cdk-assets 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/LICENSE +202 -0
- package/NOTICE +2 -0
- package/README.md +195 -0
- package/bin/cdk-assets +2 -0
- package/bin/cdk-assets.d.ts +1 -0
- package/bin/cdk-assets.js +70 -0
- package/bin/docker-credential-cdk-assets +2 -0
- package/bin/docker-credential-cdk-assets.d.ts +13 -0
- package/bin/docker-credential-cdk-assets.js +39 -0
- package/bin/list.d.ts +3 -0
- package/bin/list.js +10 -0
- package/bin/logging.d.ts +4 -0
- package/bin/logging.js +28 -0
- package/bin/publish.d.ts +5 -0
- package/bin/publish.js +49 -0
- package/lib/asset-manifest.d.ts +162 -0
- package/lib/asset-manifest.js +245 -0
- package/lib/aws-types.d.ts +1660 -0
- package/lib/aws-types.js +138 -0
- package/lib/aws.d.ts +70 -0
- package/lib/aws.js +125 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +21 -0
- package/lib/private/archive.d.ts +3 -0
- package/lib/private/archive.js +87 -0
- package/lib/private/asset-handler.d.ts +54 -0
- package/lib/private/asset-handler.js +3 -0
- package/lib/private/docker-credentials.d.ts +35 -0
- package/lib/private/docker-credentials.js +89 -0
- package/lib/private/docker.d.ts +98 -0
- package/lib/private/docker.js +232 -0
- package/lib/private/fs-extra.d.ts +3 -0
- package/lib/private/fs-extra.js +37 -0
- package/lib/private/handlers/client-options.d.ts +3 -0
- package/lib/private/handlers/client-options.js +12 -0
- package/lib/private/handlers/container-images.d.ts +22 -0
- package/lib/private/handlers/container-images.js +224 -0
- package/lib/private/handlers/files.d.ts +14 -0
- package/lib/private/handlers/files.js +288 -0
- package/lib/private/handlers/index.d.ts +3 -0
- package/lib/private/handlers/index.js +16 -0
- package/lib/private/p-limit.d.ts +10 -0
- package/lib/private/p-limit.js +51 -0
- package/lib/private/placeholders.d.ts +10 -0
- package/lib/private/placeholders.js +34 -0
- package/lib/private/shell.d.ts +24 -0
- package/lib/private/shell.js +131 -0
- package/lib/private/util.d.ts +5 -0
- package/lib/private/util.js +16 -0
- package/lib/progress.d.ts +114 -0
- package/lib/progress.js +104 -0
- package/lib/publishing.d.ts +118 -0
- package/lib/publishing.js +193 -0
- package/package.json +103 -0
- package/scripts/manual-test-manifest.json +12 -0
- package/scripts/manual-test.sh +22 -0
package/bin/publish.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.publish = publish;
|
|
4
|
+
const logging_1 = require("./logging");
|
|
5
|
+
const lib_1 = require("../lib");
|
|
6
|
+
async function publish(args) {
|
|
7
|
+
let manifest = lib_1.AssetManifest.fromPath(args.path);
|
|
8
|
+
(0, logging_1.log)('verbose', `Loaded manifest from ${args.path}: ${manifest.entries.length} assets found`);
|
|
9
|
+
if (args.assets && args.assets.length > 0) {
|
|
10
|
+
const selection = args.assets.map((a) => lib_1.DestinationPattern.parse(a));
|
|
11
|
+
manifest = manifest.select(selection);
|
|
12
|
+
(0, logging_1.log)('verbose', `Applied selection: ${manifest.entries.length} assets selected.`);
|
|
13
|
+
}
|
|
14
|
+
const pub = new lib_1.AssetPublishing(manifest, {
|
|
15
|
+
aws: new lib_1.DefaultAwsClient(args.profile),
|
|
16
|
+
progressListener: new ConsoleProgress(),
|
|
17
|
+
throwOnError: false,
|
|
18
|
+
});
|
|
19
|
+
await pub.publish();
|
|
20
|
+
if (pub.hasFailures) {
|
|
21
|
+
for (const failure of pub.failures) {
|
|
22
|
+
// eslint-disable-next-line no-console
|
|
23
|
+
console.error('Failure:', failure.error.stack);
|
|
24
|
+
}
|
|
25
|
+
process.exitCode = 1;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const EVENT_TO_LEVEL = {
|
|
29
|
+
build: 'verbose',
|
|
30
|
+
cached: 'verbose',
|
|
31
|
+
check: 'verbose',
|
|
32
|
+
debug: 'verbose',
|
|
33
|
+
fail: 'error',
|
|
34
|
+
found: 'verbose',
|
|
35
|
+
start: 'info',
|
|
36
|
+
success: 'info',
|
|
37
|
+
upload: 'verbose',
|
|
38
|
+
shell_open: 'verbose',
|
|
39
|
+
shell_stdout: 'verbose',
|
|
40
|
+
shell_stderr: 'verbose',
|
|
41
|
+
shell_close: 'verbose',
|
|
42
|
+
};
|
|
43
|
+
class ConsoleProgress {
|
|
44
|
+
onPublishEvent(type, event) {
|
|
45
|
+
const stream = ['open', 'data_stdout', 'close'].includes(type) ? 'stdout' : 'stderr';
|
|
46
|
+
(0, logging_1.log)(EVENT_TO_LEVEL[type], `[${event.percentComplete}%] ${type}: ${event.message}`, stream);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInB1Ymxpc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFXQSwwQkEwQkM7QUFyQ0QsdUNBQTBDO0FBQzFDLGdDQVFnQjtBQUVULEtBQUssVUFBVSxPQUFPLENBQUMsSUFBMkQ7SUFDdkYsSUFBSSxRQUFRLEdBQUcsbUJBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pELElBQUEsYUFBRyxFQUFDLFNBQVMsRUFBRSx3QkFBd0IsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sZUFBZSxDQUFDLENBQUM7SUFFN0YsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyx3QkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxJQUFBLGFBQUcsRUFBQyxTQUFTLEVBQUUsc0JBQXNCLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLHFCQUFlLENBQUMsUUFBUSxFQUFFO1FBQ3hDLEdBQUcsRUFBRSxJQUFJLHNCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdkMsZ0JBQWdCLEVBQUUsSUFBSSxlQUFlLEVBQUU7UUFDdkMsWUFBWSxFQUFFLEtBQUs7S0FDcEIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFFcEIsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNLE9BQU8sSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkMsc0NBQXNDO1lBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxjQUFjLEdBQWdDO0lBQ2xELEtBQUssRUFBRSxTQUFTO0lBQ2hCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLEtBQUssRUFBRSxTQUFTO0lBQ2hCLEtBQUssRUFBRSxTQUFTO0lBQ2hCLElBQUksRUFBRSxPQUFPO0lBQ2IsS0FBSyxFQUFFLFNBQVM7SUFDaEIsS0FBSyxFQUFFLE1BQU07SUFDYixPQUFPLEVBQUUsTUFBTTtJQUNmLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLFdBQVcsRUFBRSxTQUFTO0NBQ3ZCLENBQUM7QUFFRixNQUFNLGVBQWU7SUFDWixjQUFjLENBQUMsSUFBZSxFQUFFLEtBQXVCO1FBQzVELE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3JGLElBQUEsYUFBRyxFQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxlQUFlLE1BQU0sSUFBSSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3RixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsb2csIExvZ0xldmVsIH0gZnJvbSAnLi9sb2dnaW5nJztcbmltcG9ydCB7XG4gIEFzc2V0TWFuaWZlc3QsXG4gIEFzc2V0UHVibGlzaGluZyxcbiAgRGVmYXVsdEF3c0NsaWVudCxcbiAgRGVzdGluYXRpb25QYXR0ZXJuLFxuICBFdmVudFR5cGUsXG4gIElQdWJsaXNoUHJvZ3Jlc3MsXG4gIElQdWJsaXNoUHJvZ3Jlc3NMaXN0ZW5lcixcbn0gZnJvbSAnLi4vbGliJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2goYXJnczogeyBwYXRoOiBzdHJpbmc7IGFzc2V0cz86IHN0cmluZ1tdOyBwcm9maWxlPzogc3RyaW5nIH0pIHtcbiAgbGV0IG1hbmlmZXN0ID0gQXNzZXRNYW5pZmVzdC5mcm9tUGF0aChhcmdzLnBhdGgpO1xuICBsb2coJ3ZlcmJvc2UnLCBgTG9hZGVkIG1hbmlmZXN0IGZyb20gJHthcmdzLnBhdGh9OiAke21hbmlmZXN0LmVudHJpZXMubGVuZ3RofSBhc3NldHMgZm91bmRgKTtcblxuICBpZiAoYXJncy5hc3NldHMgJiYgYXJncy5hc3NldHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGFyZ3MuYXNzZXRzLm1hcCgoYSkgPT4gRGVzdGluYXRpb25QYXR0ZXJuLnBhcnNlKGEpKTtcbiAgICBtYW5pZmVzdCA9IG1hbmlmZXN0LnNlbGVjdChzZWxlY3Rpb24pO1xuICAgIGxvZygndmVyYm9zZScsIGBBcHBsaWVkIHNlbGVjdGlvbjogJHttYW5pZmVzdC5lbnRyaWVzLmxlbmd0aH0gYXNzZXRzIHNlbGVjdGVkLmApO1xuICB9XG5cbiAgY29uc3QgcHViID0gbmV3IEFzc2V0UHVibGlzaGluZyhtYW5pZmVzdCwge1xuICAgIGF3czogbmV3IERlZmF1bHRBd3NDbGllbnQoYXJncy5wcm9maWxlKSxcbiAgICBwcm9ncmVzc0xpc3RlbmVyOiBuZXcgQ29uc29sZVByb2dyZXNzKCksXG4gICAgdGhyb3dPbkVycm9yOiBmYWxzZSxcbiAgfSk7XG5cbiAgYXdhaXQgcHViLnB1Ymxpc2goKTtcblxuICBpZiAocHViLmhhc0ZhaWx1cmVzKSB7XG4gICAgZm9yIChjb25zdCBmYWlsdXJlIG9mIHB1Yi5mYWlsdXJlcykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWx1cmU6JywgZmFpbHVyZS5lcnJvci5zdGFjayk7XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIH1cbn1cblxuY29uc3QgRVZFTlRfVE9fTEVWRUw6IFJlY29yZDxFdmVudFR5cGUsIExvZ0xldmVsPiA9IHtcbiAgYnVpbGQ6ICd2ZXJib3NlJyxcbiAgY2FjaGVkOiAndmVyYm9zZScsXG4gIGNoZWNrOiAndmVyYm9zZScsXG4gIGRlYnVnOiAndmVyYm9zZScsXG4gIGZhaWw6ICdlcnJvcicsXG4gIGZvdW5kOiAndmVyYm9zZScsXG4gIHN0YXJ0OiAnaW5mbycsXG4gIHN1Y2Nlc3M6ICdpbmZvJyxcbiAgdXBsb2FkOiAndmVyYm9zZScsXG4gIHNoZWxsX29wZW46ICd2ZXJib3NlJyxcbiAgc2hlbGxfc3Rkb3V0OiAndmVyYm9zZScsXG4gIHNoZWxsX3N0ZGVycjogJ3ZlcmJvc2UnLFxuICBzaGVsbF9jbG9zZTogJ3ZlcmJvc2UnLFxufTtcblxuY2xhc3MgQ29uc29sZVByb2dyZXNzIGltcGxlbWVudHMgSVB1Ymxpc2hQcm9ncmVzc0xpc3RlbmVyIHtcbiAgcHVibGljIG9uUHVibGlzaEV2ZW50KHR5cGU6IEV2ZW50VHlwZSwgZXZlbnQ6IElQdWJsaXNoUHJvZ3Jlc3MpOiB2b2lkIHtcbiAgICBjb25zdCBzdHJlYW0gPSBbJ29wZW4nLCAnZGF0YV9zdGRvdXQnLCAnY2xvc2UnXS5pbmNsdWRlcyh0eXBlKSA/ICdzdGRvdXQnIDogJ3N0ZGVycic7XG4gICAgbG9nKEVWRU5UX1RPX0xFVkVMW3R5cGVdLCBgWyR7ZXZlbnQucGVyY2VudENvbXBsZXRlfSVdICR7dHlwZX06ICR7ZXZlbnQubWVzc2FnZX1gLCBzdHJlYW0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { AssetManifest as AssetManifestSchema, DockerImageDestination, DockerImageSource, FileDestination, FileSource } from '@aws-cdk/cloud-assembly-schema';
|
|
2
|
+
/**
|
|
3
|
+
* A manifest of assets
|
|
4
|
+
*/
|
|
5
|
+
export declare class AssetManifest {
|
|
6
|
+
private readonly manifest;
|
|
7
|
+
/**
|
|
8
|
+
* The default name of the asset manifest in a cdk.out directory
|
|
9
|
+
*/
|
|
10
|
+
static readonly DEFAULT_FILENAME = "assets.json";
|
|
11
|
+
/**
|
|
12
|
+
* Load an asset manifest from the given file
|
|
13
|
+
*/
|
|
14
|
+
static fromFile(fileName: string): AssetManifest;
|
|
15
|
+
/**
|
|
16
|
+
* Load an asset manifest from the given file or directory
|
|
17
|
+
*
|
|
18
|
+
* If the argument given is a directoy, the default asset file name will be used.
|
|
19
|
+
*/
|
|
20
|
+
static fromPath(filePath: string): AssetManifest;
|
|
21
|
+
/**
|
|
22
|
+
* The directory where the manifest was found
|
|
23
|
+
*/
|
|
24
|
+
readonly directory: string;
|
|
25
|
+
constructor(directory: string, manifest: AssetManifestSchema);
|
|
26
|
+
/**
|
|
27
|
+
* Select a subset of assets and destinations from this manifest.
|
|
28
|
+
*
|
|
29
|
+
* Only assets with at least 1 selected destination are retained.
|
|
30
|
+
*
|
|
31
|
+
* If selection is not given, everything is returned.
|
|
32
|
+
*/
|
|
33
|
+
select(selection?: DestinationPattern[]): AssetManifest;
|
|
34
|
+
/**
|
|
35
|
+
* Describe the asset manifest as a list of strings
|
|
36
|
+
*/
|
|
37
|
+
list(): string[];
|
|
38
|
+
/**
|
|
39
|
+
* List of assets per destination
|
|
40
|
+
*
|
|
41
|
+
* Returns one asset for every publishable destination. Multiple asset
|
|
42
|
+
* destinations may share the same asset source.
|
|
43
|
+
*/
|
|
44
|
+
get entries(): IManifestEntry[];
|
|
45
|
+
/**
|
|
46
|
+
* List of file assets, splat out to destinations
|
|
47
|
+
*/
|
|
48
|
+
get files(): FileManifestEntry[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A single asset from an asset manifest'
|
|
52
|
+
*/
|
|
53
|
+
export interface IManifestEntry {
|
|
54
|
+
/**
|
|
55
|
+
* The identifier of the asset and its destination
|
|
56
|
+
*/
|
|
57
|
+
readonly id: DestinationIdentifier;
|
|
58
|
+
/**
|
|
59
|
+
* The type of asset
|
|
60
|
+
*/
|
|
61
|
+
readonly type: string;
|
|
62
|
+
/**
|
|
63
|
+
* Type-dependent source data
|
|
64
|
+
*/
|
|
65
|
+
readonly genericSource: unknown;
|
|
66
|
+
/**
|
|
67
|
+
* Type-dependent destination data
|
|
68
|
+
*/
|
|
69
|
+
readonly genericDestination: unknown;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* A manifest entry for a file asset
|
|
73
|
+
*/
|
|
74
|
+
export declare class FileManifestEntry implements IManifestEntry {
|
|
75
|
+
/** Identifier for this asset */
|
|
76
|
+
readonly id: DestinationIdentifier;
|
|
77
|
+
/** Source of the file asset */
|
|
78
|
+
readonly source: FileSource;
|
|
79
|
+
/** Destination for the file asset */
|
|
80
|
+
readonly destination: FileDestination;
|
|
81
|
+
readonly genericSource: unknown;
|
|
82
|
+
readonly genericDestination: unknown;
|
|
83
|
+
readonly type = "file";
|
|
84
|
+
constructor(
|
|
85
|
+
/** Identifier for this asset */
|
|
86
|
+
id: DestinationIdentifier,
|
|
87
|
+
/** Source of the file asset */
|
|
88
|
+
source: FileSource,
|
|
89
|
+
/** Destination for the file asset */
|
|
90
|
+
destination: FileDestination);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* A manifest entry for a docker image asset
|
|
94
|
+
*/
|
|
95
|
+
export declare class DockerImageManifestEntry implements IManifestEntry {
|
|
96
|
+
/** Identifier for this asset */
|
|
97
|
+
readonly id: DestinationIdentifier;
|
|
98
|
+
/** Source of the file asset */
|
|
99
|
+
readonly source: DockerImageSource;
|
|
100
|
+
/** Destination for the file asset */
|
|
101
|
+
readonly destination: DockerImageDestination;
|
|
102
|
+
readonly genericSource: unknown;
|
|
103
|
+
readonly genericDestination: unknown;
|
|
104
|
+
readonly type = "docker-image";
|
|
105
|
+
constructor(
|
|
106
|
+
/** Identifier for this asset */
|
|
107
|
+
id: DestinationIdentifier,
|
|
108
|
+
/** Source of the file asset */
|
|
109
|
+
source: DockerImageSource,
|
|
110
|
+
/** Destination for the file asset */
|
|
111
|
+
destination: DockerImageDestination);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Identify an asset destination in an asset manifest
|
|
115
|
+
*
|
|
116
|
+
* When stringified, this will be a combination of the source
|
|
117
|
+
* and destination IDs.
|
|
118
|
+
*/
|
|
119
|
+
export declare class DestinationIdentifier {
|
|
120
|
+
/**
|
|
121
|
+
* Identifies the asset, by source.
|
|
122
|
+
*
|
|
123
|
+
* The assetId will be the same between assets that represent
|
|
124
|
+
* the same physical file or image.
|
|
125
|
+
*/
|
|
126
|
+
readonly assetId: string;
|
|
127
|
+
/**
|
|
128
|
+
* Identifies the destination where this asset will be published
|
|
129
|
+
*/
|
|
130
|
+
readonly destinationId: string;
|
|
131
|
+
constructor(assetId: string, destinationId: string);
|
|
132
|
+
/**
|
|
133
|
+
* Return a string representation for this asset identifier
|
|
134
|
+
*/
|
|
135
|
+
toString(): string;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* A filter pattern for an destination identifier
|
|
139
|
+
*/
|
|
140
|
+
export declare class DestinationPattern {
|
|
141
|
+
/**
|
|
142
|
+
* Parse a ':'-separated string into an asset/destination identifier
|
|
143
|
+
*/
|
|
144
|
+
static parse(s: string): DestinationPattern;
|
|
145
|
+
/**
|
|
146
|
+
* Identifies the asset, by source.
|
|
147
|
+
*/
|
|
148
|
+
readonly assetId?: string;
|
|
149
|
+
/**
|
|
150
|
+
* Identifies the destination where this asset will be published
|
|
151
|
+
*/
|
|
152
|
+
readonly destinationId?: string;
|
|
153
|
+
constructor(assetId?: string, destinationId?: string);
|
|
154
|
+
/**
|
|
155
|
+
* Whether or not this pattern matches the given identifier
|
|
156
|
+
*/
|
|
157
|
+
matches(id: DestinationIdentifier): boolean;
|
|
158
|
+
/**
|
|
159
|
+
* Return a string representation for this asset identifier
|
|
160
|
+
*/
|
|
161
|
+
toString(): string;
|
|
162
|
+
}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DestinationPattern = exports.DestinationIdentifier = exports.DockerImageManifestEntry = exports.FileManifestEntry = exports.AssetManifest = void 0;
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const cloud_assembly_schema_1 = require("@aws-cdk/cloud-assembly-schema");
|
|
7
|
+
/**
|
|
8
|
+
* A manifest of assets
|
|
9
|
+
*/
|
|
10
|
+
class AssetManifest {
|
|
11
|
+
/**
|
|
12
|
+
* Load an asset manifest from the given file
|
|
13
|
+
*/
|
|
14
|
+
static fromFile(fileName) {
|
|
15
|
+
try {
|
|
16
|
+
const obj = cloud_assembly_schema_1.Manifest.loadAssetManifest(fileName);
|
|
17
|
+
return new AssetManifest(path.dirname(fileName), obj);
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
throw new Error(`Cannot read asset manifest '${fileName}': ${e.message}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Load an asset manifest from the given file or directory
|
|
25
|
+
*
|
|
26
|
+
* If the argument given is a directoy, the default asset file name will be used.
|
|
27
|
+
*/
|
|
28
|
+
static fromPath(filePath) {
|
|
29
|
+
let st;
|
|
30
|
+
try {
|
|
31
|
+
st = fs.statSync(filePath);
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
throw new Error(`Cannot read asset manifest at '${filePath}': ${e.message}`);
|
|
35
|
+
}
|
|
36
|
+
if (st.isDirectory()) {
|
|
37
|
+
return AssetManifest.fromFile(path.join(filePath, AssetManifest.DEFAULT_FILENAME));
|
|
38
|
+
}
|
|
39
|
+
return AssetManifest.fromFile(filePath);
|
|
40
|
+
}
|
|
41
|
+
constructor(directory, manifest) {
|
|
42
|
+
this.manifest = manifest;
|
|
43
|
+
this.directory = directory;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Select a subset of assets and destinations from this manifest.
|
|
47
|
+
*
|
|
48
|
+
* Only assets with at least 1 selected destination are retained.
|
|
49
|
+
*
|
|
50
|
+
* If selection is not given, everything is returned.
|
|
51
|
+
*/
|
|
52
|
+
select(selection) {
|
|
53
|
+
if (selection === undefined) {
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
const ret = {
|
|
57
|
+
version: this.manifest.version,
|
|
58
|
+
dockerImages: {},
|
|
59
|
+
files: {},
|
|
60
|
+
};
|
|
61
|
+
for (const assetType of ASSET_TYPES) {
|
|
62
|
+
for (const [assetId, asset] of Object.entries(this.manifest[assetType] || {})) {
|
|
63
|
+
const filteredDestinations = filterDict(asset.destinations, (_, destId) => selection.some((sel) => sel.matches(new DestinationIdentifier(assetId, destId))));
|
|
64
|
+
if (Object.keys(filteredDestinations).length > 0) {
|
|
65
|
+
ret[assetType][assetId] = {
|
|
66
|
+
...asset,
|
|
67
|
+
destinations: filteredDestinations,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return new AssetManifest(this.directory, ret);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Describe the asset manifest as a list of strings
|
|
76
|
+
*/
|
|
77
|
+
list() {
|
|
78
|
+
return [
|
|
79
|
+
...describeAssets('file', this.manifest.files || {}),
|
|
80
|
+
...describeAssets('docker-image', this.manifest.dockerImages || {}),
|
|
81
|
+
];
|
|
82
|
+
function describeAssets(type, assets) {
|
|
83
|
+
const ret = new Array();
|
|
84
|
+
for (const [assetId, asset] of Object.entries(assets || {})) {
|
|
85
|
+
ret.push(`${assetId} ${type} ${JSON.stringify(asset.source)}`);
|
|
86
|
+
const destStrings = Object.entries(asset.destinations).map(([destId, dest]) => ` ${assetId}:${destId} ${JSON.stringify(dest)}`);
|
|
87
|
+
ret.push(...prefixTreeChars(destStrings, ' '));
|
|
88
|
+
}
|
|
89
|
+
return ret;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* List of assets per destination
|
|
94
|
+
*
|
|
95
|
+
* Returns one asset for every publishable destination. Multiple asset
|
|
96
|
+
* destinations may share the same asset source.
|
|
97
|
+
*/
|
|
98
|
+
get entries() {
|
|
99
|
+
return [
|
|
100
|
+
...makeEntries(this.manifest.files || {}, FileManifestEntry),
|
|
101
|
+
...makeEntries(this.manifest.dockerImages || {}, DockerImageManifestEntry),
|
|
102
|
+
];
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* List of file assets, splat out to destinations
|
|
106
|
+
*/
|
|
107
|
+
get files() {
|
|
108
|
+
return makeEntries(this.manifest.files || {}, FileManifestEntry);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.AssetManifest = AssetManifest;
|
|
112
|
+
/**
|
|
113
|
+
* The default name of the asset manifest in a cdk.out directory
|
|
114
|
+
*/
|
|
115
|
+
AssetManifest.DEFAULT_FILENAME = 'assets.json';
|
|
116
|
+
function makeEntries(assets, ctor) {
|
|
117
|
+
const ret = new Array();
|
|
118
|
+
for (const [assetId, asset] of Object.entries(assets)) {
|
|
119
|
+
for (const [destId, destination] of Object.entries(asset.destinations)) {
|
|
120
|
+
ret.push(new ctor(new DestinationIdentifier(assetId, destId), asset.source, destination));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return ret;
|
|
124
|
+
}
|
|
125
|
+
const ASSET_TYPES = ['files', 'dockerImages'];
|
|
126
|
+
/**
|
|
127
|
+
* A manifest entry for a file asset
|
|
128
|
+
*/
|
|
129
|
+
class FileManifestEntry {
|
|
130
|
+
constructor(
|
|
131
|
+
/** Identifier for this asset */
|
|
132
|
+
id,
|
|
133
|
+
/** Source of the file asset */
|
|
134
|
+
source,
|
|
135
|
+
/** Destination for the file asset */
|
|
136
|
+
destination) {
|
|
137
|
+
this.id = id;
|
|
138
|
+
this.source = source;
|
|
139
|
+
this.destination = destination;
|
|
140
|
+
this.type = 'file';
|
|
141
|
+
this.genericSource = source;
|
|
142
|
+
this.genericDestination = destination;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.FileManifestEntry = FileManifestEntry;
|
|
146
|
+
/**
|
|
147
|
+
* A manifest entry for a docker image asset
|
|
148
|
+
*/
|
|
149
|
+
class DockerImageManifestEntry {
|
|
150
|
+
constructor(
|
|
151
|
+
/** Identifier for this asset */
|
|
152
|
+
id,
|
|
153
|
+
/** Source of the file asset */
|
|
154
|
+
source,
|
|
155
|
+
/** Destination for the file asset */
|
|
156
|
+
destination) {
|
|
157
|
+
this.id = id;
|
|
158
|
+
this.source = source;
|
|
159
|
+
this.destination = destination;
|
|
160
|
+
this.type = 'docker-image';
|
|
161
|
+
this.genericSource = source;
|
|
162
|
+
this.genericDestination = destination;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
exports.DockerImageManifestEntry = DockerImageManifestEntry;
|
|
166
|
+
/**
|
|
167
|
+
* Identify an asset destination in an asset manifest
|
|
168
|
+
*
|
|
169
|
+
* When stringified, this will be a combination of the source
|
|
170
|
+
* and destination IDs.
|
|
171
|
+
*/
|
|
172
|
+
class DestinationIdentifier {
|
|
173
|
+
constructor(assetId, destinationId) {
|
|
174
|
+
this.assetId = assetId;
|
|
175
|
+
this.destinationId = destinationId;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Return a string representation for this asset identifier
|
|
179
|
+
*/
|
|
180
|
+
toString() {
|
|
181
|
+
return this.destinationId ? `${this.assetId}:${this.destinationId}` : this.assetId;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
exports.DestinationIdentifier = DestinationIdentifier;
|
|
185
|
+
function filterDict(xs, pred) {
|
|
186
|
+
const ret = {};
|
|
187
|
+
for (const [key, value] of Object.entries(xs)) {
|
|
188
|
+
if (pred(value, key)) {
|
|
189
|
+
ret[key] = value;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return ret;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* A filter pattern for an destination identifier
|
|
196
|
+
*/
|
|
197
|
+
class DestinationPattern {
|
|
198
|
+
/**
|
|
199
|
+
* Parse a ':'-separated string into an asset/destination identifier
|
|
200
|
+
*/
|
|
201
|
+
static parse(s) {
|
|
202
|
+
if (!s) {
|
|
203
|
+
throw new Error('Empty string is not a valid destination identifier');
|
|
204
|
+
}
|
|
205
|
+
const parts = s.split(':').map((x) => (x !== '*' ? x : undefined));
|
|
206
|
+
if (parts.length === 1) {
|
|
207
|
+
return new DestinationPattern(parts[0]);
|
|
208
|
+
}
|
|
209
|
+
if (parts.length === 2) {
|
|
210
|
+
return new DestinationPattern(parts[0] || undefined, parts[1] || undefined);
|
|
211
|
+
}
|
|
212
|
+
throw new Error(`Asset identifier must contain at most 2 ':'-separated parts, got '${s}'`);
|
|
213
|
+
}
|
|
214
|
+
constructor(assetId, destinationId) {
|
|
215
|
+
this.assetId = assetId;
|
|
216
|
+
this.destinationId = destinationId;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Whether or not this pattern matches the given identifier
|
|
220
|
+
*/
|
|
221
|
+
matches(id) {
|
|
222
|
+
return ((this.assetId === undefined || this.assetId === id.assetId) &&
|
|
223
|
+
(this.destinationId === undefined || this.destinationId === id.destinationId));
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Return a string representation for this asset identifier
|
|
227
|
+
*/
|
|
228
|
+
toString() {
|
|
229
|
+
return `${this.assetId ?? '*'}:${this.destinationId ?? '*'}`;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
exports.DestinationPattern = DestinationPattern;
|
|
233
|
+
/**
|
|
234
|
+
* Prefix box-drawing characters to make lines look like a hanging tree
|
|
235
|
+
*/
|
|
236
|
+
function prefixTreeChars(xs, prefix = '') {
|
|
237
|
+
const ret = new Array();
|
|
238
|
+
for (let i = 0; i < xs.length; i++) {
|
|
239
|
+
const isLast = i === xs.length - 1;
|
|
240
|
+
const boxChar = isLast ? '└' : '├';
|
|
241
|
+
ret.push(`${prefix}${boxChar}${xs[i]}`);
|
|
242
|
+
}
|
|
243
|
+
return ret;
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtbWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhc3NldC1tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDBFQU93QztBQUV4Qzs7R0FFRztBQUNILE1BQWEsYUFBYTtJQU14Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBZ0I7UUFDckMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLEdBQUcsZ0NBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxPQUFPLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsUUFBUSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBZ0I7UUFDckMsSUFBSSxFQUFFLENBQUM7UUFDUCxJQUFJLENBQUM7WUFDSCxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxRQUFRLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDckIsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUNE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LENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtcbiAgQXNzZXRNYW5pZmVzdCBhcyBBc3NldE1hbmlmZXN0U2NoZW1hLFxuICBEb2NrZXJJbWFnZURlc3RpbmF0aW9uLFxuICBEb2NrZXJJbWFnZVNvdXJjZSxcbiAgRmlsZURlc3RpbmF0aW9uLFxuICBGaWxlU291cmNlLFxuICBNYW5pZmVzdCxcbn0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcblxuLyoqXG4gKiBBIG1hbmlmZXN0IG9mIGFzc2V0c1xuICovXG5leHBvcnQgY2xhc3MgQXNzZXRNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBuYW1lIG9mIHRoZSBhc3NldCBtYW5pZmVzdCBpbiBhIGNkay5vdXQgZGlyZWN0b3J5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfRklMRU5BTUUgPSAnYXNzZXRzLmpzb24nO1xuXG4gIC8qKlxuICAgKiBMb2FkIGFuIGFzc2V0IG1hbmlmZXN0IGZyb20gdGhlIGdpdmVuIGZpbGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZpbGUoZmlsZU5hbWU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvYmogPSBNYW5pZmVzdC5sb2FkQXNzZXRNYW5pZmVzdChmaWxlTmFtZSk7XG4gICAgICByZXR1cm4gbmV3IEFzc2V0TWFuaWZlc3QocGF0aC5kaXJuYW1lKGZpbGVOYW1lKSwgb2JqKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlYWQgYXNzZXQgbWFuaWZlc3QgJyR7ZmlsZU5hbWV9JzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYW4gYXNzZXQgbWFuaWZlc3QgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBvciBkaXJlY3RvcnlcbiAgICpcbiAgICogSWYgdGhlIGFyZ3VtZW50IGdpdmVuIGlzIGEgZGlyZWN0b3ksIHRoZSBkZWZhdWx0IGFzc2V0IGZpbGUgbmFtZSB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21QYXRoKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBsZXQgc3Q7XG4gICAgdHJ5IHtcbiAgICAgIHN0ID0gZnMuc3RhdFN5bmMoZmlsZVBhdGgpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBhc3NldCBtYW5pZmVzdCBhdCAnJHtmaWxlUGF0aH0nOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKHN0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiBBc3NldE1hbmlmZXN0LmZyb21GaWxlKHBhdGguam9pbihmaWxlUGF0aCwgQXNzZXRNYW5pZmVzdC5ERUZBVUxUX0ZJTEVOQU1FKSk7XG4gICAgfVxuICAgIHJldHVybiBBc3NldE1hbmlmZXN0LmZyb21GaWxlKGZpbGVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBtYW5pZmVzdCB3YXMgZm91bmRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkaXJlY3Rvcnk6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkaXJlY3Rvcnk6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hbmlmZXN0OiBBc3NldE1hbmlmZXN0U2NoZW1hLFxuICApIHtcbiAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYSBzdWJzZXQgb2YgYXNzZXRzIGFuZCBkZXN0aW5hdGlvbnMgZnJvbSB0aGlzIG1hbmlmZXN0LlxuICAgKlxuICAgKiBPbmx5IGFzc2V0cyB3aXRoIGF0IGxlYXN0IDEgc2VsZWN0ZWQgZGVzdGluYXRpb24gYXJlIHJldGFpbmVkLlxuICAgKlxuICAgKiBJZiBzZWxlY3Rpb24gaXMgbm90IGdpdmVuLCBldmVyeXRoaW5nIGlzIHJldHVybmVkLlxuICAgKi9cbiAgcHVibGljIHNlbGVjdChzZWxlY3Rpb24/OiBEZXN0aW5hdGlvblBhdHRlcm5bXSk6IEFzc2V0TWFuaWZlc3Qge1xuICAgIGlmIChzZWxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0OiBBc3NldE1hbmlmZXN0U2NoZW1hICYgUmVxdWlyZWQ8UGljazxBc3NldE1hbmlmZXN0U2NoZW1hLCBBc3NldFR5cGU+PiA9IHtcbiAgICAgIHZlcnNpb246IHRoaXMubWFuaWZlc3QudmVyc2lvbixcbiAgICAgIGRvY2tlckltYWdlczoge30sXG4gICAgICBmaWxlczoge30sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgYXNzZXRUeXBlIG9mIEFTU0VUX1RZUEVTKSB7XG4gICAgICBmb3IgKGNvbnN0IFthc3NldElkLCBhc3NldF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5tYW5pZmVzdFthc3NldFR5cGVdIHx8IHt9KSkge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZERlc3RpbmF0aW9ucyA9IGZpbHRlckRpY3QoYXNzZXQuZGVzdGluYXRpb25zLCAoXywgZGVzdElkKSA9PlxuICAgICAgICAgIHNlbGVjdGlvbi5zb21lKChzZWwpID0+IHNlbC5tYXRjaGVzKG5ldyBEZXN0aW5hdGlvbklkZW50aWZpZXIoYXNzZXRJZCwgZGVzdElkKSkpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhmaWx0ZXJlZERlc3RpbmF0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldFthc3NldFR5cGVdW2Fzc2V0SWRdID0ge1xuICAgICAgICAgICAgLi4uYXNzZXQsXG4gICAgICAgICAgICBkZXN0aW5hdGlvbnM6IGZpbHRlcmVkRGVzdGluYXRpb25zLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFzc2V0TWFuaWZlc3QodGhpcy5kaXJlY3RvcnksIHJldCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzY3JpYmUgdGhlIGFzc2V0IG1hbmlmZXN0IGFzIGEgbGlzdCBvZiBzdHJpbmdzXG4gICAqL1xuICBwdWJsaWMgbGlzdCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4uZGVzY3JpYmVBc3NldHMoJ2ZpbGUnLCB0aGlzLm1hbmlmZXN0LmZpbGVzIHx8IHt9KSxcbiAgICAgIC4uLmRlc2NyaWJlQXNzZXRzKCdkb2NrZXItaW1hZ2UnLCB0aGlzLm1hbmlmZXN0LmRvY2tlckltYWdlcyB8fCB7fSksXG4gICAgXTtcblxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlQXNzZXRzKFxuICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgYXNzZXRzOiBSZWNvcmQ8c3RyaW5nLCB7IHNvdXJjZTogYW55OyBkZXN0aW5hdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gfT4sXG4gICAgKSB7XG4gICAgICBjb25zdCByZXQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBbYXNzZXRJZCwgYXNzZXRdIG9mIE9iamVjdC5lbnRyaWVzKGFzc2V0cyB8fCB7fSkpIHtcbiAgICAgICAgcmV0LnB1c2goYCR7YXNzZXRJZH0gJHt0eXBlfSAke0pTT04uc3RyaW5naWZ5KGFzc2V0LnNvdXJjZSl9YCk7XG5cbiAgICAgICAgY29uc3QgZGVzdFN0cmluZ3MgPSBPYmplY3QuZW50cmllcyhhc3NldC5kZXN0aW5hdGlvbnMpLm1hcChcbiAgICAgICAgICAoW2Rlc3RJZCwgZGVzdF0pID0+IGAgJHthc3NldElkfToke2Rlc3RJZH0gJHtKU09OLnN0cmluZ2lmeShkZXN0KX1gLFxuICAgICAgICApO1xuICAgICAgICByZXQucHVzaCguLi5wcmVmaXhUcmVlQ2hhcnMoZGVzdFN0cmluZ3MsICcgICcpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYXNzZXRzIHBlciBkZXN0aW5hdGlvblxuICAgKlxuICAgKiBSZXR1cm5zIG9uZSBhc3NldCBmb3IgZXZlcnkgcHVibGlzaGFibGUgZGVzdGluYXRpb24uIE11bHRpcGxlIGFzc2V0XG4gICAqIGRlc3RpbmF0aW9ucyBtYXkgc2hhcmUgdGhlIHNhbWUgYXNzZXQgc291cmNlLlxuICAgKi9cbiAgcHVibGljIGdldCBlbnRyaWVzKCk6IElNYW5pZmVzdEVudHJ5W10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi5tYWtlRW50cmllcyh0aGlzLm1hbmlmZXN0LmZpbGVzIHx8IHt9LCBGaWxlTWFuaWZlc3RFbnRyeSksXG4gICAgICAuLi5tYWtlRW50cmllcyh0aGlzLm1hbmlmZXN0LmRvY2tlckltYWdlcyB8fCB7fSwgRG9ja2VySW1hZ2VNYW5pZmVzdEVudHJ5KSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgZmlsZSBhc3NldHMsIHNwbGF0IG91dCB0byBkZXN0aW5hdGlvbnNcbiAgICovXG4gIHB1YmxpYyBnZXQgZmlsZXMoKTogRmlsZU1hbmlmZXN0RW50cnlbXSB7XG4gICAgcmV0dXJuIG1ha2VFbnRyaWVzKHRoaXMubWFuaWZlc3QuZmlsZXMgfHwge30sIEZpbGVNYW5pZmVzdEVudHJ5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlRW50cmllczxBLCBCLCBDPihcbiAgYXNzZXRzOiBSZWNvcmQ8c3RyaW5nLCB7IHNvdXJjZTogQTsgZGVzdGluYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCPiB9PixcbiAgY3RvcjogbmV3IChpZDogRGVzdGluYXRpb25JZGVudGlmaWVyLCBzb3VyY2U6IEEsIGRlc3RpbmF0aW9uOiBCKSA9PiBDLFxuKTogQ1tdIHtcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PEM+KCk7XG4gIGZvciAoY29uc3QgW2Fzc2V0SWQsIGFzc2V0XSBvZiBPYmplY3QuZW50cmllcyhhc3NldHMpKSB7XG4gICAgZm9yIChjb25zdCBbZGVzdElkLCBkZXN0aW5hdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoYXNzZXQuZGVzdGluYXRpb25zKSkge1xuICAgICAgcmV0LnB1c2gobmV3IGN0b3IobmV3IERlc3RpbmF0aW9uSWRlbnRpZmllcihhc3NldElkLCBkZXN0SWQpLCBhc3NldC5zb3VyY2UsIGRlc3RpbmF0aW9uKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbnR5cGUgQXNzZXRUeXBlID0gJ2ZpbGVzJyB8ICdkb2NrZXJJbWFnZXMnO1xuXG5jb25zdCBBU1NFVF9UWVBFUzogQXNzZXRUeXBlW10gPSBbJ2ZpbGVzJywgJ2RvY2tlckltYWdlcyddO1xuXG4vKipcbiAqIEEgc2luZ2xlIGFzc2V0IGZyb20gYW4gYXNzZXQgbWFuaWZlc3QnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSU1hbmlmZXN0RW50cnkge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2V0IGFuZCBpdHMgZGVzdGluYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBEZXN0aW5hdGlvbklkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGFzc2V0XG4gICAqL1xuICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFR5cGUtZGVwZW5kZW50IHNvdXJjZSBkYXRhXG4gICAqL1xuICByZWFkb25seSBnZW5lcmljU291cmNlOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUeXBlLWRlcGVuZGVudCBkZXN0aW5hdGlvbiBkYXRhXG4gICAqL1xuICByZWFkb25seSBnZW5lcmljRGVzdGluYXRpb246IHVua25vd247XG59XG5cbi8qKlxuICogQSBtYW5pZmVzdCBlbnRyeSBmb3IgYSBmaWxlIGFzc2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxlTWFuaWZlc3RFbnRyeSBpbXBsZW1lbnRzIElNYW5pZmVzdEVudHJ5IHtcbiAgcHVibGljIHJlYWRvbmx5IGdlbmVyaWNTb3VyY2U6IHVua25vd247XG4gIHB1YmxpYyByZWFkb25seSBnZW5lcmljRGVzdGluYXRpb246IHVua25vd247XG4gIHB1YmxpYyByZWFkb25seSB0eXBlID0gJ2ZpbGUnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBJZGVudGlmaWVyIGZvciB0aGlzIGFzc2V0ICovXG4gICAgcHVibGljIHJlYWRvbmx5IGlkOiBEZXN0aW5hdGlvbklkZW50aWZpZXIsXG4gICAgLyoqIFNvdXJjZSBvZiB0aGUgZmlsZSBhc3NldCAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzb3VyY2U6IEZpbGVTb3VyY2UsXG4gICAgLyoqIERlc3RpbmF0aW9uIGZvciB0aGUgZmlsZSBhc3NldCAqL1xuICAgIHB1YmxpYyByZWFkb25seSBkZXN0aW5hdGlvbjogRmlsZURlc3RpbmF0aW9uLFxuICApIHtcbiAgICB0aGlzLmdlbmVyaWNTb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5nZW5lcmljRGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEEgbWFuaWZlc3QgZW50cnkgZm9yIGEgZG9ja2VyIGltYWdlIGFzc2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBEb2NrZXJJbWFnZU1hbmlmZXN0RW50cnkgaW1wbGVtZW50cyBJTWFuaWZlc3RFbnRyeSB7XG4gIHB1YmxpYyByZWFkb25seSBnZW5lcmljU291cmNlOiB1bmtub3duO1xuICBwdWJsaWMgcmVhZG9ubHkgZ2VuZXJpY0Rlc3RpbmF0aW9uOiB1bmtub3duO1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZSA9ICdkb2NrZXItaW1hZ2UnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBJZGVudGlmaWVyIGZvciB0aGlzIGFzc2V0ICovXG4gICAgcHVibGljIHJlYWRvbmx5IGlkOiBEZXN0aW5hdGlvbklkZW50aWZpZXIsXG4gICAgLyoqIFNvdXJjZSBvZiB0aGUgZmlsZSBhc3NldCAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzb3VyY2U6IERvY2tlckltYWdlU291cmNlLFxuICAgIC8qKiBEZXN0aW5hdGlvbiBmb3IgdGhlIGZpbGUgYXNzZXQgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzdGluYXRpb246IERvY2tlckltYWdlRGVzdGluYXRpb24sXG4gICkge1xuICAgIHRoaXMuZ2VuZXJpY1NvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLmdlbmVyaWNEZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuICB9XG59XG5cbi8qKlxuICogSWRlbnRpZnkgYW4gYXNzZXQgZGVzdGluYXRpb24gaW4gYW4gYXNzZXQgbWFuaWZlc3RcbiAqXG4gKiBXaGVuIHN0cmluZ2lmaWVkLCB0aGlzIHdpbGwgYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgc291cmNlXG4gKiBhbmQgZGVzdGluYXRpb24gSURzLlxuICovXG5leHBvcnQgY2xhc3MgRGVzdGluYXRpb25JZGVudGlmaWVyIHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXMgdGhlIGFzc2V0LCBieSBzb3VyY2UuXG4gICAqXG4gICAqIFRoZSBhc3NldElkIHdpbGwgYmUgdGhlIHNhbWUgYmV0d2VlbiBhc3NldHMgdGhhdCByZXByZXNlbnRcbiAgICogdGhlIHNhbWUgcGh5c2ljYWwgZmlsZSBvciBpbWFnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhc3NldElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXMgdGhlIGRlc3RpbmF0aW9uIHdoZXJlIHRoaXMgYXNzZXQgd2lsbCBiZSBwdWJsaXNoZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXN0aW5hdGlvbklkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoYXNzZXRJZDogc3RyaW5nLCBkZXN0aW5hdGlvbklkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFzc2V0SWQgPSBhc3NldElkO1xuICAgIHRoaXMuZGVzdGluYXRpb25JZCA9IGRlc3RpbmF0aW9uSWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIGFzc2V0IGlkZW50aWZpZXJcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0aW5hdGlvbklkID8gYCR7dGhpcy5hc3NldElkfToke3RoaXMuZGVzdGluYXRpb25JZH1gIDogdGhpcy5hc3NldElkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbHRlckRpY3Q8QT4oXG4gIHhzOiBSZWNvcmQ8c3RyaW5nLCBBPixcbiAgcHJlZDogKHg6IEEsIGtleTogc3RyaW5nKSA9PiBib29sZWFuLFxuKTogUmVjb3JkPHN0cmluZywgQT4ge1xuICBjb25zdCByZXQ6IFJlY29yZDxzdHJpbmcsIEE+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHhzKSkge1xuICAgIGlmIChwcmVkKHZhbHVlLCBrZXkpKSB7XG4gICAgICByZXRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIEEgZmlsdGVyIHBhdHRlcm4gZm9yIGFuIGRlc3RpbmF0aW9uIGlkZW50aWZpZXJcbiAqL1xuZXhwb3J0IGNsYXNzIERlc3RpbmF0aW9uUGF0dGVybiB7XG4gIC8qKlxuICAgKiBQYXJzZSBhICc6Jy1zZXBhcmF0ZWQgc3RyaW5nIGludG8gYW4gYXNzZXQvZGVzdGluYXRpb24gaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBwYXJzZShzOiBzdHJpbmcpIHtcbiAgICBpZiAoIXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW1wdHkgc3RyaW5nIGlzIG5vdCBhIHZhbGlkIGRlc3RpbmF0aW9uIGlkZW50aWZpZXInKTtcbiAgICB9XG4gICAgY29uc3QgcGFydHMgPSBzLnNwbGl0KCc6JykubWFwKCh4KSA9PiAoeCAhPT0gJyonID8geCA6IHVuZGVmaW5lZCkpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBuZXcgRGVzdGluYXRpb25QYXR0ZXJuKHBhcnRzWzBdKTtcbiAgICB9XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcmV0dXJuIG5ldyBEZXN0aW5hdGlvblBhdHRlcm4ocGFydHNbMF0gfHwgdW5kZWZpbmVkLCBwYXJ0c1sxXSB8fCB1bmRlZmluZWQpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFzc2V0IGlkZW50aWZpZXIgbXVzdCBjb250YWluIGF0IG1vc3QgMiAnOictc2VwYXJhdGVkIHBhcnRzLCBnb3QgJyR7c30nYCk7XG4gIH1cblxuICAvKipcbiAgICogSWRlbnRpZmllcyB0aGUgYXNzZXQsIGJ5IHNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhc3NldElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSB0aGlzIGFzc2V0IHdpbGwgYmUgcHVibGlzaGVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzdGluYXRpb25JZD86IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihhc3NldElkPzogc3RyaW5nLCBkZXN0aW5hdGlvbklkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5hc3NldElkID0gYXNzZXRJZDtcbiAgICB0aGlzLmRlc3RpbmF0aW9uSWQgPSBkZXN0aW5hdGlvbklkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiBpZGVudGlmaWVyXG4gICAqL1xuICBwdWJsaWMgbWF0Y2hlcyhpZDogRGVzdGluYXRpb25JZGVudGlmaWVyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLmFzc2V0SWQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmFzc2V0SWQgPT09IGlkLmFzc2V0SWQpICYmXG4gICAgICAodGhpcy5kZXN0aW5hdGlvbklkID09PSB1bmRlZmluZWQgfHwgdGhpcy5kZXN0aW5hdGlvbklkID09PSBpZC5kZXN0aW5hdGlvbklkKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIGFzc2V0IGlkZW50aWZpZXJcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5hc3NldElkID8/ICcqJ306JHt0aGlzLmRlc3RpbmF0aW9uSWQgPz8gJyonfWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmVmaXggYm94LWRyYXdpbmcgY2hhcmFjdGVycyB0byBtYWtlIGxpbmVzIGxvb2sgbGlrZSBhIGhhbmdpbmcgdHJlZVxuICovXG5mdW5jdGlvbiBwcmVmaXhUcmVlQ2hhcnMoeHM6IHN0cmluZ1tdLCBwcmVmaXggPSAnJykge1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaXNMYXN0ID0gaSA9PT0geHMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBib3hDaGFyID0gaXNMYXN0ID8gJ+KUlCcgOiAn4pScJztcbiAgICByZXQucHVzaChgJHtwcmVmaXh9JHtib3hDaGFyfSR7eHNbaV19YCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ==
|