@aws-cdk-testing/cli-integ 0.0.0
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/.eslintrc.js +9 -0
- package/LICENSE +202 -0
- package/NOTICE +16 -0
- package/README.md +205 -0
- package/bin/apply-patches +22 -0
- package/bin/download-and-run-old-tests +52 -0
- package/bin/query-github +2 -0
- package/bin/query-github.d.ts +1 -0
- package/bin/query-github.js +54 -0
- package/bin/query-github.ts +56 -0
- package/bin/run-suite +2 -0
- package/bin/run-suite.d.ts +1 -0
- package/bin/run-suite.js +131 -0
- package/bin/run-suite.ts +140 -0
- package/bin/stage-distribution +2 -0
- package/bin/stage-distribution.d.ts +1 -0
- package/bin/stage-distribution.js +217 -0
- package/bin/stage-distribution.ts +267 -0
- package/bin/test-root +2 -0
- package/bin/test-root.d.ts +1 -0
- package/bin/test-root.js +6 -0
- package/bin/test-root.ts +3 -0
- package/entrypoints/test-cli-regression-against-current-code.sh +11 -0
- package/entrypoints/test-cli-regression-against-latest-release.sh +11 -0
- package/entrypoints/test-cli-regression.bash +83 -0
- package/entrypoints/test.sh +12 -0
- package/lib/aws.d.ts +51 -0
- package/lib/aws.js +206 -0
- package/lib/aws.ts +263 -0
- package/lib/corking.d.ts +12 -0
- package/lib/corking.js +35 -0
- package/lib/corking.ts +33 -0
- package/lib/eventually.d.ts +20 -0
- package/lib/eventually.js +34 -0
- package/lib/eventually.ts +42 -0
- package/lib/files.d.ts +15 -0
- package/lib/files.js +80 -0
- package/lib/files.ts +80 -0
- package/lib/github.d.ts +4 -0
- package/lib/github.js +43 -0
- package/lib/github.ts +43 -0
- package/lib/index.d.ts +13 -0
- package/lib/index.js +30 -0
- package/lib/index.ts +13 -0
- package/lib/integ-test.d.ts +10 -0
- package/lib/integ-test.js +70 -0
- package/lib/integ-test.ts +81 -0
- package/lib/lists.d.ts +1 -0
- package/lib/lists.js +11 -0
- package/lib/lists.ts +9 -0
- package/lib/memoize.d.ts +6 -0
- package/lib/memoize.js +18 -0
- package/lib/memoize.ts +14 -0
- package/lib/npm.d.ts +8 -0
- package/lib/npm.js +38 -0
- package/lib/npm.ts +41 -0
- package/lib/package-sources/release-source.d.ts +23 -0
- package/lib/package-sources/release-source.js +71 -0
- package/lib/package-sources/release-source.ts +81 -0
- package/lib/package-sources/repo-source.d.ts +30 -0
- package/lib/package-sources/repo-source.js +97 -0
- package/lib/package-sources/repo-source.ts +111 -0
- package/lib/package-sources/repo-tools/npm +2 -0
- package/lib/package-sources/repo-tools/npm.d.ts +1 -0
- package/lib/package-sources/repo-tools/npm.js +43 -0
- package/lib/package-sources/repo-tools/npm.ts +48 -0
- package/lib/package-sources/source.d.ts +28 -0
- package/lib/package-sources/source.js +3 -0
- package/lib/package-sources/source.ts +35 -0
- package/lib/package-sources/subprocess.d.ts +3 -0
- package/lib/package-sources/subprocess.js +17 -0
- package/lib/package-sources/subprocess.ts +15 -0
- package/lib/resource-pool.d.ts +50 -0
- package/lib/resource-pool.js +117 -0
- package/lib/resource-pool.ts +140 -0
- package/lib/resources.d.ts +1 -0
- package/lib/resources.js +6 -0
- package/lib/resources.ts +4 -0
- package/lib/shell.d.ts +56 -0
- package/lib/shell.js +123 -0
- package/lib/shell.ts +168 -0
- package/lib/staging/codeartifact.d.ts +44 -0
- package/lib/staging/codeartifact.js +281 -0
- package/lib/staging/codeartifact.ts +387 -0
- package/lib/staging/maven.d.ts +5 -0
- package/lib/staging/maven.js +91 -0
- package/lib/staging/maven.ts +95 -0
- package/lib/staging/npm.d.ts +4 -0
- package/lib/staging/npm.js +55 -0
- package/lib/staging/npm.ts +62 -0
- package/lib/staging/nuget.d.ts +4 -0
- package/lib/staging/nuget.js +69 -0
- package/lib/staging/nuget.ts +75 -0
- package/lib/staging/parallel-shell.d.ts +5 -0
- package/lib/staging/parallel-shell.js +45 -0
- package/lib/staging/parallel-shell.ts +51 -0
- package/lib/staging/pypi.d.ts +4 -0
- package/lib/staging/pypi.js +48 -0
- package/lib/staging/pypi.ts +50 -0
- package/lib/staging/usage-dir.d.ts +31 -0
- package/lib/staging/usage-dir.js +87 -0
- package/lib/staging/usage-dir.ts +99 -0
- package/lib/with-aws.d.ts +14 -0
- package/lib/with-aws.js +60 -0
- package/lib/with-aws.ts +67 -0
- package/lib/with-cdk-app.d.ts +210 -0
- package/lib/with-cdk-app.js +539 -0
- package/lib/with-cdk-app.ts +742 -0
- package/lib/with-cli-lib.d.ts +17 -0
- package/lib/with-cli-lib.js +123 -0
- package/lib/with-cli-lib.ts +134 -0
- package/lib/with-packages.d.ts +5 -0
- package/lib/with-packages.js +13 -0
- package/lib/with-packages.ts +15 -0
- package/lib/with-sam.d.ts +33 -0
- package/lib/with-sam.js +258 -0
- package/lib/with-sam.ts +288 -0
- package/lib/with-temporary-directory.d.ts +5 -0
- package/lib/with-temporary-directory.js +31 -0
- package/lib/with-temporary-directory.ts +35 -0
- package/lib/with-timeout.d.ts +19 -0
- package/lib/with-timeout.js +34 -0
- package/lib/with-timeout.ts +33 -0
- package/lib/xpmutex.d.ts +43 -0
- package/lib/xpmutex.js +207 -0
- package/lib/xpmutex.ts +218 -0
- package/package.json +111 -0
- package/resources/bootstrap-templates/session-tags.all-roles-deny-all.yaml +703 -0
- package/resources/bootstrap-templates/session-tags.deploy-role-deny-sqs.yaml +700 -0
- package/resources/cdk-apps/app/app.js +926 -0
- package/resources/cdk-apps/app/appsync.hotswap.graphql +3 -0
- package/resources/cdk-apps/app/cdk.json +7 -0
- package/resources/cdk-apps/app/docker/Dockerfile +2 -0
- package/resources/cdk-apps/app/docker/Dockerfile.Custom +2 -0
- package/resources/cdk-apps/app/lambda/index.js +4 -0
- package/resources/cdk-apps/app/lambda/response.json +3 -0
- package/resources/cdk-apps/app/nested-stack.js +65 -0
- package/resources/cdk-apps/cfn-include-app/cdk.json +4 -0
- package/resources/cdk-apps/cfn-include-app/cfn-include-app.js +21 -0
- package/resources/cdk-apps/cfn-include-app/example-template.json +13 -0
- package/resources/cdk-apps/rollback-test-app/app.js +110 -0
- package/resources/cdk-apps/rollback-test-app/cdk.json +7 -0
- package/resources/cdk-apps/sam_cdk_integ_app/bin/test-app.js +11 -0
- package/resources/cdk-apps/sam_cdk_integ_app/cdk.json +6 -0
- package/resources/cdk-apps/sam_cdk_integ_app/lib/nested-stack.js +19 -0
- package/resources/cdk-apps/sam_cdk_integ_app/lib/test-stack.js +134 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/.no-packagejson-validator +0 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/Dockerfile +9 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/app.js +22 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/package.json +18 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/go.mod +5 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/go.sum +17 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/main.go +17 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/.no-packagejson-validator +0 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/app.ts +16 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/package-lock.json +12 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/package.json +5 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/python/Function/app.py +15 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/python/Function/requirements.txt +1 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/python/Layer/layer_version_dependency.py +5 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/python/Layer/requirements.txt +1 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/rest-api-definition.yaml +12 -0
- package/resources/cdk-apps/simple-app/app.js +26 -0
- package/resources/cdk-apps/simple-app/cdk.json +7 -0
- package/resources/cli-regression-patches/v1.119.0/NOTES.md +5 -0
- package/resources/cli-regression-patches/v1.119.0/cli.integtest.js +659 -0
- package/resources/cli-regression-patches/v1.130.0/NOTES.md +12 -0
- package/resources/cli-regression-patches/v1.130.0/app/app.js +378 -0
- package/resources/cli-regression-patches/v1.130.0/bootstrapping.integtest.js +220 -0
- package/resources/cli-regression-patches/v1.44.0/NOTES.md +18 -0
- package/resources/cli-regression-patches/v1.44.0/bootstrapping.integtest.js +126 -0
- package/resources/cli-regression-patches/v1.44.0/test.sh +26 -0
- package/resources/cli-regression-patches/v1.61.1/NOTES.md +2 -0
- package/resources/cli-regression-patches/v1.61.1/skip-tests.txt +16 -0
- package/resources/cli-regression-patches/v1.62.0/NOTES.md +2 -0
- package/resources/cli-regression-patches/v1.62.0/aws-helpers.js +245 -0
- package/resources/cli-regression-patches/v1.63.0/NOTES.md +1 -0
- package/resources/cli-regression-patches/v1.63.0/skip-tests.txt +7 -0
- package/resources/cli-regression-patches/v1.64.0/NOTES.md +3 -0
- package/resources/cli-regression-patches/v1.64.0/cdk-helpers.js +325 -0
- package/resources/cli-regression-patches/v1.64.0/cli.integtest.js +599 -0
- package/resources/cli-regression-patches/v1.64.1/NOTES.md +3 -0
- package/resources/cli-regression-patches/v1.64.1/cdk-helpers.js +324 -0
- package/resources/cli-regression-patches/v1.64.1/cli.integtest.js +599 -0
- package/resources/cli-regression-patches/v1.67.0/NOTES.md +2 -0
- package/resources/cli-regression-patches/v1.67.0/cdk-helpers.js +331 -0
- package/resources/cli-regression-patches/v2.130.0/NOTES.md +1 -0
- package/resources/cli-regression-patches/v2.130.0/node_modules/@aws-cdk-testing/cli-integ/resources/cdk-apps/sam_cdk_integ_app/lib/nested-stack.js +19 -0
- package/resources/cli-regression-patches/v2.130.0/node_modules/@aws-cdk-testing/cli-integ/resources/cdk-apps/sam_cdk_integ_app/lib/test-stack.js +134 -0
- package/resources/cli-regression-patches/v2.130.0/skip-tests.txt +5 -0
- package/resources/cli-regression-patches/v2.132.0/NOTES.md +1 -0
- package/resources/cli-regression-patches/v2.132.0/skip-tests.txt +4 -0
- package/resources/cli-regression-patches/v2.142.0/NOTES.md +1 -0
- package/resources/cli-regression-patches/v2.142.0/skip-tests.txt +4 -0
- package/resources/cli-regression-patches/v2.160.0/skip-tests.txt +2 -0
- package/resources/cli-regression-patches/v2.161.0/NOTES.md +1 -0
- package/resources/cli-regression-patches/v2.161.0/skip-tests.txt +5 -0
- package/resources/cli-regression-patches/v2.166.0/NOTES.md +1 -0
- package/resources/cli-regression-patches/v2.166.0/skip-tests.txt +2 -0
- package/resources/cloud-assemblies/0.36.0/InitStack.template.json +1 -0
- package/resources/cloud-assemblies/0.36.0/cdk.out +1 -0
- package/resources/cloud-assemblies/0.36.0/manifest.json +19 -0
- package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/InitStack.template.json +2 -0
- package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/cdk.out +1 -0
- package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/manifest.json.js +37 -0
- package/resources/cloud-assemblies/1.10.0-request-azs/InitStack.template.json +2 -0
- package/resources/cloud-assemblies/1.10.0-request-azs/cdk.out +1 -0
- package/resources/cloud-assemblies/1.10.0-request-azs/manifest.json.js +34 -0
- package/resources/integ.jest.config.js +25 -0
- package/resources/templates/sqs-template.json +36 -0
- package/skip-tests.txt +8 -0
- package/tests/cli-integ-tests/README.md +47 -0
- package/tests/cli-integ-tests/bootstrapping.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/bootstrapping.integtest.js +412 -0
- package/tests/cli-integ-tests/bootstrapping.integtest.ts +493 -0
- package/tests/cli-integ-tests/cli-lib.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/cli-lib.integtest.js +62 -0
- package/tests/cli-integ-tests/cli-lib.integtest.ts +90 -0
- package/tests/cli-integ-tests/cli.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/cli.integtest.js +2104 -0
- package/tests/cli-integ-tests/cli.integtest.ts +2874 -0
- package/tests/cli-integ-tests/garbage-collection.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/garbage-collection.integtest.js +314 -0
- package/tests/cli-integ-tests/garbage-collection.integtest.ts +392 -0
- package/tests/init-csharp/init-csharp.integtest.d.ts +1 -0
- package/tests/init-csharp/init-csharp.integtest.js +14 -0
- package/tests/init-csharp/init-csharp.integtest.ts +15 -0
- package/tests/init-fsharp/init-fsharp.integtest.d.ts +1 -0
- package/tests/init-fsharp/init-fsharp.integtest.js +14 -0
- package/tests/init-fsharp/init-fsharp.integtest.ts +15 -0
- package/tests/init-go/init-go.integtest.d.ts +1 -0
- package/tests/init-go/init-go.integtest.js +21 -0
- package/tests/init-go/init-go.integtest.ts +23 -0
- package/tests/init-java/init-java.integtest.d.ts +1 -0
- package/tests/init-java/init-java.integtest.js +14 -0
- package/tests/init-java/init-java.integtest.ts +14 -0
- package/tests/init-javascript/init-javascript.integtest.d.ts +1 -0
- package/tests/init-javascript/init-javascript.integtest.js +53 -0
- package/tests/init-javascript/init-javascript.integtest.ts +59 -0
- package/tests/init-python/init-python.integtest.d.ts +1 -0
- package/tests/init-python/init-python.integtest.js +19 -0
- package/tests/init-python/init-python.integtest.ts +20 -0
- package/tests/init-typescript-app/init-typescript-app.integtest.d.ts +1 -0
- package/tests/init-typescript-app/init-typescript-app.integtest.js +54 -0
- package/tests/init-typescript-app/init-typescript-app.integtest.ts +66 -0
- package/tests/init-typescript-lib/init-typescript-lib.integtest.d.ts +1 -0
- package/tests/init-typescript-lib/init-typescript-lib.integtest.js +13 -0
- package/tests/init-typescript-lib/init-typescript-lib.integtest.ts +13 -0
- package/tests/tool-integrations/amplify.integtest.d.ts +1 -0
- package/tests/tool-integrations/amplify.integtest.js +39 -0
- package/tests/tool-integrations/amplify.integtest.ts +43 -0
- package/tests/tool-integrations/with-tool-context.d.ts +9 -0
- package/tests/tool-integrations/with-tool-context.js +13 -0
- package/tests/tool-integrations/with-tool-context.ts +14 -0
- package/tests/uberpackage/uberpackage.integtest.d.ts +1 -0
- package/tests/uberpackage/uberpackage.integtest.js +11 -0
- package/tests/uberpackage/uberpackage.integtest.ts +11 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param maxAttempts the maximum number of attempts
|
|
3
|
+
* @param interval interval in milliseconds to observe between attempts
|
|
4
|
+
*/
|
|
5
|
+
export type EventuallyOptions = {
|
|
6
|
+
maxAttempts?: number;
|
|
7
|
+
interval?: number;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const wait = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));
|
|
11
|
+
const DEFAULT_INTERVAL = 1000;
|
|
12
|
+
const DEFAULT_MAX_ATTEMPTS = 10;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Runs a function on an interval until the maximum number of attempts has
|
|
16
|
+
* been reached.
|
|
17
|
+
*
|
|
18
|
+
* Default interval = 1000 milliseconds
|
|
19
|
+
* Default maxAttempts = 10
|
|
20
|
+
*
|
|
21
|
+
* @param fn function to run
|
|
22
|
+
* @param options EventuallyOptions
|
|
23
|
+
*/
|
|
24
|
+
const eventually = async <T>(call: () => Promise<T>, options?: EventuallyOptions): Promise<T> => {
|
|
25
|
+
const opts = {
|
|
26
|
+
interval: options?.interval ? options.interval : DEFAULT_INTERVAL,
|
|
27
|
+
maxAttempts: options?.maxAttempts ? options.maxAttempts : DEFAULT_MAX_ATTEMPTS,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
while (opts.maxAttempts-- >= 0) {
|
|
31
|
+
try {
|
|
32
|
+
return await call();
|
|
33
|
+
} catch (err) {
|
|
34
|
+
if (opts.maxAttempts <= 0) throw err;
|
|
35
|
+
}
|
|
36
|
+
await wait(opts.interval);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
throw new Error('An unexpected error has occurred.');
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export default eventually;
|
package/lib/files.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function rmFile(filename: string): Promise<void>;
|
|
2
|
+
export declare function addToFile(filename: string, line: string): Promise<void>;
|
|
3
|
+
export declare function writeFile(filename: string, contents: string): Promise<void>;
|
|
4
|
+
export declare function copyDirectoryContents(dir: string, target: string): Promise<void>;
|
|
5
|
+
export declare function findUp(name: string, directory?: string): string | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* Docker-safe home directory
|
|
8
|
+
*/
|
|
9
|
+
export declare function homeDir(): string;
|
|
10
|
+
export declare function loadLines(filename: string): Promise<string[]>;
|
|
11
|
+
export declare function writeLines(filename: string, lines: string[]): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Update a spaceless ini file in place
|
|
14
|
+
*/
|
|
15
|
+
export declare function updateIniKey(lines: string[], key: string, value: string): void;
|
package/lib/files.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rmFile = rmFile;
|
|
4
|
+
exports.addToFile = addToFile;
|
|
5
|
+
exports.writeFile = writeFile;
|
|
6
|
+
exports.copyDirectoryContents = copyDirectoryContents;
|
|
7
|
+
exports.findUp = findUp;
|
|
8
|
+
exports.homeDir = homeDir;
|
|
9
|
+
exports.loadLines = loadLines;
|
|
10
|
+
exports.writeLines = writeLines;
|
|
11
|
+
exports.updateIniKey = updateIniKey;
|
|
12
|
+
const os = require("os");
|
|
13
|
+
const path = require("path");
|
|
14
|
+
const fs = require("fs-extra");
|
|
15
|
+
async function rmFile(filename) {
|
|
16
|
+
if (await fs.pathExists(filename)) {
|
|
17
|
+
await fs.unlink(filename);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function addToFile(filename, line) {
|
|
21
|
+
let contents = await fs.pathExists(filename) ? await fs.readFile(filename, { encoding: 'utf-8' }) : '';
|
|
22
|
+
if (!contents.endsWith('\n')) {
|
|
23
|
+
contents += '\n';
|
|
24
|
+
}
|
|
25
|
+
contents += line + '\n';
|
|
26
|
+
await writeFile(filename, contents);
|
|
27
|
+
}
|
|
28
|
+
async function writeFile(filename, contents) {
|
|
29
|
+
await fs.mkdirp(path.dirname(filename));
|
|
30
|
+
await fs.writeFile(filename, contents, { encoding: 'utf-8' });
|
|
31
|
+
}
|
|
32
|
+
async function copyDirectoryContents(dir, target) {
|
|
33
|
+
for (const file of await fs.readdir(path.join(dir), { encoding: 'utf-8' })) {
|
|
34
|
+
await fs.copyFile(path.join(dir, file), path.join(target, file));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function findUp(name, directory = process.cwd()) {
|
|
38
|
+
const absoluteDirectory = path.resolve(directory);
|
|
39
|
+
const file = path.join(directory, name);
|
|
40
|
+
if (fs.existsSync(file)) {
|
|
41
|
+
return file;
|
|
42
|
+
}
|
|
43
|
+
const { root } = path.parse(absoluteDirectory);
|
|
44
|
+
if (absoluteDirectory == root) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
return findUp(name, path.dirname(absoluteDirectory));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Docker-safe home directory
|
|
51
|
+
*/
|
|
52
|
+
function homeDir() {
|
|
53
|
+
var _a;
|
|
54
|
+
return (_a = os.userInfo().homedir) !== null && _a !== void 0 ? _a : os.homedir();
|
|
55
|
+
}
|
|
56
|
+
async function loadLines(filename) {
|
|
57
|
+
return await fs.pathExists(filename) ? (await fs.readFile(filename, { encoding: 'utf-8' })).trim().split('\n') : [];
|
|
58
|
+
}
|
|
59
|
+
async function writeLines(filename, lines) {
|
|
60
|
+
// Must end in a newline or our bash script won't read it properly
|
|
61
|
+
await fs.writeFile(filename, lines.join('\n') + '\n', { encoding: 'utf-8' });
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Update a spaceless ini file in place
|
|
65
|
+
*/
|
|
66
|
+
function updateIniKey(lines, key, value) {
|
|
67
|
+
const prefix = `${key}=`;
|
|
68
|
+
let found = false;
|
|
69
|
+
for (let i = 0; i < lines.length; i++) {
|
|
70
|
+
if (lines[i].startsWith(prefix)) {
|
|
71
|
+
lines[i] = prefix + value;
|
|
72
|
+
found = true;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (!found) {
|
|
77
|
+
lines.push(prefix + value);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmaWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLHdCQUlDO0FBRUQsOEJBUUM7QUFFRCw4QkFHQztBQUVELHNEQUlDO0FBRUQsd0JBY0M7QUFLRCwwQkFFQztBQUVELDhCQUVDO0FBRUQsZ0NBR0M7QUFLRCxvQ0FhQztBQS9FRCx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLCtCQUErQjtBQUV4QixLQUFLLFVBQVUsTUFBTSxDQUFDLFFBQWdCO0lBQzNDLElBQUksTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVCLENBQUM7QUFDSCxDQUFDO0FBRU0sS0FBSyxVQUFVLFNBQVMsQ0FBQyxRQUFnQixFQUFFLElBQVk7SUFDNUQsSUFBSSxRQUFRLEdBQUcsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN2RyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzdCLFFBQVEsSUFBSSxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNELFFBQVEsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBRXhCLE1BQU0sU0FBUyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRU0sS0FBSyxVQUFVLFNBQVMsQ0FBQyxRQUFnQixFQUFFLFFBQWdCO0lBQ2hFLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDeEMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRU0sS0FBSyxVQUFVLHFCQUFxQixDQUFDLEdBQVcsRUFBRSxNQUFjO0lBQ3JFLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzNFLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsTUFBTSxDQUFDLElBQVksRUFBRSxZQUFvQixPQUFPLENBQUMsR0FBRyxFQUFFO0lBQ3BFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUVsRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9DLElBQUksaUJBQWlCLElBQUksSUFBSSxFQUFFLENBQUM7UUFDOUIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixPQUFPOztJQUNyQixPQUFPLE1BQUEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sbUNBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQy9DLENBQUM7QUFFTSxLQUFLLFVBQVUsU0FBUyxDQUFDLFFBQWdCO0lBQzlDLE9BQU8sTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3RILENBQUM7QUFFTSxLQUFLLFVBQVUsVUFBVSxDQUFDLFFBQWdCLEVBQUUsS0FBZTtJQUNoRSxrRUFBa0U7SUFDbEUsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFlBQVksQ0FBQyxLQUFlLEVBQUUsR0FBVyxFQUFFLEtBQWE7SUFDdEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUN6QixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUMxQixLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2IsTUFBTTtRQUNSLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcm1GaWxlKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgaWYgKGF3YWl0IGZzLnBhdGhFeGlzdHMoZmlsZW5hbWUpKSB7XG4gICAgYXdhaXQgZnMudW5saW5rKGZpbGVuYW1lKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkVG9GaWxlKGZpbGVuYW1lOiBzdHJpbmcsIGxpbmU6IHN0cmluZykge1xuICBsZXQgY29udGVudHMgPSBhd2FpdCBmcy5wYXRoRXhpc3RzKGZpbGVuYW1lKSA/IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVuYW1lLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pIDogJyc7XG4gIGlmICghY29udGVudHMuZW5kc1dpdGgoJ1xcbicpKSB7XG4gICAgY29udGVudHMgKz0gJ1xcbic7XG4gIH1cbiAgY29udGVudHMgKz0gbGluZSArICdcXG4nO1xuXG4gIGF3YWl0IHdyaXRlRmlsZShmaWxlbmFtZSwgY29udGVudHMpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlKGZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnRzOiBzdHJpbmcpIHtcbiAgYXdhaXQgZnMubWtkaXJwKHBhdGguZGlybmFtZShmaWxlbmFtZSkpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZW5hbWUsIGNvbnRlbnRzLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weURpcmVjdG9yeUNvbnRlbnRzKGRpcjogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZykge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucmVhZGRpcihwYXRoLmpvaW4oZGlyKSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KSkge1xuICAgIGF3YWl0IGZzLmNvcHlGaWxlKHBhdGguam9pbihkaXIsIGZpbGUpLCBwYXRoLmpvaW4odGFyZ2V0LCBmaWxlKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRVcChuYW1lOiBzdHJpbmcsIGRpcmVjdG9yeTogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFic29sdXRlRGlyZWN0b3J5ID0gcGF0aC5yZXNvbHZlKGRpcmVjdG9yeSk7XG5cbiAgY29uc3QgZmlsZSA9IHBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlKSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgY29uc3QgeyByb290IH0gPSBwYXRoLnBhcnNlKGFic29sdXRlRGlyZWN0b3J5KTtcbiAgaWYgKGFic29sdXRlRGlyZWN0b3J5ID09IHJvb3QpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGZpbmRVcChuYW1lLCBwYXRoLmRpcm5hbWUoYWJzb2x1dGVEaXJlY3RvcnkpKTtcbn1cblxuLyoqXG4gKiBEb2NrZXItc2FmZSBob21lIGRpcmVjdG9yeVxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9tZURpcigpIHtcbiAgcmV0dXJuIG9zLnVzZXJJbmZvKCkuaG9tZWRpciA/PyBvcy5ob21lZGlyKCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkTGluZXMoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgcmV0dXJuIGF3YWl0IGZzLnBhdGhFeGlzdHMoZmlsZW5hbWUpID8gKGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVuYW1lLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pKS50cmltKCkuc3BsaXQoJ1xcbicpIDogW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUxpbmVzKGZpbGVuYW1lOiBzdHJpbmcsIGxpbmVzOiBzdHJpbmdbXSkge1xuICAvLyBNdXN0IGVuZCBpbiBhIG5ld2xpbmUgb3Igb3VyIGJhc2ggc2NyaXB0IHdvbid0IHJlYWQgaXQgcHJvcGVybHlcbiAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVuYW1lLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBhIHNwYWNlbGVzcyBpbmkgZmlsZSBpbiBwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlSW5pS2V5KGxpbmVzOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7a2V5fT1gO1xuICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIGxpbmVzW2ldID0gcHJlZml4ICsgdmFsdWU7XG4gICAgICBmb3VuZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKCFmb3VuZCkge1xuICAgIGxpbmVzLnB1c2gocHJlZml4ICsgdmFsdWUpO1xuICB9XG59XG4iXX0=
|
package/lib/files.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import * as os from 'os';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as fs from 'fs-extra';
|
|
4
|
+
|
|
5
|
+
export async function rmFile(filename: string) {
|
|
6
|
+
if (await fs.pathExists(filename)) {
|
|
7
|
+
await fs.unlink(filename);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export async function addToFile(filename: string, line: string) {
|
|
12
|
+
let contents = await fs.pathExists(filename) ? await fs.readFile(filename, { encoding: 'utf-8' }) : '';
|
|
13
|
+
if (!contents.endsWith('\n')) {
|
|
14
|
+
contents += '\n';
|
|
15
|
+
}
|
|
16
|
+
contents += line + '\n';
|
|
17
|
+
|
|
18
|
+
await writeFile(filename, contents);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export async function writeFile(filename: string, contents: string) {
|
|
22
|
+
await fs.mkdirp(path.dirname(filename));
|
|
23
|
+
await fs.writeFile(filename, contents, { encoding: 'utf-8' });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function copyDirectoryContents(dir: string, target: string) {
|
|
27
|
+
for (const file of await fs.readdir(path.join(dir), { encoding: 'utf-8' })) {
|
|
28
|
+
await fs.copyFile(path.join(dir, file), path.join(target, file));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function findUp(name: string, directory: string = process.cwd()): string | undefined {
|
|
33
|
+
const absoluteDirectory = path.resolve(directory);
|
|
34
|
+
|
|
35
|
+
const file = path.join(directory, name);
|
|
36
|
+
if (fs.existsSync(file)) {
|
|
37
|
+
return file;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const { root } = path.parse(absoluteDirectory);
|
|
41
|
+
if (absoluteDirectory == root) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return findUp(name, path.dirname(absoluteDirectory));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Docker-safe home directory
|
|
50
|
+
*/
|
|
51
|
+
export function homeDir() {
|
|
52
|
+
return os.userInfo().homedir ?? os.homedir();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export async function loadLines(filename: string): Promise<string[]> {
|
|
56
|
+
return await fs.pathExists(filename) ? (await fs.readFile(filename, { encoding: 'utf-8' })).trim().split('\n') : [];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function writeLines(filename: string, lines: string[]) {
|
|
60
|
+
// Must end in a newline or our bash script won't read it properly
|
|
61
|
+
await fs.writeFile(filename, lines.join('\n') + '\n', { encoding: 'utf-8' });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Update a spaceless ini file in place
|
|
66
|
+
*/
|
|
67
|
+
export function updateIniKey(lines: string[], key: string, value: string) {
|
|
68
|
+
const prefix = `${key}=`;
|
|
69
|
+
let found = false;
|
|
70
|
+
for (let i = 0; i < lines.length; i++) {
|
|
71
|
+
if (lines[i].startsWith(prefix)) {
|
|
72
|
+
lines[i] = prefix + value;
|
|
73
|
+
found = true;
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (!found) {
|
|
78
|
+
lines.push(prefix + value);
|
|
79
|
+
}
|
|
80
|
+
}
|
package/lib/github.d.ts
ADDED
package/lib/github.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchPreviousVersion = fetchPreviousVersion;
|
|
4
|
+
const rest_1 = require("@octokit/rest");
|
|
5
|
+
const semver = require("semver");
|
|
6
|
+
async function fetchPreviousVersion(token, options) {
|
|
7
|
+
var _a;
|
|
8
|
+
const github = new rest_1.Octokit({ auth: token });
|
|
9
|
+
const releases = await github.repos.listReleases({
|
|
10
|
+
owner: 'aws',
|
|
11
|
+
repo: 'aws-cdk',
|
|
12
|
+
});
|
|
13
|
+
// this returns a list in descending order, newest releases first
|
|
14
|
+
// opts for same major version where possible, falling back otherwise
|
|
15
|
+
// to previous major versions.
|
|
16
|
+
let previousMVRelease = undefined;
|
|
17
|
+
for (const release of releases.data) {
|
|
18
|
+
const version = (_a = release.name) === null || _a === void 0 ? void 0 : _a.replace('v', '');
|
|
19
|
+
if (!version) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
// Any old version is fine
|
|
23
|
+
if (!(options === null || options === void 0 ? void 0 : options.majorVersion) && !(options === null || options === void 0 ? void 0 : options.priorTo)) {
|
|
24
|
+
return version;
|
|
25
|
+
}
|
|
26
|
+
if ((options === null || options === void 0 ? void 0 : options.majorVersion) && `${semver.major(version)}` === options.majorVersion) {
|
|
27
|
+
return version;
|
|
28
|
+
}
|
|
29
|
+
if ((options === null || options === void 0 ? void 0 : options.priorTo) && semver.lt(version, options === null || options === void 0 ? void 0 : options.priorTo) && semver.major(version) === semver.major(options.priorTo)) {
|
|
30
|
+
return version;
|
|
31
|
+
}
|
|
32
|
+
// Otherwise return the most recent version that didn't match any
|
|
33
|
+
if (!previousMVRelease) {
|
|
34
|
+
previousMVRelease = version;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (previousMVRelease) {
|
|
38
|
+
return previousMVRelease;
|
|
39
|
+
}
|
|
40
|
+
throw new Error(`Unable to find previous version given ${JSON.stringify(options)}`);
|
|
41
|
+
}
|
|
42
|
+
;
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZ2l0aHViLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0Esb0RBdUNDO0FBMUNELHdDQUF3QztBQUN4QyxpQ0FBaUM7QUFFMUIsS0FBSyxVQUFVLG9CQUFvQixDQUFDLEtBQWEsRUFBRSxPQUd6RDs7SUFDQyxNQUFNLE1BQU0sR0FBRyxJQUFJLGNBQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDL0MsS0FBSyxFQUFFLEtBQUs7UUFDWixJQUFJLEVBQUUsU0FBUztLQUNoQixDQUFDLENBQUM7SUFFSCxpRUFBaUU7SUFDakUscUVBQXFFO0lBQ3JFLDhCQUE4QjtJQUM5QixJQUFJLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztJQUNsQyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFBLE9BQU8sQ0FBQyxJQUFJLDBDQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQUMsU0FBUztRQUFDLENBQUM7UUFFM0IsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxZQUFZLENBQUEsSUFBSSxDQUFDLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE9BQU8sQ0FBQSxFQUFFLENBQUM7WUFDaEQsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVELElBQUksQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsWUFBWSxLQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNqRixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRUQsSUFBSSxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLEtBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN4SCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRUQsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3ZCLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUFDLE9BQU8saUJBQWlCLENBQUM7SUFBQyxDQUFDO0lBRXBELE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L3Jlc3QnO1xuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFByZXZpb3VzVmVyc2lvbih0b2tlbjogc3RyaW5nLCBvcHRpb25zPzoge1xuICBwcmlvclRvPzogc3RyaW5nO1xuICBtYWpvclZlcnNpb24/OiBzdHJpbmc7XG59KSB7XG4gIGNvbnN0IGdpdGh1YiA9IG5ldyBPY3Rva2l0KHsgYXV0aDogdG9rZW4gfSk7XG4gIGNvbnN0IHJlbGVhc2VzID0gYXdhaXQgZ2l0aHViLnJlcG9zLmxpc3RSZWxlYXNlcyh7XG4gICAgb3duZXI6ICdhd3MnLFxuICAgIHJlcG86ICdhd3MtY2RrJyxcbiAgfSk7XG5cbiAgLy8gdGhpcyByZXR1cm5zIGEgbGlzdCBpbiBkZXNjZW5kaW5nIG9yZGVyLCBuZXdlc3QgcmVsZWFzZXMgZmlyc3RcbiAgLy8gb3B0cyBmb3Igc2FtZSBtYWpvciB2ZXJzaW9uIHdoZXJlIHBvc3NpYmxlLCBmYWxsaW5nIGJhY2sgb3RoZXJ3aXNlXG4gIC8vIHRvIHByZXZpb3VzIG1ham9yIHZlcnNpb25zLlxuICBsZXQgcHJldmlvdXNNVlJlbGVhc2UgPSB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgcmVsZWFzZSBvZiByZWxlYXNlcy5kYXRhKSB7XG4gICAgY29uc3QgdmVyc2lvbiA9IHJlbGVhc2UubmFtZT8ucmVwbGFjZSgndicsICcnKTtcbiAgICBpZiAoIXZlcnNpb24pIHsgY29udGludWU7IH1cblxuICAgIC8vIEFueSBvbGQgdmVyc2lvbiBpcyBmaW5lXG4gICAgaWYgKCFvcHRpb25zPy5tYWpvclZlcnNpb24gJiYgIW9wdGlvbnM/LnByaW9yVG8pIHtcbiAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5tYWpvclZlcnNpb24gJiYgYCR7c2VtdmVyLm1ham9yKHZlcnNpb24pfWAgPT09IG9wdGlvbnMubWFqb3JWZXJzaW9uKSB7XG4gICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8ucHJpb3JUbyAmJiBzZW12ZXIubHQodmVyc2lvbiwgb3B0aW9ucz8ucHJpb3JUbykgJiYgc2VtdmVyLm1ham9yKHZlcnNpb24pID09PSBzZW12ZXIubWFqb3Iob3B0aW9ucy5wcmlvclRvKSkge1xuICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIHJldHVybiB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbiB0aGF0IGRpZG4ndCBtYXRjaCBhbnlcbiAgICBpZiAoIXByZXZpb3VzTVZSZWxlYXNlKSB7XG4gICAgICBwcmV2aW91c01WUmVsZWFzZSA9IHZlcnNpb247XG4gICAgfVxuICB9XG4gIGlmIChwcmV2aW91c01WUmVsZWFzZSkgeyByZXR1cm4gcHJldmlvdXNNVlJlbGVhc2U7IH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIHByZXZpb3VzIHZlcnNpb24gZ2l2ZW4gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKTtcbn07XG4iXX0=
|
package/lib/github.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Octokit } from '@octokit/rest';
|
|
2
|
+
import * as semver from 'semver';
|
|
3
|
+
|
|
4
|
+
export async function fetchPreviousVersion(token: string, options?: {
|
|
5
|
+
priorTo?: string;
|
|
6
|
+
majorVersion?: string;
|
|
7
|
+
}) {
|
|
8
|
+
const github = new Octokit({ auth: token });
|
|
9
|
+
const releases = await github.repos.listReleases({
|
|
10
|
+
owner: 'aws',
|
|
11
|
+
repo: 'aws-cdk',
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
// this returns a list in descending order, newest releases first
|
|
15
|
+
// opts for same major version where possible, falling back otherwise
|
|
16
|
+
// to previous major versions.
|
|
17
|
+
let previousMVRelease = undefined;
|
|
18
|
+
for (const release of releases.data) {
|
|
19
|
+
const version = release.name?.replace('v', '');
|
|
20
|
+
if (!version) { continue; }
|
|
21
|
+
|
|
22
|
+
// Any old version is fine
|
|
23
|
+
if (!options?.majorVersion && !options?.priorTo) {
|
|
24
|
+
return version;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (options?.majorVersion && `${semver.major(version)}` === options.majorVersion) {
|
|
28
|
+
return version;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (options?.priorTo && semver.lt(version, options?.priorTo) && semver.major(version) === semver.major(options.priorTo)) {
|
|
32
|
+
return version;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Otherwise return the most recent version that didn't match any
|
|
36
|
+
if (!previousMVRelease) {
|
|
37
|
+
previousMVRelease = version;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (previousMVRelease) { return previousMVRelease; }
|
|
41
|
+
|
|
42
|
+
throw new Error(`Unable to find previous version given ${JSON.stringify(options)}`);
|
|
43
|
+
};
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './aws';
|
|
2
|
+
export * from './corking';
|
|
3
|
+
export * from './integ-test';
|
|
4
|
+
export * from './memoize';
|
|
5
|
+
export * from './resource-pool';
|
|
6
|
+
export * from './with-cli-lib';
|
|
7
|
+
export * from './with-sam';
|
|
8
|
+
export * from './shell';
|
|
9
|
+
export * from './with-aws';
|
|
10
|
+
export * from './with-cdk-app';
|
|
11
|
+
export * from './with-packages';
|
|
12
|
+
export * from './with-temporary-directory';
|
|
13
|
+
export * from './resources';
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./aws"), exports);
|
|
18
|
+
__exportStar(require("./corking"), exports);
|
|
19
|
+
__exportStar(require("./integ-test"), exports);
|
|
20
|
+
__exportStar(require("./memoize"), exports);
|
|
21
|
+
__exportStar(require("./resource-pool"), exports);
|
|
22
|
+
__exportStar(require("./with-cli-lib"), exports);
|
|
23
|
+
__exportStar(require("./with-sam"), exports);
|
|
24
|
+
__exportStar(require("./shell"), exports);
|
|
25
|
+
__exportStar(require("./with-aws"), exports);
|
|
26
|
+
__exportStar(require("./with-cdk-app"), exports);
|
|
27
|
+
__exportStar(require("./with-packages"), exports);
|
|
28
|
+
__exportStar(require("./with-temporary-directory"), exports);
|
|
29
|
+
__exportStar(require("./resources"), exports);
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsd0NBQXNCO0FBQ3RCLDRDQUEwQjtBQUMxQiwrQ0FBNkI7QUFDN0IsNENBQTBCO0FBQzFCLGtEQUFnQztBQUNoQyxpREFBK0I7QUFDL0IsNkNBQTJCO0FBQzNCLDBDQUF3QjtBQUN4Qiw2Q0FBMkI7QUFDM0IsaURBQStCO0FBQy9CLGtEQUFnQztBQUNoQyw2REFBMkM7QUFDM0MsOENBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hd3MnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JraW5nJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZWctdGVzdCc7XG5leHBvcnQgKiBmcm9tICcuL21lbW9pemUnO1xuZXhwb3J0ICogZnJvbSAnLi9yZXNvdXJjZS1wb29sJztcbmV4cG9ydCAqIGZyb20gJy4vd2l0aC1jbGktbGliJztcbmV4cG9ydCAqIGZyb20gJy4vd2l0aC1zYW0nO1xuZXhwb3J0ICogZnJvbSAnLi9zaGVsbCc7XG5leHBvcnQgKiBmcm9tICcuL3dpdGgtYXdzJztcbmV4cG9ydCAqIGZyb20gJy4vd2l0aC1jZGstYXBwJztcbmV4cG9ydCAqIGZyb20gJy4vd2l0aC1wYWNrYWdlcyc7XG5leHBvcnQgKiBmcm9tICcuL3dpdGgtdGVtcG9yYXJ5LWRpcmVjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL3Jlc291cmNlcyc7XG4iXX0=
|
package/lib/index.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './aws';
|
|
2
|
+
export * from './corking';
|
|
3
|
+
export * from './integ-test';
|
|
4
|
+
export * from './memoize';
|
|
5
|
+
export * from './resource-pool';
|
|
6
|
+
export * from './with-cli-lib';
|
|
7
|
+
export * from './with-sam';
|
|
8
|
+
export * from './shell';
|
|
9
|
+
export * from './with-aws';
|
|
10
|
+
export * from './with-cdk-app';
|
|
11
|
+
export * from './with-packages';
|
|
12
|
+
export * from './with-temporary-directory';
|
|
13
|
+
export * from './resources';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface TestContext {
|
|
2
|
+
readonly randomString: string;
|
|
3
|
+
readonly output: NodeJS.WritableStream;
|
|
4
|
+
log(s: string): void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* A wrapper for jest's 'test' which takes regression-disabled tests into account and prints a banner
|
|
8
|
+
*/
|
|
9
|
+
export declare function integTest(name: string, callback: (context: TestContext) => Promise<void>, timeoutMillis?: number): void;
|
|
10
|
+
export declare function randomString(): string;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.integTest = integTest;
|
|
4
|
+
exports.randomString = randomString;
|
|
5
|
+
const fs = require("fs");
|
|
6
|
+
const path = require("path");
|
|
7
|
+
const corking_1 = require("./corking");
|
|
8
|
+
const SKIP_TESTS = fs.readFileSync(path.join(__dirname, '..', 'skip-tests.txt'), { encoding: 'utf-8' })
|
|
9
|
+
.split('\n')
|
|
10
|
+
.map(x => x.trim())
|
|
11
|
+
.filter(x => x && !x.startsWith('#'));
|
|
12
|
+
if (SKIP_TESTS) {
|
|
13
|
+
process.stderr.write(`ℹ️ Skipping tests: ${JSON.stringify(SKIP_TESTS)}\n`);
|
|
14
|
+
}
|
|
15
|
+
;
|
|
16
|
+
if (process.env.JEST_TEST_CONCURRENT === 'true') {
|
|
17
|
+
process.stderr.write('ℹ️ JEST_TEST_CONCURRENT is true: tests will run concurrently and filters have no effect!\n0');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A wrapper for jest's 'test' which takes regression-disabled tests into account and prints a banner
|
|
21
|
+
*/
|
|
22
|
+
function integTest(name, callback, timeoutMillis) {
|
|
23
|
+
// Integ tests can run concurrently, and are responsible for blocking
|
|
24
|
+
// themselves if they cannot. Because `test.concurrent` executes the test
|
|
25
|
+
// code immediately, regardles of any `--testNamePattern`, this cannot be the
|
|
26
|
+
// default: test filtering simply does not work with `test.concurrent`.
|
|
27
|
+
// Instead, we make it opt-in only for the pipeline where we don't do any
|
|
28
|
+
// selection, but execute all tests unconditionally.
|
|
29
|
+
const testKind = process.env.JEST_TEST_CONCURRENT === 'true' ? test.concurrent : test;
|
|
30
|
+
const runner = shouldSkip(name) ? testKind.skip : testKind;
|
|
31
|
+
runner(name, async () => {
|
|
32
|
+
const output = new corking_1.MemoryStream();
|
|
33
|
+
output.write('================================================================\n');
|
|
34
|
+
output.write(`${name}\n`);
|
|
35
|
+
output.write('================================================================\n');
|
|
36
|
+
const now = Date.now();
|
|
37
|
+
process.stderr.write(`[INTEG TEST::${name}] Starting (pid ${process.pid})...\n`);
|
|
38
|
+
try {
|
|
39
|
+
return await callback({
|
|
40
|
+
output,
|
|
41
|
+
randomString: randomString(),
|
|
42
|
+
log(s) {
|
|
43
|
+
output.write(`${s}\n`);
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
process.stderr.write(`[INTEG TEST::${name}] Failed: ${e}\n`);
|
|
49
|
+
output.write(e.message);
|
|
50
|
+
output.write(e.stack);
|
|
51
|
+
// Print output only if the test fails. Use 'console.log' so the output is buffered by
|
|
52
|
+
// jest and prints without a stack trace (if verbose: false).
|
|
53
|
+
// eslint-disable-next-line no-console
|
|
54
|
+
console.log(output.buffer().toString());
|
|
55
|
+
throw e;
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
const duration = Date.now() - now;
|
|
59
|
+
process.stderr.write(`[INTEG TEST::${name}] Done (${duration} ms).\n`);
|
|
60
|
+
}
|
|
61
|
+
}, timeoutMillis);
|
|
62
|
+
}
|
|
63
|
+
function shouldSkip(testName) {
|
|
64
|
+
return SKIP_TESTS.includes(testName);
|
|
65
|
+
}
|
|
66
|
+
function randomString() {
|
|
67
|
+
// Crazy
|
|
68
|
+
return Math.random().toString(36).replace(/[^a-z0-9]+/g, '');
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWctdGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImludGVnLXRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwQkEsOEJBNkNDO0FBTUQsb0NBR0M7QUFoRkQseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qix1Q0FBeUM7QUFFekMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQztLQUNwRyxLQUFLLENBQUMsSUFBSSxDQUFDO0tBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ2xCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUV4QyxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFNQSxDQUFDO0FBRUYsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixLQUFLLE1BQU0sRUFBRSxDQUFDO0lBQ2hELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDZGQUE2RixDQUFDLENBQUM7QUFDdEgsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsU0FBUyxDQUN2QixJQUFZLEVBQ1osUUFBaUQsRUFDakQsYUFBc0I7SUFFdEIscUVBQXFFO0lBQ3JFLDBFQUEwRTtJQUMxRSw2RUFBNkU7SUFDN0UsdUVBQXVFO0lBQ3ZFLHlFQUF5RTtJQUN6RSxvREFBb0Q7SUFDcEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN0RixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUUzRCxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksc0JBQVksRUFBRSxDQUFDO1FBRWxDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztRQUNuRixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7UUFFbkYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLG1CQUFtQixPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sUUFBUSxDQUFDO2dCQUNwQixNQUFNO2dCQUNOLFlBQVksRUFBRSxZQUFZLEVBQUU7Z0JBQzVCLEdBQUcsQ0FBQyxDQUFTO29CQUNYLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdELE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RCLHNGQUFzRjtZQUN0Riw2REFBNkQ7WUFDN0Qsc0NBQXNDO1lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDeEMsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO2dCQUFTLENBQUM7WUFDVCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLFdBQVcsUUFBUSxTQUFTLENBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0gsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxRQUFnQjtJQUNsQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVELFNBQWdCLFlBQVk7SUFDMUIsUUFBUTtJQUNSLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgTWVtb3J5U3RyZWFtIH0gZnJvbSAnLi9jb3JraW5nJztcblxuY29uc3QgU0tJUF9URVNUUyA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnc2tpcC10ZXN0cy50eHQnKSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KVxuICAuc3BsaXQoJ1xcbicpXG4gIC5tYXAoeCA9PiB4LnRyaW0oKSlcbiAgLmZpbHRlcih4ID0+IHggJiYgIXguc3RhcnRzV2l0aCgnIycpKTtcblxuaWYgKFNLSVBfVEVTVFMpIHtcbiAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYOKEue+4jyBTa2lwcGluZyB0ZXN0czogJHtKU09OLnN0cmluZ2lmeShTS0lQX1RFU1RTKX1cXG5gKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXN0Q29udGV4dCB7XG4gIHJlYWRvbmx5IHJhbmRvbVN0cmluZzogc3RyaW5nO1xuICByZWFkb25seSBvdXRwdXQ6IE5vZGVKUy5Xcml0YWJsZVN0cmVhbTtcbiAgbG9nKHM6IHN0cmluZyk6IHZvaWQ7XG59O1xuXG5pZiAocHJvY2Vzcy5lbnYuSkVTVF9URVNUX0NPTkNVUlJFTlQgPT09ICd0cnVlJykge1xuICBwcm9jZXNzLnN0ZGVyci53cml0ZSgn4oS577iPIEpFU1RfVEVTVF9DT05DVVJSRU5UIGlzIHRydWU6IHRlc3RzIHdpbGwgcnVuIGNvbmN1cnJlbnRseSBhbmQgZmlsdGVycyBoYXZlIG5vIGVmZmVjdCFcXG4wJyk7XG59XG5cbi8qKlxuICogQSB3cmFwcGVyIGZvciBqZXN0J3MgJ3Rlc3QnIHdoaWNoIHRha2VzIHJlZ3Jlc3Npb24tZGlzYWJsZWQgdGVzdHMgaW50byBhY2NvdW50IGFuZCBwcmludHMgYSBiYW5uZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVnVGVzdChcbiAgbmFtZTogc3RyaW5nLFxuICBjYWxsYmFjazogKGNvbnRleHQ6IFRlc3RDb250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+LFxuICB0aW1lb3V0TWlsbGlzPzogbnVtYmVyLFxuKTogdm9pZCB7XG4gIC8vIEludGVnIHRlc3RzIGNhbiBydW4gY29uY3VycmVudGx5LCBhbmQgYXJlIHJlc3BvbnNpYmxlIGZvciBibG9ja2luZ1xuICAvLyB0aGVtc2VsdmVzIGlmIHRoZXkgY2Fubm90LiAgQmVjYXVzZSBgdGVzdC5jb25jdXJyZW50YCBleGVjdXRlcyB0aGUgdGVzdFxuICAvLyBjb2RlIGltbWVkaWF0ZWx5LCByZWdhcmRsZXMgb2YgYW55IGAtLXRlc3ROYW1lUGF0dGVybmAsIHRoaXMgY2Fubm90IGJlIHRoZVxuICAvLyBkZWZhdWx0OiB0ZXN0IGZpbHRlcmluZyBzaW1wbHkgZG9lcyBub3Qgd29yayB3aXRoIGB0ZXN0LmNvbmN1cnJlbnRgLlxuICAvLyBJbnN0ZWFkLCB3ZSBtYWtlIGl0IG9wdC1pbiBvbmx5IGZvciB0aGUgcGlwZWxpbmUgd2hlcmUgd2UgZG9uJ3QgZG8gYW55XG4gIC8vIHNlbGVjdGlvbiwgYnV0IGV4ZWN1dGUgYWxsIHRlc3RzIHVuY29uZGl0aW9uYWxseS5cbiAgY29uc3QgdGVzdEtpbmQgPSBwcm9jZXNzLmVudi5KRVNUX1RFU1RfQ09OQ1VSUkVOVCA9PT0gJ3RydWUnID8gdGVzdC5jb25jdXJyZW50IDogdGVzdDtcbiAgY29uc3QgcnVubmVyID0gc2hvdWxkU2tpcChuYW1lKSA/IHRlc3RLaW5kLnNraXAgOiB0ZXN0S2luZDtcblxuICBydW5uZXIobmFtZSwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oKTtcblxuICAgIG91dHB1dC53cml0ZSgnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbicpO1xuICAgIG91dHB1dC53cml0ZShgJHtuYW1lfVxcbmApO1xuICAgIG91dHB1dC53cml0ZSgnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbicpO1xuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgW0lOVEVHIFRFU1Q6OiR7bmFtZX1dIFN0YXJ0aW5nIChwaWQgJHtwcm9jZXNzLnBpZH0pLi4uXFxuYCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjayh7XG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgcmFuZG9tU3RyaW5nOiByYW5kb21TdHJpbmcoKSxcbiAgICAgICAgbG9nKHM6IHN0cmluZykge1xuICAgICAgICAgIG91dHB1dC53cml0ZShgJHtzfVxcbmApO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgW0lOVEVHIFRFU1Q6OiR7bmFtZX1dIEZhaWxlZDogJHtlfVxcbmApO1xuICAgICAgb3V0cHV0LndyaXRlKGUubWVzc2FnZSk7XG4gICAgICBvdXRwdXQud3JpdGUoZS5zdGFjayk7XG4gICAgICAvLyBQcmludCBvdXRwdXQgb25seSBpZiB0aGUgdGVzdCBmYWlscy4gVXNlICdjb25zb2xlLmxvZycgc28gdGhlIG91dHB1dCBpcyBidWZmZXJlZCBieVxuICAgICAgLy8gamVzdCBhbmQgcHJpbnRzIHdpdGhvdXQgYSBzdGFjayB0cmFjZSAoaWYgdmVyYm9zZTogZmFsc2UpLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKG91dHB1dC5idWZmZXIoKS50b1N0cmluZygpKTtcbiAgICAgIHRocm93IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIG5vdztcbiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBbSU5URUcgVEVTVDo6JHtuYW1lfV0gRG9uZSAoJHtkdXJhdGlvbn0gbXMpLlxcbmApO1xuICAgIH1cbiAgfSwgdGltZW91dE1pbGxpcyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFNraXAodGVzdE5hbWU6IHN0cmluZykge1xuICByZXR1cm4gU0tJUF9URVNUUy5pbmNsdWRlcyh0ZXN0TmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21TdHJpbmcoKSB7XG4gIC8vIENyYXp5XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICcnKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { MemoryStream } from './corking';
|
|
4
|
+
|
|
5
|
+
const SKIP_TESTS = fs.readFileSync(path.join(__dirname, '..', 'skip-tests.txt'), { encoding: 'utf-8' })
|
|
6
|
+
.split('\n')
|
|
7
|
+
.map(x => x.trim())
|
|
8
|
+
.filter(x => x && !x.startsWith('#'));
|
|
9
|
+
|
|
10
|
+
if (SKIP_TESTS) {
|
|
11
|
+
process.stderr.write(`ℹ️ Skipping tests: ${JSON.stringify(SKIP_TESTS)}\n`);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface TestContext {
|
|
15
|
+
readonly randomString: string;
|
|
16
|
+
readonly output: NodeJS.WritableStream;
|
|
17
|
+
log(s: string): void;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
if (process.env.JEST_TEST_CONCURRENT === 'true') {
|
|
21
|
+
process.stderr.write('ℹ️ JEST_TEST_CONCURRENT is true: tests will run concurrently and filters have no effect!\n0');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* A wrapper for jest's 'test' which takes regression-disabled tests into account and prints a banner
|
|
26
|
+
*/
|
|
27
|
+
export function integTest(
|
|
28
|
+
name: string,
|
|
29
|
+
callback: (context: TestContext) => Promise<void>,
|
|
30
|
+
timeoutMillis?: number,
|
|
31
|
+
): void {
|
|
32
|
+
// Integ tests can run concurrently, and are responsible for blocking
|
|
33
|
+
// themselves if they cannot. Because `test.concurrent` executes the test
|
|
34
|
+
// code immediately, regardles of any `--testNamePattern`, this cannot be the
|
|
35
|
+
// default: test filtering simply does not work with `test.concurrent`.
|
|
36
|
+
// Instead, we make it opt-in only for the pipeline where we don't do any
|
|
37
|
+
// selection, but execute all tests unconditionally.
|
|
38
|
+
const testKind = process.env.JEST_TEST_CONCURRENT === 'true' ? test.concurrent : test;
|
|
39
|
+
const runner = shouldSkip(name) ? testKind.skip : testKind;
|
|
40
|
+
|
|
41
|
+
runner(name, async () => {
|
|
42
|
+
const output = new MemoryStream();
|
|
43
|
+
|
|
44
|
+
output.write('================================================================\n');
|
|
45
|
+
output.write(`${name}\n`);
|
|
46
|
+
output.write('================================================================\n');
|
|
47
|
+
|
|
48
|
+
const now = Date.now();
|
|
49
|
+
process.stderr.write(`[INTEG TEST::${name}] Starting (pid ${process.pid})...\n`);
|
|
50
|
+
try {
|
|
51
|
+
return await callback({
|
|
52
|
+
output,
|
|
53
|
+
randomString: randomString(),
|
|
54
|
+
log(s: string) {
|
|
55
|
+
output.write(`${s}\n`);
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
} catch (e: any) {
|
|
59
|
+
process.stderr.write(`[INTEG TEST::${name}] Failed: ${e}\n`);
|
|
60
|
+
output.write(e.message);
|
|
61
|
+
output.write(e.stack);
|
|
62
|
+
// Print output only if the test fails. Use 'console.log' so the output is buffered by
|
|
63
|
+
// jest and prints without a stack trace (if verbose: false).
|
|
64
|
+
// eslint-disable-next-line no-console
|
|
65
|
+
console.log(output.buffer().toString());
|
|
66
|
+
throw e;
|
|
67
|
+
} finally {
|
|
68
|
+
const duration = Date.now() - now;
|
|
69
|
+
process.stderr.write(`[INTEG TEST::${name}] Done (${duration} ms).\n`);
|
|
70
|
+
}
|
|
71
|
+
}, timeoutMillis);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function shouldSkip(testName: string) {
|
|
75
|
+
return SKIP_TESTS.includes(testName);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function randomString() {
|
|
79
|
+
// Crazy
|
|
80
|
+
return Math.random().toString(36).replace(/[^a-z0-9]+/g, '');
|
|
81
|
+
}
|
package/lib/lists.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function chunk<A>(n: number, xs: A[]): A[][];
|
package/lib/lists.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.chunk = chunk;
|
|
4
|
+
function chunk(n, xs) {
|
|
5
|
+
const ret = new Array();
|
|
6
|
+
for (let i = 0; i < xs.length; i += n) {
|
|
7
|
+
ret.push(xs.slice(i, i + n));
|
|
8
|
+
}
|
|
9
|
+
return ret;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJsaXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNCQVFDO0FBUkQsU0FBZ0IsS0FBSyxDQUFJLENBQVMsRUFBRSxFQUFPO0lBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7SUFFN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBjaHVuazxBPihuOiBudW1iZXIsIHhzOiBBW10pOiBBW11bXSB7XG4gIGNvbnN0IHJldCA9IG5ldyBBcnJheTxBW10+KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkgKz0gbikge1xuICAgIHJldC5wdXNoKHhzLnNsaWNlKGksIGkgKyBuKSk7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuIl19
|
package/lib/lists.ts
ADDED
package/lib/memoize.d.ts
ADDED
package/lib/memoize.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.memoize0 = memoize0;
|
|
4
|
+
/**
|
|
5
|
+
* Return a memoized version of an function with 0 arguments.
|
|
6
|
+
*
|
|
7
|
+
* Async-safe.
|
|
8
|
+
*/
|
|
9
|
+
function memoize0(fn) {
|
|
10
|
+
let promise;
|
|
11
|
+
return () => {
|
|
12
|
+
if (!promise) {
|
|
13
|
+
promise = fn();
|
|
14
|
+
}
|
|
15
|
+
return promise;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb2l6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1lbW9pemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSw0QkFRQztBQWJEOzs7O0dBSUc7QUFDSCxTQUFnQixRQUFRLENBQUksRUFBb0I7SUFDOUMsSUFBSSxPQUErQixDQUFDO0lBQ3BDLE9BQU8sR0FBRyxFQUFFO1FBQ1YsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXR1cm4gYSBtZW1vaXplZCB2ZXJzaW9uIG9mIGFuIGZ1bmN0aW9uIHdpdGggMCBhcmd1bWVudHMuXG4gKlxuICogQXN5bmMtc2FmZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9pemUwPEE+KGZuOiAoKSA9PiBQcm9taXNlPEE+KTogKCkgPT4gUHJvbWlzZTxBPiB7XG4gIGxldCBwcm9taXNlOiBQcm9taXNlPEE+IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmICghcHJvbWlzZSkge1xuICAgICAgcHJvbWlzZSA9IGZuKCk7XG4gICAgfVxuICAgIHJldHVybiBwcm9taXNlO1xuICB9O1xufVxuIl19
|
package/lib/memoize.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Return a memoized version of an function with 0 arguments.
|
|
3
|
+
*
|
|
4
|
+
* Async-safe.
|
|
5
|
+
*/
|
|
6
|
+
export function memoize0<A>(fn: () => Promise<A>): () => Promise<A> {
|
|
7
|
+
let promise: Promise<A> | undefined;
|
|
8
|
+
return () => {
|
|
9
|
+
if (!promise) {
|
|
10
|
+
promise = fn();
|
|
11
|
+
}
|
|
12
|
+
return promise;
|
|
13
|
+
};
|
|
14
|
+
}
|
package/lib/npm.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use NPM preinstalled on the machine to look up a list of TypeScript versions
|
|
3
|
+
*/
|
|
4
|
+
export declare function typescriptVersionsSync(): string[];
|
|
5
|
+
/**
|
|
6
|
+
* Use NPM preinstalled on the machine to query publish times of versions
|
|
7
|
+
*/
|
|
8
|
+
export declare function typescriptVersionsYoungerThanDaysSync(days: number, versions: string[]): string[];
|