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.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -0
  3. package/dist/_inline-overrides.js +7 -0
  4. package/dist/_protocol/endpoints.d.ts +14 -0
  5. package/dist/_protocol/endpoints.js +24 -0
  6. package/dist/_protocol/index.d.ts +3 -0
  7. package/dist/_protocol/index.js +20 -0
  8. package/dist/_protocol/keys.d.ts +27 -0
  9. package/dist/_protocol/keys.js +36 -0
  10. package/dist/_protocol/types.d.ts +72 -0
  11. package/dist/_protocol/types.js +3 -0
  12. package/dist/adapters/adapter.interface.d.ts +8 -0
  13. package/dist/adapters/adapter.interface.js +3 -0
  14. package/dist/adapters/converters/passthrough.d.ts +16 -0
  15. package/dist/adapters/converters/passthrough.js +19 -0
  16. package/dist/adapters/index.d.ts +3 -0
  17. package/dist/adapters/index.js +8 -0
  18. package/dist/adapters/local-fs.adapter.d.ts +12 -0
  19. package/dist/adapters/local-fs.adapter.js +37 -0
  20. package/dist/adapters/oss.adapter.d.ts +13 -0
  21. package/dist/adapters/oss.adapter.js +26 -0
  22. package/dist/adapters/wrappers/node-server.d.ts +57 -0
  23. package/dist/adapters/wrappers/node-server.js +282 -0
  24. package/dist/bin/cli.d.ts +2 -0
  25. package/dist/bin/cli.js +21 -0
  26. package/dist/commands/build.d.ts +10 -0
  27. package/dist/commands/build.js +247 -0
  28. package/dist/commands/deploy.d.ts +11 -0
  29. package/dist/commands/deploy.js +116 -0
  30. package/dist/commands/purge.d.ts +15 -0
  31. package/dist/commands/purge.js +135 -0
  32. package/dist/commands/serve.d.ts +14 -0
  33. package/dist/commands/serve.js +162 -0
  34. package/dist/commands/upload-assets.d.ts +12 -0
  35. package/dist/commands/upload-assets.js +46 -0
  36. package/dist/commands/upload-cache.d.ts +13 -0
  37. package/dist/commands/upload-cache.js +70 -0
  38. package/dist/compile/compileCacheAssetsManifest.d.ts +1 -0
  39. package/dist/compile/compileCacheAssetsManifest.js +67 -0
  40. package/dist/config/default-open-next-config.d.ts +3 -0
  41. package/dist/config/default-open-next-config.js +30 -0
  42. package/dist/index.d.ts +13 -0
  43. package/dist/index.js +36 -0
  44. package/dist/overrides/incrementalCache/gateway.d.ts +32 -0
  45. package/dist/overrides/incrementalCache/gateway.js +160 -0
  46. package/dist/overrides/tagCache/gateway.d.ts +26 -0
  47. package/dist/overrides/tagCache/gateway.js +211 -0
  48. package/dist/runtime/gateway-auth.d.ts +51 -0
  49. package/dist/runtime/gateway-auth.js +121 -0
  50. package/dist/runtime/image-proxy.d.ts +16 -0
  51. package/dist/runtime/image-proxy.js +149 -0
  52. package/dist/util/fs.d.ts +3 -0
  53. package/dist/util/fs.js +39 -0
  54. package/package.json +47 -0
  55. 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==
@@ -0,0 +1,3 @@
1
+ export declare function walkDir(dir: string): Promise<string[]>;
2
+ export declare function dirExists(dir: string): Promise<boolean>;
3
+ export declare function readJsonFile<T = unknown>(filePath: string): Promise<T>;
@@ -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
+ }