@ashishpandeyone/cdk-lambda-web-function 0.1.0 → 0.1.2
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/.jsii +1457 -135
- package/.jsii.tabl.json +1 -1
- package/API.md +2349 -238
- package/README.md +133 -7
- package/assets/web-function-deployment/index.js +58 -0
- package/assets/web-function-provider/index.js +23 -23
- package/lib/index.d.ts +3 -0
- package/lib/index.js +4 -1
- package/lib/nodejs-web-function.d.ts +153 -0
- package/lib/nodejs-web-function.js +113 -0
- package/lib/private/bundling.d.ts +68 -0
- package/lib/private/bundling.js +192 -0
- package/lib/private/provider-protocol.d.ts +40 -0
- package/lib/private/provider-protocol.js +9 -2
- package/lib/private/provider.js +2 -2
- package/lib/private/revision-cleanup.d.ts +19 -0
- package/lib/private/revision-cleanup.js +38 -0
- package/lib/private/traffic-shift.d.ts +20 -0
- package/lib/private/traffic-shift.js +143 -0
- package/lib/web-function-deployment.d.ts +89 -0
- package/lib/web-function-deployment.js +90 -0
- package/lib/web-function-endpoint.d.ts +122 -19
- package/lib/web-function-endpoint.js +139 -18
- package/lib/web-function-grants.d.ts +2 -2
- package/lib/web-function-grants.js +4 -4
- package/lib/web-function-revision.d.ts +45 -0
- package/lib/web-function-revision.js +40 -0
- package/lib/web-function.d.ts +60 -25
- package/lib/web-function.js +80 -26
- package/package.json +7 -2
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -18,4 +18,7 @@ __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
|
-
|
|
21
|
+
__exportStar(require("./nodejs-web-function"), exports);
|
|
22
|
+
__exportStar(require("./web-function-revision"), exports);
|
|
23
|
+
__exportStar(require("./web-function-deployment"), exports);
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBDQUF3QjtBQUN4QixpREFBK0I7QUFDL0IsMERBQXdDO0FBQ3hDLHdEQUFzQztBQUN0Qyx3REFBc0M7QUFDdEMsMERBQXdDO0FBQ3hDLDREQUEwQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi93ZWItZnVuY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi93ZWItZnVuY3Rpb24tZW5kcG9pbnQnO1xuZXhwb3J0ICogZnJvbSAnLi93ZWItZnVuY3Rpb24tZ3JhbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vbm9kZWpzLXdlYi1mdW5jdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3dlYi1mdW5jdGlvbi1yZXZpc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL3dlYi1mdW5jdGlvbi1kZXBsb3ltZW50JztcbiJdfQ==
|
|
@@ -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.2" };
|
|
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==
|
|
@@ -40,3 +40,43 @@ export interface EndpointLookupProperties {
|
|
|
40
40
|
}
|
|
41
41
|
/** Attribute name holding the domain of one region, e.g. `Domain.us-east-1`. */
|
|
42
42
|
export declare function regionalDomainAttribute(region: string): string;
|
|
43
|
+
/** Deletes a function's oldest revisions beyond a count, except those that are in use or may be rolled back to. */
|
|
44
|
+
export declare const REVISION_CLEANUP_RESOURCE_TYPE = "Custom::LambdaWebRevisionCleanup";
|
|
45
|
+
export interface RevisionCleanupProperties {
|
|
46
|
+
readonly FunctionArn: string;
|
|
47
|
+
/** How many of the newest revisions to keep. */
|
|
48
|
+
readonly Keep: string;
|
|
49
|
+
/**
|
|
50
|
+
* Revisions the template uses (the current one and any an endpoint routes to). Always kept, and on an update
|
|
51
|
+
* the previous template's are kept too: they're what a rollback routes back to.
|
|
52
|
+
*/
|
|
53
|
+
readonly RevisionIds: string[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Moves an endpoint's traffic to a revision in steps, watching alarms (canary and linear deployments).
|
|
57
|
+
* Served by the deployment provider (`handlers/web-function-deployment`), not the shared provider: it can run for up to an hour.
|
|
58
|
+
*/
|
|
59
|
+
export declare const TRAFFIC_SHIFT_RESOURCE_TYPE = "Custom::LambdaWebTrafficShift";
|
|
60
|
+
export interface TrafficShiftProperties {
|
|
61
|
+
readonly FunctionArn: string;
|
|
62
|
+
readonly EndpointName: string;
|
|
63
|
+
/** The revision that ends up with all of the endpoint's traffic. */
|
|
64
|
+
readonly RevisionId: string;
|
|
65
|
+
/** The revision's share of traffic at each step, in percent, comma-separated; the last is 100. */
|
|
66
|
+
readonly Steps: string;
|
|
67
|
+
/** Seconds each step serves (counted from when its update started) before the next. */
|
|
68
|
+
readonly WaitSeconds: string;
|
|
69
|
+
/** Alarms (in any region) that stop the deployment and restore the previous weights. */
|
|
70
|
+
readonly AlarmArns?: string[];
|
|
71
|
+
/** Hash of the endpoint's other settings: any endpoint change re-checks its traffic before CloudFormation writes it. */
|
|
72
|
+
readonly EndpointConfig: string;
|
|
73
|
+
}
|
|
74
|
+
/** What `onEvent` hands to `isComplete` (the Provider framework passes it as `Data`). */
|
|
75
|
+
export interface TrafficShiftState {
|
|
76
|
+
/** `none`: nothing to do; `shift`: moving in steps; `switch`: all at once, without alarms (stack rollback). */
|
|
77
|
+
readonly Action: 'none' | 'shift' | 'switch';
|
|
78
|
+
/** `shift`: the endpoint's weights before the deployment (JSON `[{revisionId, weight}]`), restored when an alarm fires. */
|
|
79
|
+
readonly PreviousWeights?: string;
|
|
80
|
+
/** `switch`: the weights being written (JSON `[{revisionId, weight}]`). */
|
|
81
|
+
readonly TargetWeights?: string;
|
|
82
|
+
}
|