@ashishpandeyone/cdk-lambda-web-function 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -151,6 +151,30 @@ table.grantReadWriteData(api); // the default role trusts lambda.amazo
151
151
  - Environment variable names starting with `AWS_` are reserved.
152
152
  - **Renaming the function replaces it and changes its URL.** A generated name depends on the construct path, so moving the construct renames it too.
153
153
 
154
+ ### Bundling TypeScript with `NodejsWebFunction`
155
+
156
+ `NodejsWebFunction` is a `WebFunction` that bundles your server from a TypeScript or JavaScript entry file with esbuild, like `NodejsFunction` does for Lambda functions:
157
+
158
+ ```ts
159
+ new NodejsWebFunction(this, 'Api', {
160
+ entry: 'src/server.ts',
161
+ authType: WebFunctionAuthType.AWS_IAM,
162
+ bundling: {
163
+ minify: true, // default true
164
+ sourceMap: true, // default true
165
+ format: lambdaNodejs.OutputFormat.ESM, // default ESM (index.mjs); CJS gives index.js
166
+ externalModules: [], // default: bundle everything you import
167
+ },
168
+ });
169
+ ```
170
+
171
+ - **Defaults:** `runtime` is `NODEJS_24_X`, and the esbuild target follows the runtime (`node24`). The project root is the directory of the nearest lock file above `entry` (override it with `depsLockFilePath` or `projectRoot`).
172
+ - **It also sets what a `lambda.Code` can't:** the entry point that matches the bundle, and `NODE_OPTIONS=--enable-source-maps` when source maps are on, appended to any `NODE_OPTIONS` you set, so stack traces point at your `.ts` files (e.g. `/var/task/src/server.ts:22:12`). Source map paths are relative to the project root, so no build-machine paths are deployed.
173
+ - **ESM bundles include a `require` shim**, so CommonJS dependencies that load Node.js built-ins (Express, for example) work.
174
+ - **The AWS SDK is bundled like any other dependency**, since the runtime has none. Only the clients you import are included.
175
+ - **Bundling runs locally** when esbuild is installed in your project, and otherwise in Docker (an arm64 AWS SAM build image; set `forceDockerBundling` to always use Docker).
176
+ - **Not yet supported:** installing native modules next to the bundle (`nodeModules`) and command hooks. For native dependencies, use `WebFunction` with `Code.fromAsset(..., { bundling: { image, command } })`.
177
+
154
178
  ### Code
155
179
 
156
180
  `code` takes any `lambda.Code` that produces a zip in S3: `fromAsset`, `fromBucket`/`fromBucketV2`, `fromCustomCommand`, `fromDockerBuild`. Inline code and container images fail at synth time.
package/lib/index.d.ts CHANGED
@@ -2,3 +2,4 @@ export * from './enums';
2
2
  export * from './web-function';
3
3
  export * from './web-function-endpoint';
4
4
  export * from './web-function-grants';
5
+ export * from './nodejs-web-function';
package/lib/index.js CHANGED
@@ -18,4 +18,5 @@ __exportStar(require("./enums"), exports);
18
18
  __exportStar(require("./web-function"), exports);
19
19
  __exportStar(require("./web-function-endpoint"), exports);
20
20
  __exportStar(require("./web-function-grants"), exports);
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBDQUF3QjtBQUN4QixpREFBK0I7QUFDL0IsMERBQXdDO0FBQ3hDLHdEQUFzQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi93ZWItZnVuY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi93ZWItZnVuY3Rpb24tZW5kcG9pbnQnO1xuZXhwb3J0ICogZnJvbSAnLi93ZWItZnVuY3Rpb24tZ3JhbnRzJztcbiJdfQ==
21
+ __exportStar(require("./nodejs-web-function"), exports);
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBDQUF3QjtBQUN4QixpREFBK0I7QUFDL0IsMERBQXdDO0FBQ3hDLHdEQUFzQztBQUN0Qyx3REFBc0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vd2ViLWZ1bmN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vd2ViLWZ1bmN0aW9uLWVuZHBvaW50JztcbmV4cG9ydCAqIGZyb20gJy4vd2ViLWZ1bmN0aW9uLWdyYW50cyc7XG5leHBvcnQgKiBmcm9tICcuL25vZGVqcy13ZWItZnVuY3Rpb24nO1xuIl19
@@ -0,0 +1,153 @@
1
+ import { DockerImage } from 'aws-cdk-lib';
2
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
3
+ import { OutputFormat } from 'aws-cdk-lib/aws-lambda-nodejs';
4
+ import type { Construct } from 'constructs';
5
+ import { WebFunction, type WebFunctionOptions } from './web-function';
6
+ /**
7
+ * How `NodejsWebFunction` bundles the server with esbuild.
8
+ */
9
+ export interface NodejsWebFunctionBundlingOptions {
10
+ /**
11
+ * Minify the bundle.
12
+ *
13
+ * @default true
14
+ */
15
+ readonly minify?: boolean;
16
+ /**
17
+ * Generate a source map, and set `NODE_OPTIONS=--enable-source-maps` so stack traces point at your sources.
18
+ *
19
+ * @default true
20
+ */
21
+ readonly sourceMap?: boolean;
22
+ /**
23
+ * Output format. ESM is written to `index.mjs` (with a `require` shim, so CommonJS dependencies
24
+ * such as Express work); CommonJS to `index.js`.
25
+ *
26
+ * @default OutputFormat.ESM
27
+ */
28
+ readonly format?: OutputFormat;
29
+ /**
30
+ * esbuild target.
31
+ *
32
+ * @default - the runtime's Node.js version, e.g. `node24`
33
+ */
34
+ readonly target?: string;
35
+ /**
36
+ * Modules to leave out of the bundle. The runtime has no AWS SDK, so `@aws-sdk/*` is bundled like
37
+ * any other dependency; only exclude modules you provide another way.
38
+ *
39
+ * @default - none
40
+ */
41
+ readonly externalModules?: string[];
42
+ /**
43
+ * Replace global identifiers with constant expressions (esbuild `--define`).
44
+ *
45
+ * @default - none
46
+ */
47
+ readonly define?: {
48
+ [key: string]: string;
49
+ };
50
+ /**
51
+ * esbuild loaders by file extension, e.g. `{ '.png': 'dataurl' }`.
52
+ *
53
+ * @default - esbuild's defaults
54
+ */
55
+ readonly loader?: {
56
+ [ext: string]: string;
57
+ };
58
+ /**
59
+ * Text to prepend to the bundle.
60
+ *
61
+ * @default - none
62
+ */
63
+ readonly banner?: string;
64
+ /**
65
+ * Text to append to the bundle.
66
+ *
67
+ * @default - none
68
+ */
69
+ readonly footer?: string;
70
+ /**
71
+ * Path of the tsconfig.json to use, relative to the project root or absolute (inside the project root).
72
+ *
73
+ * @default - esbuild's lookup from the entry file
74
+ */
75
+ readonly tsconfig?: string;
76
+ /**
77
+ * Keep function and class names (`--keep-names`).
78
+ *
79
+ * @default false
80
+ */
81
+ readonly keepNames?: boolean;
82
+ /**
83
+ * Extra esbuild arguments, e.g. `{ '--log-limit': '0', '--tree-shaking': true }`.
84
+ *
85
+ * @default - none
86
+ */
87
+ readonly esbuildArgs?: {
88
+ [arg: string]: string | boolean;
89
+ };
90
+ /**
91
+ * Environment variables while bundling (not at runtime).
92
+ *
93
+ * @default - none
94
+ */
95
+ readonly environment?: {
96
+ [key: string]: string;
97
+ };
98
+ /**
99
+ * Always bundle in Docker, even if esbuild is installed locally.
100
+ *
101
+ * @default false
102
+ */
103
+ readonly forceDockerBundling?: boolean;
104
+ /**
105
+ * Docker image for bundling when esbuild isn't installed locally.
106
+ *
107
+ * @default - the arm64 AWS SAM build image for the runtime, e.g. `public.ecr.aws/sam/build-nodejs24.x:latest-arm64`
108
+ */
109
+ readonly dockerImage?: DockerImage;
110
+ }
111
+ /**
112
+ * Properties for a `NodejsWebFunction`.
113
+ */
114
+ export interface NodejsWebFunctionProps extends WebFunctionOptions {
115
+ /**
116
+ * The file that starts your server (TypeScript or JavaScript). It's bundled with its dependencies.
117
+ */
118
+ readonly entry: string;
119
+ /**
120
+ * The Node.js runtime.
121
+ *
122
+ * @default lambda.Runtime.NODEJS_24_X
123
+ */
124
+ readonly runtime?: lambda.Runtime;
125
+ /**
126
+ * The lock file that marks the project root (where esbuild resolves `node_modules`).
127
+ *
128
+ * @default - the nearest `package-lock.json`, `yarn.lock`, `pnpm-lock.yaml` or `bun.lock(b)` above the entry
129
+ */
130
+ readonly depsLockFilePath?: string;
131
+ /**
132
+ * The project root. Must contain the entry file.
133
+ *
134
+ * @default - the directory of the lock file
135
+ */
136
+ readonly projectRoot?: string;
137
+ /**
138
+ * How the server is bundled.
139
+ *
140
+ * @default - minified ESM with a source map, targeting the runtime's Node.js version
141
+ */
142
+ readonly bundling?: NodejsWebFunctionBundlingOptions;
143
+ }
144
+ /**
145
+ * A `WebFunction` whose code is bundled from a TypeScript or JavaScript entry file with esbuild,
146
+ * like `NodejsFunction` for Lambda functions.
147
+ *
148
+ * Besides bundling, it sets what a `lambda.Code` alone can't: the entry point that matches the
149
+ * bundle, and `NODE_OPTIONS=--enable-source-maps` when source maps are on.
150
+ */
151
+ export declare class NodejsWebFunction extends WebFunction {
152
+ constructor(scope: Construct, id: string, props: NodejsWebFunctionProps);
153
+ }
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.NodejsWebFunction = void 0;
37
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
38
+ const path = __importStar(require("node:path"));
39
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
40
+ const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
41
+ const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
42
+ const bundling_1 = require("./private/bundling");
43
+ const web_function_1 = require("./web-function");
44
+ /**
45
+ * A `WebFunction` whose code is bundled from a TypeScript or JavaScript entry file with esbuild,
46
+ * like `NodejsFunction` for Lambda functions.
47
+ *
48
+ * Besides bundling, it sets what a `lambda.Code` alone can't: the entry point that matches the
49
+ * bundle, and `NODE_OPTIONS=--enable-source-maps` when source maps are on.
50
+ */
51
+ class NodejsWebFunction extends web_function_1.WebFunction {
52
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.NodejsWebFunction", version: "0.1.1" };
53
+ constructor(scope, id, props) {
54
+ const runtime = props.runtime ?? lambda.Runtime.NODEJS_24_X;
55
+ const entry = (0, bundling_1.resolveEntry)(props.entry);
56
+ const projectRoot = path.resolve(props.projectRoot ?? path.dirname(lockFile(props, entry)));
57
+ if (path.relative(projectRoot, entry).startsWith('..')) {
58
+ throw new Error(`entry ${entry} must be inside projectRoot ${projectRoot}`);
59
+ }
60
+ const b = props.bundling ?? {};
61
+ const format = b.format ?? aws_lambda_nodejs_1.OutputFormat.ESM;
62
+ const sourceMap = b.sourceMap ?? true;
63
+ const nodeMajor = /^nodejs(\d+)/.exec(runtime.name)?.[1];
64
+ const code = (0, bundling_1.bundledCode)({
65
+ entry,
66
+ projectRoot,
67
+ environment: b.environment,
68
+ forceDockerBundling: b.forceDockerBundling ?? false,
69
+ dockerImage: b.dockerImage ?? aws_cdk_lib_1.DockerImage.fromRegistry(`public.ecr.aws/sam/build-${runtime.name}:latest-arm64`),
70
+ esbuild: {
71
+ minify: b.minify ?? true,
72
+ sourceMap,
73
+ format,
74
+ target: b.target ?? (nodeMajor ? `node${nodeMajor}` : 'node24'),
75
+ externalModules: b.externalModules ?? [],
76
+ define: b.define ?? {},
77
+ loader: b.loader ?? {},
78
+ banner: b.banner,
79
+ footer: b.footer,
80
+ tsconfig: b.tsconfig,
81
+ keepNames: b.keepNames ?? false,
82
+ esbuildArgs: b.esbuildArgs ?? {},
83
+ },
84
+ });
85
+ super(scope, id, {
86
+ ...props,
87
+ runtime,
88
+ code,
89
+ entrypoint: (0, bundling_1.outputFile)(format),
90
+ environment: withSourceMaps(props.environment, sourceMap),
91
+ });
92
+ }
93
+ }
94
+ exports.NodejsWebFunction = NodejsWebFunction;
95
+ function lockFile(props, entry) {
96
+ if (props.depsLockFilePath)
97
+ return path.resolve(props.depsLockFilePath);
98
+ const found = (0, bundling_1.findLockFile)(path.dirname(entry));
99
+ if (!found) {
100
+ throw new Error(`no lock file (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lock) found above ${entry}; set depsLockFilePath or projectRoot`);
101
+ }
102
+ return found;
103
+ }
104
+ /** Adds `--enable-source-maps` to NODE_OPTIONS, keeping anything the user set. */
105
+ function withSourceMaps(environment, sourceMap) {
106
+ if (!sourceMap)
107
+ return environment;
108
+ const existing = environment?.NODE_OPTIONS;
109
+ if (existing?.split(/\s+/).includes('--enable-source-maps'))
110
+ return environment;
111
+ return { ...environment, NODE_OPTIONS: existing ? `${existing} --enable-source-maps` : '--enable-source-maps' };
112
+ }
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZWpzLXdlYi1mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ub2RlanMtd2ViLWZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnREFBa0M7QUFDbEMsNkNBQTBDO0FBQzFDLCtEQUFpRDtBQUNqRCxxRUFBNkQ7QUFFN0QsaURBQXlGO0FBQ3pGLGlEQUFzRTtBQXdKdEU7Ozs7OztHQU1HO0FBQ0gsTUFBYSxpQkFBa0IsU0FBUSwwQkFBVzs7SUFDaEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE2QjtRQUNyRSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzVELE1BQU0sS0FBSyxHQUFHLElBQUEsdUJBQVksRUFBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUYsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2RCxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSywrQkFBK0IsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxnQ0FBWSxDQUFDLEdBQUcsQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpELE1BQU0sSUFBSSxHQUFHLElBQUEsc0JBQVcsRUFBQztZQUN2QixLQUFLO1lBQ0wsV0FBVztZQUNYLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVztZQUMxQixtQkFBbUIsRUFBRSxDQUFDLENBQUMsbUJBQW1CLElBQUksS0FBSztZQUNuRCxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVcsSUFBSSx5QkFBVyxDQUFDLFlBQVksQ0FBQyw0QkFBNEIsT0FBTyxDQUFDLElBQUksZUFBZSxDQUFDO1lBQy9HLE9BQU8sRUFBRTtnQkFDUCxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJO2dCQUN4QixTQUFTO2dCQUNULE1BQU07Z0JBQ04sTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDL0QsZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlLElBQUksRUFBRTtnQkFDeEMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRTtnQkFDdEIsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRTtnQkFDdEIsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNO2dCQUNoQixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07Z0JBQ2hCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtnQkFDcEIsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLElBQUksS0FBSztnQkFDL0IsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLElBQUksRUFBRTthQUNqQztTQUNGLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsT0FBTztZQUNQLElBQUk7WUFDSixVQUFVLEVBQUUsSUFBQSxxQkFBVSxFQUFDLE1BQU0sQ0FBQztZQUM5QixXQUFXLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDO1NBQzFELENBQUMsQ0FBQztJQUNMLENBQUM7O0FBM0NILDhDQTRDQztBQUVELFNBQVMsUUFBUSxDQUFDLEtBQTZCLEVBQUUsS0FBYTtJQUM1RCxJQUFJLEtBQUssQ0FBQyxnQkFBZ0I7UUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBQSx1QkFBWSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNoRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHFGQUFxRixLQUFLLHVDQUF1QyxDQUFDLENBQUM7SUFDckosQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixTQUFTLGNBQWMsQ0FBQyxXQUFrRCxFQUFFLFNBQWtCO0lBQzVGLElBQUksQ0FBQyxTQUFTO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDbkMsTUFBTSxRQUFRLEdBQUcsV0FBVyxFQUFFLFlBQVksQ0FBQztJQUMzQyxJQUFJLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDaEYsT0FBTyxFQUFFLEdBQUcsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztBQUNsSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgRG9ja2VySW1hZ2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBPdXRwdXRGb3JtYXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgYnVuZGxlZENvZGUsIGZpbmRMb2NrRmlsZSwgb3V0cHV0RmlsZSwgcmVzb2x2ZUVudHJ5IH0gZnJvbSAnLi9wcml2YXRlL2J1bmRsaW5nJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uLCB0eXBlIFdlYkZ1bmN0aW9uT3B0aW9ucyB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uJztcblxuLyoqXG4gKiBIb3cgYE5vZGVqc1dlYkZ1bmN0aW9uYCBidW5kbGVzIHRoZSBzZXJ2ZXIgd2l0aCBlc2J1aWxkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVqc1dlYkZ1bmN0aW9uQnVuZGxpbmdPcHRpb25zIHtcbiAgLyoqXG4gICAqIE1pbmlmeSB0aGUgYnVuZGxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBtaW5pZnk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHNvdXJjZSBtYXAsIGFuZCBzZXQgYE5PREVfT1BUSU9OUz0tLWVuYWJsZS1zb3VyY2UtbWFwc2Agc28gc3RhY2sgdHJhY2VzIHBvaW50IGF0IHlvdXIgc291cmNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlTWFwPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3V0cHV0IGZvcm1hdC4gRVNNIGlzIHdyaXR0ZW4gdG8gYGluZGV4Lm1qc2AgKHdpdGggYSBgcmVxdWlyZWAgc2hpbSwgc28gQ29tbW9uSlMgZGVwZW5kZW5jaWVzXG4gICAqIHN1Y2ggYXMgRXhwcmVzcyB3b3JrKTsgQ29tbW9uSlMgdG8gYGluZGV4LmpzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgT3V0cHV0Rm9ybWF0LkVTTVxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0PzogT3V0cHV0Rm9ybWF0O1xuXG4gIC8qKlxuICAgKiBlc2J1aWxkIHRhcmdldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgcnVudGltZSdzIE5vZGUuanMgdmVyc2lvbiwgZS5nLiBgbm9kZTI0YFxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNb2R1bGVzIHRvIGxlYXZlIG91dCBvZiB0aGUgYnVuZGxlLiBUaGUgcnVudGltZSBoYXMgbm8gQVdTIFNESywgc28gYEBhd3Mtc2RrLypgIGlzIGJ1bmRsZWQgbGlrZVxuICAgKiBhbnkgb3RoZXIgZGVwZW5kZW5jeTsgb25seSBleGNsdWRlIG1vZHVsZXMgeW91IHByb3ZpZGUgYW5vdGhlciB3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxNb2R1bGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgZ2xvYmFsIGlkZW50aWZpZXJzIHdpdGggY29uc3RhbnQgZXhwcmVzc2lvbnMgKGVzYnVpbGQgYC0tZGVmaW5lYCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVmaW5lPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogZXNidWlsZCBsb2FkZXJzIGJ5IGZpbGUgZXh0ZW5zaW9uLCBlLmcuIGB7ICcucG5nJzogJ2RhdGF1cmwnIH1gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGVzYnVpbGQncyBkZWZhdWx0c1xuICAgKi9cbiAgcmVhZG9ubHkgbG9hZGVyPzogeyBbZXh0OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogVGV4dCB0byBwcmVwZW5kIHRvIHRoZSBidW5kbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgYmFubmVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUZXh0IHRvIGFwcGVuZCB0byB0aGUgYnVuZGxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGZvb3Rlcj86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCBvZiB0aGUgdHNjb25maWcuanNvbiB0byB1c2UsIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3Qgb3IgYWJzb2x1dGUgKGluc2lkZSB0aGUgcHJvamVjdCByb290KS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBlc2J1aWxkJ3MgbG9va3VwIGZyb20gdGhlIGVudHJ5IGZpbGVcbiAgICovXG4gIHJlYWRvbmx5IHRzY29uZmlnPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZWVwIGZ1bmN0aW9uIGFuZCBjbGFzcyBuYW1lcyAoYC0ta2VlcC1uYW1lc2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkga2VlcE5hbWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXh0cmEgZXNidWlsZCBhcmd1bWVudHMsIGUuZy4gYHsgJy0tbG9nLWxpbWl0JzogJzAnLCAnLS10cmVlLXNoYWtpbmcnOiB0cnVlIH1gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGVzYnVpbGRBcmdzPzogeyBbYXJnOiBzdHJpbmddOiBzdHJpbmcgfCBib29sZWFuIH07XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyB3aGlsZSBidW5kbGluZyAobm90IGF0IHJ1bnRpbWUpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogQWx3YXlzIGJ1bmRsZSBpbiBEb2NrZXIsIGV2ZW4gaWYgZXNidWlsZCBpcyBpbnN0YWxsZWQgbG9jYWxseS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGZvcmNlRG9ja2VyQnVuZGxpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEb2NrZXIgaW1hZ2UgZm9yIGJ1bmRsaW5nIHdoZW4gZXNidWlsZCBpc24ndCBpbnN0YWxsZWQgbG9jYWxseS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgYXJtNjQgQVdTIFNBTSBidWlsZCBpbWFnZSBmb3IgdGhlIHJ1bnRpbWUsIGUuZy4gYHB1YmxpYy5lY3IuYXdzL3NhbS9idWlsZC1ub2RlanMyNC54OmxhdGVzdC1hcm02NGBcbiAgICovXG4gIHJlYWRvbmx5IGRvY2tlckltYWdlPzogRG9ja2VySW1hZ2U7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBgTm9kZWpzV2ViRnVuY3Rpb25gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVqc1dlYkZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBXZWJGdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGZpbGUgdGhhdCBzdGFydHMgeW91ciBzZXJ2ZXIgKFR5cGVTY3JpcHQgb3IgSmF2YVNjcmlwdCkuIEl0J3MgYnVuZGxlZCB3aXRoIGl0cyBkZXBlbmRlbmNpZXMuXG4gICAqL1xuICByZWFkb25seSBlbnRyeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgTm9kZS5qcyBydW50aW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjRfWFxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZT86IGxhbWJkYS5SdW50aW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9jayBmaWxlIHRoYXQgbWFya3MgdGhlIHByb2plY3Qgcm9vdCAod2hlcmUgZXNidWlsZCByZXNvbHZlcyBgbm9kZV9tb2R1bGVzYCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIG5lYXJlc3QgYHBhY2thZ2UtbG9jay5qc29uYCwgYHlhcm4ubG9ja2AsIGBwbnBtLWxvY2sueWFtbGAgb3IgYGJ1bi5sb2NrKGIpYCBhYm92ZSB0aGUgZW50cnlcbiAgICovXG4gIHJlYWRvbmx5IGRlcHNMb2NrRmlsZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9qZWN0IHJvb3QuIE11c3QgY29udGFpbiB0aGUgZW50cnkgZmlsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgZGlyZWN0b3J5IG9mIHRoZSBsb2NrIGZpbGVcbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3RSb290Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIHNlcnZlciBpcyBidW5kbGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG1pbmlmaWVkIEVTTSB3aXRoIGEgc291cmNlIG1hcCwgdGFyZ2V0aW5nIHRoZSBydW50aW1lJ3MgTm9kZS5qcyB2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBidW5kbGluZz86IE5vZGVqc1dlYkZ1bmN0aW9uQnVuZGxpbmdPcHRpb25zO1xufVxuXG4vKipcbiAqIEEgYFdlYkZ1bmN0aW9uYCB3aG9zZSBjb2RlIGlzIGJ1bmRsZWQgZnJvbSBhIFR5cGVTY3JpcHQgb3IgSmF2YVNjcmlwdCBlbnRyeSBmaWxlIHdpdGggZXNidWlsZCxcbiAqIGxpa2UgYE5vZGVqc0Z1bmN0aW9uYCBmb3IgTGFtYmRhIGZ1bmN0aW9ucy5cbiAqXG4gKiBCZXNpZGVzIGJ1bmRsaW5nLCBpdCBzZXRzIHdoYXQgYSBgbGFtYmRhLkNvZGVgIGFsb25lIGNhbid0OiB0aGUgZW50cnkgcG9pbnQgdGhhdCBtYXRjaGVzIHRoZVxuICogYnVuZGxlLCBhbmQgYE5PREVfT1BUSU9OUz0tLWVuYWJsZS1zb3VyY2UtbWFwc2Agd2hlbiBzb3VyY2UgbWFwcyBhcmUgb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBOb2RlanNXZWJGdW5jdGlvbiBleHRlbmRzIFdlYkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5vZGVqc1dlYkZ1bmN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCBydW50aW1lID0gcHJvcHMucnVudGltZSA/PyBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjRfWDtcbiAgICBjb25zdCBlbnRyeSA9IHJlc29sdmVFbnRyeShwcm9wcy5lbnRyeSk7XG4gICAgY29uc3QgcHJvamVjdFJvb3QgPSBwYXRoLnJlc29sdmUocHJvcHMucHJvamVjdFJvb3QgPz8gcGF0aC5kaXJuYW1lKGxvY2tGaWxlKHByb3BzLCBlbnRyeSkpKTtcbiAgICBpZiAocGF0aC5yZWxhdGl2ZShwcm9qZWN0Um9vdCwgZW50cnkpLnN0YXJ0c1dpdGgoJy4uJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZW50cnkgJHtlbnRyeX0gbXVzdCBiZSBpbnNpZGUgcHJvamVjdFJvb3QgJHtwcm9qZWN0Um9vdH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBiID0gcHJvcHMuYnVuZGxpbmcgPz8ge307XG4gICAgY29uc3QgZm9ybWF0ID0gYi5mb3JtYXQgPz8gT3V0cHV0Rm9ybWF0LkVTTTtcbiAgICBjb25zdCBzb3VyY2VNYXAgPSBiLnNvdXJjZU1hcCA/PyB0cnVlO1xuICAgIGNvbnN0IG5vZGVNYWpvciA9IC9ebm9kZWpzKFxcZCspLy5leGVjKHJ1bnRpbWUubmFtZSk/LlsxXTtcblxuICAgIGNvbnN0IGNvZGUgPSBidW5kbGVkQ29kZSh7XG4gICAgICBlbnRyeSxcbiAgICAgIHByb2plY3RSb290LFxuICAgICAgZW52aXJvbm1lbnQ6IGIuZW52aXJvbm1lbnQsXG4gICAgICBmb3JjZURvY2tlckJ1bmRsaW5nOiBiLmZvcmNlRG9ja2VyQnVuZGxpbmcgPz8gZmFsc2UsXG4gICAgICBkb2NrZXJJbWFnZTogYi5kb2NrZXJJbWFnZSA/PyBEb2NrZXJJbWFnZS5mcm9tUmVnaXN0cnkoYHB1YmxpYy5lY3IuYXdzL3NhbS9idWlsZC0ke3J1bnRpbWUubmFtZX06bGF0ZXN0LWFybTY0YCksXG4gICAgICBlc2J1aWxkOiB7XG4gICAgICAgIG1pbmlmeTogYi5taW5pZnkgPz8gdHJ1ZSxcbiAgICAgICAgc291cmNlTWFwLFxuICAgICAgICBmb3JtYXQsXG4gICAgICAgIHRhcmdldDogYi50YXJnZXQgPz8gKG5vZGVNYWpvciA/IGBub2RlJHtub2RlTWFqb3J9YCA6ICdub2RlMjQnKSxcbiAgICAgICAgZXh0ZXJuYWxNb2R1bGVzOiBiLmV4dGVybmFsTW9kdWxlcyA/PyBbXSxcbiAgICAgICAgZGVmaW5lOiBiLmRlZmluZSA/PyB7fSxcbiAgICAgICAgbG9hZGVyOiBiLmxvYWRlciA/PyB7fSxcbiAgICAgICAgYmFubmVyOiBiLmJhbm5lcixcbiAgICAgICAgZm9vdGVyOiBiLmZvb3RlcixcbiAgICAgICAgdHNjb25maWc6IGIudHNjb25maWcsXG4gICAgICAgIGtlZXBOYW1lczogYi5rZWVwTmFtZXMgPz8gZmFsc2UsXG4gICAgICAgIGVzYnVpbGRBcmdzOiBiLmVzYnVpbGRBcmdzID8/IHt9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBydW50aW1lLFxuICAgICAgY29kZSxcbiAgICAgIGVudHJ5cG9pbnQ6IG91dHB1dEZpbGUoZm9ybWF0KSxcbiAgICAgIGVudmlyb25tZW50OiB3aXRoU291cmNlTWFwcyhwcm9wcy5lbnZpcm9ubWVudCwgc291cmNlTWFwKSxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2NrRmlsZShwcm9wczogTm9kZWpzV2ViRnVuY3Rpb25Qcm9wcywgZW50cnk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwcm9wcy5kZXBzTG9ja0ZpbGVQYXRoKSByZXR1cm4gcGF0aC5yZXNvbHZlKHByb3BzLmRlcHNMb2NrRmlsZVBhdGgpO1xuICBjb25zdCBmb3VuZCA9IGZpbmRMb2NrRmlsZShwYXRoLmRpcm5hbWUoZW50cnkpKTtcbiAgaWYgKCFmb3VuZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8gbG9jayBmaWxlIChwYWNrYWdlLWxvY2suanNvbiwgeWFybi5sb2NrLCBwbnBtLWxvY2sueWFtbCwgYnVuLmxvY2spIGZvdW5kIGFib3ZlICR7ZW50cnl9OyBzZXQgZGVwc0xvY2tGaWxlUGF0aCBvciBwcm9qZWN0Um9vdGApO1xuICB9XG4gIHJldHVybiBmb3VuZDtcbn1cblxuLyoqIEFkZHMgYC0tZW5hYmxlLXNvdXJjZS1tYXBzYCB0byBOT0RFX09QVElPTlMsIGtlZXBpbmcgYW55dGhpbmcgdGhlIHVzZXIgc2V0LiAqL1xuZnVuY3Rpb24gd2l0aFNvdXJjZU1hcHMoZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWQsIHNvdXJjZU1hcDogYm9vbGVhbik6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIXNvdXJjZU1hcCkgcmV0dXJuIGVudmlyb25tZW50O1xuICBjb25zdCBleGlzdGluZyA9IGVudmlyb25tZW50Py5OT0RFX09QVElPTlM7XG4gIGlmIChleGlzdGluZz8uc3BsaXQoL1xccysvKS5pbmNsdWRlcygnLS1lbmFibGUtc291cmNlLW1hcHMnKSkgcmV0dXJuIGVudmlyb25tZW50O1xuICByZXR1cm4geyAuLi5lbnZpcm9ubWVudCwgTk9ERV9PUFRJT05TOiBleGlzdGluZyA/IGAke2V4aXN0aW5nfSAtLWVuYWJsZS1zb3VyY2UtbWFwc2AgOiAnLS1lbmFibGUtc291cmNlLW1hcHMnIH07XG59XG4iXX0=
@@ -0,0 +1,68 @@
1
+ import { DockerImage } from 'aws-cdk-lib';
2
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
3
+ import { OutputFormat } from 'aws-cdk-lib/aws-lambda-nodejs';
4
+ /** esbuild version used inside the Docker fallback. */
5
+ export declare const DOCKER_ESBUILD_VERSION = "0.28";
6
+ /**
7
+ * In an ESM bundle, CommonJS dependencies (e.g. Express) that `require()` Node built-ins fail with
8
+ * "Dynamic require of ... is not supported". Defining `require` fixes that.
9
+ */
10
+ export declare const ESM_REQUIRE_SHIM = "import { createRequire as __webFunctionCreateRequire } from 'node:module';const require = __webFunctionCreateRequire(import.meta.url);";
11
+ export interface EsbuildOptions {
12
+ readonly minify: boolean;
13
+ readonly sourceMap: boolean;
14
+ readonly format: OutputFormat;
15
+ readonly target: string;
16
+ readonly externalModules: string[];
17
+ readonly define: {
18
+ [key: string]: string;
19
+ };
20
+ readonly loader: {
21
+ [ext: string]: string;
22
+ };
23
+ readonly banner?: string;
24
+ readonly footer?: string;
25
+ readonly tsconfig?: string;
26
+ readonly keepNames: boolean;
27
+ readonly esbuildArgs: {
28
+ [arg: string]: string | boolean;
29
+ };
30
+ }
31
+ export interface BundleProps {
32
+ /** Absolute path of the entry file. */
33
+ readonly entry: string;
34
+ /** Absolute path of the directory esbuild resolves modules from. */
35
+ readonly projectRoot: string;
36
+ readonly esbuild: EsbuildOptions;
37
+ readonly environment?: {
38
+ [key: string]: string;
39
+ };
40
+ readonly forceDockerBundling: boolean;
41
+ readonly dockerImage: DockerImage;
42
+ }
43
+ /**
44
+ * Rewrites a source map's `sources` to be relative to the project root.
45
+ *
46
+ * esbuild writes them relative to the output directory, which CDK places outside the project, so
47
+ * they climb to the build machine's absolute paths (home directory, CI workspace) and end up in
48
+ * production stack traces. Relative to the project root, Node resolves them next to the bundle
49
+ * (e.g. `/var/task/src/server.ts`). Runs as `node -e SCRIPT <map file> <project root>`, locally
50
+ * and in Docker.
51
+ */
52
+ export declare const SOURCE_MAP_REWRITE_SCRIPT: string;
53
+ /** The file the bundle is written to, and the entry point the runtime must load. */
54
+ export declare function outputFile(format: OutputFormat): string;
55
+ /** Validates the entry file and returns its absolute path. */
56
+ export declare function resolveEntry(entry: string): string;
57
+ /** The nearest lock file at or above `dir`, or undefined. */
58
+ export declare function findLockFile(dir: string): string | undefined;
59
+ /** esbuild's command-line arguments, for the given input and output paths. */
60
+ export declare function esbuildArgs(entry: string, outfile: string, o: EsbuildOptions): string[];
61
+ /**
62
+ * A `lambda.Code` that bundles the entry with esbuild: locally when esbuild is installed in the
63
+ * project, otherwise in Docker (an arm64 Node.js build image). The asset hash covers the output,
64
+ * so an unchanged bundle doesn't create a new revision.
65
+ */
66
+ export declare function bundledCode(props: BundleProps): lambda.Code;
67
+ /** The shell command that bundles inside the container (project at /asset-input, output to /asset-output). */
68
+ export declare function dockerCommand(props: BundleProps): string;
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SOURCE_MAP_REWRITE_SCRIPT = exports.ESM_REQUIRE_SHIM = exports.DOCKER_ESBUILD_VERSION = void 0;
37
+ exports.outputFile = outputFile;
38
+ exports.resolveEntry = resolveEntry;
39
+ exports.findLockFile = findLockFile;
40
+ exports.esbuildArgs = esbuildArgs;
41
+ exports.bundledCode = bundledCode;
42
+ exports.dockerCommand = dockerCommand;
43
+ const node_child_process_1 = require("node:child_process");
44
+ const fs = __importStar(require("node:fs"));
45
+ const path = __importStar(require("node:path"));
46
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
47
+ const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
48
+ const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
49
+ /** esbuild version used inside the Docker fallback. */
50
+ exports.DOCKER_ESBUILD_VERSION = '0.28';
51
+ const DOCKER_ESBUILD_PREFIX = '/tmp/esbuild';
52
+ const LOCK_FILES = ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'bun.lockb', 'bun.lock'];
53
+ const ENTRY_EXTENSIONS = ['.ts', '.mts', '.cts', '.tsx', '.js', '.mjs', '.cjs', '.jsx'];
54
+ /**
55
+ * In an ESM bundle, CommonJS dependencies (e.g. Express) that `require()` Node built-ins fail with
56
+ * "Dynamic require of ... is not supported". Defining `require` fixes that.
57
+ */
58
+ exports.ESM_REQUIRE_SHIM = "import { createRequire as __webFunctionCreateRequire } from 'node:module';const require = __webFunctionCreateRequire(import.meta.url);";
59
+ /**
60
+ * Rewrites a source map's `sources` to be relative to the project root.
61
+ *
62
+ * esbuild writes them relative to the output directory, which CDK places outside the project, so
63
+ * they climb to the build machine's absolute paths (home directory, CI workspace) and end up in
64
+ * production stack traces. Relative to the project root, Node resolves them next to the bundle
65
+ * (e.g. `/var/task/src/server.ts`). Runs as `node -e SCRIPT <map file> <project root>`, locally
66
+ * and in Docker.
67
+ */
68
+ exports.SOURCE_MAP_REWRITE_SCRIPT = [
69
+ "const fs=require('fs'),path=require('path');",
70
+ 'const [mapFile,root]=process.argv.slice(1);',
71
+ "const map=JSON.parse(fs.readFileSync(mapFile,'utf8'));",
72
+ 'const out=path.dirname(mapFile);',
73
+ "map.sources=map.sources.map(s=>path.relative(root,path.resolve(out,map.sourceRoot||'',s)).split(path.sep).join('/'));",
74
+ 'delete map.sourceRoot;',
75
+ 'fs.writeFileSync(mapFile,JSON.stringify(map));',
76
+ ].join('');
77
+ /** The file the bundle is written to, and the entry point the runtime must load. */
78
+ function outputFile(format) {
79
+ return format === aws_lambda_nodejs_1.OutputFormat.ESM ? 'index.mjs' : 'index.js';
80
+ }
81
+ /** Validates the entry file and returns its absolute path. */
82
+ function resolveEntry(entry) {
83
+ const abs = path.resolve(entry);
84
+ if (!ENTRY_EXTENSIONS.includes(path.extname(abs))) {
85
+ throw new Error(`entry must be a JavaScript or TypeScript file (${ENTRY_EXTENSIONS.join(', ')}), got ${entry}`);
86
+ }
87
+ if (!fs.existsSync(abs)) {
88
+ throw new Error(`entry file not found: ${abs}`);
89
+ }
90
+ return abs;
91
+ }
92
+ /** The nearest lock file at or above `dir`, or undefined. */
93
+ function findLockFile(dir) {
94
+ let current = path.resolve(dir);
95
+ for (;;) {
96
+ for (const name of LOCK_FILES) {
97
+ const candidate = path.join(current, name);
98
+ if (fs.existsSync(candidate))
99
+ return candidate;
100
+ }
101
+ const parent = path.dirname(current);
102
+ if (parent === current)
103
+ return undefined;
104
+ current = parent;
105
+ }
106
+ }
107
+ /** esbuild's command-line arguments, for the given input and output paths. */
108
+ function esbuildArgs(entry, outfile, o) {
109
+ const banner = [o.format === aws_lambda_nodejs_1.OutputFormat.ESM ? exports.ESM_REQUIRE_SHIM : undefined, o.banner].filter(Boolean).join('\n');
110
+ return [
111
+ entry,
112
+ '--bundle',
113
+ '--platform=node',
114
+ `--target=${o.target}`,
115
+ `--format=${o.format}`,
116
+ `--outfile=${outfile}`,
117
+ ...(o.minify ? ['--minify'] : []),
118
+ ...(o.sourceMap ? ['--sourcemap'] : []),
119
+ ...(o.keepNames ? ['--keep-names'] : []),
120
+ ...(o.tsconfig ? [`--tsconfig=${o.tsconfig}`] : []),
121
+ ...o.externalModules.map((m) => `--external:${m}`),
122
+ ...Object.entries(o.define).map(([k, v]) => `--define:${k}=${v}`),
123
+ ...Object.entries(o.loader).map(([ext, l]) => `--loader:${ext}=${l}`),
124
+ ...(banner ? [`--banner:js=${banner}`] : []),
125
+ ...(o.footer ? [`--footer:js=${o.footer}`] : []),
126
+ ...Object.entries(o.esbuildArgs).map(([k, v]) => (v === true ? k : `${k}=${v}`)),
127
+ ];
128
+ }
129
+ /**
130
+ * A `lambda.Code` that bundles the entry with esbuild: locally when esbuild is installed in the
131
+ * project, otherwise in Docker (an arm64 Node.js build image). The asset hash covers the output,
132
+ * so an unchanged bundle doesn't create a new revision.
133
+ */
134
+ function bundledCode(props) {
135
+ const file = outputFile(props.esbuild.format);
136
+ const tsconfig = tsconfigPath(props);
137
+ return lambda.Code.fromAsset(props.projectRoot, {
138
+ assetHashType: aws_cdk_lib_1.AssetHashType.OUTPUT,
139
+ bundling: {
140
+ image: props.dockerImage,
141
+ platform: 'linux/arm64',
142
+ command: ['bash', '-c', dockerCommand(props)],
143
+ environment: { npm_config_cache: '/tmp/.npm', npm_config_update_notifier: 'false', ...props.environment },
144
+ local: props.forceDockerBundling ? undefined : {
145
+ tryBundle(outputDir) {
146
+ if (!hasLocalEsbuild(props.projectRoot))
147
+ return false;
148
+ const args = esbuildArgs(props.entry, path.join(outputDir, file), { ...props.esbuild, tsconfig });
149
+ const result = (0, node_child_process_1.spawnSync)('npx', ['--no-install', 'esbuild', ...args], {
150
+ cwd: props.projectRoot,
151
+ env: { ...process.env, ...props.environment },
152
+ stdio: ['ignore', 'inherit', 'inherit'],
153
+ });
154
+ if (result.status !== 0) {
155
+ throw new Error(`esbuild failed for ${props.entry} (exit ${result.status ?? result.signal})`);
156
+ }
157
+ if (props.esbuild.sourceMap) {
158
+ const rewrite = (0, node_child_process_1.spawnSync)(process.execPath, ['-e', exports.SOURCE_MAP_REWRITE_SCRIPT, path.join(outputDir, `${file}.map`), props.projectRoot], { stdio: 'inherit' });
159
+ if (rewrite.status !== 0)
160
+ throw new Error(`rewriting the source map for ${props.entry} failed`);
161
+ }
162
+ return true;
163
+ },
164
+ },
165
+ },
166
+ });
167
+ }
168
+ /** The shell command that bundles inside the container (project at /asset-input, output to /asset-output). */
169
+ function dockerCommand(props) {
170
+ const file = outputFile(props.esbuild.format);
171
+ const inDocker = (p) => `/asset-input/${path.relative(props.projectRoot, p).split(path.sep).join('/')}`;
172
+ const tsconfig = tsconfigPath(props);
173
+ const args = esbuildArgs(inDocker(props.entry), `/asset-output/${file}`, { ...props.esbuild, tsconfig: tsconfig && inDocker(tsconfig) });
174
+ return [
175
+ // Installed outside the mounted project: npx would pick up the project's own esbuild, a binary for the host's platform.
176
+ ['npm', 'install', '--prefix', DOCKER_ESBUILD_PREFIX, '--no-save', '--no-audit', '--no-fund', '--loglevel=error', `esbuild@${exports.DOCKER_ESBUILD_VERSION}`].join(' '),
177
+ [`${DOCKER_ESBUILD_PREFIX}/node_modules/.bin/esbuild`, ...args].map(shellQuote).join(' '),
178
+ ...(props.esbuild.sourceMap ? [['node', '-e', exports.SOURCE_MAP_REWRITE_SCRIPT, `/asset-output/${file}.map`, '/asset-input'].map(shellQuote).join(' ')] : []),
179
+ ].join(' && ');
180
+ }
181
+ /** The tsconfig as an absolute path. A relative one is relative to the project root, esbuild's working directory. */
182
+ function tsconfigPath(props) {
183
+ return props.esbuild.tsconfig ? path.resolve(props.projectRoot, props.esbuild.tsconfig) : undefined;
184
+ }
185
+ function hasLocalEsbuild(projectRoot) {
186
+ const result = (0, node_child_process_1.spawnSync)('npx', ['--no-install', 'esbuild', '--version'], { cwd: projectRoot, stdio: 'ignore' });
187
+ return result.status === 0;
188
+ }
189
+ function shellQuote(arg) {
190
+ return /^[\w@%+=:,./-]+$/.test(arg) ? arg : `'${arg.replace(/'/g, "'\\''")}'`;
191
+ }
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpdmF0ZS9idW5kbGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrRUEsZ0NBRUM7QUFHRCxvQ0FTQztBQUdELG9DQVdDO0FBR0Qsa0NBb0JDO0FBT0Qsa0NBZ0NDO0FBR0Qsc0NBV0M7QUExS0QsMkRBQStDO0FBQy9DLDRDQUE4QjtBQUM5QixnREFBa0M7QUFDbEMsNkNBQXlEO0FBQ3pELCtEQUFpRDtBQUNqRCxxRUFBNkQ7QUFFN0QsdURBQXVEO0FBQzFDLFFBQUEsc0JBQXNCLEdBQUcsTUFBTSxDQUFDO0FBQzdDLE1BQU0scUJBQXFCLEdBQUcsY0FBYyxDQUFDO0FBRTdDLE1BQU0sVUFBVSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNqRyxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRXhGOzs7R0FHRztBQUNVLFFBQUEsZ0JBQWdCLEdBQUcsd0lBQXdJLENBQUM7QUE0QnpLOzs7Ozs7OztHQVFHO0FBQ1UsUUFBQSx5QkFBeUIsR0FBRztJQUN2Qyw4Q0FBOEM7SUFDOUMsNkNBQTZDO0lBQzdDLHdEQUF3RDtJQUN4RCxrQ0FBa0M7SUFDbEMsdUhBQXVIO0lBQ3ZILHdCQUF3QjtJQUN4QixnREFBZ0Q7Q0FDakQsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFWCxvRkFBb0Y7QUFDcEYsU0FBZ0IsVUFBVSxDQUFDLE1BQW9CO0lBQzdDLE9BQU8sTUFBTSxLQUFLLGdDQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxD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QVEsRUFBRSxDQUFDLENBQUM7SUFDakgsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsR0FBVztJQUM3QixPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUM7QUFDaEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEFzc2V0SGFzaFR5cGUsIERvY2tlckltYWdlIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgT3V0cHV0Rm9ybWF0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanMnO1xuXG4vKiogZXNidWlsZCB2ZXJzaW9uIHVzZWQgaW5zaWRlIHRoZSBEb2NrZXIgZmFsbGJhY2suICovXG5leHBvcnQgY29uc3QgRE9DS0VSX0VTQlVJTERfVkVSU0lPTiA9ICcwLjI4JztcbmNvbnN0IERPQ0tFUl9FU0JVSUxEX1BSRUZJWCA9ICcvdG1wL2VzYnVpbGQnO1xuXG5jb25zdCBMT0NLX0ZJTEVTID0gWydwYWNrYWdlLWxvY2suanNvbicsICd5YXJuLmxvY2snLCAncG5wbS1sb2NrLnlhbWwnLCAnYnVuLmxvY2tiJywgJ2J1bi5sb2NrJ107XG5jb25zdCBFTlRSWV9FWFRFTlNJT05TID0gWycudHMnLCAnLm10cycsICcuY3RzJywgJy50c3gnLCAnLmpzJywgJy5tanMnLCAnLmNqcycsICcuanN4J107XG5cbi8qKlxuICogSW4gYW4gRVNNIGJ1bmRsZSwgQ29tbW9uSlMgZGVwZW5kZW5jaWVzIChlLmcuIEV4cHJlc3MpIHRoYXQgYHJlcXVpcmUoKWAgTm9kZSBidWlsdC1pbnMgZmFpbCB3aXRoXG4gKiBcIkR5bmFtaWMgcmVxdWlyZSBvZiAuLi4gaXMgbm90IHN1cHBvcnRlZFwiLiBEZWZpbmluZyBgcmVxdWlyZWAgZml4ZXMgdGhhdC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVTTV9SRVFVSVJFX1NISU0gPSBcImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgYXMgX193ZWJGdW5jdGlvbkNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7Y29uc3QgcmVxdWlyZSA9IF9fd2ViRnVuY3Rpb25DcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXNidWlsZE9wdGlvbnMge1xuICByZWFkb25seSBtaW5pZnk6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNvdXJjZU1hcDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZm9ybWF0OiBPdXRwdXRGb3JtYXQ7XG4gIHJlYWRvbmx5IHRhcmdldDogc3RyaW5nO1xuICByZWFkb25seSBleHRlcm5hbE1vZHVsZXM6IHN0cmluZ1tdO1xuICByZWFkb25seSBkZWZpbmU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIHJlYWRvbmx5IGxvYWRlcjogeyBbZXh0OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcmVhZG9ubHkgYmFubmVyPzogc3RyaW5nO1xuICByZWFkb25seSBmb290ZXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRzY29uZmlnPzogc3RyaW5nO1xuICByZWFkb25seSBrZWVwTmFtZXM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGVzYnVpbGRBcmdzOiB7IFthcmc6IHN0cmluZ106IHN0cmluZyB8IGJvb2xlYW4gfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdW5kbGVQcm9wcyB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBlbnRyeSBmaWxlLiAqL1xuICByZWFkb25seSBlbnRyeTogc3RyaW5nO1xuICAvKiogQWJzb2x1dGUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IGVzYnVpbGQgcmVzb2x2ZXMgbW9kdWxlcyBmcm9tLiAqL1xuICByZWFkb25seSBwcm9qZWN0Um9vdDogc3RyaW5nO1xuICByZWFkb25seSBlc2J1aWxkOiBFc2J1aWxkT3B0aW9ucztcbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICByZWFkb25seSBmb3JjZURvY2tlckJ1bmRsaW5nOiBib29sZWFuO1xuICByZWFkb25seSBkb2NrZXJJbWFnZTogRG9ja2VySW1hZ2U7XG59XG5cbi8qKlxuICogUmV3cml0ZXMgYSBzb3VyY2UgbWFwJ3MgYHNvdXJjZXNgIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKlxuICogZXNidWlsZCB3cml0ZXMgdGhlbSByZWxhdGl2ZSB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeSwgd2hpY2ggQ0RLIHBsYWNlcyBvdXRzaWRlIHRoZSBwcm9qZWN0LCBzb1xuICogdGhleSBjbGltYiB0byB0aGUgYnVpbGQgbWFjaGluZSdzIGFic29sdXRlIHBhdGhzIChob21lIGRpcmVjdG9yeSwgQ0kgd29ya3NwYWNlKSBhbmQgZW5kIHVwIGluXG4gKiBwcm9kdWN0aW9uIHN0YWNrIHRyYWNlcy4gUmVsYXRpdmUgdG8gdGhlIHByb2plY3Qgcm9vdCwgTm9kZSByZXNvbHZlcyB0aGVtIG5leHQgdG8gdGhlIGJ1bmRsZVxuICogKGUuZy4gYC92YXIvdGFzay9zcmMvc2VydmVyLnRzYCkuIFJ1bnMgYXMgYG5vZGUgLWUgU0NSSVBUIDxtYXAgZmlsZT4gPHByb2plY3Qgcm9vdD5gLCBsb2NhbGx5XG4gKiBhbmQgaW4gRG9ja2VyLlxuICovXG5leHBvcnQgY29uc3QgU09VUkNFX01BUF9SRVdSSVRFX1NDUklQVCA9IFtcbiAgXCJjb25zdCBmcz1yZXF1aXJlKCdmcycpLHBhdGg9cmVxdWlyZSgncGF0aCcpO1wiLFxuICAnY29uc3QgW21hcEZpbGUscm9vdF09cHJvY2Vzcy5hcmd2LnNsaWNlKDEpOycsXG4gIFwiY29uc3QgbWFwPUpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1hcEZpbGUsJ3V0ZjgnKSk7XCIsXG4gICdjb25zdCBvdXQ9cGF0aC5kaXJuYW1lKG1hcEZpbGUpOycsXG4gIFwibWFwLnNvdXJjZXM9bWFwLnNvdXJjZXMubWFwKHM9PnBhdGgucmVsYXRpdmUocm9vdCxwYXRoLnJlc29sdmUob3V0LG1hcC5zb3VyY2VSb290fHwnJyxzKSkuc3BsaXQocGF0aC5zZXApLmpvaW4oJy8nKSk7XCIsXG4gICdkZWxldGUgbWFwLnNvdXJjZVJvb3Q7JyxcbiAgJ2ZzLndyaXRlRmlsZVN5bmMobWFwRmlsZSxKU09OLnN0cmluZ2lmeShtYXApKTsnLFxuXS5qb2luKCcnKTtcblxuLyoqIFRoZSBmaWxlIHRoZSBidW5kbGUgaXMgd3JpdHRlbiB0bywgYW5kIHRoZSBlbnRyeSBwb2ludCB0aGUgcnVudGltZSBtdXN0IGxvYWQuICovXG5leHBvcnQgZnVuY3Rpb24gb3V0cHV0RmlsZShmb3JtYXQ6IE91dHB1dEZvcm1hdCk6IHN0cmluZyB7XG4gIHJldHVybiBmb3JtYXQgPT09IE91dHB1dEZvcm1hdC5FU00gPyAnaW5kZXgubWpzJyA6ICdpbmRleC5qcyc7XG59XG5cbi8qKiBWYWxpZGF0ZXMgdGhlIGVudHJ5IGZpbGUgYW5kIHJldHVybnMgaXRzIGFic29sdXRlIHBhdGguICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUVudHJ5KGVudHJ5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBhYnMgPSBwYXRoLnJlc29sdmUoZW50cnkpO1xuICBpZiAoIUVOVFJZX0VYVEVOU0lPTlMuaW5jbHVkZXMocGF0aC5leHRuYW1lKGFicykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBlbnRyeSBtdXN0IGJlIGEgSmF2YVNjcmlwdCBvciBUeXBlU2NyaXB0IGZpbGUgKCR7RU5UUllfRVhURU5TSU9OUy5qb2luKCcsICcpfSksIGdvdCAke2VudHJ5fWApO1xuICB9XG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBlbnRyeSBmaWxlIG5vdCBmb3VuZDogJHthYnN9YCk7XG4gIH1cbiAgcmV0dXJuIGFicztcbn1cblxuLyoqIFRoZSBuZWFyZXN0IGxvY2sgZmlsZSBhdCBvciBhYm92ZSBgZGlyYCwgb3IgdW5kZWZpbmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMb2NrRmlsZShkaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpcik7XG4gIGZvciAoOzspIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgTE9DS19GSUxFUykge1xuICAgICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnQsIG5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY2FuZGlkYXRlKSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGN1cnJlbnQpO1xuICAgIGlmIChwYXJlbnQgPT09IGN1cnJlbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY3VycmVudCA9IHBhcmVudDtcbiAgfVxufVxuXG4vKiogZXNidWlsZCdzIGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGZvciB0aGUgZ2l2ZW4gaW5wdXQgYW5kIG91dHB1dCBwYXRocy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2J1aWxkQXJncyhlbnRyeTogc3RyaW5nLCBvdXRmaWxlOiBzdHJpbmcsIG86IEVzYnVpbGRPcHRpb25zKTogc3RyaW5nW10ge1xuICBjb25zdCBiYW5uZXIgPSBbby5mb3JtYXQgPT09IE91dHB1dEZvcm1hdC5FU00gPyBFU01fUkVRVUlSRV9TSElNIDogdW5kZWZpbmVkLCBvLmJhbm5lcl0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ1xcbicpO1xuICByZXR1cm4gW1xuICAgIGVudHJ5LFxuICAgICctLWJ1bmRsZScsXG4gICAgJy0tcGxhdGZvcm09bm9kZScsXG4gICAgYC0tdGFyZ2V0PSR7by50YXJnZXR9YCxcbiAgICBgLS1mb3JtYXQ9JHtvLmZvcm1hdH1gLFxuICAgIGAtLW91dGZpbGU9JHtvdXRmaWxlfWAsXG4gICAgLi4uKG8ubWluaWZ5ID8gWyctLW1pbmlmeSddIDogW10pLFxuICAgIC4uLihvLnNvdXJjZU1hcCA/IFsnLS1zb3VyY2VtYXAnXSA6IFtdKSxcbiAgICAuLi4oby5rZWVwTmFtZXMgPyBbJy0ta2VlcC1uYW1lcyddIDogW10pLFxuICAgIC4uLihvLnRzY29uZmlnID8gW2AtLXRzY29uZmlnPSR7by50c2NvbmZpZ31gXSA6IFtdKSxcbiAgICAuLi5vLmV4dGVybmFsTW9kdWxlcy5tYXAoKG0pID0+IGAtLWV4dGVybmFsOiR7bX1gKSxcbiAgICAuLi5PYmplY3QuZW50cmllcyhvLmRlZmluZSkubWFwKChbaywgdl0pID0+IGAtLWRlZmluZToke2t9PSR7dn1gKSxcbiAgICAuLi5PYmplY3QuZW50cmllcyhvLmxvYWRlcikubWFwKChbZXh0LCBsXSkgPT4gYC0tbG9hZGVyOiR7ZXh0fT0ke2x9YCksXG4gICAgLi4uKGJhbm5lciA/IFtgLS1iYW5uZXI6anM9JHtiYW5uZXJ9YF0gOiBbXSksXG4gICAgLi4uKG8uZm9vdGVyID8gW2AtLWZvb3Rlcjpqcz0ke28uZm9vdGVyfWBdIDogW10pLFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKG8uZXNidWlsZEFyZ3MpLm1hcCgoW2ssIHZdKSA9PiAodiA9PT0gdHJ1ZSA/IGsgOiBgJHtrfT0ke3Z9YCkpLFxuICBdO1xufVxuXG4vKipcbiAqIEEgYGxhbWJkYS5Db2RlYCB0aGF0IGJ1bmRsZXMgdGhlIGVudHJ5IHdpdGggZXNidWlsZDogbG9jYWxseSB3aGVuIGVzYnVpbGQgaXMgaW5zdGFsbGVkIGluIHRoZVxuICogcHJvamVjdCwgb3RoZXJ3aXNlIGluIERvY2tlciAoYW4gYXJtNjQgTm9kZS5qcyBidWlsZCBpbWFnZSkuIFRoZSBhc3NldCBoYXNoIGNvdmVycyB0aGUgb3V0cHV0LFxuICogc28gYW4gdW5jaGFuZ2VkIGJ1bmRsZSBkb2Vzbid0IGNyZWF0ZSBhIG5ldyByZXZpc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1bmRsZWRDb2RlKHByb3BzOiBCdW5kbGVQcm9wcyk6IGxhbWJkYS5Db2RlIHtcbiAgY29uc3QgZmlsZSA9IG91dHB1dEZpbGUocHJvcHMuZXNidWlsZC5mb3JtYXQpO1xuICBjb25zdCB0c2NvbmZpZyA9IHRzY29uZmlnUGF0aChwcm9wcyk7XG5cbiAgcmV0dXJuIGxhbWJkYS5Db2RlLmZyb21Bc3NldChwcm9wcy5wcm9qZWN0Um9vdCwge1xuICAgIGFzc2V0SGFzaFR5cGU6IEFzc2V0SGFzaFR5cGUuT1VUUFVULFxuICAgIGJ1bmRsaW5nOiB7XG4gICAgICBpbWFnZTogcHJvcHMuZG9ja2VySW1hZ2UsXG4gICAgICBwbGF0Zm9ybTogJ2xpbnV4L2FybTY0JyxcbiAgICAgIGNvbW1hbmQ6IFsnYmFzaCcsICctYycsIGRvY2tlckNvbW1hbmQocHJvcHMpXSxcbiAgICAgIGVudmlyb25tZW50OiB7IG5wbV9jb25maWdfY2FjaGU6ICcvdG1wLy5ucG0nLCBucG1fY29uZmlnX3VwZGF0ZV9ub3RpZmllcjogJ2ZhbHNlJywgLi4ucHJvcHMuZW52aXJvbm1lbnQgfSxcbiAgICAgIGxvY2FsOiBwcm9wcy5mb3JjZURvY2tlckJ1bmRsaW5nID8gdW5kZWZpbmVkIDoge1xuICAgICAgICB0cnlCdW5kbGUob3V0cHV0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgICBpZiAoIWhhc0xvY2FsRXNidWlsZChwcm9wcy5wcm9qZWN0Um9vdCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBjb25zdCBhcmdzID0gZXNidWlsZEFyZ3MocHJvcHMuZW50cnksIHBhdGguam9pbihvdXRwdXREaXIsIGZpbGUpLCB7IC4uLnByb3BzLmVzYnVpbGQsIHRzY29uZmlnIH0pO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYygnbnB4JywgWyctLW5vLWluc3RhbGwnLCAnZXNidWlsZCcsIC4uLmFyZ3NdLCB7XG4gICAgICAgICAgICBjd2Q6IHByb3BzLnByb2plY3RSb290LFxuICAgICAgICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5wcm9wcy5lbnZpcm9ubWVudCB9LFxuICAgICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGVzYnVpbGQgZmFpbGVkIGZvciAke3Byb3BzLmVudHJ5fSAoZXhpdCAke3Jlc3VsdC5zdGF0dXMgPz8gcmVzdWx0LnNpZ25hbH0pYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcm9wcy5lc2J1aWxkLnNvdXJjZU1hcCkge1xuICAgICAgICAgICAgY29uc3QgcmV3cml0ZSA9IHNwYXduU3luYyhwcm9jZXNzLmV4ZWNQYXRoLCBbJy1lJywgU09VUkNFX01BUF9SRVdSSVRFX1NDUklQVCwgcGF0aC5qb2luKG91dHB1dERpciwgYCR7ZmlsZX0ubWFwYCksIHByb3BzLnByb2plY3RSb290XSwgeyBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgICAgICAgICAgaWYgKHJld3JpdGUuc3RhdHVzICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoYHJld3JpdGluZyB0aGUgc291cmNlIG1hcCBmb3IgJHtwcm9wcy5lbnRyeX0gZmFpbGVkYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqIFRoZSBzaGVsbCBjb21tYW5kIHRoYXQgYnVuZGxlcyBpbnNpZGUgdGhlIGNvbnRhaW5lciAocHJvamVjdCBhdCAvYXNzZXQtaW5wdXQsIG91dHB1dCB0byAvYXNzZXQtb3V0cHV0KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2NrZXJDb21tYW5kKHByb3BzOiBCdW5kbGVQcm9wcyk6IHN0cmluZyB7XG4gIGNvbnN0IGZpbGUgPSBvdXRwdXRGaWxlKHByb3BzLmVzYnVpbGQuZm9ybWF0KTtcbiAgY29uc3QgaW5Eb2NrZXIgPSAocDogc3RyaW5nKSA9PiBgL2Fzc2V0LWlucHV0LyR7cGF0aC5yZWxhdGl2ZShwcm9wcy5wcm9qZWN0Um9vdCwgcCkuc3BsaXQocGF0aC5zZXApLmpvaW4oJy8nKX1gO1xuICBjb25zdCB0c2NvbmZpZyA9IHRzY29uZmlnUGF0aChwcm9wcyk7XG4gIGNvbnN0IGFyZ3MgPSBlc2J1aWxkQXJncyhpbkRvY2tlcihwcm9wcy5lbnRyeSksIGAvYXNzZXQtb3V0cHV0LyR7ZmlsZX1gLCB7IC4uLnByb3BzLmVzYnVpbGQsIHRzY29uZmlnOiB0c2NvbmZpZyAmJiBpbkRvY2tlcih0c2NvbmZpZykgfSk7XG4gIHJldHVybiBbXG4gICAgLy8gSW5zdGFsbGVkIG91dHNpZGUgdGhlIG1vdW50ZWQgcHJvamVjdDogbnB4IHdvdWxkIHBpY2sgdXAgdGhlIHByb2plY3QncyBvd24gZXNidWlsZCwgYSBiaW5hcnkgZm9yIHRoZSBob3N0J3MgcGxhdGZvcm0uXG4gICAgWyducG0nLCAnaW5zdGFsbCcsICctLXByZWZpeCcsIERPQ0tFUl9FU0JVSUxEX1BSRUZJWCwgJy0tbm8tc2F2ZScsICctLW5vLWF1ZGl0JywgJy0tbm8tZnVuZCcsICctLWxvZ2xldmVsPWVycm9yJywgYGVzYnVpbGRAJHtET0NLRVJfRVNCVUlMRF9WRVJTSU9OfWBdLmpvaW4oJyAnKSxcbiAgICBbYCR7RE9DS0VSX0VTQlVJTERfUFJFRklYfS9ub2RlX21vZHVsZXMvLmJpbi9lc2J1aWxkYCwgLi4uYXJnc10ubWFwKHNoZWxsUXVvdGUpLmpvaW4oJyAnKSxcbiAgICAuLi4ocHJvcHMuZXNidWlsZC5zb3VyY2VNYXAgPyBbWydub2RlJywgJy1lJywgU09VUkNFX01BUF9SRVdSSVRFX1NDUklQVCwgYC9hc3NldC1vdXRwdXQvJHtmaWxlfS5tYXBgLCAnL2Fzc2V0LWlucHV0J10ubWFwKHNoZWxsUXVvdGUpLmpvaW4oJyAnKV0gOiBbXSksXG4gIF0uam9pbignICYmICcpO1xufVxuXG4vKiogVGhlIHRzY29uZmlnIGFzIGFuIGFic29sdXRlIHBhdGguIEEgcmVsYXRpdmUgb25lIGlzIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QsIGVzYnVpbGQncyB3b3JraW5nIGRpcmVjdG9yeS4gKi9cbmZ1bmN0aW9uIHRzY29uZmlnUGF0aChwcm9wczogQnVuZGxlUHJvcHMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcHJvcHMuZXNidWlsZC50c2NvbmZpZyA/IHBhdGgucmVzb2x2ZShwcm9wcy5wcm9qZWN0Um9vdCwgcHJvcHMuZXNidWlsZC50c2NvbmZpZykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsRXNidWlsZChwcm9qZWN0Um9vdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYygnbnB4JywgWyctLW5vLWluc3RhbGwnLCAnZXNidWlsZCcsICctLXZlcnNpb24nXSwgeyBjd2Q6IHByb2plY3RSb290LCBzdGRpbzogJ2lnbm9yZScgfSk7XG4gIHJldHVybiByZXN1bHQuc3RhdHVzID09PSAwO1xufVxuXG5mdW5jdGlvbiBzaGVsbFF1b3RlKGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9eW1xcd0AlKz06LC4vLV0rJC8udGVzdChhcmcpID8gYXJnIDogYCcke2FyZy5yZXBsYWNlKC8nL2csIFwiJ1xcXFwnJ1wiKX0nYDtcbn1cbiJdfQ==
@@ -48,7 +48,7 @@ const validation_1 = require("./private/validation");
48
48
  * Only `WebFunction` creates endpoints in this version (one per function), so the constructor is private.
49
49
  */
50
50
  class WebFunctionEndpoint extends constructs_1.Construct {
51
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.0" };
51
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.1" };
52
52
  /**
53
53
  * Creates the endpoint of a Web Function. Used by `WebFunction`.
54
54
  *