esa-pcg-cli 0.1.1 → 0.1.3
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/README.md +11 -26
- package/dist/_inline-overrides.js +2 -2
- package/dist/_protocol/types.d.ts +3 -0
- package/dist/_protocol/types.js +1 -1
- package/dist/adapters/wrappers/node-server.d.ts +1 -1
- package/dist/adapters/wrappers/node-server.js +8 -6
- package/dist/commands/build.js +20 -60
- package/dist/commands/serve.js +2 -2
- package/dist/overrides/tagCache/gateway.d.ts +3 -0
- package/dist/overrides/tagCache/gateway.js +26 -1
- package/dist/runtime/cdn-purge.d.ts +49 -0
- package/dist/runtime/cdn-purge.js +237 -0
- package/dist/runtime/image-config.d.ts +45 -0
- package/dist/runtime/image-config.js +144 -0
- package/dist/runtime/image-proxy.d.ts +3 -2
- package/dist/runtime/image-proxy.js +18 -3
- package/package.json +2 -3
- package/runtime/pcg-image-loader.js +0 -13
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CDN Purge Runtime
|
|
4
|
+
*
|
|
5
|
+
* 在 revalidateTag / revalidatePath 后,fire-and-forget 触发 ESA 边缘缓存失效。
|
|
6
|
+
*
|
|
7
|
+
* 设计原则:
|
|
8
|
+
* - tag → paths 反查走 **本地** manifest(build 时由 pcg build 把
|
|
9
|
+
* .open-next/dynamodb-provider/dynamodb-cache.json 嵌入 FC bundle),
|
|
10
|
+
* 运行时第一次用到时 lazy 加载到内存 Map,后续 O(1) 查询,无网络往返
|
|
11
|
+
* - /cache/refresh 走 Gateway,沿用现有 HMAC 鉴权 + ESA 分流
|
|
12
|
+
* - 所有失败仅 warn,绝不抛错(purge 是优化,不是正确性)
|
|
13
|
+
* - hostname / siteId 缺失则 loadCdnPurgeConfig 返回 null,调用方降级 no-op
|
|
14
|
+
* - 跨 tag 反查结果去重,每 path 追加 /_next/data/{buildId}/{path}.json
|
|
15
|
+
* - 调 /cache/refresh 时按 100 URL/批、batch 内并发上限 4
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.createCdnPurgeClient = exports.loadCdnPurgeConfig = void 0;
|
|
19
|
+
const fs = require("fs");
|
|
20
|
+
const path = require("path");
|
|
21
|
+
const gateway_auth_1 = require("./gateway-auth");
|
|
22
|
+
const REFRESH_TIMEOUT_MS = 15000;
|
|
23
|
+
const URL_BATCH_SIZE = 100;
|
|
24
|
+
const REFRESH_CONCURRENCY = 4;
|
|
25
|
+
// 与 build.ts 中 TAG_MANIFEST_FILENAME 保持一致(对侧是写入,这侧是读取)
|
|
26
|
+
const TAG_MANIFEST_FILENAME = '__pcg_tag_manifest.json';
|
|
27
|
+
function stripLeadingSlash(s) {
|
|
28
|
+
return s.replace(/^\/+/, '');
|
|
29
|
+
}
|
|
30
|
+
function ensureLeadingSlash(s) {
|
|
31
|
+
return s.startsWith('/') ? s : `/${s}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 从环境变量加载 purge 配置。
|
|
35
|
+
*
|
|
36
|
+
* 沿用 loadGatewayAuthConfig 的 5 个 env,额外读取:
|
|
37
|
+
* - ESA_CACHE_GW_HOSTNAME — 拼 purge URL 用
|
|
38
|
+
* - ESA_CACHE_GW_SITE_ID — 透传给 /cache/refresh
|
|
39
|
+
*
|
|
40
|
+
* 缺一返回 null,调用方应跳过 purge(不影响 tag 写库)。
|
|
41
|
+
*/
|
|
42
|
+
function loadCdnPurgeConfig() {
|
|
43
|
+
const base = (0, gateway_auth_1.loadGatewayAuthConfig)();
|
|
44
|
+
if (!base)
|
|
45
|
+
return null;
|
|
46
|
+
const hostname = process.env.ESA_CACHE_GW_HOSTNAME;
|
|
47
|
+
const siteIdRaw = process.env.ESA_CACHE_GW_SITE_ID;
|
|
48
|
+
if (!hostname || !siteIdRaw) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const siteIdNum = Number(siteIdRaw);
|
|
52
|
+
const siteId = Number.isFinite(siteIdNum)
|
|
53
|
+
? siteIdNum
|
|
54
|
+
: siteIdRaw;
|
|
55
|
+
return {
|
|
56
|
+
...base,
|
|
57
|
+
hostname,
|
|
58
|
+
siteId,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
exports.loadCdnPurgeConfig = loadCdnPurgeConfig;
|
|
62
|
+
function createCdnPurgeClient(cfg) {
|
|
63
|
+
var _a;
|
|
64
|
+
const buildId = cfg.version;
|
|
65
|
+
const pathPrefix = `${buildId}/`;
|
|
66
|
+
const manifestPath = (_a = cfg.manifestPath) !== null && _a !== void 0 ? _a : path.join(__dirname, TAG_MANIFEST_FILENAME);
|
|
67
|
+
// lazy 加载;Promise 用于并发首次调用的合流
|
|
68
|
+
let manifestPromise = null;
|
|
69
|
+
async function loadManifest() {
|
|
70
|
+
if (manifestPromise)
|
|
71
|
+
return manifestPromise;
|
|
72
|
+
manifestPromise = (async () => {
|
|
73
|
+
var _a, _b, _c, _d;
|
|
74
|
+
const map = new Map();
|
|
75
|
+
let raw;
|
|
76
|
+
try {
|
|
77
|
+
raw = await fs.promises.readFile(manifestPath, 'utf-8');
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
// ENOENT 是常见情况(纯静态项目无 tag,或老版 CLI 未嵌入),静默降级
|
|
81
|
+
if ((err === null || err === void 0 ? void 0 : err.code) !== 'ENOENT') {
|
|
82
|
+
console.warn(`[cdn-purge] manifest read error ${manifestPath}: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
|
|
83
|
+
}
|
|
84
|
+
return new Map();
|
|
85
|
+
}
|
|
86
|
+
let rows;
|
|
87
|
+
try {
|
|
88
|
+
const parsed = JSON.parse(raw);
|
|
89
|
+
rows = Array.isArray(parsed) ? parsed : [];
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
console.warn(`[cdn-purge] manifest parse error ${manifestPath}: ${(_b = err === null || err === void 0 ? void 0 : err.message) !== null && _b !== void 0 ? _b : err}`);
|
|
93
|
+
return new Map();
|
|
94
|
+
}
|
|
95
|
+
for (const row of rows) {
|
|
96
|
+
const tagPk = (_c = row === null || row === void 0 ? void 0 : row.tag) === null || _c === void 0 ? void 0 : _c.S;
|
|
97
|
+
const pathPk = (_d = row === null || row === void 0 ? void 0 : row.path) === null || _d === void 0 ? void 0 : _d.S;
|
|
98
|
+
if (typeof tagPk !== 'string' || typeof pathPk !== 'string')
|
|
99
|
+
continue;
|
|
100
|
+
// 只接受当前 buildId 的行;OpenNext 已保证 prefix,但万一混入旧行就跳过
|
|
101
|
+
if (!tagPk.startsWith(pathPrefix))
|
|
102
|
+
continue;
|
|
103
|
+
if (!pathPk.startsWith(pathPrefix))
|
|
104
|
+
continue;
|
|
105
|
+
const tag = tagPk.slice(pathPrefix.length);
|
|
106
|
+
const p = pathPk.slice(pathPrefix.length);
|
|
107
|
+
if (!tag || !p)
|
|
108
|
+
continue;
|
|
109
|
+
let bucket = map.get(tag);
|
|
110
|
+
if (!bucket) {
|
|
111
|
+
bucket = new Set();
|
|
112
|
+
map.set(tag, bucket);
|
|
113
|
+
}
|
|
114
|
+
bucket.add(p);
|
|
115
|
+
}
|
|
116
|
+
const result = new Map();
|
|
117
|
+
for (const [tag, set] of map) {
|
|
118
|
+
result.set(tag, Array.from(set));
|
|
119
|
+
}
|
|
120
|
+
return result;
|
|
121
|
+
})();
|
|
122
|
+
return manifestPromise;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 把若干 Next 路由 path 展开成需 purge 的 URL 列表:
|
|
126
|
+
* - 跳过空串、去重(基于规范化后的 leading "/")
|
|
127
|
+
* - 对每个 path 追加 /_next/data/{buildId}/{path}.json
|
|
128
|
+
* - 拼上 https://{hostname}
|
|
129
|
+
*/
|
|
130
|
+
function expandPathsToUrls(paths) {
|
|
131
|
+
const normalized = new Set();
|
|
132
|
+
for (const p of paths) {
|
|
133
|
+
if (!p)
|
|
134
|
+
continue;
|
|
135
|
+
normalized.add(ensureLeadingSlash(p));
|
|
136
|
+
}
|
|
137
|
+
if (normalized.size === 0)
|
|
138
|
+
return [];
|
|
139
|
+
const urls = new Set();
|
|
140
|
+
for (const p of normalized) {
|
|
141
|
+
urls.add(`https://${cfg.hostname}${p}`);
|
|
142
|
+
const rel = stripLeadingSlash(p);
|
|
143
|
+
// pages router ISR 必需;app router 多打一条无副作用
|
|
144
|
+
urls.add(`https://${cfg.hostname}/_next/data/${buildId}/${rel || 'index'}.json`);
|
|
145
|
+
}
|
|
146
|
+
return Array.from(urls);
|
|
147
|
+
}
|
|
148
|
+
async function refreshBatch(urls) {
|
|
149
|
+
var _a;
|
|
150
|
+
const body = {
|
|
151
|
+
hostname: cfg.hostname,
|
|
152
|
+
siteId: cfg.siteId,
|
|
153
|
+
urls,
|
|
154
|
+
};
|
|
155
|
+
let res;
|
|
156
|
+
try {
|
|
157
|
+
res = await (0, gateway_auth_1.gatewayFetch)(cfg, '/cache/refresh', {
|
|
158
|
+
method: 'POST',
|
|
159
|
+
headers: { 'Content-Type': 'application/json' },
|
|
160
|
+
body: JSON.stringify(body),
|
|
161
|
+
timeoutMs: REFRESH_TIMEOUT_MS,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
console.warn(`[cdn-purge] cache/refresh error (${urls.length} urls): ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (!res.ok) {
|
|
169
|
+
let detail = '';
|
|
170
|
+
try {
|
|
171
|
+
detail = (await res.text()).slice(0, 200);
|
|
172
|
+
}
|
|
173
|
+
catch (_b) {
|
|
174
|
+
/* ignore */
|
|
175
|
+
}
|
|
176
|
+
console.warn(`[cdn-purge] cache/refresh failed status=${res.status} urls=${urls.length} ${detail}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function refreshUrls(allUrls) {
|
|
180
|
+
if (allUrls.length === 0)
|
|
181
|
+
return;
|
|
182
|
+
const batches = [];
|
|
183
|
+
for (let i = 0; i < allUrls.length; i += URL_BATCH_SIZE) {
|
|
184
|
+
batches.push(allUrls.slice(i, i + URL_BATCH_SIZE));
|
|
185
|
+
}
|
|
186
|
+
// 并发上限 REFRESH_CONCURRENCY 的滑动窗口
|
|
187
|
+
let cursor = 0;
|
|
188
|
+
async function worker() {
|
|
189
|
+
while (cursor < batches.length) {
|
|
190
|
+
const idx = cursor++;
|
|
191
|
+
await refreshBatch(batches[idx]);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const workers = Array.from({ length: Math.min(REFRESH_CONCURRENCY, batches.length) }, () => worker());
|
|
195
|
+
await Promise.all(workers);
|
|
196
|
+
}
|
|
197
|
+
async function purgeByPaths(paths) {
|
|
198
|
+
var _a;
|
|
199
|
+
try {
|
|
200
|
+
const urls = expandPathsToUrls(paths);
|
|
201
|
+
await refreshUrls(urls);
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
console.warn(`[cdn-purge] purgeByPaths error: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async function purgeByTags(tags) {
|
|
208
|
+
var _a;
|
|
209
|
+
try {
|
|
210
|
+
const uniqueTags = Array.from(new Set(tags
|
|
211
|
+
.map(t => (typeof t === 'string' ? t : ''))
|
|
212
|
+
.map(t => t.trim())
|
|
213
|
+
.filter(Boolean)));
|
|
214
|
+
if (uniqueTags.length === 0)
|
|
215
|
+
return;
|
|
216
|
+
const map = await loadManifest();
|
|
217
|
+
const merged = new Set();
|
|
218
|
+
for (const t of uniqueTags) {
|
|
219
|
+
const paths = map.get(t);
|
|
220
|
+
if (!paths)
|
|
221
|
+
continue;
|
|
222
|
+
for (const p of paths)
|
|
223
|
+
merged.add(p);
|
|
224
|
+
}
|
|
225
|
+
if (merged.size === 0)
|
|
226
|
+
return;
|
|
227
|
+
const urls = expandPathsToUrls(Array.from(merged));
|
|
228
|
+
await refreshUrls(urls);
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
console.warn(`[cdn-purge] purgeByTags error: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return { purgeByPaths, purgeByTags };
|
|
235
|
+
}
|
|
236
|
+
exports.createCdnPurgeClient = createCdnPurgeClient;
|
|
237
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RuLXB1cmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvY2RuLXB1cmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBRUgseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUU3QixpREFJd0I7QUFFeEIsTUFBTSxrQkFBa0IsR0FBRyxLQUFNLENBQUM7QUFFbEMsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDO0FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBRTlCLHVEQUF1RDtBQUN2RCxNQUFNLHFCQUFxQixHQUFHLHlCQUF5QixDQUFDO0FBMkJ4RCxTQUFTLGlCQUFpQixDQUFDLENBQVM7SUFDbEMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxDQUFTO0lBQ25DLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLGtCQUFrQjtJQUNoQyxNQUFNLElBQUksR0FBRyxJQUFBLG9DQUFxQixHQUFFLENBQUM7SUFDckMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUV2QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO0lBQ25ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7SUFFbkQsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUMzQixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BD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LE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQztnQkFBRSxPQUFPO1lBRTlCLE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNuRCxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QjtRQUFDLE9BQU8sR0FBUSxFQUFFO1lBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLE1BQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLE9BQU8sbUNBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN2RTtJQUNILENBQUM7SUFFRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO0FBQ3ZDLENBQUM7QUEzTEQsb0RBMkxDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDRE4gUHVyZ2UgUnVudGltZVxuICpcbiAqIOWcqCByZXZhbGlkYXRlVGFnIC8gcmV2YWxpZGF0ZVBhdGgg5ZCOLGZpcmUtYW5kLWZvcmdldCDop6blj5EgRVNBIOi+uee8mOe8k+WtmOWkseaViOOAglxuICpcbiAqIOiuvuiuoeWOn+WImTpcbiAqICAgLSB0YWcg4oaSIHBhdGhzIOWPjeafpei1sCAqKuacrOWcsCoqIG1hbmlmZXN0KGJ1aWxkIOaXtueUsSBwY2cgYnVpbGQg5oqKXG4gKiAgICAgLm9wZW4tbmV4dC9keW5hbW9kYi1wcm92aWRlci9keW5hbW9kYi1jYWNoZS5qc29uIOW1jOWFpSBGQyBidW5kbGUpLFxuICogICAgIOi/kOihjOaXtuesrOS4gOasoeeUqOWIsOaXtiBsYXp5IOWKoOi9veWIsOWGheWtmCBNYXAs5ZCO57utIE8oMSkg5p+l6K+iLOaXoOe9kee7nOW+gOi/lFxuICogICAtIC9jYWNoZS9yZWZyZXNoIOi1sCBHYXRld2F5LOayv+eUqOeOsOaciSBITUFDIOmJtOadgyArIEVTQSDliIbmtYFcbiAqICAgLSDmiYDmnInlpLHotKXku4Ugd2Fybiznu53kuI3mipvplJkocHVyZ2Ug5piv5LyY5YyWLOS4jeaYr+ato+ehruaApylcbiAqICAgLSBob3N0bmFtZSAvIHNpdGVJZCDnvLrlpLHliJkgbG9hZENkblB1cmdlQ29uZmlnIOi/lOWbniBudWxsLOiwg+eUqOaWuemZjee6pyBuby1vcFxuICogICAtIOi3qCB0YWcg5Y+N5p+l57uT5p6c5Y676YeNLOavjyBwYXRoIOi/veWKoCAvX25leHQvZGF0YS97YnVpbGRJZH0ve3BhdGh9Lmpzb25cbiAqICAgLSDosIMgL2NhY2hlL3JlZnJlc2gg5pe25oyJIDEwMCBVUkwv5om544CBYmF0Y2gg5YaF5bm25Y+R5LiK6ZmQIDRcbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQ2FjaGVSZWZyZXNoUmVxdWVzdCB9IGZyb20gJ0BwY2cvcHJvdG9jb2wnO1xuaW1wb3J0IHtcbiAgbG9hZEdhdGV3YXlBdXRoQ29uZmlnLFxuICBnYXRld2F5RmV0Y2gsXG4gIEdhdGV3YXlBdXRoQ29uZmlnLFxufSBmcm9tICcuL2dhdGV3YXktYXV0aCc7XG5cbmNvbnN0IFJFRlJFU0hfVElNRU9VVF9NUyA9IDE1XzAwMDtcblxuY29uc3QgVVJMX0JBVENIX1NJWkUgPSAxMDA7XG5jb25zdCBSRUZSRVNIX0NPTkNVUlJFTkNZID0gNDtcblxuLy8g5LiOIGJ1aWxkLnRzIOS4rSBUQUdfTUFOSUZFU1RfRklMRU5BTUUg5L+d5oyB5LiA6Ie0KOWvueS+p+aYr+WGmeWFpSzov5nkvqfmmK/or7vlj5YpXG5jb25zdCBUQUdfTUFOSUZFU1RfRklMRU5BTUUgPSAnX19wY2dfdGFnX21hbmlmZXN0Lmpzb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENkblB1cmdlQ29uZmlnIGV4dGVuZHMgR2F0ZXdheUF1dGhDb25maWcge1xuICBob3N0bmFtZTogc3RyaW5nO1xuICBzaXRlSWQ6IHN0cmluZyB8IG51bWJlcjtcbiAgLyoqXG4gICAqIOimhueblum7mOiupCBtYW5pZmVzdCDot6/lvoQs5Li76KaB57uZ5rWL6K+V55So44CCXG4gICAqIOm7mOiupCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdfX3BjZ190YWdfbWFuaWZlc3QuanNvbicpLFxuICAgKiDljbMgRkMgYnVuZGxlIOWGheS4jiBjYWNoZS5janMg5ZCM57qn44CCXG4gICAqL1xuICBtYW5pZmVzdFBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RuUHVyZ2VDbGllbnQge1xuICAvKipcbiAgICog5byC5q2l6Kem5Y+RIEVTQSDnvJPlrZjlpLHmlYjjgILkuI3pmLvloZ7osIPnlKjmlrks5aSx6LSl5LuFIHdhcm7jgIJcbiAgICog5YaF6YOo5a6M5oiQIHBhdGgg5Y676YeNICsgSVNSIOaVsOaNrui3r+W+hOihpeWFqCArIOmZkOa1geOAglxuICAgKi9cbiAgcHVyZ2VCeVBhdGhzKHBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIHRhZyDihpIgcGF0aHMg5Y+N5p+lICsgcHVyZ2XjgIJcbiAgICog5Y+N5p+l6LWw5pys5Zyw5bWM5YWl55qEIG1hbmlmZXN0IOaWh+S7tizml6DnvZHnu5wgSU/jgIJcbiAgICovXG4gIHB1cmdlQnlUYWdzKHRhZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuZnVuY3Rpb24gc3RyaXBMZWFkaW5nU2xhc2goczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvXlxcLysvLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZUxlYWRpbmdTbGFzaChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcy5zdGFydHNXaXRoKCcvJykgPyBzIDogYC8ke3N9YDtcbn1cblxuLyoqXG4gKiDku47njq/looPlj5jph4/liqDovb0gcHVyZ2Ug6YWN572u44CCXG4gKlxuICog5rK/55SoIGxvYWRHYXRld2F5QXV0aENvbmZpZyDnmoQgNSDkuKogZW52LOmineWkluivu+WPljpcbiAqICAgLSBFU0FfQ0FDSEVfR1dfSE9TVE5BTUUg4oCUIOaLvCBwdXJnZSBVUkwg55SoXG4gKiAgIC0gRVNBX0NBQ0hFX0dXX1NJVEVfSUQgIOKAlCDpgI/kvKDnu5kgL2NhY2hlL3JlZnJlc2hcbiAqXG4gKiDnvLrkuIDov5Tlm54gbnVsbCzosIPnlKjmlrnlupTot7Pov4cgcHVyZ2Uo5LiN5b2x5ZONIHRhZyDlhpnlupMp44CCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ2RuUHVyZ2VDb25maWcoKTogQ2RuUHVyZ2VDb25maWcgfCBudWxsIHtcbiAgY29uc3QgYmFzZSA9IGxvYWRHYXRld2F5QXV0aENvbmZpZygpO1xuICBpZiAoIWJhc2UpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGhvc3RuYW1lID0gcHJvY2Vzcy5lbnYuRVNBX0NBQ0hFX0dXX0hPU1ROQU1FO1xuICBjb25zdCBzaXRlSWRSYXcgPSBwcm9jZXNzLmVudi5FU0FfQ0FDSEVfR1dfU0lURV9JRDtcblxuICBpZiAoIWhvc3RuYW1lIHx8ICFzaXRlSWRSYXcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNpdGVJZE51bSA9IE51bWJlcihzaXRlSWRSYXcpO1xuICBjb25zdCBzaXRlSWQ6IHN0cmluZyB8IG51bWJlciA9IE51bWJlci5pc0Zpbml0ZShzaXRlSWROdW0pXG4gICAgPyBzaXRlSWROdW1cbiAgICA6IHNpdGVJZFJhdztcblxuICByZXR1cm4ge1xuICAgIC4uLmJhc2UsXG4gICAgaG9zdG5hbWUsXG4gICAgc2l0ZUlkLFxuICB9O1xufVxuXG4vKipcbiAqIGR5bmFtb2RiLXByb3ZpZGVyL2R5bmFtb2RiLWNhY2hlLmpzb24g55qE6KGM5qC85byPIOKAlOKAlFxuICog55SxIE9wZW5OZXh0IGJ1aWxkIOebtOaOpeS6p+WHuizlrZfmrrXlkI3lm7rlrprkuLogRHluYW1vREIg5bGe5oCn5pig5bCE5qC85byP44CCXG4gKi9cbmludGVyZmFjZSBEeW5hbW9UYWdSb3cge1xuICB0YWc6IHsgUzogc3RyaW5nIH07XG4gIHBhdGg6IHsgUzogc3RyaW5nIH07XG4gIHJldmFsaWRhdGVkQXQ/OiB7IE46IHN0cmluZyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2RuUHVyZ2VDbGllbnQoY2ZnOiBDZG5QdXJnZUNvbmZpZyk6IENkblB1cmdlQ2xpZW50IHtcbiAgY29uc3QgYnVpbGRJZCA9IGNmZy52ZXJzaW9uO1xuICBjb25zdCBwYXRoUHJlZml4ID0gYCR7YnVpbGRJZH0vYDtcbiAgY29uc3QgbWFuaWZlc3RQYXRoID1cbiAgICBjZmcubWFuaWZlc3RQYXRoID8/IHBhdGguam9pbihfX2Rpcm5hbWUsIFRBR19NQU5JRkVTVF9GSUxFTkFNRSk7XG5cbiAgLy8gbGF6eSDliqDovb07UHJvbWlzZSDnlKjkuo7lubblj5HpppbmrKHosIPnlKjnmoTlkIjmtYFcbiAgbGV0IG1hbmlmZXN0UHJvbWlzZTogUHJvbWlzZTxNYXA8c3RyaW5nLCBzdHJpbmdbXT4+IHwgbnVsbCA9IG51bGw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZE1hbmlmZXN0KCk6IFByb21pc2U8TWFwPHN0cmluZywgc3RyaW5nW10+PiB7XG4gICAgaWYgKG1hbmlmZXN0UHJvbWlzZSkgcmV0dXJuIG1hbmlmZXN0UHJvbWlzZTtcbiAgICBtYW5pZmVzdFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICAgICAgbGV0IHJhdzogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmF3ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUobWFuaWZlc3RQYXRoLCAndXRmLTgnKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIC8vIEVOT0VOVCDmmK/luLjop4Hmg4XlhrUo57qv6Z2Z5oCB6aG555uu5pegIHRhZyzmiJbogIHniYggQ0xJIOacquW1jOWFpSks6Z2Z6buY6ZmN57qnXG4gICAgICAgIGlmIChlcnI/LmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtjZG4tcHVyZ2VdIG1hbmlmZXN0IHJlYWQgZXJyb3IgJHttYW5pZmVzdFBhdGh9OiAke2Vycj8ubWVzc2FnZSA/PyBlcnJ9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICAgIH1cbiAgICAgIGxldCByb3dzOiBEeW5hbW9UYWdSb3dbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTtcbiAgICAgICAgcm93cyA9IEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZCA6IFtdO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbY2RuLXB1cmdlXSBtYW5pZmVzdCBwYXJzZSBlcnJvciAke21hbmlmZXN0UGF0aH06ICR7ZXJyPy5tZXNzYWdlID8/IGVycn1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgY29uc3QgdGFnUGsgPSByb3c/LnRhZz8uUztcbiAgICAgICAgY29uc3QgcGF0aFBrID0gcm93Py5wYXRoPy5TO1xuICAgICAgICBpZiAodHlwZW9mIHRhZ1BrICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgcGF0aFBrICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgICAgIC8vIOWPquaOpeWPl+W9k+WJjSBidWlsZElkIOeahOihjDtPcGVuTmV4dCDlt7Lkv53or4EgcHJlZml4LOS9huS4h+S4gOa3t+WFpeaXp+ihjOWwsei3s+i/h1xuICAgICAgICBpZiAoIXRhZ1BrLnN0YXJ0c1dpdGgocGF0aFByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXBhdGhQay5zdGFydHNXaXRoKHBhdGhQcmVmaXgpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgdGFnID0gdGFnUGsuc2xpY2UocGF0aFByZWZpeC5sZW5ndGgpO1xuICAgICAgICBjb25zdCBwID0gcGF0aFBrLnNsaWNlKHBhdGhQcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgaWYgKCF0YWcgfHwgIXApIGNvbnRpbnVlO1xuICAgICAgICBsZXQgYnVja2V0ID0gbWFwLmdldCh0YWcpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgICAgIGJ1Y2tldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgIG1hcC5zZXQodGFnLCBidWNrZXQpO1xuICAgICAgICB9XG4gICAgICAgIGJ1Y2tldC5hZGQocCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICAgIGZvciAoY29uc3QgW3RhZywgc2V0XSBvZiBtYXApIHtcbiAgICAgICAgcmVzdWx0LnNldCh0YWcsIEFycmF5LmZyb20oc2V0KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIG1hbmlmZXN0UHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmioroi6XlubIgTmV4dCDot6/nlLEgcGF0aCDlsZXlvIDmiJDpnIAgcHVyZ2Ug55qEIFVSTCDliJfooag6XG4gICAqICAgLSDot7Pov4fnqbrkuLLjgIHljrvph40o5Z+65LqO6KeE6IyD5YyW5ZCO55qEIGxlYWRpbmcgXCIvXCIpXG4gICAqICAgLSDlr7nmr4/kuKogcGF0aCDov73liqAgL19uZXh0L2RhdGEve2J1aWxkSWR9L3twYXRofS5qc29uXG4gICAqICAgLSDmi7zkuIogaHR0cHM6Ly97aG9zdG5hbWV9XG4gICAqL1xuICBmdW5jdGlvbiBleHBhbmRQYXRoc1RvVXJscyhwYXRoczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcCBvZiBwYXRocykge1xuICAgICAgaWYgKCFwKSBjb250aW51ZTtcbiAgICAgIG5vcm1hbGl6ZWQuYWRkKGVuc3VyZUxlYWRpbmdTbGFzaChwKSk7XG4gICAgfVxuICAgIGlmIChub3JtYWxpemVkLnNpemUgPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHVybHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHAgb2Ygbm9ybWFsaXplZCkge1xuICAgICAgdXJscy5hZGQoYGh0dHBzOi8vJHtjZmcuaG9zdG5hbWV9JHtwfWApO1xuICAgICAgY29uc3QgcmVsID0gc3RyaXBMZWFkaW5nU2xhc2gocCk7XG4gICAgICAvLyBwYWdlcyByb3V0ZXIgSVNSIOW/hemcgDthcHAgcm91dGVyIOWkmuaJk+S4gOadoeaXoOWJr+S9nOeUqFxuICAgICAgdXJscy5hZGQoXG4gICAgICAgIGBodHRwczovLyR7Y2ZnLmhvc3RuYW1lfS9fbmV4dC9kYXRhLyR7YnVpbGRJZH0vJHtyZWwgfHwgJ2luZGV4J30uanNvbmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHVybHMpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEJhdGNoKHVybHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYm9keTogQ2FjaGVSZWZyZXNoUmVxdWVzdCA9IHtcbiAgICAgIGhvc3RuYW1lOiBjZmcuaG9zdG5hbWUsXG4gICAgICBzaXRlSWQ6IGNmZy5zaXRlSWQsXG4gICAgICB1cmxzLFxuICAgIH07XG5cbiAgICBsZXQgcmVzOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNmZywgJy9jYWNoZS9yZWZyZXNoJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgICB0aW1lb3V0TXM6IFJFRlJFU0hfVElNRU9VVF9NUyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbY2RuLXB1cmdlXSBjYWNoZS9yZWZyZXNoIGVycm9yICgke3VybHMubGVuZ3RofSB1cmxzKTogJHtlcnI/Lm1lc3NhZ2UgPz8gZXJyfWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGxldCBkZXRhaWwgPSAnJztcbiAgICAgIHRyeSB7XG4gICAgICAgIGRldGFpbCA9IChhd2FpdCByZXMudGV4dCgpKS5zbGljZSgwLCAyMDApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIGlnbm9yZSAqL1xuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Nkbi1wdXJnZV0gY2FjaGUvcmVmcmVzaCBmYWlsZWQgc3RhdHVzPSR7cmVzLnN0YXR1c30gdXJscz0ke3VybHMubGVuZ3RofSAke2RldGFpbH1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hVcmxzKGFsbFVybHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGFsbFVybHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBiYXRjaGVzOiBzdHJpbmdbXVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxVcmxzLmxlbmd0aDsgaSArPSBVUkxfQkFUQ0hfU0laRSkge1xuICAgICAgYmF0Y2hlcy5wdXNoKGFsbFVybHMuc2xpY2UoaSwgaSArIFVSTF9CQVRDSF9TSVpFKSk7XG4gICAgfVxuXG4gICAgLy8g5bm25Y+R5LiK6ZmQIFJFRlJFU0hfQ09OQ1VSUkVOQ1kg55qE5ruR5Yqo56qX5Y+jXG4gICAgbGV0IGN1cnNvciA9IDA7XG4gICAgYXN5bmMgZnVuY3Rpb24gd29ya2VyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgd2hpbGUgKGN1cnNvciA8IGJhdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IGN1cnNvcisrO1xuICAgICAgICBhd2FpdCByZWZyZXNoQmF0Y2goYmF0Y2hlc1tpZHhdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZXJzID0gQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiBNYXRoLm1pbihSRUZSRVNIX0NPTkNVUlJFTkNZLCBiYXRjaGVzLmxlbmd0aCkgfSxcbiAgICAgICgpID0+IHdvcmtlcigpXG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3b3JrZXJzKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHB1cmdlQnlQYXRocyhwYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJscyA9IGV4cGFuZFBhdGhzVG9VcmxzKHBhdGhzKTtcbiAgICAgIGF3YWl0IHJlZnJlc2hVcmxzKHVybHMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtjZG4tcHVyZ2VdIHB1cmdlQnlQYXRocyBlcnJvcjogJHtlcnI/Lm1lc3NhZ2UgPz8gZXJyfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHB1cmdlQnlUYWdzKHRhZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVuaXF1ZVRhZ3MgPSBBcnJheS5mcm9tKFxuICAgICAgICBuZXcgU2V0KFxuICAgICAgICAgIHRhZ3NcbiAgICAgICAgICAgIC5tYXAodCA9PiAodHlwZW9mIHQgPT09ICdzdHJpbmcnID8gdCA6ICcnKSlcbiAgICAgICAgICAgIC5tYXAodCA9PiB0LnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGlmICh1bmlxdWVUYWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBtYXAgPSBhd2FpdCBsb2FkTWFuaWZlc3QoKTtcblxuICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHQgb2YgdW5pcXVlVGFncykge1xuICAgICAgICBjb25zdCBwYXRocyA9IG1hcC5nZXQodCk7XG4gICAgICAgIGlmICghcGF0aHMpIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcGF0aHMpIG1lcmdlZC5hZGQocCk7XG4gICAgICB9XG4gICAgICBpZiAobWVyZ2VkLnNpemUgPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgdXJscyA9IGV4cGFuZFBhdGhzVG9VcmxzKEFycmF5LmZyb20obWVyZ2VkKSk7XG4gICAgICBhd2FpdCByZWZyZXNoVXJscyh1cmxzKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbY2RuLXB1cmdlXSBwdXJnZUJ5VGFncyBlcnJvcjogJHtlcnI/Lm1lc3NhZ2UgPz8gZXJyfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHB1cmdlQnlQYXRocywgcHVyZ2VCeVRhZ3MgfTtcbn1cbiJdfQ==
|
|
@@ -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==
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 图片优化代理(FC 内执行)
|
|
3
3
|
*
|
|
4
|
-
* 浏览器 GET /
|
|
4
|
+
* 浏览器 GET /_next/image?url=...&w=...&q=... → ESA → FC(本模块)
|
|
5
5
|
* → 用 gatewayFetch 注入签名 4 header → Gateway /image/optimize
|
|
6
6
|
* → 流式 pipe 响应回浏览器(Cache-Control / ETag / Vary 等头透传)
|
|
7
7
|
*
|
|
8
8
|
* `<img>` 标签发不出自定义 header,由 FC 在这里代发签名请求 —— 这是方案三的核心。
|
|
9
|
+
* 拦截 Next 内置的 /_next/image 路由,用户 next.config 无需配 custom loader。
|
|
9
10
|
*/
|
|
10
11
|
/// <reference types="node" />
|
|
11
12
|
import * as http from 'http';
|
|
12
13
|
/**
|
|
13
|
-
* 处理一个 /
|
|
14
|
+
* 处理一个 /_next/image 请求。
|
|
14
15
|
* 由 node-server wrapper 在路径匹配后调用。
|
|
15
16
|
*/
|
|
16
17
|
export declare function handleImageProxy(req: http.IncomingMessage, res: http.ServerResponse): Promise<void>;
|
|
@@ -2,16 +2,18 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* 图片优化代理(FC 内执行)
|
|
4
4
|
*
|
|
5
|
-
* 浏览器 GET /
|
|
5
|
+
* 浏览器 GET /_next/image?url=...&w=...&q=... → ESA → FC(本模块)
|
|
6
6
|
* → 用 gatewayFetch 注入签名 4 header → Gateway /image/optimize
|
|
7
7
|
* → 流式 pipe 响应回浏览器(Cache-Control / ETag / Vary 等头透传)
|
|
8
8
|
*
|
|
9
9
|
* `<img>` 标签发不出自定义 header,由 FC 在这里代发签名请求 —— 这是方案三的核心。
|
|
10
|
+
* 拦截 Next 内置的 /_next/image 路由,用户 next.config 无需配 custom loader。
|
|
10
11
|
*/
|
|
11
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
13
|
exports.handleImageProxy = void 0;
|
|
13
14
|
const stream_1 = require("stream");
|
|
14
15
|
const gateway_auth_1 = require("./gateway-auth");
|
|
16
|
+
const image_config_1 = require("./image-config");
|
|
15
17
|
const GATEWAY_TIMEOUT_MS = 10000;
|
|
16
18
|
/** 透传给浏览器的响应头白名单(避免泄露 Gateway 内部 header) */
|
|
17
19
|
const PASSTHROUGH_HEADERS = [
|
|
@@ -48,7 +50,7 @@ function writeJson(res, status, body) {
|
|
|
48
50
|
res.end(JSON.stringify(body));
|
|
49
51
|
}
|
|
50
52
|
/**
|
|
51
|
-
* 处理一个 /
|
|
53
|
+
* 处理一个 /_next/image 请求。
|
|
52
54
|
* 由 node-server wrapper 在路径匹配后调用。
|
|
53
55
|
*/
|
|
54
56
|
async function handleImageProxy(req, res) {
|
|
@@ -74,6 +76,19 @@ async function handleImageProxy(req, res) {
|
|
|
74
76
|
error: 'Cannot resolve absolute URL: missing Host header',
|
|
75
77
|
});
|
|
76
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
|
+
}
|
|
77
92
|
// 加载签名配置
|
|
78
93
|
const cfg = (0, gateway_auth_1.loadGatewayAuthConfig)();
|
|
79
94
|
if (!cfg) {
|
|
@@ -146,4 +161,4 @@ async function handleImageProxy(req, res) {
|
|
|
146
161
|
}
|
|
147
162
|
}
|
|
148
163
|
exports.handleImageProxy = handleImageProxy;
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9pbWFnZS1wcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7OztBQUdILG1DQUFrQztBQUNsQyxpREFBcUU7QUFFckUsTUFBTSxrQkFBa0IsR0FBRyxLQUFNLENBQUM7QUFFbEMsNENBQTRDO0FBQzVDLE1BQU0sbUJBQW1CLEdBQUc7SUFDMUIsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YsTUFBTTtJQUNOLE1BQU07SUFDTixlQUFlO0lBQ2YseUJBQXlCO0NBQzFCLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FDekIsTUFBYyxFQUNkLEdBQXlCO0lBRXpCLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ2pFLE9BQU8sTUFBTSxDQUFDO0tBQ2Y7SUFDRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkIsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sS0FBSyxHQUNULENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDM0QsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUMzRCxPQUFPLENBQUM7SUFDVixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMs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QUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtRQUM3QyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVixPQUFPO0tBQ1I7SUFFRCwyQkFBMkI7SUFDM0IsSUFBSTtRQUNGLE1BQU0sVUFBVSxHQUFHLGlCQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFXLENBQUMsQ0FBQztRQUMxRCxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRTtZQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWE7Z0JBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUN0QjtJQUFDLE9BQU8sR0FBUSxFQUFFO1FBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFO1lBQ3BCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQztTQUN2RDthQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFO1lBQzdCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNYO0tBQ0Y7QUFDSCxDQUFDO0FBeEdELDRDQXdHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog5Zu+54mH5LyY5YyW5Luj55CG77yIRkMg5YaF5omn6KGM77yJXG4gKlxuICog5rWP6KeI5ZmoIEdFVCAvX3BjZy9pbWFnZS9vcHRpbWl6ZT91cmw9Li4uJnc9Li4uJnE9Li4uIOKGkiBFU0Eg4oaSIEZD77yI5pys5qih5Z2X77yJXG4gKiDihpIg55SoIGdhdGV3YXlGZXRjaCDms6jlhaXnrb7lkI0gNCBoZWFkZXIg4oaSIEdhdGV3YXkgL2ltYWdlL29wdGltaXplXG4gKiDihpIg5rWB5byPIHBpcGUg5ZON5bqU5Zue5rWP6KeI5Zmo77yIQ2FjaGUtQ29udHJvbCAvIEVUYWcgLyBWYXJ5IOetieWktOmAj+S8oO+8iVxuICpcbiAqIGA8aW1nPmAg5qCH562+5Y+R5LiN5Ye66Ieq5a6a5LmJIGhlYWRlcu+8jOeUsSBGQyDlnKjov5nph4zku6Plj5Hnrb7lkI3or7fmsYIg4oCU4oCUIOi/meaYr+aWueahiOS4ieeahOaguOW/g+OAglxuICovXG5cbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBsb2FkR2F0ZXdheUF1dGhDb25maWcsIGdhdGV3YXlGZXRjaCB9IGZyb20gJy4vZ2F0ZXdheS1hdXRoJztcblxuY29uc3QgR0FURVdBWV9USU1FT1VUX01TID0gMTBfMDAwO1xuXG4vKiog6YCP5Lyg57uZ5rWP6KeI5Zmo55qE5ZON5bqU5aS055m95ZCN5Y2V77yI6YG/5YWN5rOE6ZyyIEdhdGV3YXkg5YaF6YOoIGhlYWRlcu+8iSAqL1xuY29uc3QgUEFTU1RIUk9VR0hfSEVBREVSUyA9IFtcbiAgJ2NvbnRlbnQtdHlwZScsXG4gICdjb250ZW50LWxlbmd0aCcsXG4gICdjYWNoZS1jb250cm9sJyxcbiAgJ2V0YWcnLFxuICAndmFyeScsXG4gICdsYXN0LW1vZGlmaWVkJyxcbiAgJ2NvbnRlbnQtc2VjdXJpdHktcG9saWN5Jyxcbl07XG5cbi8qKlxuICog5oqK6K+35rGCIFVSTCDkuK3nmoQgYHVybD1gIOWPguaVsOagh+WHhuWMluaIkOe7neWvuSBVUkzjgIJcbiAqIC0g5bey57uP5pivIGh0dHAocyk6Ly8g4oaSIOWOn+agt1xuICogLSDlkKbliJnnlKggYCR7cHJvdG99Oi8vJHtob3N0fSR7dXJsfWAg5ou85o6l77yMcHJvdG8g5Y+WIHgtZm9yd2FyZGVkLXByb3Rv77yM5ZCm5YiZIGh0dHBzXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBYnNvbHV0ZVVybChcbiAgcmF3VXJsOiBzdHJpbmcsXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2Vcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAocmF3VXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCByYXdVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuICAgIHJldHVybiByYXdVcmw7XG4gIH1cbiAgY29uc3QgaG9zdCA9IHJlcS5oZWFkZXJzWydob3N0J107XG4gIGlmICghaG9zdCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHByb3RvSGVhZGVyID0gcmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLXByb3RvJ107XG4gIGNvbnN0IHByb3RvID1cbiAgICAoQXJyYXkuaXNBcnJheShwcm90b0hlYWRlcikgPyBwcm90b0hlYWRlclswXSA6IHByb3RvSGVhZGVyKSB8fFxuICAgIChBcnJheS5pc0FycmF5KHByb3RvSGVhZGVyKSA/IHByb3RvSGVhZGVyWzBdIDogcHJvdG9IZWFkZXIpIHx8XG4gICAgJ2h0dHBzJztcbiAgY29uc3QgcGF0aCA9IHJhd1VybC5zdGFydHNXaXRoKCcvJykgPyByYXdVcmwgOiBgLyR7cmF3VXJsfWA7XG4gIHJldHVybiBgJHtwcm90b306Ly8ke2hvc3R9JHtwYXRofWA7XG59XG5cbmZ1bmN0aW9uIHdyaXRlSnNvbihyZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsIHN0YXR1czogbnVtYmVyLCBib2R5OiBhbnkpOiB2b2lkIHtcbiAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXM7XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04Jyk7XG4gIHJlcy5lbmQoSlNPTi5zdHJpbmdpZnkoYm9keSkpO1xufVxuXG4vKipcbiAqIOWkhOeQhuS4gOS4qiAvX3BjZy9pbWFnZS9vcHRpbWl6ZSDor7fmsYLjgIJcbiAqIOeUsSBub2RlLXNlcnZlciB3cmFwcGVyIOWcqOi3r+W+hOWMuemFjeWQjuiwg+eUqOOAglxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlSW1hZ2VQcm94eShcbiAgcmVxOiBodHRwLkluY29taW5nTWVzc2FnZSxcbiAgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8g6Kej5p6QIHF1ZXJ5XG4gIGNvbnN0IHJlcVVybCA9IHJlcS51cmwgfHwgJyc7XG4gIGNvbnN0IHFJZHggPSByZXFVcmwuaW5kZXhPZignPycpO1xuICBpZiAocUlkeCA9PT0gLTEpIHtcbiAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNDAwLCB7IGVycm9yOiAnTWlzc2luZyBxdWVyeSBwYXJhbWV0ZXJzJyB9KTtcbiAgfVxuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHJlcVVybC5zbGljZShxSWR4ICsgMSkpO1xuICBjb25zdCByYXdVcmwgPSBwYXJhbXMuZ2V0KCd1cmwnKTtcbiAgY29uc3QgdyA9IHBhcmFtcy5nZXQoJ3cnKTtcbiAgY29uc3QgcSA9IHBhcmFtcy5nZXQoJ3EnKTtcblxuICBpZiAoIXJhd1VybCB8fCAhdykge1xuICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA0MDAsIHtcbiAgICAgIGVycm9yOiAnTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXJzOiB1cmwsIHcnLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g5qCH5YeG5YyWIHVybCDlj4LmlbDkuLrnu53lr7kgVVJMXG4gIGNvbnN0IGFic29sdXRlVXJsID0gcmVzb2x2ZUFic29sdXRlVXJsKHJhd1VybCwgcmVxKTtcbiAgaWYgKCFhYnNvbHV0ZVVybCkge1xuICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA1MDAsIHtcbiAgICAgIGVycm9yOiAnQ2Fubm90IHJlc29sdmUgYWJzb2x1dGUgVVJMOiBtaXNzaW5nIEhvc3QgaGVhZGVyJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOWKoOi9veetvuWQjemFjee9rlxuICBjb25zdCBjZmcgPSBsb2FkR2F0ZXdheUF1dGhDb25maWcoKTtcbiAgaWYgKCFjZmcpIHtcbiAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNTAwLCB7XG4gICAgICBlcnJvcjogJ0dhdGV3YXkgYXV0aCBjb25maWcgbWlzc2luZycsXG4gICAgfSk7XG4gIH1cblxuICAvLyDmnoTpgKAgR2F0ZXdheSDor7fmsYLot6/lvoRcbiAgY29uc3QgdXBzdHJlYW1QYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgdXJsOiBhYnNvbHV0ZVVybCwgdyB9KTtcbiAgaWYgKHEpIHVwc3RyZWFtUGFyYW1zLnNldCgncScsIHEpO1xuICBjb25zdCB1cHN0cmVhbVBhdGggPSBgL2ltYWdlL29wdGltaXplPyR7dXBzdHJlYW1QYXJhbXN9YDtcblxuICAvLyDpgI/kvKAgSWYtTm9uZS1NYXRjaCDorqkgR2F0ZXdheSDotbAgMzA0XG4gIGNvbnN0IGlmTm9uZU1hdGNoID0gcmVxLmhlYWRlcnNbJ2lmLW5vbmUtbWF0Y2gnXTtcbiAgY29uc3QgdXBzdHJlYW1IZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGlmICh0eXBlb2YgaWZOb25lTWF0Y2ggPT09ICdzdHJpbmcnKSB7XG4gICAgdXBzdHJlYW1IZWFkZXJzWydpZi1ub25lLW1hdGNoJ10gPSBpZk5vbmVNYXRjaDtcbiAgfVxuICBjb25zdCBhY2NlcHQgPSByZXEuaGVhZGVyc1snYWNjZXB0J107XG4gIGlmICh0eXBlb2YgYWNjZXB0ID09PSAnc3RyaW5nJykge1xuICAgIHVwc3RyZWFtSGVhZGVyc1snYWNjZXB0J10gPSBhY2NlcHQ7XG4gIH1cblxuICBsZXQgdXBzdHJlYW06IFJlc3BvbnNlO1xuICB0cnkge1xuICAgIHVwc3RyZWFtID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNmZywgdXBzdHJlYW1QYXRoLCB7XG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgaGVhZGVyczogdXBzdHJlYW1IZWFkZXJzLFxuICAgICAgdGltZW91dE1zOiBHQVRFV0FZX1RJTUVPVVRfTVMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtpbWFnZS1wcm94eV0gR2F0ZXdheSB0aW1lb3V0IGFmdGVyICR7R0FURVdBWV9USU1FT1VUX01TfW1zOiAke2Fic29sdXRlVXJsfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNTA0LCB7IGVycm9yOiAnVXBzdHJlYW0gdGltZW91dCcgfSk7XG4gICAgfVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbaW1hZ2UtcHJveHldIEdhdGV3YXkgZmV0Y2ggZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9ICh1cmw9JHthYnNvbHV0ZVVybH0pYFxuICAgICk7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDUwMiwgeyBlcnJvcjogJ0JhZCBnYXRld2F5JyB9KTtcbiAgfVxuXG4gIC8vIOmAj+S8oOeKtuaAgeeggSArIOeZveWQjeWNlSBoZWFkZXJcbiAgcmVzLnN0YXR1c0NvZGUgPSB1cHN0cmVhbS5zdGF0dXM7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBQQVNTVEhST1VHSF9IRUFERVJTKSB7XG4gICAgY29uc3QgdmFsdWUgPSB1cHN0cmVhbS5oZWFkZXJzLmdldChuYW1lKTtcbiAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHJlcy5zZXRIZWFkZXIobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIDMwNCAvIOaXoCBib2R5IOebtOaOpee7k+adn1xuICBpZiAodXBzdHJlYW0uc3RhdHVzID09PSAzMDQgfHwgIXVwc3RyZWFtLmJvZHkpIHtcbiAgICByZXMuZW5kKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g5rWB5byPIHBpcGXvvIjpgb/lhY3lpKflm74gYnVmZmVyIOWNoOWGheWtmO+8iVxuICB0cnkge1xuICAgIGNvbnN0IG5vZGVTdHJlYW0gPSBSZWFkYWJsZS5mcm9tV2ViKHVwc3RyZWFtLmJvZHkgYXMgYW55KTtcbiAgICBub2RlU3RyZWFtLm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oYFtpbWFnZS1wcm94eV0gU3RyZWFtIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkgcmVzLmVuZCgpO1xuICAgIH0pO1xuICAgIG5vZGVTdHJlYW0ucGlwZShyZXMpO1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUud2FybihgW2ltYWdlLXByb3h5XSBQaXBlIHNldHVwIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBpZiAoIXJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgd3JpdGVKc29uKHJlcywgNTAyLCB7IGVycm9yOiAnU3RyZWFtIHNldHVwIGZhaWxlZCcgfSk7XG4gICAgfSBlbHNlIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
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.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "CLI for building and deploying Next.js apps onto pages-cache-gateway (PCG)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"next",
|
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
},
|
|
20
20
|
"files": [
|
|
21
21
|
"dist",
|
|
22
|
-
"runtime",
|
|
23
22
|
"README.md",
|
|
24
23
|
"LICENSE"
|
|
25
24
|
],
|
|
@@ -42,4 +41,4 @@
|
|
|
42
41
|
"typescript": "~4.8.0"
|
|
43
42
|
},
|
|
44
43
|
"repository": "git@gitlab.alibaba-inc.com:edge-routine-tools/pages-cache-gateway.git"
|
|
45
|
-
}
|
|
44
|
+
}
|