Skip to content

Commit 8530e8d

Browse files
committed
feat: provide 'shimRequire' and 'includeAwsSdk' options
1 parent 7fef242 commit 8530e8d

File tree

5 files changed

+46
-12
lines changed

5 files changed

+46
-12
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "serverless-aws-lambda",
3-
"version": "4.8.3",
3+
"version": "4.8.4",
44
"description": "AWS Application Load Balancer and API Gateway - Lambda dev tool for Serverless. Allows Express synthax in handlers. Supports packaging, local invoking and offline ALB, APG, S3, SNS, SQS, DynamoDB Stream server mocking.",
55
"author": "Inqnuam",
66
"license": "MIT",

src/config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ export interface OfflineConfig {
1515

1616
export interface Config {
1717
esbuild?: Omit<BuildOptions, "outExtension" | "outfile" | "bundle" | "splitting" | "stdin" | "platforme" | "metafile" | "format"> & { format?: "cjs" | "esm" };
18+
shimRequire?: boolean;
19+
includeAwsSdk?: boolean;
1820
offline?: OfflineConfig;
1921
buildCallback?: (result: BuildResult, isRebuild: boolean) => Promise<void> | void;
2022
afterDeployCallbacks?: (() => Promise<void> | void)[];

src/defineConfig.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,18 @@ export interface SlsAwsLambdaPlugin {
9595

9696
export interface Options {
9797
esbuild?: Config["esbuild"];
98+
/**
99+
* shim `require`, `__dirname` and `__filename` when bundeling Lambdas with ESM format
100+
* @default true
101+
*/
102+
shimRequire?: boolean;
103+
/**
104+
* By default aws sdk packages are excluded from Lambda bundles as AWS Lambda Runtime already includes `aws-sdk` (v2) for Node < 18 and `@aws-sdk/*` for Node >=18 packages.
105+
*
106+
* Use this option to include aws-sdk if you prefer to control exact package version used by your Lambdas during runtime.
107+
* @default false
108+
*/
109+
includeAwsSdk?: boolean;
98110
offline?: {
99111
/**
100112
* Serve files locally from provided directory
@@ -167,6 +179,8 @@ function defineConfig(options: Options) {
167179
): Promise<Omit<Config, "config" | "options">> {
168180
let config: Config = {
169181
esbuild: options.esbuild ?? {},
182+
shimRequire: options.shimRequire,
183+
includeAwsSdk: options.includeAwsSdk,
170184
offline: {
171185
staticPath: options.offline?.staticPath,
172186
port: options.offline?.port,

src/index.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ class ServerlessAwsLambda extends Daemon {
5757
afterDeployCallbacks: (() => void | Promise<void>)[] = [];
5858
afterPackageCallbacks: (() => void | Promise<void>)[] = [];
5959
resources: ReturnType<typeof getResources> = { ddb: {}, kinesis: {}, sns: {}, sqs: {} };
60+
shimRequire: boolean = true;
61+
includeAwsSdk: boolean = false;
6062
static tags: string[] = ["build"];
6163
constructor(serverless: any, options: any, pluginUtils: PluginUtils) {
6264
super({ debug: process.env.SLS_DEBUG == "*" });
@@ -209,7 +211,9 @@ class ServerlessAwsLambda extends Daemon {
209211
log.RED(`You are running on NodeJS ${process.version} which is lower than '${this.nodeVersion}' found in serverless.yml.`);
210212
}
211213
esBuildConfig.target = `node${this.nodeVersion}`;
212-
esBuildConfig.plugins?.push(buildOptimizer({ isLocal, nodeVersion: this.nodeVersion, buildCallback: this.buildCallback }));
214+
esBuildConfig.plugins?.push(
215+
buildOptimizer({ isLocal, nodeVersion: this.nodeVersion, shimRequire: this.shimRequire, includeAwsSdk: this.includeAwsSdk, buildCallback: this.buildCallback })
216+
);
213217
}
214218
if (!isLocal) {
215219
esBuildConfig.dropLabels!.push("LOCAL");
@@ -580,6 +584,14 @@ class ServerlessAwsLambda extends Daemon {
580584
throw new Error(`Can not find config at: ${configPath}`);
581585
}
582586

587+
if (typeof exportedObject.shimRequire == "boolean") {
588+
this.shimRequire = exportedObject.shimRequire;
589+
}
590+
591+
if (typeof exportedObject.includeAwsSdk == "boolean") {
592+
this.includeAwsSdk = exportedObject.includeAwsSdk;
593+
}
594+
583595
if (typeof exportedObject.buildCallback == "function") {
584596
this.customBuildCallback = exportedObject.buildCallback;
585597
}

src/lib/esbuild/buildOptimizer.ts

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@ const requirePoly = (nodePrefix: "node:" | "") =>
1010
export const buildOptimizer = ({
1111
isLocal,
1212
nodeVersion,
13+
shimRequire,
14+
includeAwsSdk,
1315
buildCallback,
1416
}: {
1517
isLocal: boolean;
1618
nodeVersion: number;
19+
shimRequire: boolean;
20+
includeAwsSdk: boolean;
1721
buildCallback: (result: BuildResult, isRebuild: boolean, format: string, outdir: string) => void | Promise<void>;
1822
}): Plugin => {
1923
return {
@@ -49,25 +53,27 @@ export const buildOptimizer = ({
4953
}
5054

5155
build.initialOptions.external!.push(...knownCjs);
52-
} else {
56+
} else if (!includeAwsSdk) {
5357
build.initialOptions.external!.push(nodeVersion < 18 ? awsSdkV2 : awsSdkV3);
5458
}
5559

5660
if (build.initialOptions.format != "esm") {
5761
return;
5862
}
5963

60-
const r = requirePoly(nodeVersion < 18 ? "" : "node:");
61-
if (build.initialOptions.banner) {
62-
if (build.initialOptions.banner.js) {
63-
build.initialOptions.banner.js = `${r}${build.initialOptions.banner.js}`;
64+
if (shimRequire) {
65+
const r = requirePoly(nodeVersion < 18 ? "" : "node:");
66+
if (build.initialOptions.banner) {
67+
if (build.initialOptions.banner.js) {
68+
build.initialOptions.banner.js = `${r}${build.initialOptions.banner.js}`;
69+
} else {
70+
build.initialOptions.banner.js = r;
71+
}
6472
} else {
65-
build.initialOptions.banner.js = r;
73+
build.initialOptions.banner = {
74+
js: r,
75+
};
6676
}
67-
} else {
68-
build.initialOptions.banner = {
69-
js: r,
70-
};
7177
}
7278
},
7379
};

0 commit comments

Comments
 (0)