esa-pcg-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +65 -0
- package/dist/_inline-overrides.js +7 -0
- package/dist/_protocol/endpoints.d.ts +14 -0
- package/dist/_protocol/endpoints.js +24 -0
- package/dist/_protocol/index.d.ts +3 -0
- package/dist/_protocol/index.js +20 -0
- package/dist/_protocol/keys.d.ts +27 -0
- package/dist/_protocol/keys.js +36 -0
- package/dist/_protocol/types.d.ts +72 -0
- package/dist/_protocol/types.js +3 -0
- package/dist/adapters/adapter.interface.d.ts +8 -0
- package/dist/adapters/adapter.interface.js +3 -0
- package/dist/adapters/converters/passthrough.d.ts +16 -0
- package/dist/adapters/converters/passthrough.js +19 -0
- package/dist/adapters/index.d.ts +3 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/local-fs.adapter.d.ts +12 -0
- package/dist/adapters/local-fs.adapter.js +37 -0
- package/dist/adapters/oss.adapter.d.ts +13 -0
- package/dist/adapters/oss.adapter.js +26 -0
- package/dist/adapters/wrappers/node-server.d.ts +57 -0
- package/dist/adapters/wrappers/node-server.js +282 -0
- package/dist/bin/cli.d.ts +2 -0
- package/dist/bin/cli.js +21 -0
- package/dist/commands/build.d.ts +10 -0
- package/dist/commands/build.js +247 -0
- package/dist/commands/deploy.d.ts +11 -0
- package/dist/commands/deploy.js +116 -0
- package/dist/commands/purge.d.ts +15 -0
- package/dist/commands/purge.js +135 -0
- package/dist/commands/serve.d.ts +14 -0
- package/dist/commands/serve.js +162 -0
- package/dist/commands/upload-assets.d.ts +12 -0
- package/dist/commands/upload-assets.js +46 -0
- package/dist/commands/upload-cache.d.ts +13 -0
- package/dist/commands/upload-cache.js +70 -0
- package/dist/compile/compileCacheAssetsManifest.d.ts +1 -0
- package/dist/compile/compileCacheAssetsManifest.js +67 -0
- package/dist/config/default-open-next-config.d.ts +3 -0
- package/dist/config/default-open-next-config.js +30 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +36 -0
- package/dist/overrides/incrementalCache/gateway.d.ts +32 -0
- package/dist/overrides/incrementalCache/gateway.js +160 -0
- package/dist/overrides/tagCache/gateway.d.ts +26 -0
- package/dist/overrides/tagCache/gateway.js +211 -0
- package/dist/runtime/gateway-auth.d.ts +51 -0
- package/dist/runtime/gateway-auth.js +121 -0
- package/dist/runtime/image-proxy.d.ts +16 -0
- package/dist/runtime/image-proxy.js +149 -0
- package/dist/util/fs.d.ts +3 -0
- package/dist/util/fs.js +39 -0
- package/package.json +47 -0
- package/runtime/pcg-image-loader.js +13 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 图片优化代理(FC 内执行)
|
|
3
|
+
*
|
|
4
|
+
* 浏览器 GET /_pcg/image/optimize?url=...&w=...&q=... → ESA → FC(本模块)
|
|
5
|
+
* → 用 gatewayFetch 注入签名 4 header → Gateway /image/optimize
|
|
6
|
+
* → 流式 pipe 响应回浏览器(Cache-Control / ETag / Vary 等头透传)
|
|
7
|
+
*
|
|
8
|
+
* `<img>` 标签发不出自定义 header,由 FC 在这里代发签名请求 —— 这是方案三的核心。
|
|
9
|
+
*/
|
|
10
|
+
/// <reference types="node" />
|
|
11
|
+
import * as http from 'http';
|
|
12
|
+
/**
|
|
13
|
+
* 处理一个 /_pcg/image/optimize 请求。
|
|
14
|
+
* 由 node-server wrapper 在路径匹配后调用。
|
|
15
|
+
*/
|
|
16
|
+
export declare function handleImageProxy(req: http.IncomingMessage, res: http.ServerResponse): Promise<void>;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 图片优化代理(FC 内执行)
|
|
4
|
+
*
|
|
5
|
+
* 浏览器 GET /_pcg/image/optimize?url=...&w=...&q=... → ESA → FC(本模块)
|
|
6
|
+
* → 用 gatewayFetch 注入签名 4 header → Gateway /image/optimize
|
|
7
|
+
* → 流式 pipe 响应回浏览器(Cache-Control / ETag / Vary 等头透传)
|
|
8
|
+
*
|
|
9
|
+
* `<img>` 标签发不出自定义 header,由 FC 在这里代发签名请求 —— 这是方案三的核心。
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.handleImageProxy = void 0;
|
|
13
|
+
const stream_1 = require("stream");
|
|
14
|
+
const gateway_auth_1 = require("./gateway-auth");
|
|
15
|
+
const GATEWAY_TIMEOUT_MS = 10000;
|
|
16
|
+
/** 透传给浏览器的响应头白名单(避免泄露 Gateway 内部 header) */
|
|
17
|
+
const PASSTHROUGH_HEADERS = [
|
|
18
|
+
'content-type',
|
|
19
|
+
'content-length',
|
|
20
|
+
'cache-control',
|
|
21
|
+
'etag',
|
|
22
|
+
'vary',
|
|
23
|
+
'last-modified',
|
|
24
|
+
'content-security-policy',
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* 把请求 URL 中的 `url=` 参数标准化成绝对 URL。
|
|
28
|
+
* - 已经是 http(s):// → 原样
|
|
29
|
+
* - 否则用 `${proto}://${host}${url}` 拼接,proto 取 x-forwarded-proto,否则 https
|
|
30
|
+
*/
|
|
31
|
+
function resolveAbsoluteUrl(rawUrl, req) {
|
|
32
|
+
if (rawUrl.startsWith('http://') || rawUrl.startsWith('https://')) {
|
|
33
|
+
return rawUrl;
|
|
34
|
+
}
|
|
35
|
+
const host = req.headers['host'];
|
|
36
|
+
if (!host)
|
|
37
|
+
return null;
|
|
38
|
+
const protoHeader = req.headers['x-forwarded-proto'];
|
|
39
|
+
const proto = (Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) ||
|
|
40
|
+
(Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) ||
|
|
41
|
+
'https';
|
|
42
|
+
const path = rawUrl.startsWith('/') ? rawUrl : `/${rawUrl}`;
|
|
43
|
+
return `${proto}://${host}${path}`;
|
|
44
|
+
}
|
|
45
|
+
function writeJson(res, status, body) {
|
|
46
|
+
res.statusCode = status;
|
|
47
|
+
res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
48
|
+
res.end(JSON.stringify(body));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 处理一个 /_pcg/image/optimize 请求。
|
|
52
|
+
* 由 node-server wrapper 在路径匹配后调用。
|
|
53
|
+
*/
|
|
54
|
+
async function handleImageProxy(req, res) {
|
|
55
|
+
// 解析 query
|
|
56
|
+
const reqUrl = req.url || '';
|
|
57
|
+
const qIdx = reqUrl.indexOf('?');
|
|
58
|
+
if (qIdx === -1) {
|
|
59
|
+
return writeJson(res, 400, { error: 'Missing query parameters' });
|
|
60
|
+
}
|
|
61
|
+
const params = new URLSearchParams(reqUrl.slice(qIdx + 1));
|
|
62
|
+
const rawUrl = params.get('url');
|
|
63
|
+
const w = params.get('w');
|
|
64
|
+
const q = params.get('q');
|
|
65
|
+
if (!rawUrl || !w) {
|
|
66
|
+
return writeJson(res, 400, {
|
|
67
|
+
error: 'Missing required parameters: url, w',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// 标准化 url 参数为绝对 URL
|
|
71
|
+
const absoluteUrl = resolveAbsoluteUrl(rawUrl, req);
|
|
72
|
+
if (!absoluteUrl) {
|
|
73
|
+
return writeJson(res, 500, {
|
|
74
|
+
error: 'Cannot resolve absolute URL: missing Host header',
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// 加载签名配置
|
|
78
|
+
const cfg = (0, gateway_auth_1.loadGatewayAuthConfig)();
|
|
79
|
+
if (!cfg) {
|
|
80
|
+
return writeJson(res, 500, {
|
|
81
|
+
error: 'Gateway auth config missing',
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// 构造 Gateway 请求路径
|
|
85
|
+
const upstreamParams = new URLSearchParams({ url: absoluteUrl, w });
|
|
86
|
+
if (q)
|
|
87
|
+
upstreamParams.set('q', q);
|
|
88
|
+
const upstreamPath = `/image/optimize?${upstreamParams}`;
|
|
89
|
+
// 透传 If-None-Match 让 Gateway 走 304
|
|
90
|
+
const ifNoneMatch = req.headers['if-none-match'];
|
|
91
|
+
const upstreamHeaders = {};
|
|
92
|
+
if (typeof ifNoneMatch === 'string') {
|
|
93
|
+
upstreamHeaders['if-none-match'] = ifNoneMatch;
|
|
94
|
+
}
|
|
95
|
+
const accept = req.headers['accept'];
|
|
96
|
+
if (typeof accept === 'string') {
|
|
97
|
+
upstreamHeaders['accept'] = accept;
|
|
98
|
+
}
|
|
99
|
+
let upstream;
|
|
100
|
+
try {
|
|
101
|
+
upstream = await (0, gateway_auth_1.gatewayFetch)(cfg, upstreamPath, {
|
|
102
|
+
method: 'GET',
|
|
103
|
+
headers: upstreamHeaders,
|
|
104
|
+
timeoutMs: GATEWAY_TIMEOUT_MS,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
if (err.name === 'AbortError') {
|
|
109
|
+
console.warn(`[image-proxy] Gateway timeout after ${GATEWAY_TIMEOUT_MS}ms: ${absoluteUrl}`);
|
|
110
|
+
return writeJson(res, 504, { error: 'Upstream timeout' });
|
|
111
|
+
}
|
|
112
|
+
console.warn(`[image-proxy] Gateway fetch error: ${err.message} (url=${absoluteUrl})`);
|
|
113
|
+
return writeJson(res, 502, { error: 'Bad gateway' });
|
|
114
|
+
}
|
|
115
|
+
// 透传状态码 + 白名单 header
|
|
116
|
+
res.statusCode = upstream.status;
|
|
117
|
+
for (const name of PASSTHROUGH_HEADERS) {
|
|
118
|
+
const value = upstream.headers.get(name);
|
|
119
|
+
if (value !== null) {
|
|
120
|
+
res.setHeader(name, value);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// 304 / 无 body 直接结束
|
|
124
|
+
if (upstream.status === 304 || !upstream.body) {
|
|
125
|
+
res.end();
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// 流式 pipe(避免大图 buffer 占内存)
|
|
129
|
+
try {
|
|
130
|
+
const nodeStream = stream_1.Readable.fromWeb(upstream.body);
|
|
131
|
+
nodeStream.on('error', err => {
|
|
132
|
+
console.warn(`[image-proxy] Stream error: ${err.message}`);
|
|
133
|
+
if (!res.writableEnded)
|
|
134
|
+
res.end();
|
|
135
|
+
});
|
|
136
|
+
nodeStream.pipe(res);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
console.warn(`[image-proxy] Pipe setup failed: ${err.message}`);
|
|
140
|
+
if (!res.headersSent) {
|
|
141
|
+
writeJson(res, 502, { error: 'Stream setup failed' });
|
|
142
|
+
}
|
|
143
|
+
else if (!res.writableEnded) {
|
|
144
|
+
res.end();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
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==
|
package/dist/util/fs.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readJsonFile = exports.dirExists = exports.walkDir = void 0;
|
|
4
|
+
const fs = require("fs/promises");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
async function walkDir(dir) {
|
|
7
|
+
const files = [];
|
|
8
|
+
async function walk(currentDir) {
|
|
9
|
+
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
|
10
|
+
for (const entry of entries) {
|
|
11
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
12
|
+
if (entry.isDirectory()) {
|
|
13
|
+
await walk(fullPath);
|
|
14
|
+
}
|
|
15
|
+
else if (entry.isFile()) {
|
|
16
|
+
files.push(fullPath);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
await walk(dir);
|
|
21
|
+
return files;
|
|
22
|
+
}
|
|
23
|
+
exports.walkDir = walkDir;
|
|
24
|
+
async function dirExists(dir) {
|
|
25
|
+
try {
|
|
26
|
+
const stat = await fs.stat(dir);
|
|
27
|
+
return stat.isDirectory();
|
|
28
|
+
}
|
|
29
|
+
catch (_a) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.dirExists = dirExists;
|
|
34
|
+
async function readJsonFile(filePath) {
|
|
35
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
36
|
+
return JSON.parse(content);
|
|
37
|
+
}
|
|
38
|
+
exports.readJsonFile = readJsonFile;
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC9mcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrQ0FBa0M7QUFDbEMsNkJBQTZCO0FBRXRCLEtBQUssVUFBVSxPQUFPLENBQUMsR0FBVztJQUN2QyxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFFM0IsS0FBSyxVQUFVLElBQUksQ0FBQyxVQUFrQjtRQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEUsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUU7WUFDM0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25ELElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUN2QixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN0QjtpQkFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN0QjtTQUNGO0lBQ0gsQ0FBQztJQUVELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQWpCRCwwQkFpQkM7QUFFTSxLQUFLLFVBQVUsU0FBUyxDQUFDLEdBQVc7SUFDekMsSUFBSTtRQUNGLE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUMzQjtJQUFDLFdBQU07UUFDTixPQUFPLEtBQUssQ0FBQztLQUNkO0FBQ0gsQ0FBQztBQVBELDhCQU9DO0FBRU0sS0FBSyxVQUFVLFlBQVksQ0FBYyxRQUFnQjtJQUM5RCxNQUFNLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQU0sQ0FBQztBQUNsQyxDQUFDO0FBSEQsb0NBR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2Fsa0RpcihkaXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2FsayhjdXJyZW50RGlyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihjdXJyZW50RGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGF3YWl0IHdhbGsoZnVsbFBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSkge1xuICAgICAgICBmaWxlcy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhd2FpdCB3YWxrKGRpcik7XG4gIHJldHVybiBmaWxlcztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpckV4aXN0cyhkaXI6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGRpcik7XG4gICAgcmV0dXJuIHN0YXQuaXNEaXJlY3RvcnkoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkSnNvbkZpbGU8VCA9IHVua25vd24+KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudCkgYXMgVDtcbn1cbiJdfQ==
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "esa-pcg-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for building and deploying Next.js apps onto pages-cache-gateway (PCG)",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"next",
|
|
7
|
+
"nextjs",
|
|
8
|
+
"opennext",
|
|
9
|
+
"cache",
|
|
10
|
+
"edge",
|
|
11
|
+
"deploy",
|
|
12
|
+
"pages-cache-gateway",
|
|
13
|
+
"pcg"
|
|
14
|
+
],
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"main": "dist/bin/cli.js",
|
|
17
|
+
"bin": {
|
|
18
|
+
"pcg": "./dist/bin/cli.js"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"runtime",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc && node scripts/inline-protocol.js && node scripts/bundle-overrides.js",
|
|
28
|
+
"prepublishOnly": "npm run build",
|
|
29
|
+
"test": "jest --config jest.config.js"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"ali-oss": "^6.23.0",
|
|
33
|
+
"commander": "^12.0.0"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"@opennextjs/aws": "^3.10.4"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@opennextjs/aws": "^3.10.4",
|
|
40
|
+
"@types/ali-oss": "^6.23.3",
|
|
41
|
+
"@types/jest": "^29.2.0",
|
|
42
|
+
"esbuild": "^0.25.4",
|
|
43
|
+
"jest": "^29.2.2",
|
|
44
|
+
"ts-jest": "^29.0.3",
|
|
45
|
+
"typescript": "~4.8.0"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Shipped with esa-pcg-cli. `pcg build` copies this file into
|
|
2
|
+
// <projectDir>/node_modules/.pcg/, so next.config can reference it as
|
|
3
|
+
// 'node_modules/.pcg/pcg-image-loader.js' without writing into the user's
|
|
4
|
+
// source tree and without declaring esa-pcg-cli in package.json.
|
|
5
|
+
// 图片请求走同域 /_pcg/image/optimize,由 FC 内的 wrapper 拦截后用签名 client 调 Gateway。
|
|
6
|
+
export default function pcgImageLoader({ src, width, quality }) {
|
|
7
|
+
const params = new URLSearchParams({
|
|
8
|
+
url: src,
|
|
9
|
+
w: String(width),
|
|
10
|
+
q: String(quality || 75),
|
|
11
|
+
});
|
|
12
|
+
return `/_pcg/image/optimize?${params}`;
|
|
13
|
+
}
|