esa-pcg-cli 0.1.2 → 0.1.4

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,45 @@
1
+ /**
2
+ * 解析 next.config.images 并校验 /_next/image 的 url 参数。
3
+ *
4
+ * 配置来源:OpenNext build 完成后会把解析后的完整 next.config 写到
5
+ * <server-bundle>/.next/required-server-files.json,images 字段就是 Next 自己
6
+ * 在运行时用的最终形态。直接读这个文件可以避开 next.config 的 TS/ESM/JS 三种
7
+ * 形态解析,也无需在 build 阶段做额外抽取。
8
+ *
9
+ * 匹配算法:复用 Next 自己的 match-remote-pattern 模块——picomatch 的 glob
10
+ * 语义边界(`**` 跨段、`*` 单段、`?`、`{a,b}`)自己重写很容易跟 next dev
11
+ * 行为漂移。Next 必然在 server bundle 的 node_modules 里,运行时 require 即可。
12
+ *
13
+ * 边界行为(已与上层对齐):
14
+ * - 校验失败 → 上层 400(对齐 Next 默认行为)
15
+ * - required-server-files.json 缺失 → warn + 放行(兼容老产物,不阻断部署)
16
+ * - images.unoptimized=true → 跳过校验、照常代发(用户关了 Next 优化但仍走
17
+ * wrapper,白名单职责让位给上游)
18
+ */
19
+ interface RemotePattern {
20
+ protocol?: 'http' | 'https';
21
+ hostname: string;
22
+ port?: string;
23
+ pathname?: string;
24
+ search?: string;
25
+ }
26
+ declare type MatcherImpl = (domains: string[], remotePatterns: RemotePattern[], url: URL) => boolean;
27
+ export interface ValidateResult {
28
+ ok: boolean;
29
+ reason?: string;
30
+ }
31
+ /**
32
+ * 校验 /_next/image 的 url 是否被允许。语义对齐 Next:
33
+ * - 同源(host header === url 的 host,含端口)始终放行
34
+ * - unoptimized:true 跳过校验
35
+ * - 否则必须命中 domains 或 remotePatterns 之一
36
+ */
37
+ export declare function validateImageUrl(absoluteUrl: URL, hostHeader: string): ValidateResult;
38
+ /** 测试用:重置缓存。生产代码不调用。 */
39
+ export declare function _resetImageConfigCacheForTests(): void;
40
+ /**
41
+ * 测试用:注入 matcher,绕过对真实 next 模块的 require。
42
+ * 传 null 模拟"matcher 不可用"分支。
43
+ */
44
+ export declare function _setMatcherForTests(impl: MatcherImpl | null): void;
45
+ export {};
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ /**
3
+ * 解析 next.config.images 并校验 /_next/image 的 url 参数。
4
+ *
5
+ * 配置来源:OpenNext build 完成后会把解析后的完整 next.config 写到
6
+ * <server-bundle>/.next/required-server-files.json,images 字段就是 Next 自己
7
+ * 在运行时用的最终形态。直接读这个文件可以避开 next.config 的 TS/ESM/JS 三种
8
+ * 形态解析,也无需在 build 阶段做额外抽取。
9
+ *
10
+ * 匹配算法:复用 Next 自己的 match-remote-pattern 模块——picomatch 的 glob
11
+ * 语义边界(`**` 跨段、`*` 单段、`?`、`{a,b}`)自己重写很容易跟 next dev
12
+ * 行为漂移。Next 必然在 server bundle 的 node_modules 里,运行时 require 即可。
13
+ *
14
+ * 边界行为(已与上层对齐):
15
+ * - 校验失败 → 上层 400(对齐 Next 默认行为)
16
+ * - required-server-files.json 缺失 → warn + 放行(兼容老产物,不阻断部署)
17
+ * - images.unoptimized=true → 跳过校验、照常代发(用户关了 Next 优化但仍走
18
+ * wrapper,白名单职责让位给上游)
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports._setMatcherForTests = exports._resetImageConfigCacheForTests = exports.validateImageUrl = void 0;
22
+ const fs = require("fs");
23
+ const path = require("path");
24
+ let cachedConfig;
25
+ let cachedMatcher;
26
+ let warnedMatcherMissing = false;
27
+ /**
28
+ * 路径解析与 node-server.ts 的 assets 解析同源:wrapper 启动时
29
+ * process.cwd() === server-functions/default/,所以 .next 就在 cwd 下。
30
+ */
31
+ function configFilePath() {
32
+ return path.resolve(process.cwd(), '.next', 'required-server-files.json');
33
+ }
34
+ function loadImageConfig() {
35
+ var _a, _b, _c;
36
+ if (cachedConfig !== undefined)
37
+ return cachedConfig;
38
+ const filePath = configFilePath();
39
+ let raw;
40
+ try {
41
+ raw = fs.readFileSync(filePath, 'utf-8');
42
+ }
43
+ catch (err) {
44
+ console.warn(`[image-config] required-server-files.json not found at ${filePath} — allowing all image URLs (${(_a = err.code) !== null && _a !== void 0 ? _a : err.message})`);
45
+ cachedConfig = { mode: 'config-missing' };
46
+ return cachedConfig;
47
+ }
48
+ try {
49
+ const parsed = JSON.parse(raw);
50
+ const images = (_c = (_b = parsed === null || parsed === void 0 ? void 0 : parsed.config) === null || _b === void 0 ? void 0 : _b.images) !== null && _c !== void 0 ? _c : {};
51
+ cachedConfig = {
52
+ mode: 'loaded',
53
+ images: {
54
+ remotePatterns: Array.isArray(images.remotePatterns)
55
+ ? images.remotePatterns
56
+ : [],
57
+ domains: Array.isArray(images.domains) ? images.domains : [],
58
+ unoptimized: images.unoptimized === true,
59
+ },
60
+ };
61
+ return cachedConfig;
62
+ }
63
+ catch (err) {
64
+ console.warn(`[image-config] failed to parse ${filePath}: ${err.message} — allowing all image URLs`);
65
+ cachedConfig = { mode: 'config-missing' };
66
+ return cachedConfig;
67
+ }
68
+ }
69
+ /**
70
+ * 拿 Next 自己的 hasRemoteMatch。失败一次后缓存 null,后续走严格 deny 分支。
71
+ * 用 eval('require') 让 esbuild 不去尝试解析 next 模块——wrapper bundle 由
72
+ * scripts/bundle-overrides.js 用 esbuild 打包,把 next 标了 external 是 belt-
73
+ * and-suspenders;eval 这一层确保即便 external 配错也打不进 bundle。
74
+ */
75
+ function loadMatcher() {
76
+ if (cachedMatcher !== undefined)
77
+ return cachedMatcher;
78
+ try {
79
+ const dynamicRequire = eval('require');
80
+ const mod = dynamicRequire('next/dist/shared/lib/match-remote-pattern');
81
+ const hasRemoteMatch = mod === null || mod === void 0 ? void 0 : mod.hasRemoteMatch;
82
+ if (typeof hasRemoteMatch !== 'function') {
83
+ throw new Error('hasRemoteMatch not exported');
84
+ }
85
+ cachedMatcher = hasRemoteMatch;
86
+ return cachedMatcher;
87
+ }
88
+ catch (err) {
89
+ if (!warnedMatcherMissing) {
90
+ warnedMatcherMissing = true;
91
+ console.warn(`[image-config] cannot load next/dist/shared/lib/match-remote-pattern (${err.message}) — falling back to deny-external-only mode`);
92
+ }
93
+ cachedMatcher = null;
94
+ return null;
95
+ }
96
+ }
97
+ /**
98
+ * 校验 /_next/image 的 url 是否被允许。语义对齐 Next:
99
+ * - 同源(host header === url 的 host,含端口)始终放行
100
+ * - unoptimized:true 跳过校验
101
+ * - 否则必须命中 domains 或 remotePatterns 之一
102
+ */
103
+ function validateImageUrl(absoluteUrl, hostHeader) {
104
+ const cfg = loadImageConfig();
105
+ if (cfg.mode === 'config-missing') {
106
+ return { ok: true, reason: 'config-missing' };
107
+ }
108
+ const { images } = cfg;
109
+ if (images.unoptimized) {
110
+ return { ok: true, reason: 'unoptimized' };
111
+ }
112
+ // host header 通常带端口,absoluteUrl.hostname 不带 —— 用 url.host(含端口)
113
+ // 比较;同时小写化避免大小写差异。
114
+ const reqHost = hostHeader.toLowerCase();
115
+ const urlHost = absoluteUrl.host.toLowerCase();
116
+ if (reqHost && reqHost === urlHost) {
117
+ return { ok: true, reason: 'same-origin' };
118
+ }
119
+ const matcher = loadMatcher();
120
+ if (matcher === null) {
121
+ return { ok: false, reason: 'matcher-unavailable' };
122
+ }
123
+ if (matcher(images.domains, images.remotePatterns, absoluteUrl)) {
124
+ return { ok: true, reason: 'pattern-match' };
125
+ }
126
+ return { ok: false, reason: 'remote-pattern-not-matched' };
127
+ }
128
+ exports.validateImageUrl = validateImageUrl;
129
+ /** 测试用:重置缓存。生产代码不调用。 */
130
+ function _resetImageConfigCacheForTests() {
131
+ cachedConfig = undefined;
132
+ cachedMatcher = undefined;
133
+ warnedMatcherMissing = false;
134
+ }
135
+ exports._resetImageConfigCacheForTests = _resetImageConfigCacheForTests;
136
+ /**
137
+ * 测试用:注入 matcher,绕过对真实 next 模块的 require。
138
+ * 传 null 模拟"matcher 不可用"分支。
139
+ */
140
+ function _setMatcherForTests(impl) {
141
+ cachedMatcher = impl;
142
+ }
143
+ exports._setMatcherForTests = _setMatcherForTests;
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvaW1hZ2UtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7OztBQUVILHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUEwQjdCLElBQUksWUFBc0MsQ0FBQztBQUMzQyxJQUFJLGFBQTZDLENBQUM7QUFDbEQsSUFBSSxvQkFBb0IsR0FBRyxLQUFLLENBQUM7QUFFakM7OztHQUdHO0FBQ0gsU0FBUyxjQUFjO0lBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLDRCQUE0QixDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELFNBQVMsZUFBZTs7SUFDdEIsSUFBSSxZQUFZLEtBQUssU0FBUztRQUFFLE9BQU8sWUFBWSxDQUFDO0lBRXBELE1BQU0sUUFBUSxHQUFHLGNBQWMsRUFBRSxDQUFDO0lBQ2xDLElBQUksR0FBVyxDQUFDO0lBQ2hCLElBQUk7UUFDRixHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDMUM7SUFBQyxPQUFPLEdBQVEsRUFBRTtRQUNqQixPQUFPLENBQUMsSUFBSSxDQUNWLDBEQUEwRCxRQUFRLCtCQUErQixNQUFBLEdBQUcsQ0FBQyxJQUFJLG1DQUFJLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FDNUgsQ0FBQztRQUNGLFlBQVksR0FBRyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFDLE9BQU8sWUFBWSxDQUFDO0tBQ3JCO0lBRUQsSUFBSTtRQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBQSxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxN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QUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztLQUNyRDtJQUNELElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsRUFBRTtRQUMvRCxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLENBQUM7S0FDOUM7SUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsNEJBQTRCLEVBQUUsQ0FBQztBQUM3RCxDQUFDO0FBOUJELDRDQThCQztBQUVELHdCQUF3QjtBQUN4QixTQUFnQiw4QkFBOEI7SUFDNUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztJQUN6QixhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQzFCLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUMvQixDQUFDO0FBSkQsd0VBSUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxJQUF3QjtJQUMxRCxhQUFhLEdBQUcsSUFBSSxDQUFDO0FBQ3ZCLENBQUM7QUFGRCxrREFFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog6Kej5p6QIG5leHQuY29uZmlnLmltYWdlcyDlubbmoKHpqowgL19uZXh0L2ltYWdlIOeahCB1cmwg5Y+C5pWw44CCXG4gKlxuICog6YWN572u5p2l5rqQOk9wZW5OZXh0IGJ1aWxkIOWujOaIkOWQjuS8muaKiuino+aekOWQjueahOWujOaVtCBuZXh0LmNvbmZpZyDlhpnliLBcbiAqIDxzZXJ2ZXItYnVuZGxlPi8ubmV4dC9yZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbixpbWFnZXMg5a2X5q615bCx5pivIE5leHQg6Ieq5bexXG4gKiDlnKjov5DooYzml7bnlKjnmoTmnIDnu4jlvaLmgIHjgILnm7TmjqXor7vov5nkuKrmlofku7blj6/ku6Xpgb/lvIAgbmV4dC5jb25maWcg55qEIFRTL0VTTS9KUyDkuInnp41cbiAqIOW9ouaAgeino+aekCzkuZ/ml6DpnIDlnKggYnVpbGQg6Zi25q615YGa6aKd5aSW5oq95Y+W44CCXG4gKlxuICog5Yy56YWN566X5rOVOuWkjeeUqCBOZXh0IOiHquW3seeahCBtYXRjaC1yZW1vdGUtcGF0dGVybiDmqKHlnZfigJTigJRwaWNvbWF0Y2gg55qEIGdsb2JcbiAqIOivreS5iei+ueeVjChgKipgIOi3qOauteOAgWAqYCDljZXmrrXjgIFgP2DjgIFge2EsYn1gKeiHquW3semHjeWGmeW+iOWuueaYk+i3nyBuZXh0IGRldlxuICog6KGM5Li65ryC56e744CCTmV4dCDlv4XnhLblnKggc2VydmVyIGJ1bmRsZSDnmoQgbm9kZV9tb2R1bGVzIOmHjCzov5DooYzml7YgcmVxdWlyZSDljbPlj6/jgIJcbiAqXG4gKiDovrnnlYzooYzkuLoo5bey5LiO5LiK5bGC5a+56b2QKTpcbiAqIC0g5qCh6aqM5aSx6LSlIOKGkiDkuIrlsYIgNDAwKOWvuem9kCBOZXh0IOm7mOiupOihjOS4uilcbiAqIC0gcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb24g57y65aSxIOKGkiB3YXJuICsg5pS+6KGMKOWFvOWuueiAgeS6p+eJqSzkuI3pmLvmlq3pg6jnvbIpXG4gKiAtIGltYWdlcy51bm9wdGltaXplZD10cnVlIOKGkiDot7Pov4fmoKHpqozjgIHnhafluLjku6Plj5Eo55So5oi35YWz5LqGIE5leHQg5LyY5YyW5L2G5LuN6LWwXG4gKiAgIHdyYXBwZXIs55m95ZCN5Y2V6IGM6LSj6K6p5L2N57uZ5LiK5ri4KVxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmludGVyZmFjZSBSZW1vdGVQYXR0ZXJuIHtcbiAgcHJvdG9jb2w/OiAnaHR0cCcgfCAnaHR0cHMnO1xuICBob3N0bmFtZTogc3RyaW5nO1xuICBwb3J0Pzogc3RyaW5nO1xuICBwYXRobmFtZT86IHN0cmluZztcbiAgc2VhcmNoPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW1hZ2VzQ29uZmlnIHtcbiAgcmVtb3RlUGF0dGVybnM6IFJlbW90ZVBhdHRlcm5bXTtcbiAgZG9tYWluczogc3RyaW5nW107XG4gIHVub3B0aW1pemVkOiBib29sZWFuO1xufVxuXG50eXBlIExvYWRlZENvbmZpZyA9XG4gIHwgeyBtb2RlOiAnY29uZmlnLW1pc3NpbmcnIH1cbiAgfCB7IG1vZGU6ICdsb2FkZWQnOyBpbWFnZXM6IEltYWdlc0NvbmZpZyB9O1xuXG50eXBlIE1hdGNoZXJJbXBsID0gKFxuICBkb21haW5zOiBzdHJpbmdbXSxcbiAgcmVtb3RlUGF0dGVybnM6IFJlbW90ZVBhdHRlcm5bXSxcbiAgdXJsOiBVUkxcbikgPT4gYm9vbGVhbjtcblxubGV0IGNhY2hlZENvbmZpZzogTG9hZGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xubGV0IGNhY2hlZE1hdGNoZXI6IE1hdGNoZXJJbXBsIHwgbnVsbCB8IHVuZGVmaW5lZDtcbmxldCB3YXJuZWRNYXRjaGVyTWlzc2luZyA9IGZhbHNlO1xuXG4vKipcbiAqIOi3r+W+hOino+aekOS4jiBub2RlLXNlcnZlci50cyDnmoQgYXNzZXRzIOino+aekOWQjOa6kDp3cmFwcGVyIOWQr+WKqOaXtlxuICogcHJvY2Vzcy5jd2QoKSA9PT0gc2VydmVyLWZ1bmN0aW9ucy9kZWZhdWx0LyzmiYDku6UgLm5leHQg5bCx5ZyoIGN3ZCDkuIvjgIJcbiAqL1xuZnVuY3Rpb24gY29uZmlnRmlsZVBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLm5leHQnLCAncmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb24nKTtcbn1cblxuZnVuY3Rpb24gbG9hZEltYWdlQ29uZmlnKCk6IExvYWRlZENvbmZpZyB7XG4gIGlmIChjYWNoZWRDb25maWcgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZENvbmZpZztcblxuICBjb25zdCBmaWxlUGF0aCA9IGNvbmZpZ0ZpbGVQYXRoKCk7XG4gIGxldCByYXc6IHN0cmluZztcbiAgdHJ5IHtcbiAgICByYXcgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGYtOCcpO1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbaW1hZ2UtY29uZmlnXSByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbiBub3QgZm91bmQgYXQgJHtmaWxlUGF0aH0g4oCUIGFsbG93aW5nIGFsbCBpbWFnZSBVUkxzICgke2Vyci5jb2RlID8/IGVyci5tZXNzYWdlfSlgXG4gICAgKTtcbiAgICBjYWNoZWRDb25maWcgPSB7IG1vZGU6ICdjb25maWctbWlzc2luZycgfTtcbiAgICByZXR1cm4gY2FjaGVkQ29uZmlnO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgY29uc3QgaW1hZ2VzID0gcGFyc2VkPy5jb25maWc/LmltYWdlcyA/PyB7fTtcbiAgICBjYWNoZWRDb25maWcgPSB7XG4gICAgICBtb2RlOiAnbG9hZGVkJyxcbiAgICAgIGltYWdlczoge1xuICAgICAgICByZW1vdGVQYXR0ZXJuczogQXJyYXkuaXNBcnJheShpbWFnZXMucmVtb3RlUGF0dGVybnMpXG4gICAgICAgICAgPyBpbWFnZXMucmVtb3RlUGF0dGVybnNcbiAgICAgICAgICA6IFtdLFxuICAgICAgICBkb21haW5zOiBBcnJheS5pc0FycmF5KGltYWdlcy5kb21haW5zKSA/IGltYWdlcy5kb21haW5zIDogW10sXG4gICAgICAgIHVub3B0aW1pemVkOiBpbWFnZXMudW5vcHRpbWl6ZWQgPT09IHRydWUsXG4gICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIGNhY2hlZENvbmZpZztcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW2ltYWdlLWNvbmZpZ10gZmFpbGVkIHRvIHBhcnNlICR7ZmlsZVBhdGh9OiAke2Vyci5tZXNzYWdlfSDigJQgYWxsb3dpbmcgYWxsIGltYWdlIFVSTHNgXG4gICAgKTtcbiAgICBjYWNoZWRDb25maWcgPSB7IG1vZGU6ICdjb25maWctbWlzc2luZycgfTtcbiAgICByZXR1cm4gY2FjaGVkQ29uZmlnO1xuICB9XG59XG5cbi8qKlxuICog5ou/IE5leHQg6Ieq5bex55qEIGhhc1JlbW90ZU1hdGNo44CC5aSx6LSl5LiA5qyh5ZCO57yT5a2YIG51bGws5ZCO57ut6LWw5Lil5qC8IGRlbnkg5YiG5pSv44CCXG4gKiDnlKggZXZhbCgncmVxdWlyZScpIOiuqSBlc2J1aWxkIOS4jeWOu+Wwneivleino+aekCBuZXh0IOaooeWdl+KAlOKAlHdyYXBwZXIgYnVuZGxlIOeUsVxuICogc2NyaXB0cy9idW5kbGUtb3ZlcnJpZGVzLmpzIOeUqCBlc2J1aWxkIOaJk+WMhSzmioogbmV4dCDmoIfkuoYgZXh0ZXJuYWwg5pivIGJlbHQtXG4gKiBhbmQtc3VzcGVuZGVycztldmFsIOi/meS4gOWxguehruS/neWNs+S+vyBleHRlcm5hbCDphY3plJnkuZ/miZPkuI3ov5sgYnVuZGxl44CCXG4gKi9cbmZ1bmN0aW9uIGxvYWRNYXRjaGVyKCk6IE1hdGNoZXJJbXBsIHwgbnVsbCB7XG4gIGlmIChjYWNoZWRNYXRjaGVyICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWRNYXRjaGVyO1xuICB0cnkge1xuICAgIGNvbnN0IGR5bmFtaWNSZXF1aXJlID0gZXZhbCgncmVxdWlyZScpIGFzIE5vZGVSZXF1aXJlO1xuICAgIGNvbnN0IG1vZCA9IGR5bmFtaWNSZXF1aXJlKCduZXh0L2Rpc3Qvc2hhcmVkL2xpYi9tYXRjaC1yZW1vdGUtcGF0dGVybicpO1xuICAgIGNvbnN0IGhhc1JlbW90ZU1hdGNoID0gbW9kPy5oYXNSZW1vdGVNYXRjaDtcbiAgICBpZiAodHlwZW9mIGhhc1JlbW90ZU1hdGNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hhc1JlbW90ZU1hdGNoIG5vdCBleHBvcnRlZCcpO1xuICAgIH1cbiAgICBjYWNoZWRNYXRjaGVyID0gaGFzUmVtb3RlTWF0Y2ggYXMgTWF0Y2hlckltcGw7XG4gICAgcmV0dXJuIGNhY2hlZE1hdGNoZXI7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKCF3YXJuZWRNYXRjaGVyTWlzc2luZykge1xuICAgICAgd2FybmVkTWF0Y2hlck1pc3NpbmcgPSB0cnVlO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2ltYWdlLWNvbmZpZ10gY2Fubm90IGxvYWQgbmV4dC9kaXN0L3NoYXJlZC9saWIvbWF0Y2gtcmVtb3RlLXBhdHRlcm4gKCR7ZXJyLm1lc3NhZ2V9KSDigJQgZmFsbGluZyBiYWNrIHRvIGRlbnktZXh0ZXJuYWwtb25seSBtb2RlYFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FjaGVkTWF0Y2hlciA9IG51bGw7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0ZVJlc3VsdCB7XG4gIG9rOiBib29sZWFuO1xuICByZWFzb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICog5qCh6aqMIC9fbmV4dC9pbWFnZSDnmoQgdXJsIOaYr+WQpuiiq+WFgeiuuOOAguivreS5ieWvuem9kCBOZXh0OlxuICogLSDlkIzmupAoaG9zdCBoZWFkZXIgPT09IHVybCDnmoQgaG9zdCzlkKvnq6/lj6Mp5aeL57uI5pS+6KGMXG4gKiAtIHVub3B0aW1pemVkOnRydWUg6Lez6L+H5qCh6aqMXG4gKiAtIOWQpuWImeW/hemhu+WRveS4rSBkb21haW5zIOaIliByZW1vdGVQYXR0ZXJucyDkuYvkuIBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW1hZ2VVcmwoXG4gIGFic29sdXRlVXJsOiBVUkwsXG4gIGhvc3RIZWFkZXI6IHN0cmluZ1xuKTogVmFsaWRhdGVSZXN1bHQge1xuICBjb25zdCBjZmcgPSBsb2FkSW1hZ2VDb25maWcoKTtcbiAgaWYgKGNmZy5tb2RlID09PSAnY29uZmlnLW1pc3NpbmcnKSB7XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIHJlYXNvbjogJ2NvbmZpZy1taXNzaW5nJyB9O1xuICB9XG5cbiAgY29uc3QgeyBpbWFnZXMgfSA9IGNmZztcbiAgaWYgKGltYWdlcy51bm9wdGltaXplZCkge1xuICAgIHJldHVybiB7IG9rOiB0cnVlLCByZWFzb246ICd1bm9wdGltaXplZCcgfTtcbiAgfVxuXG4gIC8vIGhvc3QgaGVhZGVyIOmAmuW4uOW4puerr+WPoyxhYnNvbHV0ZVVybC5ob3N0bmFtZSDkuI3luKYg4oCU4oCUIOeUqCB1cmwuaG9zdCjlkKvnq6/lj6MpXG4gIC8vIOavlOi+gzvlkIzml7blsI/lhpnljJbpgb/lhY3lpKflsI/lhpnlt67lvILjgIJcbiAgY29uc3QgcmVxSG9zdCA9IGhvc3RIZWFkZXIudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgdXJsSG9zdCA9IGFic29sdXRlVXJsLmhvc3QudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJlcUhvc3QgJiYgcmVxSG9zdCA9PT0gdXJsSG9zdCkge1xuICAgIHJldHVybiB7IG9rOiB0cnVlLCByZWFzb246ICdzYW1lLW9yaWdpbicgfTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoZXIgPSBsb2FkTWF0Y2hlcigpO1xuICBpZiAobWF0Y2hlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiAnbWF0Y2hlci11bmF2YWlsYWJsZScgfTtcbiAgfVxuICBpZiAobWF0Y2hlcihpbWFnZXMuZG9tYWlucywgaW1hZ2VzLnJlbW90ZVBhdHRlcm5zLCBhYnNvbHV0ZVVybCkpIHtcbiAgICByZXR1cm4geyBvazogdHJ1ZSwgcmVhc29uOiAncGF0dGVybi1tYXRjaCcgfTtcbiAgfVxuICByZXR1cm4geyBvazogZmFsc2UsIHJlYXNvbjogJ3JlbW90ZS1wYXR0ZXJuLW5vdC1tYXRjaGVkJyB9O1xufVxuXG4vKiog5rWL6K+V55SoOumHjee9rue8k+WtmOOAgueUn+S6p+S7o+eggeS4jeiwg+eUqOOAgiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldEltYWdlQ29uZmlnQ2FjaGVGb3JUZXN0cygpOiB2b2lkIHtcbiAgY2FjaGVkQ29uZmlnID0gdW5kZWZpbmVkO1xuICBjYWNoZWRNYXRjaGVyID0gdW5kZWZpbmVkO1xuICB3YXJuZWRNYXRjaGVyTWlzc2luZyA9IGZhbHNlO1xufVxuXG4vKipcbiAqIOa1i+ivleeUqDrms6jlhaUgbWF0Y2hlciznu5Xov4flr7nnnJ/lrp4gbmV4dCDmqKHlnZfnmoQgcmVxdWlyZeOAglxuICog5LygIG51bGwg5qih5oufXCJtYXRjaGVyIOS4jeWPr+eUqFwi5YiG5pSv44CCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfc2V0TWF0Y2hlckZvclRlc3RzKGltcGw6IE1hdGNoZXJJbXBsIHwgbnVsbCk6IHZvaWQge1xuICBjYWNoZWRNYXRjaGVyID0gaW1wbDtcbn1cbiJdfQ==
@@ -13,6 +13,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.handleImageProxy = void 0;
14
14
  const stream_1 = require("stream");
15
15
  const gateway_auth_1 = require("./gateway-auth");
16
+ const image_config_1 = require("./image-config");
16
17
  const GATEWAY_TIMEOUT_MS = 10000;
17
18
  /** 透传给浏览器的响应头白名单(避免泄露 Gateway 内部 header) */
18
19
  const PASSTHROUGH_HEADERS = [
@@ -75,6 +76,19 @@ async function handleImageProxy(req, res) {
75
76
  error: 'Cannot resolve absolute URL: missing Host header',
76
77
  });
77
78
  }
79
+ // 按 next.config.images.{remotePatterns,domains} 校验 —— 与 next dev 行为对齐
80
+ let parsedUrl;
81
+ try {
82
+ parsedUrl = new URL(absoluteUrl);
83
+ }
84
+ catch (_a) {
85
+ return writeJson(res, 400, { error: 'Invalid url parameter' });
86
+ }
87
+ const hostHeader = req.headers['host'] || '';
88
+ const verdict = (0, image_config_1.validateImageUrl)(parsedUrl, hostHeader);
89
+ if (!verdict.ok) {
90
+ return writeJson(res, 400, { error: 'url not allowed' });
91
+ }
78
92
  // 加载签名配置
79
93
  const cfg = (0, gateway_auth_1.loadGatewayAuthConfig)();
80
94
  if (!cfg) {
@@ -147,4 +161,4 @@ async function handleImageProxy(req, res) {
147
161
  }
148
162
  }
149
163
  exports.handleImageProxy = handleImageProxy;
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9pbWFnZS1wcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7QUFHSCxtQ0FBa0M7QUFDbEMsaURBQXFFO0FBRXJFLE1BQU0sa0JBQWtCLEdBQUcsS0FBTSxDQUFDO0FBRWxDLDRDQUE0QztBQUM1QyxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLE1BQU07SUFDTixNQUFNO0lBQ04sZUFBZTtJQUNmLHlCQUF5QjtDQUMxQixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILFNBQVMsa0JBQWtCLENBQ3pCLE1BQWMsRUFDZCxHQUF5QjtJQUV6QixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUNqRSxPQUFPLE1BQU0sQ0FBQztLQUNmO0lBQ0QsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNyRCxNQUFNLEtBQUssR0FDVCxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQzNELENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDM0QsT0FBTyxDQUFDO0lBQ1YsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFD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SUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7UUFDN0MsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1YsT0FBTztLQUNSO0lBRUQsMkJBQTJCO0lBQzNCLElBQUk7UUFDRixNQUFNLFVBQVUsR0FBRyxpQkFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBVyxDQUFDLENBQUM7UUFDMUQsVUFBVSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhO2dCQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUNILFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDdEI7SUFBQyxPQUFPLEdBQVEsRUFBRTtRQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRTtZQUNwQixTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7U0FDdkQ7YUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRTtZQUM3QixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDWDtLQUNGO0FBQ0gsQ0FBQztBQXhHRCw0Q0F3R0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIOWbvueJh+S8mOWMluS7o+eQhu+8iEZDIOWGheaJp+ihjO+8iVxuICpcbiAqIOa1j+iniOWZqCBHRVQgL19uZXh0L2ltYWdlP3VybD0uLi4mdz0uLi4mcT0uLi4g4oaSIEVTQSDihpIgRkPvvIjmnKzmqKHlnZfvvIlcbiAqIOKGkiDnlKggZ2F0ZXdheUZldGNoIOazqOWFpeetvuWQjSA0IGhlYWRlciDihpIgR2F0ZXdheSAvaW1hZ2Uvb3B0aW1pemVcbiAqIOKGkiDmtYHlvI8gcGlwZSDlk43lupTlm57mtY/op4jlmajvvIhDYWNoZS1Db250cm9sIC8gRVRhZyAvIFZhcnkg562J5aS06YCP5Lyg77yJXG4gKlxuICogYDxpbWc+YCDmoIfnrb7lj5HkuI3lh7roh6rlrprkuYkgaGVhZGVy77yM55SxIEZDIOWcqOi/memHjOS7o+WPkeetvuWQjeivt+axgiDigJTigJQg6L+Z5piv5pa55qGI5LiJ55qE5qC45b+D44CCXG4gKiDmi6bmiKogTmV4dCDlhoXnva7nmoQgL19uZXh0L2ltYWdlIOi3r+eUsSznlKjmiLcgbmV4dC5jb25maWcg5peg6ZyA6YWNIGN1c3RvbSBsb2FkZXLjgIJcbiAqL1xuXG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgbG9hZEdhdGV3YXlBdXRoQ29uZmlnLCBnYXRld2F5RmV0Y2ggfSBmcm9tICcuL2dhdGV3YXktYXV0aCc7XG5cbmNvbnN0IEdBVEVXQVlfVElNRU9VVF9NUyA9IDEwXzAwMDtcblxuLyoqIOmAj+S8oOe7mea1j+iniOWZqOeahOWTjeW6lOWktOeZveWQjeWNle+8iOmBv+WFjeazhOmcsiBHYXRld2F5IOWGhemDqCBoZWFkZXLvvIkgKi9cbmNvbnN0IFBBU1NUSFJPVUdIX0hFQURFUlMgPSBbXG4gICdjb250ZW50LXR5cGUnLFxuICAnY29udGVudC1sZW5ndGgnLFxuICAnY2FjaGUtY29udHJvbCcsXG4gICdldGFnJyxcbiAgJ3ZhcnknLFxuICAnbGFzdC1tb2RpZmllZCcsXG4gICdjb250ZW50LXNlY3VyaXR5LXBvbGljeScsXG5dO1xuXG4vKipcbiAqIOaKiuivt+axgiBVUkwg5Lit55qEIGB1cmw9YCDlj4LmlbDmoIflh4bljJbmiJDnu53lr7kgVVJM44CCXG4gKiAtIOW3sue7j+aYryBodHRwKHMpOi8vIOKGkiDljp/moLdcbiAqIC0g5ZCm5YiZ55SoIGAke3Byb3RvfTovLyR7aG9zdH0ke3VybH1gIOaLvOaOpe+8jHByb3RvIOWPliB4LWZvcndhcmRlZC1wcm90b++8jOWQpuWImSBodHRwc1xuICovXG5mdW5jdGlvbiByZXNvbHZlQWJzb2x1dGVVcmwoXG4gIHJhd1VybDogc3RyaW5nLFxuICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHJhd1VybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgcmF3VXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICByZXR1cm4gcmF3VXJsO1xuICB9XG4gIGNvbnN0IGhvc3QgPSByZXEuaGVhZGVyc1snaG9zdCddO1xuICBpZiAoIWhvc3QpIHJldHVybiBudWxsO1xuICBjb25zdCBwcm90b0hlYWRlciA9IHJlcS5oZWFkZXJzWyd4LWZvcndhcmRlZC1wcm90byddO1xuICBjb25zdCBwcm90byA9XG4gICAgKEFycmF5LmlzQXJyYXkocHJvdG9IZWFkZXIpID8gcHJvdG9IZWFkZXJbMF0gOiBwcm90b0hlYWRlcikgfHxcbiAgICAoQXJyYXkuaXNBcnJheShwcm90b0hlYWRlcikgPyBwcm90b0hlYWRlclswXSA6IHByb3RvSGVhZGVyKSB8fFxuICAgICdodHRwcyc7XG4gIGNvbnN0IHBhdGggPSByYXdVcmwuc3RhcnRzV2l0aCgnLycpID8gcmF3VXJsIDogYC8ke3Jhd1VybH1gO1xuICByZXR1cm4gYCR7cHJvdG99Oi8vJHtob3N0fSR7cGF0aH1gO1xufVxuXG5mdW5jdGlvbiB3cml0ZUpzb24ocmVzOiBodHRwLlNlcnZlclJlc3BvbnNlLCBzdGF0dXM6IG51bWJlciwgYm9keTogYW55KTogdm9pZCB7XG4gIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzO1xuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpO1xuICByZXMuZW5kKEpTT04uc3RyaW5naWZ5KGJvZHkpKTtcbn1cblxuLyoqXG4gKiDlpITnkIbkuIDkuKogL19uZXh0L2ltYWdlIOivt+axguOAglxuICog55SxIG5vZGUtc2VydmVyIHdyYXBwZXIg5Zyo6Lev5b6E5Yy56YWN5ZCO6LCD55So44CCXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVJbWFnZVByb3h5KFxuICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2Vcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyDop6PmnpAgcXVlcnlcbiAgY29uc3QgcmVxVXJsID0gcmVxLnVybCB8fCAnJztcbiAgY29uc3QgcUlkeCA9IHJlcVVybC5pbmRleE9mKCc/Jyk7XG4gIGlmIChxSWR4ID09PSAtMSkge1xuICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA0MDAsIHsgZXJyb3I6ICdNaXNzaW5nIHF1ZXJ5IHBhcmFtZXRlcnMnIH0pO1xuICB9XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocmVxVXJsLnNsaWNlKHFJZHggKyAxKSk7XG4gIGNvbnN0IHJhd1VybCA9IHBhcmFtcy5nZXQoJ3VybCcpO1xuICBjb25zdCB3ID0gcGFyYW1zLmdldCgndycpO1xuICBjb25zdCBxID0gcGFyYW1zLmdldCgncScpO1xuXG4gIGlmICghcmF3VXJsIHx8ICF3KSB7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDQwMCwge1xuICAgICAgZXJyb3I6ICdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnM6IHVybCwgdycsXG4gICAgfSk7XG4gIH1cblxuICAvLyDmoIflh4bljJYgdXJsIOWPguaVsOS4uue7neWvuSBVUkxcbiAgY29uc3QgYWJzb2x1dGVVcmwgPSByZXNvbHZlQWJzb2x1dGVVcmwocmF3VXJsLCByZXEpO1xuICBpZiAoIWFic29sdXRlVXJsKSB7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDUwMCwge1xuICAgICAgZXJyb3I6ICdDYW5ub3QgcmVzb2x2ZSBhYnNvbHV0ZSBVUkw6IG1pc3NpbmcgSG9zdCBoZWFkZXInLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g5Yqg6L29562+5ZCN6YWN572uXG4gIGNvbnN0IGNmZyA9IGxvYWRHYXRld2F5QXV0aENvbmZpZygpO1xuICBpZiAoIWNmZykge1xuICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA1MDAsIHtcbiAgICAgIGVycm9yOiAnR2F0ZXdheSBhdXRoIGNvbmZpZyBtaXNzaW5nJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOaehOmAoCBHYXRld2F5IOivt+axgui3r+W+hFxuICBjb25zdCB1cHN0cmVhbVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyB1cmw6IGFic29sdXRlVXJsLCB3IH0pO1xuICBpZiAocSkgdXBzdHJlYW1QYXJhbXMuc2V0KCdxJywgcSk7XG4gIGNvbnN0IHVwc3RyZWFtUGF0aCA9IGAvaW1hZ2Uvb3B0aW1pemU/JHt1cHN0cmVhbVBhcmFtc31gO1xuXG4gIC8vIOmAj+S8oCBJZi1Ob25lLU1hdGNoIOiuqSBHYXRld2F5IOi1sCAzMDRcbiAgY29uc3QgaWZOb25lTWF0Y2ggPSByZXEuaGVhZGVyc1snaWYtbm9uZS1tYXRjaCddO1xuICBjb25zdCB1cHN0cmVhbUhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgaWYgKHR5cGVvZiBpZk5vbmVNYXRjaCA9PT0gJ3N0cmluZycpIHtcbiAgICB1cHN0cmVhbUhlYWRlcnNbJ2lmLW5vbmUtbWF0Y2gnXSA9IGlmTm9uZU1hdGNoO1xuICB9XG4gIGNvbnN0IGFjY2VwdCA9IHJlcS5oZWFkZXJzWydhY2NlcHQnXTtcbiAgaWYgKHR5cGVvZiBhY2NlcHQgPT09ICdzdHJpbmcnKSB7XG4gICAgdXBzdHJlYW1IZWFkZXJzWydhY2NlcHQnXSA9IGFjY2VwdDtcbiAgfVxuXG4gIGxldCB1cHN0cmVhbTogUmVzcG9uc2U7XG4gIHRyeSB7XG4gICAgdXBzdHJlYW0gPSBhd2FpdCBnYXRld2F5RmV0Y2goY2ZnLCB1cHN0cmVhbVBhdGgsIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzOiB1cHN0cmVhbUhlYWRlcnMsXG4gICAgICB0aW1lb3V0TXM6IEdBVEVXQVlfVElNRU9VVF9NUyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2ltYWdlLXByb3h5XSBHYXRld2F5IHRpbWVvdXQgYWZ0ZXIgJHtHQVRFV0FZX1RJTUVPVVRfTVN9bXM6ICR7YWJzb2x1dGVVcmx9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA1MDQsIHsgZXJyb3I6ICdVcHN0cmVhbSB0aW1lb3V0JyB9KTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFtpbWFnZS1wcm94eV0gR2F0ZXdheSBmZXRjaCBlcnJvcjogJHtlcnIubWVzc2FnZX0gKHVybD0ke2Fic29sdXRlVXJsfSlgXG4gICAgKTtcbiAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNTAyLCB7IGVycm9yOiAnQmFkIGdhdGV3YXknIH0pO1xuICB9XG5cbiAgLy8g6YCP5Lyg54q25oCB56CBICsg55m95ZCN5Y2VIGhlYWRlclxuICByZXMuc3RhdHVzQ29kZSA9IHVwc3RyZWFtLnN0YXR1cztcbiAgZm9yIChjb25zdCBuYW1lIG9mIFBBU1NUSFJPVUdIX0hFQURFUlMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHVwc3RyZWFtLmhlYWRlcnMuZ2V0KG5hbWUpO1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmVzLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gMzA0IC8g5pegIGJvZHkg55u05o6l57uT5p2fXG4gIGlmICh1cHN0cmVhbS5zdGF0dXMgPT09IDMwNCB8fCAhdXBzdHJlYW0uYm9keSkge1xuICAgIHJlcy5lbmQoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDmtYHlvI8gcGlwZe+8iOmBv+WFjeWkp+WbviBidWZmZXIg5Y2g5YaF5a2Y77yJXG4gIHRyeSB7XG4gICAgY29uc3Qgbm9kZVN0cmVhbSA9IFJlYWRhYmxlLmZyb21XZWIodXBzdHJlYW0uYm9keSBhcyBhbnkpO1xuICAgIG5vZGVTdHJlYW0ub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgIGNvbnNvbGUud2FybihgW2ltYWdlLXByb3h5XSBTdHJlYW0gZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICBpZiAoIXJlcy53cml0YWJsZUVuZGVkKSByZXMuZW5kKCk7XG4gICAgfSk7XG4gICAgbm9kZVN0cmVhbS5waXBlKHJlcyk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgY29uc29sZS53YXJuKGBbaW1hZ2UtcHJveHldIFBpcGUgc2V0dXAgZmFpbGVkOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICB3cml0ZUpzb24ocmVzLCA1MDIsIHsgZXJyb3I6ICdTdHJlYW0gc2V0dXAgZmFpbGVkJyB9KTtcbiAgICB9IGVsc2UgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgcmVzLmVuZCgpO1xuICAgIH1cbiAgfVxufVxuIl19
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9pbWFnZS1wcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7QUFHSCxtQ0FBa0M7QUFDbEMsaURBQXFFO0FBQ3JFLGlEQUFrRDtBQUVsRCxNQUFNLGtCQUFrQixHQUFHLEtBQU0sQ0FBQztBQUVsQyw0Q0FBNEM7QUFDNUMsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixNQUFNO0lBQ04sTUFBTTtJQUNOLGVBQWU7SUFDZix5QkFBeUI7Q0FDMUIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixNQUFjLEVBQ2QsR0FBeUI7SUFFekIsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDakUsT0FBTyxNQUFNLENBQUM7S0FDZjtJQUNELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QixNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDckQsTUFBTSxLQUFLLEdBQ1QsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUMzRCxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQzNELE9BQU8sQ0FBQztJQUNWLE1BQU0sSUFBSSxH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LEVBQUU7UUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUU7WUFDcEIsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZEO2FBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUU7WUFDN0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ1g7S0FDRjtBQUNILENBQUM7QUFySEQsNENBcUhDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDlm77niYfkvJjljJbku6PnkIbvvIhGQyDlhoXmiafooYzvvIlcbiAqXG4gKiDmtY/op4jlmaggR0VUIC9fbmV4dC9pbWFnZT91cmw9Li4uJnc9Li4uJnE9Li4uIOKGkiBFU0Eg4oaSIEZD77yI5pys5qih5Z2X77yJXG4gKiDihpIg55SoIGdhdGV3YXlGZXRjaCDms6jlhaXnrb7lkI0gNCBoZWFkZXIg4oaSIEdhdGV3YXkgL2ltYWdlL29wdGltaXplXG4gKiDihpIg5rWB5byPIHBpcGUg5ZON5bqU5Zue5rWP6KeI5Zmo77yIQ2FjaGUtQ29udHJvbCAvIEVUYWcgLyBWYXJ5IOetieWktOmAj+S8oO+8iVxuICpcbiAqIGA8aW1nPmAg5qCH562+5Y+R5LiN5Ye66Ieq5a6a5LmJIGhlYWRlcu+8jOeUsSBGQyDlnKjov5nph4zku6Plj5Hnrb7lkI3or7fmsYIg4oCU4oCUIOi/meaYr+aWueahiOS4ieeahOaguOW/g+OAglxuICog5oum5oiqIE5leHQg5YaF572u55qEIC9fbmV4dC9pbWFnZSDot6/nlLEs55So5oi3IG5leHQuY29uZmlnIOaXoOmcgOmFjSBjdXN0b20gbG9hZGVy44CCXG4gKi9cblxuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IGxvYWRHYXRld2F5QXV0aENvbmZpZywgZ2F0ZXdheUZldGNoIH0gZnJvbSAnLi9nYXRld2F5LWF1dGgnO1xuaW1wb3J0IHsgdmFsaWRhdGVJbWFnZVVybCB9IGZyb20gJy4vaW1hZ2UtY29uZmlnJztcblxuY29uc3QgR0FURVdBWV9USU1FT1VUX01TID0gMTBfMDAwO1xuXG4vKiog6YCP5Lyg57uZ5rWP6KeI5Zmo55qE5ZON5bqU5aS055m95ZCN5Y2V77yI6YG/5YWN5rOE6ZyyIEdhdGV3YXkg5YaF6YOoIGhlYWRlcu+8iSAqL1xuY29uc3QgUEFTU1RIUk9VR0hfSEVBREVSUyA9IFtcbiAgJ2NvbnRlbnQtdHlwZScsXG4gICdjb250ZW50LWxlbmd0aCcsXG4gICdjYWNoZS1jb250cm9sJyxcbiAgJ2V0YWcnLFxuICAndmFyeScsXG4gICdsYXN0LW1vZGlmaWVkJyxcbiAgJ2NvbnRlbnQtc2VjdXJpdHktcG9saWN5Jyxcbl07XG5cbi8qKlxuICog5oqK6K+35rGCIFVSTCDkuK3nmoQgYHVybD1gIOWPguaVsOagh+WHhuWMluaIkOe7neWvuSBVUkzjgIJcbiAqIC0g5bey57uP5pivIGh0dHAocyk6Ly8g4oaSIOWOn+agt1xuICogLSDlkKbliJnnlKggYCR7cHJvdG99Oi8vJHtob3N0fSR7dXJsfWAg5ou85o6l77yMcHJvdG8g5Y+WIHgtZm9yd2FyZGVkLXByb3Rv77yM5ZCm5YiZIGh0dHBzXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBYnNvbHV0ZVVybChcbiAgcmF3VXJsOiBzdHJpbmcsXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2Vcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAocmF3VXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCByYXdVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuICAgIHJldHVybiByYXdVcmw7XG4gIH1cbiAgY29uc3QgaG9zdCA9IHJlcS5oZWFkZXJzWydob3N0J107XG4gIGlmICghaG9zdCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHByb3RvSGVhZGVyID0gcmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLXByb3RvJ107XG4gIGNvbnN0IHByb3RvID1cbiAgICAoQXJyYXkuaXNBcnJheShwcm90b0hlYWRlcikgPyBwcm90b0hlYWRlclswXSA6IHByb3RvSGVhZGVyKSB8fFxuICAgIChBcnJheS5pc0FycmF5KHByb3RvSGVhZGVyKSA/IHByb3RvSGVhZGVyWzBdIDogcHJvdG9IZWFkZXIpIHx8XG4gICAgJ2h0dHBzJztcbiAgY29uc3QgcGF0aCA9IHJhd1VybC5zdGFydHNXaXRoKCcvJykgPyByYXdVcmwgOiBgLyR7cmF3VXJsfWA7XG4gIHJldHVybiBgJHtwcm90b306Ly8ke2hvc3R9JHtwYXRofWA7XG59XG5cbmZ1bmN0aW9uIHdyaXRlSnNvbihyZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsIHN0YXR1czogbnVtYmVyLCBib2R5OiBhbnkpOiB2b2lkIHtcbiAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXM7XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04Jyk7XG4gIHJlcy5lbmQoSlNPTi5zdHJpbmdpZnkoYm9keSkpO1xufVxuXG4vKipcbiAqIOWkhOeQhuS4gOS4qiAvX25leHQvaW1hZ2Ug6K+35rGC44CCXG4gKiDnlLEgbm9kZS1zZXJ2ZXIgd3JhcHBlciDlnKjot6/lvoTljLnphY3lkI7osIPnlKjjgIJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUltYWdlUHJveHkoXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIOino+aekCBxdWVyeVxuICBjb25zdCByZXFVcmwgPSByZXEudXJsIHx8ICcnO1xuICBjb25zdCBxSWR4ID0gcmVxVXJsLmluZGV4T2YoJz8nKTtcbiAgaWYgKHFJZHggPT09IC0xKSB7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDQwMCwgeyBlcnJvcjogJ01pc3NpbmcgcXVlcnkgcGFyYW1ldGVycycgfSk7XG4gIH1cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhyZXFVcmwuc2xpY2UocUlkeCArIDEpKTtcbiAgY29uc3QgcmF3VXJsID0gcGFyYW1zLmdldCgndXJsJyk7XG4gIGNvbnN0IHcgPSBwYXJhbXMuZ2V0KCd3Jyk7XG4gIGNvbnN0IHEgPSBwYXJhbXMuZ2V0KCdxJyk7XG5cbiAgaWYgKCFyYXdVcmwgfHwgIXcpIHtcbiAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNDAwLCB7XG4gICAgICBlcnJvcjogJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyczogdXJsLCB3JyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOagh+WHhuWMliB1cmwg5Y+C5pWw5Li657ud5a+5IFVSTFxuICBjb25zdCBhYnNvbHV0ZVVybCA9IHJlc29sdmVBYnNvbHV0ZVVybChyYXdVcmwsIHJlcSk7XG4gIGlmICghYWJzb2x1dGVVcmwpIHtcbiAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNTAwLCB7XG4gICAgICBlcnJvcjogJ0Nhbm5vdCByZXNvbHZlIGFic29sdXRlIFVSTDogbWlzc2luZyBIb3N0IGhlYWRlcicsXG4gICAgfSk7XG4gIH1cblxuICAvLyDmjIkgbmV4dC5jb25maWcuaW1hZ2VzLntyZW1vdGVQYXR0ZXJucyxkb21haW5zfSDmoKHpqowg4oCU4oCUIOS4jiBuZXh0IGRldiDooYzkuLrlr7npvZBcbiAgbGV0IHBhcnNlZFVybDogVVJMO1xuICB0cnkge1xuICAgIHBhcnNlZFVybCA9IG5ldyBVUkwoYWJzb2x1dGVVcmwpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNDAwLCB7IGVycm9yOiAnSW52YWxpZCB1cmwgcGFyYW1ldGVyJyB9KTtcbiAgfVxuICBjb25zdCBob3N0SGVhZGVyID0gKHJlcS5oZWFkZXJzWydob3N0J10gYXMgc3RyaW5nKSB8fCAnJztcbiAgY29uc3QgdmVyZGljdCA9IHZhbGlkYXRlSW1hZ2VVcmwocGFyc2VkVXJsLCBob3N0SGVhZGVyKTtcbiAgaWYgKCF2ZXJkaWN0Lm9rKSB7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDQwMCwgeyBlcnJvcjogJ3VybCBub3QgYWxsb3dlZCcgfSk7XG4gIH1cblxuICAvLyDliqDovb3nrb7lkI3phY3nva5cbiAgY29uc3QgY2ZnID0gbG9hZEdhdGV3YXlBdXRoQ29uZmlnKCk7XG4gIGlmICghY2ZnKSB7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDUwMCwge1xuICAgICAgZXJyb3I6ICdHYXRld2F5IGF1dGggY29uZmlnIG1pc3NpbmcnLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g5p6E6YCgIEdhdGV3YXkg6K+35rGC6Lev5b6EXG4gIGNvbnN0IHVwc3RyZWFtUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHVybDogYWJzb2x1dGVVcmwsIHcgfSk7XG4gIGlmIChxKSB1cHN0cmVhbVBhcmFtcy5zZXQoJ3EnLCBxKTtcbiAgY29uc3QgdXBzdHJlYW1QYXRoID0gYC9pbWFnZS9vcHRpbWl6ZT8ke3Vwc3RyZWFtUGFyYW1zfWA7XG5cbiAgLy8g6YCP5LygIElmLU5vbmUtTWF0Y2gg6K6pIEdhdGV3YXkg6LWwIDMwNFxuICBjb25zdCBpZk5vbmVNYXRjaCA9IHJlcS5oZWFkZXJzWydpZi1ub25lLW1hdGNoJ107XG4gIGNvbnN0IHVwc3RyZWFtSGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBpZiAodHlwZW9mIGlmTm9uZU1hdGNoID09PSAnc3RyaW5nJykge1xuICAgIHVwc3RyZWFtSGVhZGVyc1snaWYtbm9uZS1tYXRjaCddID0gaWZOb25lTWF0Y2g7XG4gIH1cbiAgY29uc3QgYWNjZXB0ID0gcmVxLmhlYWRlcnNbJ2FjY2VwdCddO1xuICBpZiAodHlwZW9mIGFjY2VwdCA9PT0gJ3N0cmluZycpIHtcbiAgICB1cHN0cmVhbUhlYWRlcnNbJ2FjY2VwdCddID0gYWNjZXB0O1xuICB9XG5cbiAgbGV0IHVwc3RyZWFtOiBSZXNwb25zZTtcbiAgdHJ5IHtcbiAgICB1cHN0cmVhbSA9IGF3YWl0IGdhdGV3YXlGZXRjaChjZmcsIHVwc3RyZWFtUGF0aCwge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIGhlYWRlcnM6IHVwc3RyZWFtSGVhZGVycyxcbiAgICAgIHRpbWVvdXRNczogR0FURVdBWV9USU1FT1VUX01TLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbaW1hZ2UtcHJveHldIEdhdGV3YXkgdGltZW91dCBhZnRlciAke0dBVEVXQVlfVElNRU9VVF9NU31tczogJHthYnNvbHV0ZVVybH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDUwNCwgeyBlcnJvcjogJ1Vwc3RyZWFtIHRpbWVvdXQnIH0pO1xuICAgIH1cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW2ltYWdlLXByb3h5XSBHYXRld2F5IGZldGNoIGVycm9yOiAke2Vyci5tZXNzYWdlfSAodXJsPSR7YWJzb2x1dGVVcmx9KWBcbiAgICApO1xuICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA1MDIsIHsgZXJyb3I6ICdCYWQgZ2F0ZXdheScgfSk7XG4gIH1cblxuICAvLyDpgI/kvKDnirbmgIHnoIEgKyDnmb3lkI3ljZUgaGVhZGVyXG4gIHJlcy5zdGF0dXNDb2RlID0gdXBzdHJlYW0uc3RhdHVzO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgUEFTU1RIUk9VR0hfSEVBREVSUykge1xuICAgIGNvbnN0IHZhbHVlID0gdXBzdHJlYW0uaGVhZGVycy5nZXQobmFtZSk7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICByZXMuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvLyAzMDQgLyDml6AgYm9keSDnm7TmjqXnu5PmnZ9cbiAgaWYgKHVwc3RyZWFtLnN0YXR1cyA9PT0gMzA0IHx8ICF1cHN0cmVhbS5ib2R5KSB7XG4gICAgcmVzLmVuZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOa1geW8jyBwaXBl77yI6YG/5YWN5aSn5Zu+IGJ1ZmZlciDljaDlhoXlrZjvvIlcbiAgdHJ5IHtcbiAgICBjb25zdCBub2RlU3RyZWFtID0gUmVhZGFibGUuZnJvbVdlYih1cHN0cmVhbS5ib2R5IGFzIGFueSk7XG4gICAgbm9kZVN0cmVhbS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgY29uc29sZS53YXJuKGBbaW1hZ2UtcHJveHldIFN0cmVhbSBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHJlcy5lbmQoKTtcbiAgICB9KTtcbiAgICBub2RlU3RyZWFtLnBpcGUocmVzKTtcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBjb25zb2xlLndhcm4oYFtpbWFnZS1wcm94eV0gUGlwZSBzZXR1cCBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgIHdyaXRlSnNvbihyZXMsIDUwMiwgeyBlcnJvcjogJ1N0cmVhbSBzZXR1cCBmYWlsZWQnIH0pO1xuICAgIH0gZWxzZSBpZiAoIXJlcy53cml0YWJsZUVuZGVkKSB7XG4gICAgICByZXMuZW5kKCk7XG4gICAgfVxuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "esa-pcg-cli",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "CLI for building and deploying Next.js apps onto pages-cache-gateway (PCG)",
5
5
  "keywords": [
6
6
  "next",