@aws-cdk/toolkit-lib 1.14.3 → 1.15.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.
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Options for creating a glob matcher
3
+ */
4
+ export interface GlobMatcherOptions {
5
+ /**
6
+ * Patterns for files to include (glob patterns)
7
+ * @default ['**'] - match all files
8
+ */
9
+ include?: string[];
10
+ /**
11
+ * Patterns for files to exclude (glob patterns)
12
+ */
13
+ exclude?: string[];
14
+ /**
15
+ * The root directory for matching. If provided, absolute paths will be
16
+ * converted to relative paths before matching against patterns.
17
+ * This is necessary because chokidar v4 passes absolute paths to the
18
+ * ignored callback even when a cwd is specified.
19
+ */
20
+ rootDir?: string;
21
+ }
22
+ /**
23
+ * Creates a function that returns true if a file should be ignored.
24
+ * A file is ignored if:
25
+ * - It matches any exclude pattern, OR
26
+ * - It does NOT match any include pattern
27
+ *
28
+ * This replicates the behavior of chokidar v3's glob pattern support.
29
+ *
30
+ * @param options - The include and exclude patterns
31
+ * @returns A function that takes a file path and returns true if it should be ignored
32
+ */
33
+ export declare function createIgnoreMatcher(options: GlobMatcherOptions): (filePath: string) => boolean;
34
+ //# sourceMappingURL=glob-matcher.d.ts.map
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createIgnoreMatcher = createIgnoreMatcher;
4
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
5
+ const picomatch = require("picomatch");
6
+ /**
7
+ * Normalizes a pattern to ensure it matches files within directories.
8
+ * If a pattern doesn't contain glob characters, it's treated as a directory
9
+ * and `/**` is appended to match all files within it.
10
+ *
11
+ * @param pattern - The pattern to normalize
12
+ * @returns The normalized pattern
13
+ */
14
+ function normalizePattern(pattern) {
15
+ // If pattern already contains glob characters, use as-is
16
+ if (pattern.includes('*') || pattern.includes('?') || pattern.includes('[')) {
17
+ return pattern;
18
+ }
19
+ // Otherwise, treat as a directory and match all files within
20
+ // Remove trailing slash if present, then append /**
21
+ const normalized = pattern.replace(/\/+$/, '');
22
+ return `${normalized}/**`;
23
+ }
24
+ /**
25
+ * Creates a function that returns true if a file should be ignored.
26
+ * A file is ignored if:
27
+ * - It matches any exclude pattern, OR
28
+ * - It does NOT match any include pattern
29
+ *
30
+ * This replicates the behavior of chokidar v3's glob pattern support.
31
+ *
32
+ * @param options - The include and exclude patterns
33
+ * @returns A function that takes a file path and returns true if it should be ignored
34
+ */
35
+ function createIgnoreMatcher(options) {
36
+ const includePatterns = options.include && options.include.length > 0
37
+ ? options.include.map(normalizePattern)
38
+ : ['**'];
39
+ const excludePatterns = (options.exclude ?? []).map(normalizePattern);
40
+ const rootDir = options.rootDir ? options.rootDir.replace(/\\/g, '/').replace(/\/+$/, '') : undefined;
41
+ // Compile patterns into matchers for better performance
42
+ const picomatchOptions = {
43
+ dot: true, // Match dotfiles when pattern explicitly includes them
44
+ };
45
+ const includeMatcher = picomatch(includePatterns, picomatchOptions);
46
+ const excludeMatcher = excludePatterns.length > 0
47
+ ? picomatch(excludePatterns, picomatchOptions)
48
+ : () => false;
49
+ return (filePath) => {
50
+ // Normalize path separators for cross-platform compatibility
51
+ let normalizedPath = filePath.replace(/\\/g, '/');
52
+ // If rootDir is provided and the path appears to be absolute, make it relative
53
+ // This is necessary because chokidar v4 passes absolute paths to the
54
+ // ignored callback even when a cwd is specified
55
+ if (rootDir) {
56
+ if (normalizedPath.startsWith(rootDir + '/')) {
57
+ normalizedPath = normalizedPath.slice(rootDir.length + 1);
58
+ }
59
+ else if (normalizedPath === rootDir) {
60
+ // The root directory itself - don't ignore it
61
+ return false;
62
+ }
63
+ }
64
+ // A file is ignored if:
65
+ // 1. It matches any exclude pattern, OR
66
+ // 2. It does NOT match any include pattern
67
+ if (excludeMatcher(normalizedPath)) {
68
+ return true; // Ignore: matches exclude
69
+ }
70
+ if (!includeMatcher(normalizedPath)) {
71
+ return true; // Ignore: doesn't match include
72
+ }
73
+ return false; // Don't ignore: matches include and doesn't match exclude
74
+ };
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYi1tYXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZ2xvYi1tYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeURBLGtEQThDQztBQXZHRCxpRUFBaUU7QUFDakUsdUNBQXdDO0FBMEJ4Qzs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFlO0lBQ3ZDLHlEQUF5RDtJQUN6RCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUUsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUNELDZEQUE2RDtJQUM3RCxvREFBb0Q7SUFDcEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0MsT0FBTyxHQUFHLFVBQVUsS0FBSyxDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsT0FBMkI7SUFDN0QsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNYLE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN0RSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRXRHLHdEQUF3RDtJQUN4RCxNQUFNLGdCQUFnQixHQUErQjtRQUNuRCxHQUFHLEVBQUUsSUFBSSxFQUFFLHVEQUF1RDtLQUNuRSxDQUFDO0lBRUYsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUMvQyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQztRQUM5QyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0lBRWhCLE9BQU8sQ0FBQyxRQUFnQixFQUFXLEVBQUU7UUFDbkMsNkRBQTZEO1FBQzdELElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRWxELCtFQUErRTtRQUMvRSxxRUFBcUU7UUFDckUsZ0RBQWdEO1FBQ2hELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLGNBQWMsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUQsQ0FBQztpQkFBTSxJQUFJLGNBQWMsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDdEMsOENBQThDO2dCQUM5QyxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLHdDQUF3QztRQUN4QywyQ0FBMkM7UUFDM0MsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPLElBQUksQ0FBQyxDQUFDLDBCQUEwQjtRQUN6QyxDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sSUFBSSxDQUFDLENBQUMsZ0NBQWdDO1FBQy9DLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxDQUFDLDBEQUEwRDtJQUMxRSxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmltcG9ydCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjcmVhdGluZyBhIGdsb2IgbWF0Y2hlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdsb2JNYXRjaGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQYXR0ZXJucyBmb3IgZmlsZXMgdG8gaW5jbHVkZSAoZ2xvYiBwYXR0ZXJucylcbiAgICogQGRlZmF1bHQgWycqKiddIC0gbWF0Y2ggYWxsIGZpbGVzXG4gICAqL1xuICBpbmNsdWRlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFBhdHRlcm5zIGZvciBmaWxlcyB0byBleGNsdWRlIChnbG9iIHBhdHRlcm5zKVxuICAgKi9cbiAgZXhjbHVkZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9vdCBkaXJlY3RvcnkgZm9yIG1hdGNoaW5nLiBJZiBwcm92aWRlZCwgYWJzb2x1dGUgcGF0aHMgd2lsbCBiZVxuICAgKiBjb252ZXJ0ZWQgdG8gcmVsYXRpdmUgcGF0aHMgYmVmb3JlIG1hdGNoaW5nIGFnYWluc3QgcGF0dGVybnMuXG4gICAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgY2hva2lkYXIgdjQgcGFzc2VzIGFic29sdXRlIHBhdGhzIHRvIHRoZVxuICAgKiBpZ25vcmVkIGNhbGxiYWNrIGV2ZW4gd2hlbiBhIGN3ZCBpcyBzcGVjaWZpZWQuXG4gICAqL1xuICByb290RGlyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBwYXR0ZXJuIHRvIGVuc3VyZSBpdCBtYXRjaGVzIGZpbGVzIHdpdGhpbiBkaXJlY3Rvcmllcy5cbiAqIElmIGEgcGF0dGVybiBkb2Vzbid0IGNvbnRhaW4gZ2xvYiBjaGFyYWN0ZXJzLCBpdCdzIHRyZWF0ZWQgYXMgYSBkaXJlY3RvcnlcbiAqIGFuZCBgLyoqYCBpcyBhcHBlbmRlZCB0byBtYXRjaCBhbGwgZmlsZXMgd2l0aGluIGl0LlxuICpcbiAqIEBwYXJhbSBwYXR0ZXJuIC0gVGhlIHBhdHRlcm4gdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBwYXR0ZXJuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdHRlcm4ocGF0dGVybjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSWYgcGF0dGVybiBhbHJlYWR5IGNvbnRhaW5zIGdsb2IgY2hhcmFjdGVycywgdXNlIGFzLWlzXG4gIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCcqJykgfHwgcGF0dGVybi5pbmNsdWRlcygnPycpIHx8IHBhdHRlcm4uaW5jbHVkZXMoJ1snKSkge1xuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG4gIC8vIE90aGVyd2lzZSwgdHJlYXQgYXMgYSBkaXJlY3RvcnkgYW5kIG1hdGNoIGFsbCBmaWxlcyB3aXRoaW5cbiAgLy8gUmVtb3ZlIHRyYWlsaW5nIHNsYXNoIGlmIHByZXNlbnQsIHRoZW4gYXBwZW5kIC8qKlxuICBjb25zdCBub3JtYWxpemVkID0gcGF0dGVybi5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgcmV0dXJuIGAke25vcm1hbGl6ZWR9LyoqYDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYSBmaWxlIHNob3VsZCBiZSBpZ25vcmVkLlxuICogQSBmaWxlIGlzIGlnbm9yZWQgaWY6XG4gKiAtIEl0IG1hdGNoZXMgYW55IGV4Y2x1ZGUgcGF0dGVybiwgT1JcbiAqIC0gSXQgZG9lcyBOT1QgbWF0Y2ggYW55IGluY2x1ZGUgcGF0dGVyblxuICpcbiAqIFRoaXMgcmVwbGljYXRlcyB0aGUgYmVoYXZpb3Igb2YgY2hva2lkYXIgdjMncyBnbG9iIHBhdHRlcm4gc3VwcG9ydC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBpbmNsdWRlIGFuZCBleGNsdWRlIHBhdHRlcm5zXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBmaWxlIHBhdGggYW5kIHJldHVybnMgdHJ1ZSBpZiBpdCBzaG91bGQgYmUgaWdub3JlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSWdub3JlTWF0Y2hlcihvcHRpb25zOiBHbG9iTWF0Y2hlck9wdGlvbnMpOiAoZmlsZVBhdGg6IHN0cmluZykgPT4gYm9vbGVhbiB7XG4gIGNvbnN0IGluY2x1ZGVQYXR0ZXJucyA9IG9wdGlvbnMuaW5jbHVkZSAmJiBvcHRpb25zLmluY2x1ZGUubGVuZ3RoID4gMFxuICAgID8gb3B0aW9ucy5pbmNsdWRlLm1hcChub3JtYWxpemVQYXR0ZXJuKVxuICAgIDogWycqKiddO1xuICBjb25zdCBleGNsdWRlUGF0dGVybnMgPSAob3B0aW9ucy5leGNsdWRlID8/IFtdKS5tYXAobm9ybWFsaXplUGF0dGVybik7XG4gIGNvbnN0IHJvb3REaXIgPSBvcHRpb25zLnJvb3REaXIgPyBvcHRpb25zLnJvb3REaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpLnJlcGxhY2UoL1xcLyskLywgJycpIDogdW5kZWZpbmVkO1xuXG4gIC8vIENvbXBpbGUgcGF0dGVybnMgaW50byBtYXRjaGVycyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gIGNvbnN0IHBpY29tYXRjaE9wdGlvbnM6IHBpY29tYXRjaC5QaWNvbWF0Y2hPcHRpb25zID0ge1xuICAgIGRvdDogdHJ1ZSwgLy8gTWF0Y2ggZG90ZmlsZXMgd2hlbiBwYXR0ZXJuIGV4cGxpY2l0bHkgaW5jbHVkZXMgdGhlbVxuICB9O1xuXG4gIGNvbnN0IGluY2x1ZGVNYXRjaGVyID0gcGljb21hdGNoKGluY2x1ZGVQYXR0ZXJucywgcGljb21hdGNoT3B0aW9ucyk7XG4gIGNvbnN0IGV4Y2x1ZGVNYXRjaGVyID0gZXhjbHVkZVBhdHRlcm5zLmxlbmd0aCA+IDBcbiAgICA/IHBpY29tYXRjaChleGNsdWRlUGF0dGVybnMsIHBpY29tYXRjaE9wdGlvbnMpXG4gICAgOiAoKSA9PiBmYWxzZTtcblxuICByZXR1cm4gKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAvLyBOb3JtYWxpemUgcGF0aCBzZXBhcmF0b3JzIGZvciBjcm9zcy1wbGF0Zm9ybSBjb21wYXRpYmlsaXR5XG4gICAgbGV0IG5vcm1hbGl6ZWRQYXRoID0gZmlsZVBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG4gICAgLy8gSWYgcm9vdERpciBpcyBwcm92aWRlZCBhbmQgdGhlIHBhdGggYXBwZWFycyB0byBiZSBhYnNvbHV0ZSwgbWFrZSBpdCByZWxhdGl2ZVxuICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgY2hva2lkYXIgdjQgcGFzc2VzIGFic29sdXRlIHBhdGhzIHRvIHRoZVxuICAgIC8vIGlnbm9yZWQgY2FsbGJhY2sgZXZlbiB3aGVuIGEgY3dkIGlzIHNwZWNpZmllZFxuICAgIGlmIChyb290RGlyKSB7XG4gICAgICBpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChyb290RGlyICsgJy8nKSkge1xuICAgICAgICBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZWRQYXRoLnNsaWNlKHJvb3REaXIubGVuZ3RoICsgMSk7XG4gICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRQYXRoID09PSByb290RGlyKSB7XG4gICAgICAgIC8vIFRoZSByb290IGRpcmVjdG9yeSBpdHNlbGYgLSBkb24ndCBpZ25vcmUgaXRcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEEgZmlsZSBpcyBpZ25vcmVkIGlmOlxuICAgIC8vIDEuIEl0IG1hdGNoZXMgYW55IGV4Y2x1ZGUgcGF0dGVybiwgT1JcbiAgICAvLyAyLiBJdCBkb2VzIE5PVCBtYXRjaCBhbnkgaW5jbHVkZSBwYXR0ZXJuXG4gICAgaWYgKGV4Y2x1ZGVNYXRjaGVyKG5vcm1hbGl6ZWRQYXRoKSkge1xuICAgICAgcmV0dXJuIHRydWU7IC8vIElnbm9yZTogbWF0Y2hlcyBleGNsdWRlXG4gICAgfVxuXG4gICAgaWYgKCFpbmNsdWRlTWF0Y2hlcihub3JtYWxpemVkUGF0aCkpIHtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBJZ25vcmU6IGRvZXNuJ3QgbWF0Y2ggaW5jbHVkZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTsgLy8gRG9uJ3QgaWdub3JlOiBtYXRjaGVzIGluY2x1ZGUgYW5kIGRvZXNuJ3QgbWF0Y2ggZXhjbHVkZVxuICB9O1xufVxuIl19
@@ -1,5 +1,6 @@
1
1
  export * from './archive';
2
2
  export * from './arrays';
3
+ export * from './glob-matcher';
3
4
  export * from './bool';
4
5
  export * from './bytes';
5
6
  export * from './cloudformation';
package/lib/util/index.js CHANGED
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./archive"), exports);
18
18
  __exportStar(require("./arrays"), exports);
19
+ __exportStar(require("./glob-matcher"), exports);
19
20
  __exportStar(require("./bool"), exports);
20
21
  __exportStar(require("./bytes"), exports);
21
22
  __exportStar(require("./cloudformation"), exports);
@@ -33,4 +34,4 @@ __exportStar(require("./type-brands"), exports);
33
34
  __exportStar(require("./types"), exports);
34
35
  __exportStar(require("./version-range"), exports);
35
36
  __exportStar(require("./yaml-cfn"), exports);
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQTBCO0FBQzFCLDJDQUF5QjtBQUN6Qix5Q0FBdUI7QUFDdkIsMENBQXdCO0FBQ3hCLG1EQUFpQztBQUNqQyxpREFBK0I7QUFDL0IsZ0RBQThCO0FBQzlCLGlEQUErQjtBQUMvQix5Q0FBdUI7QUFDdkIsd0NBQXNCO0FBQ3RCLDRDQUEwQjtBQUMxQiw2Q0FBMkI7QUFDM0IsaURBQStCO0FBQy9CLDhDQUE0QjtBQUM1Qix3REFBc0M7QUFDdEMsZ0RBQThCO0FBQzlCLDBDQUF3QjtBQUN4QixrREFBZ0M7QUFDaEMsNkNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hcmNoaXZlJztcbmV4cG9ydCAqIGZyb20gJy4vYXJyYXlzJztcbmV4cG9ydCAqIGZyb20gJy4vYm9vbCc7XG5leHBvcnQgKiBmcm9tICcuL2J5dGVzJztcbmV4cG9ydCAqIGZyb20gJy4vY2xvdWRmb3JtYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9jb250ZW50LWhhc2gnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXJlY3Rvcmllcyc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm1hdC1lcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL2pzb24nO1xuZXhwb3J0ICogZnJvbSAnLi9uZXQnO1xuZXhwb3J0ICogZnJvbSAnLi9vYmplY3RzJztcbmV4cG9ydCAqIGZyb20gJy4vcGFyYWxsZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9wYWNrYWdlLWluZm8nO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJpYWxpemUnO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJpbmctbWFuaXB1bGF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZS1icmFuZHMnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb24tcmFuZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi95YW1sLWNmbic7XG4iXX0=
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQTBCO0FBQzFCLDJDQUF5QjtBQUN6QixpREFBK0I7QUFDL0IseUNBQXVCO0FBQ3ZCLDBDQUF3QjtBQUN4QixtREFBaUM7QUFDakMsaURBQStCO0FBQy9CLGdEQUE4QjtBQUM5QixpREFBK0I7QUFDL0IseUNBQXVCO0FBQ3ZCLHdDQUFzQjtBQUN0Qiw0Q0FBMEI7QUFDMUIsNkNBQTJCO0FBQzNCLGlEQUErQjtBQUMvQiw4Q0FBNEI7QUFDNUIsd0RBQXNDO0FBQ3RDLGdEQUE4QjtBQUM5QiwwQ0FBd0I7QUFDeEIsa0RBQWdDO0FBQ2hDLDZDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYXJjaGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2FycmF5cyc7XG5leHBvcnQgKiBmcm9tICcuL2dsb2ItbWF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL2Jvb2wnO1xuZXhwb3J0ICogZnJvbSAnLi9ieXRlcyc7XG5leHBvcnQgKiBmcm9tICcuL2Nsb3VkZm9ybWF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vY29udGVudC1oYXNoJztcbmV4cG9ydCAqIGZyb20gJy4vZGlyZWN0b3JpZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtYXQtZXJyb3InO1xuZXhwb3J0ICogZnJvbSAnLi9qc29uJztcbmV4cG9ydCAqIGZyb20gJy4vbmV0JztcbmV4cG9ydCAqIGZyb20gJy4vb2JqZWN0cyc7XG5leHBvcnQgKiBmcm9tICcuL3BhcmFsbGVsJztcbmV4cG9ydCAqIGZyb20gJy4vcGFja2FnZS1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vc2VyaWFsaXplJztcbmV4cG9ydCAqIGZyb20gJy4vc3RyaW5nLW1hbmlwdWxhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3R5cGUtYnJhbmRzJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uLXJhbmdlJztcbmV4cG9ydCAqIGZyb20gJy4veWFtbC1jZm4nO1xuIl19
package/package.json CHANGED
@@ -47,6 +47,7 @@
47
47
  "@types/jest": "^29.5.14",
48
48
  "@types/jest-when": "^3.5.5",
49
49
  "@types/node": "^16",
50
+ "@types/picomatch": "^4",
50
51
  "@types/split2": "^4.2.3",
51
52
  "@typescript-eslint/eslint-plugin": "^8",
52
53
  "@typescript-eslint/parser": "^8",
@@ -79,8 +80,8 @@
79
80
  },
80
81
  "dependencies": {
81
82
  "@aws-cdk/cdk-assets-lib": "^1",
82
- "@aws-cdk/cloud-assembly-api": "2.0.1",
83
- "@aws-cdk/cloud-assembly-schema": ">=50.4.0",
83
+ "@aws-cdk/cloud-assembly-api": "2.1.0",
84
+ "@aws-cdk/cloud-assembly-schema": ">=52.0.0",
84
85
  "@aws-cdk/cloudformation-diff": "^2",
85
86
  "@aws-cdk/cx-api": "^2",
86
87
  "@aws-sdk/client-appsync": "^3",
@@ -119,6 +120,7 @@
119
120
  "glob": "^11.1.0",
120
121
  "minimatch": "10.0.1",
121
122
  "p-limit": "^3",
123
+ "picomatch": "^4",
122
124
  "semver": "^7.7.3",
123
125
  "split2": "^4.2.0",
124
126
  "uuid": "^11.1.0",
@@ -138,7 +140,7 @@
138
140
  "publishConfig": {
139
141
  "access": "public"
140
142
  },
141
- "version": "1.14.3",
143
+ "version": "1.15.0",
142
144
  "types": "lib/index.d.ts",
143
145
  "exports": {
144
146
  ".": {
@@ -1,35 +0,0 @@
1
- import type { AssemblyManifest } from '@aws-cdk/cloud-assembly-schema';
2
- import type { ResourceLocation } from './cloudformation';
3
- export interface ExcludeList {
4
- isExcluded(location: ResourceLocation): boolean;
5
- union(other: ExcludeList): ExcludeList;
6
- }
7
- declare abstract class AbstractExcludeList implements ExcludeList {
8
- abstract isExcluded(location: ResourceLocation): boolean;
9
- union(other: ExcludeList): ExcludeList;
10
- }
11
- export declare class ManifestExcludeList extends AbstractExcludeList {
12
- private readonly excludedLocations;
13
- constructor(manifest: AssemblyManifest);
14
- private getExcludedLocations;
15
- isExcluded(location: ResourceLocation): boolean;
16
- }
17
- export declare class InMemoryExcludeList extends AbstractExcludeList {
18
- private readonly excludedLocations;
19
- private readonly excludedPaths;
20
- constructor(items: string[]);
21
- isExcluded(location: ResourceLocation): boolean;
22
- }
23
- export declare class UnionExcludeList extends AbstractExcludeList {
24
- private readonly excludeLists;
25
- constructor(excludeLists: ExcludeList[]);
26
- isExcluded(location: ResourceLocation): boolean;
27
- }
28
- export declare class NeverExclude extends AbstractExcludeList {
29
- isExcluded(_location: ResourceLocation): boolean;
30
- }
31
- export declare class AlwaysExclude extends AbstractExcludeList {
32
- isExcluded(_location: ResourceLocation): boolean;
33
- }
34
- export {};
35
- //# sourceMappingURL=exclude.d.ts.map
@@ -1,98 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AlwaysExclude = exports.NeverExclude = exports.UnionExcludeList = exports.InMemoryExcludeList = exports.ManifestExcludeList = void 0;
4
- const cloud_assembly_schema_1 = require("@aws-cdk/cloud-assembly-schema");
5
- class AbstractExcludeList {
6
- union(other) {
7
- return new UnionExcludeList([this, other]);
8
- }
9
- }
10
- class ManifestExcludeList extends AbstractExcludeList {
11
- excludedLocations;
12
- constructor(manifest) {
13
- super();
14
- this.excludedLocations = this.getExcludedLocations(manifest);
15
- }
16
- getExcludedLocations(asmManifest) {
17
- // First, we need to filter the artifacts to only include CloudFormation stacks
18
- const stackManifests = Object.entries(asmManifest.artifacts ?? {}).filter(([_, manifest]) => manifest.type === cloud_assembly_schema_1.ArtifactType.AWS_CLOUDFORMATION_STACK);
19
- const result = [];
20
- for (let [stackName, manifest] of stackManifests) {
21
- const locations = Object.values(manifest.metadata ?? {})
22
- // Then pick only the resources in each stack marked with DO_NOT_REFACTOR
23
- .filter((entries) => entries.some((entry) => entry.type === cloud_assembly_schema_1.ArtifactMetadataEntryType.DO_NOT_REFACTOR && entry.data === true))
24
- // Finally, get the logical ID of each resource
25
- .map((entries) => {
26
- const logicalIdEntry = entries.find((entry) => entry.type === cloud_assembly_schema_1.ArtifactMetadataEntryType.LOGICAL_ID);
27
- const location = {
28
- StackName: stackName,
29
- LogicalResourceId: logicalIdEntry.data,
30
- };
31
- return location;
32
- });
33
- result.push(...locations);
34
- }
35
- return result;
36
- }
37
- isExcluded(location) {
38
- return this.excludedLocations.some((loc) => loc.StackName === location.stack.stackName && loc.LogicalResourceId === location.logicalResourceId);
39
- }
40
- }
41
- exports.ManifestExcludeList = ManifestExcludeList;
42
- class InMemoryExcludeList extends AbstractExcludeList {
43
- excludedLocations;
44
- excludedPaths;
45
- constructor(items) {
46
- super();
47
- this.excludedLocations = [];
48
- this.excludedPaths = [];
49
- if (items.length === 0) {
50
- return;
51
- }
52
- const locationRegex = /^[A-Za-z0-9]+\.[A-Za-z0-9]+$/;
53
- items.forEach((item) => {
54
- if (locationRegex.test(item)) {
55
- const [stackName, logicalId] = item.split('.');
56
- this.excludedLocations.push({
57
- StackName: stackName,
58
- LogicalResourceId: logicalId,
59
- });
60
- }
61
- else {
62
- this.excludedPaths.push(item);
63
- }
64
- });
65
- }
66
- isExcluded(location) {
67
- const containsLocation = this.excludedLocations.some((loc) => {
68
- return loc.StackName === location.stack.stackName && loc.LogicalResourceId === location.logicalResourceId;
69
- });
70
- const containsPath = this.excludedPaths.some((path) => location.toPath() === path);
71
- return containsLocation || containsPath;
72
- }
73
- }
74
- exports.InMemoryExcludeList = InMemoryExcludeList;
75
- class UnionExcludeList extends AbstractExcludeList {
76
- excludeLists;
77
- constructor(excludeLists) {
78
- super();
79
- this.excludeLists = excludeLists;
80
- }
81
- isExcluded(location) {
82
- return this.excludeLists.some((excludeList) => excludeList.isExcluded(location));
83
- }
84
- }
85
- exports.UnionExcludeList = UnionExcludeList;
86
- class NeverExclude extends AbstractExcludeList {
87
- isExcluded(_location) {
88
- return false;
89
- }
90
- }
91
- exports.NeverExclude = NeverExclude;
92
- class AlwaysExclude extends AbstractExcludeList {
93
- isExcluded(_location) {
94
- return true;
95
- }
96
- }
97
- exports.AlwaysExclude = AlwaysExclude;
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjbHVkZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImV4Y2x1ZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMEVBQXlGO0FBVXpGLE1BQWUsbUJBQW1CO0lBR2hDLEtBQUssQ0FBQyxLQUFrQjtRQUN0QixPQUFPLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUFFRCxNQUFhLG1CQUFvQixTQUFRLG1CQUFtQjtJQUN6QyxpQkFBaUIsQ0FBd0I7SUFFMUQsWUFBWSxRQUEwQjtRQUNwQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFdBQTZCO1FBQ3hELCtFQUErRTtRQUMvRSxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUN2RSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLG9DQUFZLENBQUMsd0JBQXdCLENBQzNFLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBMEIsRUFBRSxDQUFDO1FBQ3pDLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNqRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO2dCQUN0RCx5RUFBeUU7aUJBQ3hFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssaURBQXlC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R0FBWixZQUFZLENBQWU7SUFFeEQsQ0FBQztJQUVELFVBQVUsQ0FBQyxRQUEwQjtRQUNuQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDbkYsQ0FBQztDQUNGO0FBUkQsNENBUUM7QUFFRCxNQUFhLFlBQWEsU0FBUSxtQkFBbUI7SUFDbkQsVUFBVSxDQUFDLFNBQTJCO1FBQ3BDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBSkQsb0NBSUM7QUFFRCxNQUFhLGFBQWMsU0FBUSxtQkFBbUI7SUFDcEQsVUFBVSxDQUFDLFNBQTJCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBSkQsc0NBSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFzc2VtYmx5TWFuaWZlc3QgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHsgQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZSwgQXJ0aWZhY3RUeXBlIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VMb2NhdGlvbiBhcyBDZm5SZXNvdXJjZUxvY2F0aW9uIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VMb2NhdGlvbiB9IGZyb20gJy4vY2xvdWRmb3JtYXRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4Y2x1ZGVMaXN0IHtcbiAgaXNFeGNsdWRlZChsb2NhdGlvbjogUmVzb3VyY2VMb2NhdGlvbik6IGJvb2xlYW47XG5cbiAgdW5pb24ob3RoZXI6IEV4Y2x1ZGVMaXN0KTogRXhjbHVkZUxpc3Q7XG59XG5cbmFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXhjbHVkZUxpc3QgaW1wbGVtZW50cyBFeGNsdWRlTGlzdCB7XG4gIGFic3RyYWN0IGlzRXhjbHVkZWQobG9jYXRpb246IFJlc291cmNlTG9jYXRpb24pOiBib29sZWFuO1xuXG4gIHVuaW9uKG90aGVyOiBFeGNsdWRlTGlzdCk6IEV4Y2x1ZGVMaXN0IHtcbiAgICByZXR1cm4gbmV3IFVuaW9uRXhjbHVkZUxpc3QoW3RoaXMsIG90aGVyXSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hbmlmZXN0RXhjbHVkZUxpc3QgZXh0ZW5kcyBBYnN0cmFjdEV4Y2x1ZGVMaXN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBleGNsdWRlZExvY2F0aW9uczogQ2ZuUmVzb3VyY2VMb2NhdGlvbltdO1xuXG4gIGNvbnN0cnVjdG9yKG1hbmlmZXN0OiBBc3NlbWJseU1hbmlmZXN0KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmV4Y2x1ZGVkTG9jYXRpb25zID0gdGhpcy5nZXRFeGNsdWRlZExvY2F0aW9ucyhtYW5pZmVzdCk7XG4gIH1cblxuICBwcml2YXRlIGdldEV4Y2x1ZGVkTG9jYXRpb25zKGFzbU1hbmlmZXN0OiBBc3NlbWJseU1hbmlmZXN0KTogQ2ZuUmVzb3VyY2VMb2NhdGlvbltdIHtcbiAgICAvLyBGaXJzdCwgd2UgbmVlZCB0byBmaWx0ZXIgdGhlIGFydGlmYWN0cyB0byBvbmx5IGluY2x1ZGUgQ2xvdWRGb3JtYXRpb24gc3RhY2tzXG4gICAgY29uc3Qgc3RhY2tNYW5pZmVzdHMgPSBPYmplY3QuZW50cmllcyhhc21NYW5pZmVzdC5hcnRpZmFjdHMgPz8ge30pLmZpbHRlcihcbiAgICAgIChbXywgbWFuaWZlc3RdKSA9PiBtYW5pZmVzdC50eXBlID09PSBBcnRpZmFjdFR5cGUuQVdTX0NMT1VERk9STUFUSU9OX1NUQUNLLFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQ6IENmblJlc291cmNlTG9jYXRpb25bXSA9IFtdO1xuICAgIGZvciAobGV0IFtzdGFja05hbWUsIG1hbmlmZXN0XSBvZiBzdGFja01hbmlmZXN0cykge1xuICAgICAgY29uc3QgbG9jYXRpb25zID0gT2JqZWN0LnZhbHVlcyhtYW5pZmVzdC5tZXRhZGF0YSA/PyB7fSlcbiAgICAgICAgLy8gVGhlbiBwaWNrIG9ubHkgdGhlIHJlc291cmNlcyBpbiBlYWNoIHN0YWNrIG1hcmtlZCB3aXRoIERPX05PVF9SRUZBQ1RPUlxuICAgICAgICAuZmlsdGVyKChlbnRyaWVzKSA9PlxuICAgICAgICAgIGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LnR5cGUgPT09IEFydGlmYWN0TWV0YWRhdGFFbnRyeVR5cGUuRE9fTk9UX1JFRkFDVE9SICYmIGVudHJ5LmRhdGEgPT09IHRydWUpLFxuICAgICAgICApXG4gICAgICAgIC8vIEZpbmFsbHksIGdldCB0aGUgbG9naWNhbCBJRCBvZiBlYWNoIHJlc291cmNlXG4gICAgICAgIC5tYXAoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICBjb25zdCBsb2dpY2FsSWRFbnRyeSA9IGVudHJpZXMuZmluZCgoZW50cnkpID0+IGVudHJ5LnR5cGUgPT09IEFydGlmYWN0TWV0YWRhdGFFbnRyeVR5cGUuTE9HSUNBTF9JRCk7XG4gICAgICAgICAgY29uc3QgbG9jYXRpb246IENmblJlc291cmNlTG9jYXRpb24gPSB7XG4gICAgICAgICAgICBTdGFja05hbWU6IHN0YWNrTmFtZSxcbiAgICAgICAgICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBsb2dpY2FsSWRFbnRyeSEuZGF0YSEgYXMgc3RyaW5nLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xuICAgICAgICB9KTtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmxvY2F0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpc0V4Y2x1ZGVkKGxvY2F0aW9uOiBSZXNvdXJjZUxvY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXhjbHVkZWRMb2NhdGlvbnMuc29tZShcbiAgICAgIChsb2MpID0+IGxvYy5TdGFja05hbWUgPT09IGxvY2F0aW9uLnN0YWNrLnN0YWNrTmFtZSAmJiBsb2MuTG9naWNhbFJlc291cmNlSWQgPT09IGxvY2F0aW9uLmxvZ2ljYWxSZXNvdXJjZUlkLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluTWVtb3J5RXhjbHVkZUxpc3QgZXh0ZW5kcyBBYnN0cmFjdEV4Y2x1ZGVMaXN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBleGNsdWRlZExvY2F0aW9uczogQ2ZuUmVzb3VyY2VMb2NhdGlvbltdO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4Y2x1ZGVkUGF0aHM6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGl0ZW1zOiBzdHJpbmdbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5leGNsdWRlZExvY2F0aW9ucyA9IFtdO1xuICAgIHRoaXMuZXhjbHVkZWRQYXRocyA9IFtdO1xuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxvY2F0aW9uUmVnZXggPSAvXltBLVphLXowLTldK1xcLltBLVphLXowLTldKyQvO1xuXG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAobG9jYXRpb25SZWdleC50ZXN0KGl0ZW0pKSB7XG4gICAgICAgIGNvbnN0IFtzdGFja05hbWUsIGxvZ2ljYWxJZF0gPSBpdGVtLnNwbGl0KCcuJyk7XG4gICAgICAgIHRoaXMuZXhjbHVkZWRMb2NhdGlvbnMucHVzaCh7XG4gICAgICAgICAgU3RhY2tOYW1lOiBzdGFja05hbWUsXG4gICAgICAgICAgTG9naWNhbFJlc291cmNlSWQ6IGxvZ2ljYWxJZCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV4Y2x1ZGVkUGF0aHMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlzRXhjbHVkZWQobG9jYXRpb246IFJlc291cmNlTG9jYXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBjb250YWluc0xvY2F0aW9uID0gdGhpcy5leGNsdWRlZExvY2F0aW9ucy5zb21lKChsb2MpID0+IHtcbiAgICAgIHJldHVybiBsb2MuU3RhY2tOYW1lID09PSBsb2NhdGlvbi5zdGFjay5zdGFja05hbWUgJiYgbG9jLkxvZ2ljYWxSZXNvdXJjZUlkID09PSBsb2NhdGlvbi5sb2dpY2FsUmVzb3VyY2VJZDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbnRhaW5zUGF0aCA9IHRoaXMuZXhjbHVkZWRQYXRocy5zb21lKChwYXRoKSA9PiBsb2NhdGlvbi50b1BhdGgoKSA9PT0gcGF0aCk7XG4gICAgcmV0dXJuIGNvbnRhaW5zTG9jYXRpb24gfHwgY29udGFpbnNQYXRoO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmlvbkV4Y2x1ZGVMaXN0IGV4dGVuZHMgQWJzdHJhY3RFeGNsdWRlTGlzdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZXhjbHVkZUxpc3RzOiBFeGNsdWRlTGlzdFtdKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGlzRXhjbHVkZWQobG9jYXRpb246IFJlc291cmNlTG9jYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leGNsdWRlTGlzdHMuc29tZSgoZXhjbHVkZUxpc3QpID0+IGV4Y2x1ZGVMaXN0LmlzRXhjbHVkZWQobG9jYXRpb24pKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTmV2ZXJFeGNsdWRlIGV4dGVuZHMgQWJzdHJhY3RFeGNsdWRlTGlzdCB7XG4gIGlzRXhjbHVkZWQoX2xvY2F0aW9uOiBSZXNvdXJjZUxvY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBbHdheXNFeGNsdWRlIGV4dGVuZHMgQWJzdHJhY3RFeGNsdWRlTGlzdCB7XG4gIGlzRXhjbHVkZWQoX2xvY2F0aW9uOiBSZXNvdXJjZUxvY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiJdfQ==