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,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createServeCommand = exports.runServe = void 0;
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const fs = require("fs");
|
|
6
|
+
const http = require("http");
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const commander_1 = require("commander");
|
|
9
|
+
/**
|
|
10
|
+
* Poll the child server's /__health endpoint until it responds 200 or we time out.
|
|
11
|
+
* node-server wrapper exposes /__health unconditionally, so this is now load-bearing
|
|
12
|
+
* (the old impl always fell through to a setTimeout because platform-function had
|
|
13
|
+
* no /__health).
|
|
14
|
+
*/
|
|
15
|
+
async function waitForReady(port, timeoutMs = 30000) {
|
|
16
|
+
const deadline = Date.now() + timeoutMs;
|
|
17
|
+
return new Promise((resolve, reject) => {
|
|
18
|
+
const probe = () => {
|
|
19
|
+
const req = http.request({
|
|
20
|
+
hostname: '127.0.0.1',
|
|
21
|
+
port,
|
|
22
|
+
path: '/__health',
|
|
23
|
+
method: 'GET',
|
|
24
|
+
timeout: 1000,
|
|
25
|
+
}, res => {
|
|
26
|
+
res.resume();
|
|
27
|
+
if (res.statusCode === 200) {
|
|
28
|
+
resolve();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (Date.now() > deadline) {
|
|
32
|
+
reject(new Error(`/__health returned ${res.statusCode}`));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
setTimeout(probe, 200);
|
|
36
|
+
});
|
|
37
|
+
req.on('error', () => {
|
|
38
|
+
if (Date.now() > deadline) {
|
|
39
|
+
reject(new Error('Timed out waiting for child server'));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
setTimeout(probe, 200);
|
|
43
|
+
});
|
|
44
|
+
req.end();
|
|
45
|
+
};
|
|
46
|
+
probe();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async function runServe(opts) {
|
|
50
|
+
var _a, _b;
|
|
51
|
+
const projectDir = path.resolve(opts.dir);
|
|
52
|
+
const assetsDir = path.join(projectDir, '.open-next', 'assets');
|
|
53
|
+
const serverDir = path.join(projectDir, '.open-next', 'server-functions', 'default');
|
|
54
|
+
const serverEntry = path.join(serverDir, 'index.mjs');
|
|
55
|
+
if (!fs.existsSync(serverEntry)) {
|
|
56
|
+
throw new Error(`.open-next/server-functions/default/index.mjs not found. Run "pcg build" first.`);
|
|
57
|
+
}
|
|
58
|
+
const port = opts.port;
|
|
59
|
+
const childEnv = {
|
|
60
|
+
...process.env,
|
|
61
|
+
PORT: String(port),
|
|
62
|
+
};
|
|
63
|
+
if (opts.gateway) {
|
|
64
|
+
let rawGateway = opts.gateway.replace(/\/+$/, '');
|
|
65
|
+
if (!/^https?:\/\//i.test(rawGateway)) {
|
|
66
|
+
rawGateway = `http://${rawGateway}`;
|
|
67
|
+
}
|
|
68
|
+
const gatewayUrl = rawGateway;
|
|
69
|
+
const appId = opts.appId || 'local_user/local_app';
|
|
70
|
+
const secret = opts.secret || opts.token || 'local-dev-secret';
|
|
71
|
+
if (!opts.secret && opts.token) {
|
|
72
|
+
console.warn('[serve] --token is deprecated, use --secret to provide HMAC auth key');
|
|
73
|
+
}
|
|
74
|
+
const slashIdx = appId.indexOf('/');
|
|
75
|
+
if (slashIdx <= 0 || slashIdx === appId.length - 1) {
|
|
76
|
+
throw new Error(`[serve] --app-id 格式错误: "${appId}",期望 "<aliuid>/<routinename>"`);
|
|
77
|
+
}
|
|
78
|
+
const aliuid = appId.slice(0, slashIdx);
|
|
79
|
+
const routinename = appId.slice(slashIdx + 1);
|
|
80
|
+
let buildId = '';
|
|
81
|
+
const buildIdPath = path.join(assetsDir, 'BUILD_ID');
|
|
82
|
+
try {
|
|
83
|
+
buildId = fs.readFileSync(buildIdPath, 'utf-8').trim();
|
|
84
|
+
}
|
|
85
|
+
catch (_c) {
|
|
86
|
+
console.warn('[serve] Warning: BUILD_ID not found, tag/cache key may be incorrect');
|
|
87
|
+
}
|
|
88
|
+
childEnv.ESA_CACHE_GW_GATEWAY_ENDPOINT = gatewayUrl;
|
|
89
|
+
childEnv.ESA_CACHE_GW_AUTH_KEY = secret;
|
|
90
|
+
childEnv.ESA_CACHE_GW_ALIUID = aliuid;
|
|
91
|
+
childEnv.ESA_CACHE_GW_ROUTINENAME = routinename;
|
|
92
|
+
if (buildId)
|
|
93
|
+
childEnv.ESA_CACHE_GW_VERSION = buildId;
|
|
94
|
+
console.log('[serve] Gateway mode enabled:');
|
|
95
|
+
console.log(` ESA_CACHE_GW_GATEWAY_ENDPOINT = ${gatewayUrl}`);
|
|
96
|
+
console.log(` ESA_CACHE_GW_ALIUID = ${aliuid}`);
|
|
97
|
+
console.log(` ESA_CACHE_GW_ROUTINENAME = ${routinename}`);
|
|
98
|
+
console.log(` ESA_CACHE_GW_VERSION = ${buildId || '(not found)'}`);
|
|
99
|
+
console.log(' Image proxy = /_pcg/image/* (intercepted by node-server wrapper)');
|
|
100
|
+
}
|
|
101
|
+
const child = (0, child_process_1.spawn)('node', ['index.mjs'], {
|
|
102
|
+
cwd: serverDir,
|
|
103
|
+
env: childEnv,
|
|
104
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
105
|
+
});
|
|
106
|
+
(_a = child.stdout) === null || _a === void 0 ? void 0 : _a.on('data', (data) => {
|
|
107
|
+
process.stdout.write(`[next] ${data}`);
|
|
108
|
+
});
|
|
109
|
+
(_b = child.stderr) === null || _b === void 0 ? void 0 : _b.on('data', (data) => {
|
|
110
|
+
process.stderr.write(`[next] ${data}`);
|
|
111
|
+
});
|
|
112
|
+
let shuttingDown = false;
|
|
113
|
+
const stopChild = (signal = 'SIGTERM') => {
|
|
114
|
+
if (shuttingDown)
|
|
115
|
+
return;
|
|
116
|
+
shuttingDown = true;
|
|
117
|
+
if (!child.killed)
|
|
118
|
+
child.kill(signal);
|
|
119
|
+
};
|
|
120
|
+
child.on('exit', code => {
|
|
121
|
+
if (!shuttingDown) {
|
|
122
|
+
console.error(`[serve] Next.js server exited unexpectedly with code ${code}`);
|
|
123
|
+
}
|
|
124
|
+
process.exit(code !== null && code !== void 0 ? code : 0);
|
|
125
|
+
});
|
|
126
|
+
process.on('SIGINT', () => stopChild('SIGINT'));
|
|
127
|
+
process.on('SIGTERM', () => stopChild('SIGTERM'));
|
|
128
|
+
try {
|
|
129
|
+
await waitForReady(port);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
console.error(`[serve] Child server failed to become ready: ${err.message}`);
|
|
133
|
+
stopChild('SIGTERM');
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
console.log(`[serve] Ready at http://localhost:${port}`);
|
|
137
|
+
console.log(`[serve] assets -> .open-next/assets/ (served by wrapper)`);
|
|
138
|
+
console.log(`[serve] health -> /__health`);
|
|
139
|
+
}
|
|
140
|
+
exports.runServe = runServe;
|
|
141
|
+
function createServeCommand() {
|
|
142
|
+
return new commander_1.Command('serve')
|
|
143
|
+
.description('Start a local dev server for a built Next.js project')
|
|
144
|
+
.option('--dir <path>', 'Next.js project directory', '.')
|
|
145
|
+
.option('-p, --port <number>', 'Port number', '3000')
|
|
146
|
+
.option('--gateway <url>', 'Gateway URL (auto-injects auth env vars)')
|
|
147
|
+
.option('--app-id <id>', 'App ID for gateway auth (default: local_user/local_app)')
|
|
148
|
+
.option('--secret <secret>', 'HMAC secret for ESA_CACHE_GW_AUTH_KEY (default: local-dev-secret)')
|
|
149
|
+
.option('--token <token>', '[deprecated] alias for --secret, will be removed')
|
|
150
|
+
.action(async (options) => {
|
|
151
|
+
await runServe({
|
|
152
|
+
dir: options.dir,
|
|
153
|
+
port: parseInt(options.port, 10),
|
|
154
|
+
gateway: options.gateway,
|
|
155
|
+
appId: options.appId,
|
|
156
|
+
secret: options.secret,
|
|
157
|
+
token: options.token,
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
exports.createServeCommand = createServeCommand;
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc2VydmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsaURBQW9EO0FBQ3BELHlDQUFvQztBQWNwQzs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxZQUFZLENBQ3pCLElBQVksRUFDWixTQUFTLEdBQUcsS0FBTTtJQUVsQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQ3hDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsTUFBTSxLQUFLLEdBQUcsR0FBUyxFQUFFO1lBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQ3RCO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixJQUFJO2dCQUNKLElBQUksRUFBRSxXQUFXO2dCQUNqQixNQUFNLEVBQUUsS0FBSztnQkFDYixPQUFPLEVBQUUsSUFBSzthQUNmLEVBQ0QsR0FBRyxDQUFDLEVBQUU7Z0JBQ0osR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNiLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxHQUFHLEVBQUU7b0JBQzFCLE9BQU8sRUFBRSxDQUFDO29CQUNWLE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFO29CQUN6QixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzFELE9BQU87aUJBQ1I7Z0JBQ0QsVUFBVSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6QixDQUFDLENBQ0YsQ0FBQztZQUNGLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdB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UCxDQUFDO0FBNUJELGdEQTRCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgc3Bhd24sIENoaWxkUHJvY2VzcyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVPcHRpb25zIHtcbiAgZGlyOiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbiAgZ2F0ZXdheT86IHN0cmluZztcbiAgLyoqIOacrOWcsOS+v+WIqTpgPGFsaXVpZD4vPHJvdXRpbmVuYW1lPmAs5YaF6YOo5ouG5oiQIEVTQV9DQUNIRV9HV19BTElVSUQgKyBST1VUSU5FTkFNRSAqL1xuICBhcHBJZD86IHN0cmluZztcbiAgLyoqIEhNQUMgc2VjcmV0LOazqOWFpeWIsCBFU0FfQ0FDSEVfR1dfQVVUSF9LRVnjgILkvJjlhYjnuqfpq5jkuo4gdG9rZW7jgIIgKi9cbiAgc2VjcmV0Pzogc3RyaW5nO1xuICAvKiogQGRlcHJlY2F0ZWQg5penIEpXVCzlt7LkuI3lho3kvb/nlKgs5LuF5L+d55WZ5ZCR5ZCO5YW85a65ICovXG4gIHRva2VuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBvbGwgdGhlIGNoaWxkIHNlcnZlcidzIC9fX2hlYWx0aCBlbmRwb2ludCB1bnRpbCBpdCByZXNwb25kcyAyMDAgb3Igd2UgdGltZSBvdXQuXG4gKiBub2RlLXNlcnZlciB3cmFwcGVyIGV4cG9zZXMgL19faGVhbHRoIHVuY29uZGl0aW9uYWxseSwgc28gdGhpcyBpcyBub3cgbG9hZC1iZWFyaW5nXG4gKiAodGhlIG9sZCBpbXBsIGFsd2F5cyBmZWxsIHRocm91Z2ggdG8gYSBzZXRUaW1lb3V0IGJlY2F1c2UgcGxhdGZvcm0tZnVuY3Rpb24gaGFkXG4gKiBubyAvX19oZWFsdGgpLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yUmVhZHkoXG4gIHBvcnQ6IG51bWJlcixcbiAgdGltZW91dE1zID0gMzBfMDAwXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGltZW91dE1zO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHByb2JlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgcmVxID0gaHR0cC5yZXF1ZXN0KFxuICAgICAgICB7XG4gICAgICAgICAgaG9zdG5hbWU6ICcxMjcuMC4wLjEnLFxuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgcGF0aDogJy9fX2hlYWx0aCcsXG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICB0aW1lb3V0OiAxXzAwMCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgL19faGVhbHRoIHJldHVybmVkICR7cmVzLnN0YXR1c0NvZGV9YCkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRUaW1lb3V0KHByb2JlLCAyMDApO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmVxLm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1RpbWVkIG91dCB3YWl0aW5nIGZvciBjaGlsZCBzZXJ2ZXInKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQocHJvYmUsIDIwMCk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5lbmQoKTtcbiAgICB9O1xuICAgIHByb2JlKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU2VydmUob3B0czogU2VydmVPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLnJlc29sdmUob3B0cy5kaXIpO1xuICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJy5vcGVuLW5leHQnLCAnYXNzZXRzJyk7XG4gIGNvbnN0IHNlcnZlckRpciA9IHBhdGguam9pbihcbiAgICBwcm9qZWN0RGlyLFxuICAgICcub3Blbi1uZXh0JyxcbiAgICAnc2VydmVyLWZ1bmN0aW9ucycsXG4gICAgJ2RlZmF1bHQnXG4gICk7XG4gIGNvbnN0IHNlcnZlckVudHJ5ID0gcGF0aC5qb2luKHNlcnZlckRpciwgJ2luZGV4Lm1qcycpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhzZXJ2ZXJFbnRyeSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgLm9wZW4tbmV4dC9zZXJ2ZXItZnVuY3Rpb25zL2RlZmF1bHQvaW5kZXgubWpzIG5vdCBmb3VuZC4gUnVuIFwicGNnIGJ1aWxkXCIgZmlyc3QuYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwb3J0ID0gb3B0cy5wb3J0O1xuXG4gIGNvbnN0IGNoaWxkRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIC4uLihwcm9jZXNzLmVudiBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSxcbiAgICBQT1JUOiBTdHJpbmcocG9ydCksXG4gIH07XG5cbiAgaWYgKG9wdHMuZ2F0ZXdheSkge1xuICAgIGxldCByYXdHYXRld2F5ID0gb3B0cy5nYXRld2F5LnJlcGxhY2UoL1xcLyskLywgJycpO1xuICAgIGlmICghL15odHRwcz86XFwvXFwvL2kudGVzdChyYXdHYXRld2F5KSkge1xuICAgICAgcmF3R2F0ZXdheSA9IGBodHRwOi8vJHtyYXdHYXRld2F5fWA7XG4gICAgfVxuICAgIGNvbnN0IGdhdGV3YXlVcmwgPSByYXdHYXRld2F5O1xuICAgIGNvbnN0IGFwcElkID0gb3B0cy5hcHBJZCB8fCAnbG9jYWxfdXNlci9sb2NhbF9hcHAnO1xuICAgIGNvbnN0IHNlY3JldCA9IG9wdHMuc2VjcmV0IHx8IG9wdHMudG9rZW4gfHwgJ2xvY2FsLWRldi1zZWNyZXQnO1xuICAgIGlmICghb3B0cy5zZWNyZXQgJiYgb3B0cy50b2tlbikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW3NlcnZlXSAtLXRva2VuIGlzIGRlcHJlY2F0ZWQsIHVzZSAtLXNlY3JldCB0byBwcm92aWRlIEhNQUMgYXV0aCBrZXknXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNsYXNoSWR4ID0gYXBwSWQuaW5kZXhPZignLycpO1xuICAgIGlmIChzbGFzaElkeCA8PSAwIHx8IHNsYXNoSWR4ID09PSBhcHBJZC5sZW5ndGggLSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbc2VydmVdIC0tYXBwLWlkIOagvOW8j+mUmeivrzogXCIke2FwcElkfVwiLOacn+acmyBcIjxhbGl1aWQ+Lzxyb3V0aW5lbmFtZT5cImBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGFsaXVpZCA9IGFwcElkLnNsaWNlKDAsIHNsYXNoSWR4KTtcbiAgICBjb25zdCByb3V0aW5lbmFtZSA9IGFwcElkLnNsaWNlKHNsYXNoSWR4ICsgMSk7XG5cbiAgICBsZXQgYnVpbGRJZCA9ICcnO1xuICAgIGNvbnN0IGJ1aWxkSWRQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgJ0JVSUxEX0lEJyk7XG4gICAgdHJ5IHtcbiAgICAgIGJ1aWxkSWQgPSBmcy5yZWFkRmlsZVN5bmMoYnVpbGRJZFBhdGgsICd1dGYtOCcpLnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1tzZXJ2ZV0gV2FybmluZzogQlVJTERfSUQgbm90IGZvdW5kLCB0YWcvY2FjaGUga2V5IG1heSBiZSBpbmNvcnJlY3QnXG4gICAgICApO1xuICAgIH1cblxuICAgIGNoaWxkRW52LkVTQV9DQUNIRV9HV19HQVRFV0FZX0VORFBPSU5UID0gZ2F0ZXdheVVybDtcbiAgICBjaGlsZEVudi5FU0FfQ0FDSEVfR1dfQVVUSF9LRVkgPSBzZWNyZXQ7XG4gICAgY2hpbGRFbnYuRVNBX0NBQ0hFX0dXX0FMSVVJRCA9IGFsaXVpZDtcbiAgICBjaGlsZEVudi5FU0FfQ0FDSEVfR1dfUk9VVElORU5BTUUgPSByb3V0aW5lbmFtZTtcbiAgICBpZiAoYnVpbGRJZCkgY2hpbGRFbnYuRVNBX0NBQ0hFX0dXX1ZFUlNJT04gPSBidWlsZElkO1xuXG4gICAgY29uc29sZS5sb2coJ1tzZXJ2ZV0gR2F0ZXdheSBtb2RlIGVuYWJsZWQ6Jyk7XG4gICAgY29uc29sZS5sb2coYCAgRVNBX0NBQ0hFX0dXX0dBVEVXQVlfRU5EUE9JTlQgPSAke2dhdGV3YXlVcmx9YCk7XG4gICAgY29uc29sZS5sb2coYCAgRVNBX0NBQ0hFX0dXX0FMSVVJRCAgICAgICAgICAgPSAke2FsaXVpZH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBFU0FfQ0FDSEVfR1dfUk9VVElORU5BTUUgICAgICA9ICR7cm91dGluZW5hbWV9YCk7XG4gICAgY29uc29sZS5sb2coYCAgRVNBX0NBQ0hFX0dXX1ZFUlNJT04gICAgICAgICAgPSAke2J1aWxkSWQgfHwgJyhub3QgZm91bmQpJ31gKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICcgIEltYWdlIHByb3h5ICAgICAgICAgICAgICAgICA9IC9fcGNnL2ltYWdlLyogKGludGVyY2VwdGVkIGJ5IG5vZGUtc2VydmVyIHdyYXBwZXIpJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBjaGlsZDogQ2hpbGRQcm9jZXNzID0gc3Bhd24oJ25vZGUnLCBbJ2luZGV4Lm1qcyddLCB7XG4gICAgY3dkOiBzZXJ2ZXJEaXIsXG4gICAgZW52OiBjaGlsZEVudixcbiAgICBzdGRpbzogWydwaXBlJywgJ3BpcGUnLCAncGlwZSddLFxuICB9KTtcblxuICBjaGlsZC5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGBbbmV4dF0gJHtkYXRhfWApO1xuICB9KTtcbiAgY2hpbGQuc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgW25leHRdICR7ZGF0YX1gKTtcbiAgfSk7XG5cbiAgbGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuICBjb25zdCBzdG9wQ2hpbGQgPSAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyA9ICdTSUdURVJNJyk6IHZvaWQgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIGlmICghY2hpbGQua2lsbGVkKSBjaGlsZC5raWxsKHNpZ25hbCk7XG4gIH07XG5cbiAgY2hpbGQub24oJ2V4aXQnLCBjb2RlID0+IHtcbiAgICBpZiAoIXNodXR0aW5nRG93bikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3NlcnZlXSBOZXh0LmpzIHNlcnZlciBleGl0ZWQgdW5leHBlY3RlZGx5IHdpdGggY29kZSAke2NvZGV9YCk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChjb2RlID8/IDApO1xuICB9KTtcblxuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiBzdG9wQ2hpbGQoJ1NJR0lOVCcpKTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsICgpID0+IHN0b3BDaGlsZCgnU0lHVEVSTScpKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JSZWFkeShwb3J0KTtcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBbc2VydmVdIENoaWxkIHNlcnZlciBmYWlsZWQgdG8gYmVjb21lIHJlYWR5OiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHN0b3BDaGlsZCgnU0lHVEVSTScpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBbc2VydmVdIFJlYWR5IGF0IGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWApO1xuICBjb25zb2xlLmxvZyhgW3NlcnZlXSAgIGFzc2V0cyAgLT4gLm9wZW4tbmV4dC9hc3NldHMvIChzZXJ2ZWQgYnkgd3JhcHBlcilgKTtcbiAgY29uc29sZS5sb2coYFtzZXJ2ZV0gICBoZWFsdGggIC0+IC9fX2hlYWx0aGApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmVDb21tYW5kKCk6IENvbW1hbmQge1xuICByZXR1cm4gbmV3IENvbW1hbmQoJ3NlcnZlJylcbiAgICAuZGVzY3JpcHRpb24oJ1N0YXJ0IGEgbG9jYWwgZGV2IHNlcnZlciBmb3IgYSBidWlsdCBOZXh0LmpzIHByb2plY3QnKVxuICAgIC5vcHRpb24oJy0tZGlyIDxwYXRoPicsICdOZXh0LmpzIHByb2plY3QgZGlyZWN0b3J5JywgJy4nKVxuICAgIC5vcHRpb24oJy1wLCAtLXBvcnQgPG51bWJlcj4nLCAnUG9ydCBudW1iZXInLCAnMzAwMCcpXG4gICAgLm9wdGlvbignLS1nYXRld2F5IDx1cmw+JywgJ0dhdGV3YXkgVVJMIChhdXRvLWluamVjdHMgYXV0aCBlbnYgdmFycyknKVxuICAgIC5vcHRpb24oXG4gICAgICAnLS1hcHAtaWQgPGlkPicsXG4gICAgICAnQXBwIElEIGZvciBnYXRld2F5IGF1dGggKGRlZmF1bHQ6IGxvY2FsX3VzZXIvbG9jYWxfYXBwKSdcbiAgICApXG4gICAgLm9wdGlvbihcbiAgICAgICctLXNlY3JldCA8c2VjcmV0PicsXG4gICAgICAnSE1BQyBzZWNyZXQgZm9yIEVTQV9DQUNIRV9HV19BVVRIX0tFWSAoZGVmYXVsdDogbG9jYWwtZGV2LXNlY3JldCknXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICAnLS10b2tlbiA8dG9rZW4+JyxcbiAgICAgICdbZGVwcmVjYXRlZF0gYWxpYXMgZm9yIC0tc2VjcmV0LCB3aWxsIGJlIHJlbW92ZWQnXG4gICAgKVxuICAgIC5hY3Rpb24oYXN5bmMgb3B0aW9ucyA9PiB7XG4gICAgICBhd2FpdCBydW5TZXJ2ZSh7XG4gICAgICAgIGRpcjogb3B0aW9ucy5kaXIsXG4gICAgICAgIHBvcnQ6IHBhcnNlSW50KG9wdGlvbnMucG9ydCwgMTApLFxuICAgICAgICBnYXRld2F5OiBvcHRpb25zLmdhdGV3YXksXG4gICAgICAgIGFwcElkOiBvcHRpb25zLmFwcElkLFxuICAgICAgICBzZWNyZXQ6IG9wdGlvbnMuc2VjcmV0LFxuICAgICAgICB0b2tlbjogb3B0aW9ucy50b2tlbixcbiAgICAgIH0pO1xuICAgIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { IUploadAdapter } from '../adapters/adapter.interface';
|
|
3
|
+
export interface UploadAssetsOptions {
|
|
4
|
+
dir: string;
|
|
5
|
+
appId: string;
|
|
6
|
+
adapter: IUploadAdapter;
|
|
7
|
+
}
|
|
8
|
+
export declare function runUploadAssets(opts: UploadAssetsOptions): Promise<{
|
|
9
|
+
total: number;
|
|
10
|
+
failed: number;
|
|
11
|
+
}>;
|
|
12
|
+
export declare function createUploadAssetsCommand(): Command;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createUploadAssetsCommand = exports.runUploadAssets = void 0;
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const commander_1 = require("commander");
|
|
6
|
+
const protocol_1 = require("../_protocol");
|
|
7
|
+
const fs_1 = require("../util/fs");
|
|
8
|
+
async function runUploadAssets(opts) {
|
|
9
|
+
const assetsDir = path.join(opts.dir, '.open-next', 'assets');
|
|
10
|
+
if (!(await (0, fs_1.dirExists)(assetsDir))) {
|
|
11
|
+
console.warn(`[upload-assets] assets directory not found: ${assetsDir}, skipping.`);
|
|
12
|
+
return { total: 0, failed: 0 };
|
|
13
|
+
}
|
|
14
|
+
const files = await (0, fs_1.walkDir)(assetsDir);
|
|
15
|
+
let uploaded = 0;
|
|
16
|
+
let failed = 0;
|
|
17
|
+
for (const filePath of files) {
|
|
18
|
+
const relativePath = path.relative(assetsDir, filePath);
|
|
19
|
+
const ossKey = (0, protocol_1.buildStaticAssetKey)({
|
|
20
|
+
appId: opts.appId,
|
|
21
|
+
path: relativePath,
|
|
22
|
+
});
|
|
23
|
+
try {
|
|
24
|
+
await opts.adapter.uploadFile(ossKey, filePath);
|
|
25
|
+
uploaded++;
|
|
26
|
+
if (uploaded % 100 === 0) {
|
|
27
|
+
console.log(`[upload-assets] progress: ${uploaded}/${files.length}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
console.error(`[upload-assets] failed to upload ${relativePath}:`, err);
|
|
32
|
+
failed++;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
console.log(`[upload-assets] done: ${uploaded} uploaded, ${failed} failed, total ${files.length}`);
|
|
36
|
+
return { total: files.length, failed };
|
|
37
|
+
}
|
|
38
|
+
exports.runUploadAssets = runUploadAssets;
|
|
39
|
+
function createUploadAssetsCommand() {
|
|
40
|
+
return new commander_1.Command('upload-assets')
|
|
41
|
+
.description('Upload static assets from .open-next/assets/ to OSS or local directory')
|
|
42
|
+
.option('-d, --dir <path>', 'Build output directory', '.')
|
|
43
|
+
.option('--cache-mode <mode>', 'Cache mode: local | central');
|
|
44
|
+
}
|
|
45
|
+
exports.createUploadAssetsCommand = createUploadAssetsCommand;
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWFzc2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy91cGxvYWQtYXNzZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUE2QjtBQUM3Qix5Q0FBb0M7QUFDcEMsNENBQW9EO0FBRXBELG1DQUFnRDtBQVF6QyxLQUFLLFVBQVUsZUFBZSxDQUFDLElBQXlCO0lBQzdELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFOUQsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFBLGNBQVMsRUFBQyxTQUFTLENBQUMsQ0FBQyxFQUFFO1FBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0NBQStDLFNBQVMsYUFBYSxDQUFDLENBQUM7UUFDcEYsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO0tBQ2hDO0lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFBLFlBQU8sRUFBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWYsS0FBSyxNQUFNLFFBQVEsSUFBSSxLQUFLLEVBQUU7UUFDNUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEQsTUFBTSxNQUFNLEdBQUcsSUFBQSw4QkFBbUIsRUFBQztZQUNqQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsSUFBSSxFQUFFLFlBQVk7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsSUFBSTtZQUNGLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2hELFFBQVEsRUFBRSxDQUFDO1lBQ1gsSUFBSSxRQUFRLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRTtnQkFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ3RFO1NBQ0Y7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLFlBQVksR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sRUFBRSxDQUFDO1NBQ1Y7S0FDRjtJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLFFBQVEsY0FBYyxNQUFNLGtCQUFrQixLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNuRyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDekMsQ0FBQztBQWpDRCwwQ0FpQ0M7QUFFRCxTQUFnQix5QkFBeUI7SUFDdkMsT0FBTyxJQUFJLG1CQUFPLENBQUMsZUFBZSxDQUFDO1NBQ2hDLFdBQVcsQ0FBQyx3RUFBd0UsQ0FBQztTQUNyRixNQUFNLENBQUMsa0JBQWtCLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyxDQUFDO1NBQ3pELE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFMRCw4REFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGJ1aWxkU3RhdGljQXNzZXRLZXkgfSBmcm9tICdAcGNnL3Byb3RvY29sJztcbmltcG9ydCB7IElVcGxvYWRBZGFwdGVyIH0gZnJvbSAnLi4vYWRhcHRlcnMvYWRhcHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgd2Fsa0RpciwgZGlyRXhpc3RzIH0gZnJvbSAnLi4vdXRpbC9mcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkQXNzZXRzT3B0aW9ucyB7XG4gIGRpcjogc3RyaW5nO1xuICBhcHBJZDogc3RyaW5nO1xuICBhZGFwdGVyOiBJVXBsb2FkQWRhcHRlcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blVwbG9hZEFzc2V0cyhvcHRzOiBVcGxvYWRBc3NldHNPcHRpb25zKTogUHJvbWlzZTx7IHRvdGFsOiBudW1iZXI7IGZhaWxlZDogbnVtYmVyIH0+IHtcbiAgY29uc3QgYXNzZXRzRGlyID0gcGF0aC5qb2luKG9wdHMuZGlyLCAnLm9wZW4tbmV4dCcsICdhc3NldHMnKTtcblxuICBpZiAoIShhd2FpdCBkaXJFeGlzdHMoYXNzZXRzRGlyKSkpIHtcbiAgICBjb25zb2xlLndhcm4oYFt1cGxvYWQtYXNzZXRzXSBhc3NldHMgZGlyZWN0b3J5IG5vdCBmb3VuZDogJHthc3NldHNEaXJ9LCBza2lwcGluZy5gKTtcbiAgICByZXR1cm4geyB0b3RhbDogMCwgZmFpbGVkOiAwIH07XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGF3YWl0IHdhbGtEaXIoYXNzZXRzRGlyKTtcbiAgbGV0IHVwbG9hZGVkID0gMDtcbiAgbGV0IGZhaWxlZCA9IDA7XG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlcykge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoYXNzZXRzRGlyLCBmaWxlUGF0aCk7XG4gICAgY29uc3Qgb3NzS2V5ID0gYnVpbGRTdGF0aWNBc3NldEtleSh7XG4gICAgICBhcHBJZDogb3B0cy5hcHBJZCxcbiAgICAgIHBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBvcHRzLmFkYXB0ZXIudXBsb2FkRmlsZShvc3NLZXksIGZpbGVQYXRoKTtcbiAgICAgIHVwbG9hZGVkKys7XG4gICAgICBpZiAodXBsb2FkZWQgJSAxMDAgPT09IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coYFt1cGxvYWQtYXNzZXRzXSBwcm9ncmVzczogJHt1cGxvYWRlZH0vJHtmaWxlcy5sZW5ndGh9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbdXBsb2FkLWFzc2V0c10gZmFpbGVkIHRvIHVwbG9hZCAke3JlbGF0aXZlUGF0aH06YCwgZXJyKTtcbiAgICAgIGZhaWxlZCsrO1xuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBbdXBsb2FkLWFzc2V0c10gZG9uZTogJHt1cGxvYWRlZH0gdXBsb2FkZWQsICR7ZmFpbGVkfSBmYWlsZWQsIHRvdGFsICR7ZmlsZXMubGVuZ3RofWApO1xuICByZXR1cm4geyB0b3RhbDogZmlsZXMubGVuZ3RoLCBmYWlsZWQgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVwbG9hZEFzc2V0c0NvbW1hbmQoKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgndXBsb2FkLWFzc2V0cycpXG4gICAgLmRlc2NyaXB0aW9uKCdVcGxvYWQgc3RhdGljIGFzc2V0cyBmcm9tIC5vcGVuLW5leHQvYXNzZXRzLyB0byBPU1Mgb3IgbG9jYWwgZGlyZWN0b3J5JylcbiAgICAub3B0aW9uKCctZCwgLS1kaXIgPHBhdGg+JywgJ0J1aWxkIG91dHB1dCBkaXJlY3RvcnknLCAnLicpXG4gICAgLm9wdGlvbignLS1jYWNoZS1tb2RlIDxtb2RlPicsICdDYWNoZSBtb2RlOiBsb2NhbCB8IGNlbnRyYWwnKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { IUploadAdapter } from '../adapters/adapter.interface';
|
|
3
|
+
export interface UploadCacheOptions {
|
|
4
|
+
dir: string;
|
|
5
|
+
appId: string;
|
|
6
|
+
buildId: string;
|
|
7
|
+
adapter: IUploadAdapter;
|
|
8
|
+
}
|
|
9
|
+
export declare function runUploadCache(opts: UploadCacheOptions): Promise<{
|
|
10
|
+
total: number;
|
|
11
|
+
failed: number;
|
|
12
|
+
}>;
|
|
13
|
+
export declare function createUploadCacheCommand(): Command;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createUploadCacheCommand = exports.runUploadCache = void 0;
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const fs = require("fs/promises");
|
|
6
|
+
const commander_1 = require("commander");
|
|
7
|
+
const protocol_1 = require("../_protocol");
|
|
8
|
+
const fs_1 = require("../util/fs");
|
|
9
|
+
function determineCacheType(relativePath) {
|
|
10
|
+
if (relativePath.startsWith('__fetch') || relativePath.includes('/__fetch/')) {
|
|
11
|
+
return 'fetch';
|
|
12
|
+
}
|
|
13
|
+
return 'cache';
|
|
14
|
+
}
|
|
15
|
+
async function runUploadCache(opts) {
|
|
16
|
+
const cacheDir = path.join(opts.dir, '.open-next', 'cache');
|
|
17
|
+
if (!(await (0, fs_1.dirExists)(cacheDir))) {
|
|
18
|
+
console.warn(`[upload-cache] cache directory not found: ${cacheDir}, skipping.`);
|
|
19
|
+
return { total: 0, failed: 0 };
|
|
20
|
+
}
|
|
21
|
+
const files = await (0, fs_1.walkDir)(cacheDir);
|
|
22
|
+
let uploaded = 0;
|
|
23
|
+
let failed = 0;
|
|
24
|
+
for (const filePath of files) {
|
|
25
|
+
const relativePath = path.relative(cacheDir, filePath);
|
|
26
|
+
const cacheType = determineCacheType(relativePath);
|
|
27
|
+
const keyPath = cacheType === 'fetch'
|
|
28
|
+
? relativePath.replace(/^__fetch\//, '')
|
|
29
|
+
: relativePath.replace(/\.cache$/, '');
|
|
30
|
+
const ossKey = (0, protocol_1.buildOssKey)({
|
|
31
|
+
appId: opts.appId,
|
|
32
|
+
buildId: opts.buildId,
|
|
33
|
+
key: keyPath,
|
|
34
|
+
cacheType,
|
|
35
|
+
});
|
|
36
|
+
try {
|
|
37
|
+
const raw = await fs.readFile(filePath, 'utf-8');
|
|
38
|
+
let value;
|
|
39
|
+
try {
|
|
40
|
+
value = JSON.parse(raw);
|
|
41
|
+
}
|
|
42
|
+
catch (_a) {
|
|
43
|
+
console.error(`[upload-cache] skip non-JSON file: ${relativePath}`);
|
|
44
|
+
failed++;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const envelope = JSON.stringify({ lastModified: Date.now(), value });
|
|
48
|
+
await opts.adapter.upload(ossKey, Buffer.from(envelope, 'utf-8'));
|
|
49
|
+
uploaded++;
|
|
50
|
+
if (uploaded % 100 === 0) {
|
|
51
|
+
console.log(`[upload-cache] progress: ${uploaded}/${files.length}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
console.error(`[upload-cache] failed to upload ${relativePath}:`, err);
|
|
56
|
+
failed++;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
console.log(`[upload-cache] done: ${uploaded} uploaded, ${failed} failed, total ${files.length}`);
|
|
60
|
+
return { total: files.length, failed };
|
|
61
|
+
}
|
|
62
|
+
exports.runUploadCache = runUploadCache;
|
|
63
|
+
function createUploadCacheCommand() {
|
|
64
|
+
return new commander_1.Command('upload-cache')
|
|
65
|
+
.description('Upload pre-rendered cache from .open-next/cache/ to OSS or local directory')
|
|
66
|
+
.option('-d, --dir <path>', 'Build output directory', '.')
|
|
67
|
+
.option('--cache-mode <mode>', 'Cache mode: local | central');
|
|
68
|
+
}
|
|
69
|
+
exports.createUploadCacheCommand = createUploadCacheCommand;
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3VwbG9hZC1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFDN0Isa0NBQWtDO0FBQ2xDLHlDQUFvQztBQUNwQyw0Q0FBNEM7QUFFNUMsbUNBQWdEO0FBU2hELFNBQVMsa0JBQWtCLENBQUMsWUFBb0I7SUFDOUMsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDNUUsT0FBTyxPQUFPLENBQUM7S0FDaEI7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRU0sS0FBSyxVQUFVLGNBQWMsQ0FBQyxJQUF3QjtJQUMzRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTVELElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBQSxjQUFTLEVBQUMsUUFBUSxDQUFDLENBQUMsRUFBRTtRQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxRQUFRLGFBQWEsQ0FBQyxDQUFDO1FBQ2pGLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztLQUNoQztJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBQSxZQUFPLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVmLEtBQUssTUFBTSxRQUFRLElBQUksS0FBSyxFQUFFO1FBQzVCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRW5ELE1BQU0sT0FBTyxHQUFHLFNBQVMsS0FBSyxPQUFPO1lBQ25DLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7WUFDeEMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sTUFBTSxHQUFHLElBQUEsc0JBQVcsRUFBQztZQUN6QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLEdBQUcsRUFBRSxPQUFPO1lBQ1osU0FBUztTQUNWLENBQUMsQ0FBQztRQUVILElBQUk7WUFDRixNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELElBQUksS0FBYyxDQUFDO1lBQ25CLElBQUk7Z0JBQ0YsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDekI7WUFBQyxXQUFNO2dCQUNOLE9BQU8sQ0FBQyxLQUFLLENBQ1gsc0NBQXNDLFlBQVksRUFBRSxDQUNyRCxDQUFDO2dCQUNGLE1BQU0sRUFBRSxDQUFDO2dCQUNULFNBQVM7YUFDVjtZQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDckUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNsRSxRQUFRLEVBQUUsQ0FBQztZQUNYLElBQUksUUFBUSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQzthQUNyRTtTQUNGO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxZQUFZLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN2RSxNQUFNLEVBQUUsQ0FBQztTQUNWO0tBQ0Y7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixRQUFRLGNBQWMsTUFBTSxrQkFBa0IsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbEcsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3pDLENBQUM7QUFyREQsd0NBcURDO0FBRUQsU0FBZ0Isd0JBQXdCO0lBQ3RDLE9BQU8sSUFBSSxtQkFBTyxDQUFDLGNBQWMsQ0FBQztTQUMvQixXQUFXLENBQUMsNEVBQTRFLENBQUM7U0FDekYsTUFBTSxDQUFDLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLEdBQUcsQ0FBQztTQUN6RCxNQUFNLENBQUMscUJBQXFCLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBTEQsNERBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBidWlsZE9zc0tleSB9IGZyb20gJ0BwY2cvcHJvdG9jb2wnO1xuaW1wb3J0IHsgSVVwbG9hZEFkYXB0ZXIgfSBmcm9tICcuLi9hZGFwdGVycy9hZGFwdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyB3YWxrRGlyLCBkaXJFeGlzdHMgfSBmcm9tICcuLi91dGlsL2ZzJztcblxuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRDYWNoZU9wdGlvbnMge1xuICBkaXI6IHN0cmluZztcbiAgYXBwSWQ6IHN0cmluZztcbiAgYnVpbGRJZDogc3RyaW5nO1xuICBhZGFwdGVyOiBJVXBsb2FkQWRhcHRlcjtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lQ2FjaGVUeXBlKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCdfX2ZldGNoJykgfHwgcmVsYXRpdmVQYXRoLmluY2x1ZGVzKCcvX19mZXRjaC8nKSkge1xuICAgIHJldHVybiAnZmV0Y2gnO1xuICB9XG4gIHJldHVybiAnY2FjaGUnO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVXBsb2FkQ2FjaGUob3B0czogVXBsb2FkQ2FjaGVPcHRpb25zKTogUHJvbWlzZTx7IHRvdGFsOiBudW1iZXI7IGZhaWxlZDogbnVtYmVyIH0+IHtcbiAgY29uc3QgY2FjaGVEaXIgPSBwYXRoLmpvaW4ob3B0cy5kaXIsICcub3Blbi1uZXh0JywgJ2NhY2hlJyk7XG5cbiAgaWYgKCEoYXdhaXQgZGlyRXhpc3RzKGNhY2hlRGlyKSkpIHtcbiAgICBjb25zb2xlLndhcm4oYFt1cGxvYWQtY2FjaGVdIGNhY2hlIGRpcmVjdG9yeSBub3QgZm91bmQ6ICR7Y2FjaGVEaXJ9LCBza2lwcGluZy5gKTtcbiAgICByZXR1cm4geyB0b3RhbDogMCwgZmFpbGVkOiAwIH07XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGF3YWl0IHdhbGtEaXIoY2FjaGVEaXIpO1xuICBsZXQgdXBsb2FkZWQgPSAwO1xuICBsZXQgZmFpbGVkID0gMDtcblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShjYWNoZURpciwgZmlsZVBhdGgpO1xuICAgIGNvbnN0IGNhY2hlVHlwZSA9IGRldGVybWluZUNhY2hlVHlwZShyZWxhdGl2ZVBhdGgpO1xuXG4gICAgY29uc3Qga2V5UGF0aCA9IGNhY2hlVHlwZSA9PT0gJ2ZldGNoJ1xuICAgICAgPyByZWxhdGl2ZVBhdGgucmVwbGFjZSgvXl9fZmV0Y2hcXC8vLCAnJylcbiAgICAgIDogcmVsYXRpdmVQYXRoLnJlcGxhY2UoL1xcLmNhY2hlJC8sICcnKTtcblxuICAgIGNvbnN0IG9zc0tleSA9IGJ1aWxkT3NzS2V5KHtcbiAgICAgIGFwcElkOiBvcHRzLmFwcElkLFxuICAgICAgYnVpbGRJZDogb3B0cy5idWlsZElkLFxuICAgICAga2V5OiBrZXlQYXRoLFxuICAgICAgY2FjaGVUeXBlLFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgIGxldCB2YWx1ZTogdW5rbm93bjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlID0gSlNPTi5wYXJzZShyYXcpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFt1cGxvYWQtY2FjaGVdIHNraXAgbm9uLUpTT04gZmlsZTogJHtyZWxhdGl2ZVBhdGh9YFxuICAgICAgICApO1xuICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IEpTT04uc3RyaW5naWZ5KHsgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpLCB2YWx1ZSB9KTtcbiAgICAgIGF3YWl0IG9wdHMuYWRhcHRlci51cGxvYWQob3NzS2V5LCBCdWZmZXIuZnJvbShlbnZlbG9wZSwgJ3V0Zi04JykpO1xuICAgICAgdXBsb2FkZWQrKztcbiAgICAgIGlmICh1cGxvYWRlZCAlIDEwMCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgW3VwbG9hZC1jYWNoZV0gcHJvZ3Jlc3M6ICR7dXBsb2FkZWR9LyR7ZmlsZXMubGVuZ3RofWApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3VwbG9hZC1jYWNoZV0gZmFpbGVkIHRvIHVwbG9hZCAke3JlbGF0aXZlUGF0aH06YCwgZXJyKTtcbiAgICAgIGZhaWxlZCsrO1xuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBbdXBsb2FkLWNhY2hlXSBkb25lOiAke3VwbG9hZGVkfSB1cGxvYWRlZCwgJHtmYWlsZWR9IGZhaWxlZCwgdG90YWwgJHtmaWxlcy5sZW5ndGh9YCk7XG4gIHJldHVybiB7IHRvdGFsOiBmaWxlcy5sZW5ndGgsIGZhaWxlZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVXBsb2FkQ2FjaGVDb21tYW5kKCk6IENvbW1hbmQge1xuICByZXR1cm4gbmV3IENvbW1hbmQoJ3VwbG9hZC1jYWNoZScpXG4gICAgLmRlc2NyaXB0aW9uKCdVcGxvYWQgcHJlLXJlbmRlcmVkIGNhY2hlIGZyb20gLm9wZW4tbmV4dC9jYWNoZS8gdG8gT1NTIG9yIGxvY2FsIGRpcmVjdG9yeScpXG4gICAgLm9wdGlvbignLWQsIC0tZGlyIDxwYXRoPicsICdCdWlsZCBvdXRwdXQgZGlyZWN0b3J5JywgJy4nKVxuICAgIC5vcHRpb24oJy0tY2FjaGUtbW9kZSA8bW9kZT4nLCAnQ2FjaGUgbW9kZTogbG9jYWwgfCBjZW50cmFsJyk7XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function compileCacheAssetsManifest(openNextDir: string): Promise<Record<string, string[]>>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compileCacheAssetsManifest = void 0;
|
|
4
|
+
const fs = require("fs/promises");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const fs_1 = require("../util/fs");
|
|
7
|
+
async function compileCacheAssetsManifest(openNextDir) {
|
|
8
|
+
var _a, _b;
|
|
9
|
+
const manifest = {};
|
|
10
|
+
const assetsDir = path.join(openNextDir, 'assets');
|
|
11
|
+
let buildId = '';
|
|
12
|
+
try {
|
|
13
|
+
buildId = (await fs.readFile(path.join(assetsDir, 'BUILD_ID'), 'utf-8')).trim();
|
|
14
|
+
}
|
|
15
|
+
catch (_c) {
|
|
16
|
+
console.warn('[build] BUILD_ID not found, skipping cache-assets-manifest compilation');
|
|
17
|
+
return manifest;
|
|
18
|
+
}
|
|
19
|
+
const cacheDir = path.join(openNextDir, 'cache', buildId);
|
|
20
|
+
if (await (0, fs_1.dirExists)(cacheDir)) {
|
|
21
|
+
const files = await (0, fs_1.walkDir)(cacheDir);
|
|
22
|
+
for (const filePath of files) {
|
|
23
|
+
if (!filePath.endsWith('.cache'))
|
|
24
|
+
continue;
|
|
25
|
+
try {
|
|
26
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
27
|
+
const parsed = JSON.parse(content);
|
|
28
|
+
const tags = (_b = (_a = parsed === null || parsed === void 0 ? void 0 : parsed.meta) === null || _a === void 0 ? void 0 : _a.headers) === null || _b === void 0 ? void 0 : _b['x-next-cache-tags'];
|
|
29
|
+
if (tags) {
|
|
30
|
+
const relativePath = path.relative(cacheDir, filePath);
|
|
31
|
+
const routePath = cacheFileToRoute(relativePath);
|
|
32
|
+
manifest[routePath] = tags.split(',').map((t) => t.trim());
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (_d) {
|
|
36
|
+
// skip unparseable files
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const fetchDir = path.join(openNextDir, 'cache', '__fetch', buildId);
|
|
41
|
+
if (await (0, fs_1.dirExists)(fetchDir)) {
|
|
42
|
+
const files = await (0, fs_1.walkDir)(fetchDir);
|
|
43
|
+
for (const filePath of files) {
|
|
44
|
+
try {
|
|
45
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
46
|
+
const parsed = JSON.parse(content);
|
|
47
|
+
if ((parsed === null || parsed === void 0 ? void 0 : parsed.tags) && Array.isArray(parsed.tags)) {
|
|
48
|
+
const key = path.basename(filePath);
|
|
49
|
+
manifest[key] = parsed.tags;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (_e) {
|
|
53
|
+
// skip unparseable files
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return manifest;
|
|
58
|
+
}
|
|
59
|
+
exports.compileCacheAssetsManifest = compileCacheAssetsManifest;
|
|
60
|
+
function cacheFileToRoute(relativePath) {
|
|
61
|
+
let route = relativePath.replace(/\.cache$/, '');
|
|
62
|
+
route = route.replace(/\\/g, '/');
|
|
63
|
+
if (route === 'index')
|
|
64
|
+
return '/';
|
|
65
|
+
return '/' + route;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZUNhY2hlQXNzZXRzTWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcGlsZS9jb21waWxlQ2FjaGVBc3NldHNNYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrQ0FBa0M7QUFDbEMsNkJBQTZCO0FBQzdCLG1DQUFnRDtBQUV6QyxLQUFLLFVBQVUsMEJBQTBCLENBQUMsV0FBbUI7O0lBQ2xFLE1BQU0sUUFBUSxHQUE2QixFQUFFLENBQUM7SUFFOUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkQsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLElBQUk7UUFDRixPQUFPLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNqRjtJQUFDLFdBQU07UUFDTixPQUFPLENBQUMsSUFBSSxDQUFDLHdFQUF3RSxDQUFDLENBQUM7UUFDdkYsT0FBTyxRQUFRLENBQUM7S0FDakI7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUQsSUFBSSxNQUFNLElBQUEsY0FBUyxFQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQzdCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBQSxZQUFPLEVBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsS0FBSyxNQUFNLFFBQVEsSUFBSSxLQUFLLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO2dCQUFFLFNBQVM7WUFDM0MsSUFBSTtnQkFDRixNQUFNLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNyRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLElBQUksR0FBRyxNQUFBLE1BQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLElBQUksMENBQUUsT0FBTywwQ0FBRyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLElBQUksRUFBRTtvQkFDUixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDdkQsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ3BFO2FBQ0Y7WUFBQyxXQUFNO2dCQUNOLHlCQUF5QjthQUMxQjtTQUNGO0tBQ0Y7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JFLElBQUksTUFBTSxJQUFBLGNBQVMsRUFBQyxRQUFRLENBQUMsRUFBRTtRQUM3QixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUEsWUFBTyxFQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLEtBQUssTUFBTSxRQUFRLElBQUksS0FBSyxFQUFFO1lBQzVCLElBQUk7Z0JBQ0YsTUFBTSxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDckQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxJQUFJLEtBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzlDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3BDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO2lCQUM3QjthQUNGO1lBQUMsV0FBTTtnQkFDTix5QkFBeUI7YUFDMUI7U0FDRjtLQUNGO0lBRUQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQWxERCxnRUFrREM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFlBQW9CO0lBQzVDLElBQUksS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNsQyxJQUFJLEtBQUssS0FBSyxPQUFPO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDbEMsT0FBTyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgd2Fsa0RpciwgZGlyRXhpc3RzIH0gZnJvbSAnLi4vdXRpbC9mcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21waWxlQ2FjaGVBc3NldHNNYW5pZmVzdChvcGVuTmV4dERpcjogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+IHtcbiAgY29uc3QgbWFuaWZlc3Q6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG4gIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbihvcGVuTmV4dERpciwgJ2Fzc2V0cycpO1xuICBsZXQgYnVpbGRJZCA9ICcnO1xuICB0cnkge1xuICAgIGJ1aWxkSWQgPSAoYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKGFzc2V0c0RpciwgJ0JVSUxEX0lEJyksICd1dGYtOCcpKS50cmltKCk7XG4gIH0gY2F0Y2gge1xuICAgIGNvbnNvbGUud2FybignW2J1aWxkXSBCVUlMRF9JRCBub3QgZm91bmQsIHNraXBwaW5nIGNhY2hlLWFzc2V0cy1tYW5pZmVzdCBjb21waWxhdGlvbicpO1xuICAgIHJldHVybiBtYW5pZmVzdDtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlRGlyID0gcGF0aC5qb2luKG9wZW5OZXh0RGlyLCAnY2FjaGUnLCBidWlsZElkKTtcbiAgaWYgKGF3YWl0IGRpckV4aXN0cyhjYWNoZURpcikpIHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHdhbGtEaXIoY2FjaGVEaXIpO1xuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZXMpIHtcbiAgICAgIGlmICghZmlsZVBhdGguZW5kc1dpdGgoJy5jYWNoZScpKSBjb250aW51ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudCk7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSBwYXJzZWQ/Lm1ldGE/LmhlYWRlcnM/LlsneC1uZXh0LWNhY2hlLXRhZ3MnXTtcbiAgICAgICAgaWYgKHRhZ3MpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNhY2hlRGlyLCBmaWxlUGF0aCk7XG4gICAgICAgICAgY29uc3Qgcm91dGVQYXRoID0gY2FjaGVGaWxlVG9Sb3V0ZShyZWxhdGl2ZVBhdGgpO1xuICAgICAgICAgIG1hbmlmZXN0W3JvdXRlUGF0aF0gPSB0YWdzLnNwbGl0KCcsJykubWFwKCh0OiBzdHJpbmcpID0+IHQudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIHNraXAgdW5wYXJzZWFibGUgZmlsZXNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBmZXRjaERpciA9IHBhdGguam9pbihvcGVuTmV4dERpciwgJ2NhY2hlJywgJ19fZmV0Y2gnLCBidWlsZElkKTtcbiAgaWYgKGF3YWl0IGRpckV4aXN0cyhmZXRjaERpcikpIHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHdhbGtEaXIoZmV0Y2hEaXIpO1xuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudCk7XG4gICAgICAgIGlmIChwYXJzZWQ/LnRhZ3MgJiYgQXJyYXkuaXNBcnJheShwYXJzZWQudGFncykpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKTtcbiAgICAgICAgICBtYW5pZmVzdFtrZXldID0gcGFyc2VkLnRhZ3M7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBza2lwIHVucGFyc2VhYmxlIGZpbGVzXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hbmlmZXN0O1xufVxuXG5mdW5jdGlvbiBjYWNoZUZpbGVUb1JvdXRlKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJvdXRlID0gcmVsYXRpdmVQYXRoLnJlcGxhY2UoL1xcLmNhY2hlJC8sICcnKTtcbiAgcm91dGUgPSByb3V0ZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIGlmIChyb3V0ZSA9PT0gJ2luZGV4JykgcmV0dXJuICcvJztcbiAgcmV0dXJuICcvJyArIHJvdXRlO1xufVxuIl19
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateDefaultConfig = void 0;
|
|
4
|
+
function generateDefaultConfig(options) {
|
|
5
|
+
const d = options.overridesDir.replace(/\\/g, '/').replace(/\/$/, '');
|
|
6
|
+
return `// @ts-nocheck
|
|
7
|
+
// Auto-generated by pcg build — do not edit
|
|
8
|
+
const config = {
|
|
9
|
+
default: {
|
|
10
|
+
override: {
|
|
11
|
+
wrapper: () => import("${d}/adapters/wrappers/node-server.js").then(m => m.default),
|
|
12
|
+
converter: () => import("${d}/adapters/converters/passthrough.js").then(m => m.default),
|
|
13
|
+
incrementalCache: () => import("${d}/overrides/incrementalCache/gateway.js").then(m => new m.default()),
|
|
14
|
+
tagCache: () => import("${d}/overrides/tagCache/gateway.js").then(m => new m.default()),
|
|
15
|
+
queue: "direct",
|
|
16
|
+
proxyExternalRequest: "fetch",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
imageOptimization: {
|
|
20
|
+
install: false,
|
|
21
|
+
},
|
|
22
|
+
buildOutputPath: ".",
|
|
23
|
+
appPath: ".",
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export default config;
|
|
27
|
+
`;
|
|
28
|
+
}
|
|
29
|
+
exports.generateDefaultConfig = generateDefaultConfig;
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1vcGVuLW5leHQtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9kZWZhdWx0LW9wZW4tbmV4dC1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsU0FBZ0IscUJBQXFCLENBQUMsT0FFckM7SUFDQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RSxPQUFPOzs7OzsrQkFLc0IsQ0FBQztpQ0FDQyxDQUFDO3dDQUNNLENBQUM7Z0NBQ1QsQ0FBQzs7Ozs7Ozs7Ozs7OztDQWFoQyxDQUFDO0FBQ0YsQ0FBQztBQTFCRCxzREEwQkMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVEZWZhdWx0Q29uZmlnKG9wdGlvbnM6IHtcbiAgb3ZlcnJpZGVzRGlyOiBzdHJpbmc7XG59KTogc3RyaW5nIHtcbiAgY29uc3QgZCA9IG9wdGlvbnMub3ZlcnJpZGVzRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKS5yZXBsYWNlKC9cXC8kLywgJycpO1xuICByZXR1cm4gYC8vIEB0cy1ub2NoZWNrXG4vLyBBdXRvLWdlbmVyYXRlZCBieSBwY2cgYnVpbGQg4oCUIGRvIG5vdCBlZGl0XG5jb25zdCBjb25maWcgPSB7XG4gIGRlZmF1bHQ6IHtcbiAgICBvdmVycmlkZToge1xuICAgICAgd3JhcHBlcjogKCkgPT4gaW1wb3J0KFwiJHtkfS9hZGFwdGVycy93cmFwcGVycy9ub2RlLXNlcnZlci5qc1wiKS50aGVuKG0gPT4gbS5kZWZhdWx0KSxcbiAgICAgIGNvbnZlcnRlcjogKCkgPT4gaW1wb3J0KFwiJHtkfS9hZGFwdGVycy9jb252ZXJ0ZXJzL3Bhc3N0aHJvdWdoLmpzXCIpLnRoZW4obSA9PiBtLmRlZmF1bHQpLFxuICAgICAgaW5jcmVtZW50YWxDYWNoZTogKCkgPT4gaW1wb3J0KFwiJHtkfS9vdmVycmlkZXMvaW5jcmVtZW50YWxDYWNoZS9nYXRld2F5LmpzXCIpLnRoZW4obSA9PiBuZXcgbS5kZWZhdWx0KCkpLFxuICAgICAgdGFnQ2FjaGU6ICgpID0+IGltcG9ydChcIiR7ZH0vb3ZlcnJpZGVzL3RhZ0NhY2hlL2dhdGV3YXkuanNcIikudGhlbihtID0+IG5ldyBtLmRlZmF1bHQoKSksXG4gICAgICBxdWV1ZTogXCJkaXJlY3RcIixcbiAgICAgIHByb3h5RXh0ZXJuYWxSZXF1ZXN0OiBcImZldGNoXCIsXG4gICAgfSxcbiAgfSxcbiAgaW1hZ2VPcHRpbWl6YXRpb246IHtcbiAgICBpbnN0YWxsOiBmYWxzZSxcbiAgfSxcbiAgYnVpbGRPdXRwdXRQYXRoOiBcIi5cIixcbiAgYXBwUGF0aDogXCIuXCIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25maWc7XG5gO1xufVxuIl19
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { IUploadAdapter } from './adapters/adapter.interface';
|
|
2
|
+
export { LocalFSUploadAdapter } from './adapters/local-fs.adapter';
|
|
3
|
+
export { OSSUploadAdapter } from './adapters/oss.adapter';
|
|
4
|
+
export { runBuild, BuildOptions, createBuildCommand } from './commands/build';
|
|
5
|
+
export { runDeploy, DeployOptions, createDeployCommand } from './commands/deploy';
|
|
6
|
+
export { runUploadCache, UploadCacheOptions, createUploadCacheCommand } from './commands/upload-cache';
|
|
7
|
+
export { generateDefaultConfig } from './config/default-open-next-config';
|
|
8
|
+
export { default as GatewayIncrementalCache } from './overrides/incrementalCache/gateway';
|
|
9
|
+
export { default as GatewayTagCache } from './overrides/tagCache/gateway';
|
|
10
|
+
export { default as nodeServerWrapper } from './adapters/wrappers/node-server';
|
|
11
|
+
export { default as passthroughConverter } from './adapters/converters/passthrough';
|
|
12
|
+
export { loadGatewayAuthConfig, signGatewayHeaders, gatewayFetch, GatewayAuthConfig, GatewaySignedHeaders, } from './runtime/gateway-auth';
|
|
13
|
+
export { handleImageProxy } from './runtime/image-proxy';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleImageProxy = exports.gatewayFetch = exports.signGatewayHeaders = exports.loadGatewayAuthConfig = exports.passthroughConverter = exports.nodeServerWrapper = exports.GatewayTagCache = exports.GatewayIncrementalCache = exports.generateDefaultConfig = exports.createUploadCacheCommand = exports.runUploadCache = exports.createDeployCommand = exports.runDeploy = exports.createBuildCommand = exports.runBuild = exports.OSSUploadAdapter = exports.LocalFSUploadAdapter = void 0;
|
|
4
|
+
var local_fs_adapter_1 = require("./adapters/local-fs.adapter");
|
|
5
|
+
Object.defineProperty(exports, "LocalFSUploadAdapter", { enumerable: true, get: function () { return local_fs_adapter_1.LocalFSUploadAdapter; } });
|
|
6
|
+
var oss_adapter_1 = require("./adapters/oss.adapter");
|
|
7
|
+
Object.defineProperty(exports, "OSSUploadAdapter", { enumerable: true, get: function () { return oss_adapter_1.OSSUploadAdapter; } });
|
|
8
|
+
var build_1 = require("./commands/build");
|
|
9
|
+
Object.defineProperty(exports, "runBuild", { enumerable: true, get: function () { return build_1.runBuild; } });
|
|
10
|
+
Object.defineProperty(exports, "createBuildCommand", { enumerable: true, get: function () { return build_1.createBuildCommand; } });
|
|
11
|
+
var deploy_1 = require("./commands/deploy");
|
|
12
|
+
Object.defineProperty(exports, "runDeploy", { enumerable: true, get: function () { return deploy_1.runDeploy; } });
|
|
13
|
+
Object.defineProperty(exports, "createDeployCommand", { enumerable: true, get: function () { return deploy_1.createDeployCommand; } });
|
|
14
|
+
var upload_cache_1 = require("./commands/upload-cache");
|
|
15
|
+
Object.defineProperty(exports, "runUploadCache", { enumerable: true, get: function () { return upload_cache_1.runUploadCache; } });
|
|
16
|
+
Object.defineProperty(exports, "createUploadCacheCommand", { enumerable: true, get: function () { return upload_cache_1.createUploadCacheCommand; } });
|
|
17
|
+
var default_open_next_config_1 = require("./config/default-open-next-config");
|
|
18
|
+
Object.defineProperty(exports, "generateDefaultConfig", { enumerable: true, get: function () { return default_open_next_config_1.generateDefaultConfig; } });
|
|
19
|
+
// Runtime overrides (used by OpenNext config at build time, executed in Function at runtime)
|
|
20
|
+
var gateway_1 = require("./overrides/incrementalCache/gateway");
|
|
21
|
+
Object.defineProperty(exports, "GatewayIncrementalCache", { enumerable: true, get: function () { return gateway_1.default; } });
|
|
22
|
+
var gateway_2 = require("./overrides/tagCache/gateway");
|
|
23
|
+
Object.defineProperty(exports, "GatewayTagCache", { enumerable: true, get: function () { return gateway_2.default; } });
|
|
24
|
+
// Adapters (used by OpenNext config)
|
|
25
|
+
var node_server_1 = require("./adapters/wrappers/node-server");
|
|
26
|
+
Object.defineProperty(exports, "nodeServerWrapper", { enumerable: true, get: function () { return node_server_1.default; } });
|
|
27
|
+
var passthrough_1 = require("./adapters/converters/passthrough");
|
|
28
|
+
Object.defineProperty(exports, "passthroughConverter", { enumerable: true, get: function () { return passthrough_1.default; } });
|
|
29
|
+
// Runtime: Gateway 鉴权 client + 图片代理处理函数
|
|
30
|
+
var gateway_auth_1 = require("./runtime/gateway-auth");
|
|
31
|
+
Object.defineProperty(exports, "loadGatewayAuthConfig", { enumerable: true, get: function () { return gateway_auth_1.loadGatewayAuthConfig; } });
|
|
32
|
+
Object.defineProperty(exports, "signGatewayHeaders", { enumerable: true, get: function () { return gateway_auth_1.signGatewayHeaders; } });
|
|
33
|
+
Object.defineProperty(exports, "gatewayFetch", { enumerable: true, get: function () { return gateway_auth_1.gatewayFetch; } });
|
|
34
|
+
var image_proxy_1 = require("./runtime/image-proxy");
|
|
35
|
+
Object.defineProperty(exports, "handleImageProxy", { enumerable: true, get: function () { return image_proxy_1.handleImageProxy; } });
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsZ0VBQW1FO0FBQTFELHdIQUFBLG9CQUFvQixPQUFBO0FBQzdCLHNEQUEwRDtBQUFqRCwrR0FBQSxnQkFBZ0IsT0FBQTtBQUN6QiwwQ0FBOEU7QUFBckUsaUdBQUEsUUFBUSxPQUFBO0FBQWdCLDJHQUFBLGtCQUFrQixPQUFBO0FBQ25ELDRDQUFrRjtBQUF6RSxtR0FBQSxTQUFTLE9BQUE7QUFBaUIsNkdBQUEsbUJBQW1CLE9BQUE7QUFDdEQsd0RBQXVHO0FBQTlGLDhHQUFBLGNBQWMsT0FBQTtBQUFzQix3SEFBQSx3QkFBd0IsT0FBQTtBQUNyRSw4RUFBMEU7QUFBakUsaUlBQUEscUJBQXFCLE9BQUE7QUFFOUIsNkZBQTZGO0FBQzdGLGdFQUEwRjtBQUFqRixrSEFBQSxPQUFPLE9BQTJCO0FBQzNDLHdEQUEwRTtBQUFqRSwwR0FBQSxPQUFPLE9BQW1CO0FBRW5DLHFDQUFxQztBQUNyQywrREFBK0U7QUFBdEUsZ0hBQUEsT0FBTyxPQUFxQjtBQUNyQyxpRUFBb0Y7QUFBM0UsbUhBQUEsT0FBTyxPQUF3QjtBQUV4Qyx3Q0FBd0M7QUFDeEMsdURBTWdDO0FBTDlCLHFIQUFBLHFCQUFxQixPQUFBO0FBQ3JCLGtIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLDRHQUFBLFlBQVksT0FBQTtBQUlkLHFEQUF5RDtBQUFoRCwrR0FBQSxnQkFBZ0IsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IElVcGxvYWRBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVycy9hZGFwdGVyLmludGVyZmFjZSc7XG5leHBvcnQgeyBMb2NhbEZTVXBsb2FkQWRhcHRlciB9IGZyb20gJy4vYWRhcHRlcnMvbG9jYWwtZnMuYWRhcHRlcic7XG5leHBvcnQgeyBPU1NVcGxvYWRBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVycy9vc3MuYWRhcHRlcic7XG5leHBvcnQgeyBydW5CdWlsZCwgQnVpbGRPcHRpb25zLCBjcmVhdGVCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkJztcbmV4cG9ydCB7IHJ1bkRlcGxveSwgRGVwbG95T3B0aW9ucywgY3JlYXRlRGVwbG95Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZGVwbG95JztcbmV4cG9ydCB7IHJ1blVwbG9hZENhY2hlLCBVcGxvYWRDYWNoZU9wdGlvbnMsIGNyZWF0ZVVwbG9hZENhY2hlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdXBsb2FkLWNhY2hlJztcbmV4cG9ydCB7IGdlbmVyYXRlRGVmYXVsdENvbmZpZyB9IGZyb20gJy4vY29uZmlnL2RlZmF1bHQtb3Blbi1uZXh0LWNvbmZpZyc7XG5cbi8vIFJ1bnRpbWUgb3ZlcnJpZGVzICh1c2VkIGJ5IE9wZW5OZXh0IGNvbmZpZyBhdCBidWlsZCB0aW1lLCBleGVjdXRlZCBpbiBGdW5jdGlvbiBhdCBydW50aW1lKVxuZXhwb3J0IHsgZGVmYXVsdCBhcyBHYXRld2F5SW5jcmVtZW50YWxDYWNoZSB9IGZyb20gJy4vb3ZlcnJpZGVzL2luY3JlbWVudGFsQ2FjaGUvZ2F0ZXdheSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEdhdGV3YXlUYWdDYWNoZSB9IGZyb20gJy4vb3ZlcnJpZGVzL3RhZ0NhY2hlL2dhdGV3YXknO1xuXG4vLyBBZGFwdGVycyAodXNlZCBieSBPcGVuTmV4dCBjb25maWcpXG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vZGVTZXJ2ZXJXcmFwcGVyIH0gZnJvbSAnLi9hZGFwdGVycy93cmFwcGVycy9ub2RlLXNlcnZlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhc3N0aHJvdWdoQ29udmVydGVyIH0gZnJvbSAnLi9hZGFwdGVycy9jb252ZXJ0ZXJzL3Bhc3N0aHJvdWdoJztcblxuLy8gUnVudGltZTogR2F0ZXdheSDpibTmnYMgY2xpZW50ICsg5Zu+54mH5Luj55CG5aSE55CG5Ye95pWwXG5leHBvcnQge1xuICBsb2FkR2F0ZXdheUF1dGhDb25maWcsXG4gIHNpZ25HYXRld2F5SGVhZGVycyxcbiAgZ2F0ZXdheUZldGNoLFxuICBHYXRld2F5QXV0aENvbmZpZyxcbiAgR2F0ZXdheVNpZ25lZEhlYWRlcnMsXG59IGZyb20gJy4vcnVudGltZS9nYXRld2F5LWF1dGgnO1xuZXhwb3J0IHsgaGFuZGxlSW1hZ2VQcm94eSB9IGZyb20gJy4vcnVudGltZS9pbWFnZS1wcm94eSc7XG4iXX0=
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway 增量缓存 Override
|
|
3
|
+
*
|
|
4
|
+
* Next.js Function 运行时的增量缓存实现,通过 Gateway 代理读写 OSS。
|
|
5
|
+
* 鉴权统一走 runtime/gateway-auth(HMAC 签名 + 4 header)。
|
|
6
|
+
*
|
|
7
|
+
* @see specs/runtime/incremental-cache-override.spec.md
|
|
8
|
+
*/
|
|
9
|
+
export default class GatewayIncrementalCache {
|
|
10
|
+
name: "gateway-incremental-cache";
|
|
11
|
+
private config;
|
|
12
|
+
private configLoaded;
|
|
13
|
+
/**
|
|
14
|
+
* 延迟加载配置,避免在构造函数中因环境变量缺失而阻塞 Function 启动。
|
|
15
|
+
*/
|
|
16
|
+
private getConfig;
|
|
17
|
+
/**
|
|
18
|
+
* 从 Gateway 读取缓存。
|
|
19
|
+
*/
|
|
20
|
+
get(key: string, isFetch?: boolean): Promise<{
|
|
21
|
+
value: any;
|
|
22
|
+
lastModified: number;
|
|
23
|
+
} | null>;
|
|
24
|
+
/**
|
|
25
|
+
* 向 Gateway 写入缓存。
|
|
26
|
+
*/
|
|
27
|
+
set(key: string, value: any, isFetch?: boolean): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* 通过 Gateway 删除缓存。
|
|
30
|
+
*/
|
|
31
|
+
delete(key: string, isFetch?: boolean): Promise<void>;
|
|
32
|
+
}
|