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,247 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createBuildCommand = exports.runBuild = void 0;
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const fs = require("fs/promises");
|
|
6
|
+
const commander_1 = require("commander");
|
|
7
|
+
const fs_1 = require("../util/fs");
|
|
8
|
+
const default_open_next_config_1 = require("../config/default-open-next-config");
|
|
9
|
+
// Mirror of OpenNext's NEXT_RELEASE_DATES (helper.js). Used to auto-pass
|
|
10
|
+
// --force-unsupported-next when the user's Next major is past its 2-year window,
|
|
11
|
+
// so pipeline builds don't fail on OpenNext's policy gate.
|
|
12
|
+
const NEXT_RELEASE_DATES = {
|
|
13
|
+
16: '2025-10-21',
|
|
14
|
+
15: '2024-10-21',
|
|
15
|
+
14: '2023-10-26',
|
|
16
|
+
13: '2022-10-26',
|
|
17
|
+
12: '2021-10-26',
|
|
18
|
+
};
|
|
19
|
+
const NEXT_SUPPORT_WINDOW_YEARS = 2;
|
|
20
|
+
async function detectNextMajor(projectDir) {
|
|
21
|
+
try {
|
|
22
|
+
const pkgPath = path.join(projectDir, 'node_modules', 'next', 'package.json');
|
|
23
|
+
const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf-8'));
|
|
24
|
+
const major = parseInt(String(pkg.version).split('.')[0], 10);
|
|
25
|
+
return Number.isNaN(major) ? null : major;
|
|
26
|
+
}
|
|
27
|
+
catch (_a) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function isNextMajorUnsupported(major) {
|
|
32
|
+
const releaseDate = NEXT_RELEASE_DATES[major];
|
|
33
|
+
if (!releaseDate)
|
|
34
|
+
return major < 12;
|
|
35
|
+
const eol = new Date(releaseDate);
|
|
36
|
+
eol.setFullYear(eol.getFullYear() + NEXT_SUPPORT_WINDOW_YEARS);
|
|
37
|
+
return Date.now() > eol.getTime();
|
|
38
|
+
}
|
|
39
|
+
// Path inside <projectDir> where we materialize override bundles so the
|
|
40
|
+
// auto-generated open-next.config can reference them via a relative path.
|
|
41
|
+
// Relative form needed because absolute __dirname paths break when the CLI is
|
|
42
|
+
// ncc-bundled into a single file (subdirectory tree no longer exists).
|
|
43
|
+
const PCG_OVERRIDES_REL = '.pcg/overrides';
|
|
44
|
+
// Loader copied into <projectDir>/node_modules/.pcg/ at build time so
|
|
45
|
+
// next.config can reference it as 'node_modules/.pcg/pcg-image-loader.js'
|
|
46
|
+
// without writing into the user's source tree or adding esa-pcg-cli to
|
|
47
|
+
// their package.json. node_modules is gitignored and webpack handles paths
|
|
48
|
+
// under it natively.
|
|
49
|
+
const PCG_IMAGE_LOADER_FILENAME = 'pcg-image-loader.js';
|
|
50
|
+
const PCG_IMAGE_LOADER_REL_DIR = 'node_modules/.pcg';
|
|
51
|
+
async function materializeImageLoader(projectDir) {
|
|
52
|
+
const src = path.join(__dirname, '..', '..', 'runtime', PCG_IMAGE_LOADER_FILENAME);
|
|
53
|
+
const destDir = path.join(projectDir, PCG_IMAGE_LOADER_REL_DIR);
|
|
54
|
+
const dest = path.join(destDir, PCG_IMAGE_LOADER_FILENAME);
|
|
55
|
+
try {
|
|
56
|
+
await fs.mkdir(destDir, { recursive: true });
|
|
57
|
+
await fs.copyFile(src, dest);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
if (err && err.code === 'ENOENT') {
|
|
61
|
+
throw new Error(`[build] runtime/${PCG_IMAGE_LOADER_FILENAME} missing from esa-pcg-cli, ` +
|
|
62
|
+
`or ${projectDir}/node_modules is missing. ` +
|
|
63
|
+
'Run `npm install` in the project, and reinstall esa-pcg-cli if its runtime/ is gone.');
|
|
64
|
+
}
|
|
65
|
+
throw err;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function materializeOverrides(projectDir) {
|
|
69
|
+
// Lazy require — keeps the inline-overrides bundle out of the import graph
|
|
70
|
+
// for code paths that don't auto-generate the config.
|
|
71
|
+
let INLINE_OVERRIDES;
|
|
72
|
+
try {
|
|
73
|
+
({ INLINE_OVERRIDES } = require('../_inline-overrides'));
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
if (err && err.code === 'MODULE_NOT_FOUND') {
|
|
77
|
+
throw new Error('[build] dist/_inline-overrides.js missing from esa-pcg-cli. ' +
|
|
78
|
+
'The published package was built without scripts/bundle-overrides.js. ' +
|
|
79
|
+
'Reinstall a newer esa-pcg-cli (built with the full `pnpm build` pipeline).');
|
|
80
|
+
}
|
|
81
|
+
throw err;
|
|
82
|
+
}
|
|
83
|
+
const overridesRoot = path.join(projectDir, PCG_OVERRIDES_REL);
|
|
84
|
+
for (const [relPath, source] of Object.entries(INLINE_OVERRIDES)) {
|
|
85
|
+
const target = path.join(overridesRoot, relPath);
|
|
86
|
+
await fs.mkdir(path.dirname(target), { recursive: true });
|
|
87
|
+
await fs.writeFile(target, source);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function cleanupOverrides(projectDir) {
|
|
91
|
+
const overridesRoot = path.join(projectDir, PCG_OVERRIDES_REL);
|
|
92
|
+
await fs.rm(overridesRoot, { recursive: true, force: true });
|
|
93
|
+
// Also try to remove the .pcg parent if it's empty; ignore if not.
|
|
94
|
+
await fs.rmdir(path.join(projectDir, '.pcg')).catch(() => { });
|
|
95
|
+
}
|
|
96
|
+
async function runBuild(opts) {
|
|
97
|
+
const projectDir = path.resolve(opts.dir);
|
|
98
|
+
const pkgJsonPath = path.join(projectDir, 'package.json');
|
|
99
|
+
try {
|
|
100
|
+
await fs.access(pkgJsonPath);
|
|
101
|
+
}
|
|
102
|
+
catch (_a) {
|
|
103
|
+
throw new Error(`Next.js project not found at ${projectDir} (no package.json)`);
|
|
104
|
+
}
|
|
105
|
+
const openNextDir = path.join(projectDir, '.open-next');
|
|
106
|
+
let configPath = opts.config;
|
|
107
|
+
let tempConfig = false;
|
|
108
|
+
if (!configPath) {
|
|
109
|
+
const candidates = ['open-next.config.ts', 'open-next.config.js'];
|
|
110
|
+
for (const c of candidates) {
|
|
111
|
+
const p = path.join(projectDir, c);
|
|
112
|
+
try {
|
|
113
|
+
await fs.access(p);
|
|
114
|
+
configPath = p;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
catch (_b) { }
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (!configPath) {
|
|
121
|
+
console.log('[build] No open-next.config found, generating default config...');
|
|
122
|
+
configPath = path.join(projectDir, 'open-next.config.ts');
|
|
123
|
+
await materializeOverrides(projectDir);
|
|
124
|
+
const configContent = (0, default_open_next_config_1.generateDefaultConfig)({
|
|
125
|
+
overridesDir: `./${PCG_OVERRIDES_REL}`,
|
|
126
|
+
});
|
|
127
|
+
await fs.writeFile(configPath, configContent);
|
|
128
|
+
tempConfig = true;
|
|
129
|
+
}
|
|
130
|
+
if (opts.dryRun) {
|
|
131
|
+
console.log('[build] Dry run mode — build plan:');
|
|
132
|
+
console.log(` Project dir: ${projectDir}`);
|
|
133
|
+
console.log(` Config: ${configPath}`);
|
|
134
|
+
console.log(` Output: ${openNextDir}`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
if (await (0, fs_1.dirExists)(openNextDir)) {
|
|
139
|
+
console.log('[build] Cleaning old .open-next/ directory...');
|
|
140
|
+
await fs.rm(openNextDir, { recursive: true, force: true });
|
|
141
|
+
}
|
|
142
|
+
if (opts.debug) {
|
|
143
|
+
process.env.OPEN_NEXT_DEBUG = 'true';
|
|
144
|
+
}
|
|
145
|
+
let forceUnsupported = opts.forceUnsupportedNext === true;
|
|
146
|
+
if (!forceUnsupported && process.env.PCG_STRICT_NEXT_SUPPORT !== '1') {
|
|
147
|
+
const nextMajor = await detectNextMajor(projectDir);
|
|
148
|
+
if (nextMajor !== null && isNextMajorUnsupported(nextMajor)) {
|
|
149
|
+
console.warn(`[build] Next ${nextMajor}.x is past OpenNext's ${NEXT_SUPPORT_WINDOW_YEARS}-year support window — ` +
|
|
150
|
+
'auto-enabling --force-unsupported-next. ' +
|
|
151
|
+
'Set PCG_STRICT_NEXT_SUPPORT=1 to disable this behavior.');
|
|
152
|
+
forceUnsupported = true;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
await materializeImageLoader(projectDir);
|
|
156
|
+
await checkImageLoaderConfig(projectDir);
|
|
157
|
+
console.log('[build] Running OpenNext build...');
|
|
158
|
+
const prevCwd = process.cwd();
|
|
159
|
+
try {
|
|
160
|
+
process.chdir(projectDir);
|
|
161
|
+
// OpenNext resolves `next` via process.cwd() / { paths: [appPath] },
|
|
162
|
+
// so loading it from the CLI's own node_modules still finds the user's Next.
|
|
163
|
+
const openNextBuild = require('@opennextjs/aws/build.js');
|
|
164
|
+
const relativeConfigPath = path.relative(projectDir, configPath);
|
|
165
|
+
await openNextBuild.build(relativeConfigPath, '@opennextjs/aws', forceUnsupported);
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
process.chdir(prevCwd);
|
|
169
|
+
}
|
|
170
|
+
console.log('[build] Build complete!');
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
if (tempConfig) {
|
|
174
|
+
try {
|
|
175
|
+
await fs.unlink(configPath);
|
|
176
|
+
}
|
|
177
|
+
catch (_c) {
|
|
178
|
+
console.warn('[build] Warning: failed to clean up temporary config file');
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
await cleanupOverrides(projectDir);
|
|
182
|
+
}
|
|
183
|
+
catch (_d) {
|
|
184
|
+
console.warn(`[build] Warning: failed to clean up ${PCG_OVERRIDES_REL}/`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
exports.runBuild = runBuild;
|
|
190
|
+
const NEXT_CONFIG_FILES = [
|
|
191
|
+
'next.config.js',
|
|
192
|
+
'next.config.mjs',
|
|
193
|
+
'next.config.ts',
|
|
194
|
+
];
|
|
195
|
+
async function readNextConfig(projectDir) {
|
|
196
|
+
for (const f of NEXT_CONFIG_FILES) {
|
|
197
|
+
try {
|
|
198
|
+
return await fs.readFile(path.join(projectDir, f), 'utf-8');
|
|
199
|
+
}
|
|
200
|
+
catch (_a) {
|
|
201
|
+
// try next candidate
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Verify `next.config.{js,mjs,ts}` wires `images.loader = "custom"` AND
|
|
208
|
+
* `images.loaderFile` references the loader that `materializeImageLoader`
|
|
209
|
+
* just wrote into `<projectDir>/node_modules/.pcg/`. Without that wiring
|
|
210
|
+
* Next falls back to the built-in /_next/image handler and `<Image>` URLs
|
|
211
|
+
* never reach the wrapper's `/_pcg/image/*` route.
|
|
212
|
+
*/
|
|
213
|
+
async function checkImageLoaderConfig(projectDir) {
|
|
214
|
+
try {
|
|
215
|
+
const content = await readNextConfig(projectDir);
|
|
216
|
+
if (content === null)
|
|
217
|
+
return;
|
|
218
|
+
const hasCustomLoader = /loader\s*:\s*['"]custom['"]/.test(content);
|
|
219
|
+
const hasLoaderFile = content.includes('pcg-image-loader');
|
|
220
|
+
if (!hasCustomLoader || !hasLoaderFile) {
|
|
221
|
+
console.warn('[build] Warning: next.config must configure images.loader = "custom" ' +
|
|
222
|
+
'and set images.loaderFile to "node_modules/.pcg/pcg-image-loader.js" — ' +
|
|
223
|
+
'without both, <Image> URLs will not be routed through /_pcg/image/optimize.');
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (_a) { }
|
|
227
|
+
}
|
|
228
|
+
function createBuildCommand() {
|
|
229
|
+
return new commander_1.Command('build')
|
|
230
|
+
.description('Build Next.js project for deployment via pages-cache-gateway')
|
|
231
|
+
.option('--dir <path>', 'Next.js project directory', '.')
|
|
232
|
+
.option('--config <path>', 'open-next.config.ts path')
|
|
233
|
+
.option('--debug', 'Enable debug mode')
|
|
234
|
+
.option('--dry-run', 'Show build plan without executing')
|
|
235
|
+
.option('--force-unsupported-next', 'Allow unsupported Next.js versions')
|
|
236
|
+
.action(async (options) => {
|
|
237
|
+
await runBuild({
|
|
238
|
+
dir: options.dir,
|
|
239
|
+
config: options.config,
|
|
240
|
+
debug: options.debug,
|
|
241
|
+
dryRun: options.dryRun,
|
|
242
|
+
forceUnsupportedNext: options.forceUnsupportedNext,
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
exports.createBuildCommand = createBuildCommand;
|
|
247
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLGtDQUFrQztBQUNsQyx5Q0FBb0M7QUFDcEMsbUNBQXVDO0FBQ3ZDLGlGQUEyRTtBQUUzRSx5RUFBeUU7QUFDekUsaUZBQWlGO0FBQ2pGLDJEQUEyRDtBQUMzRCxNQUFNLGtCQUFrQixHQUEyQjtJQUNqRCxFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtDQUNqQixDQUFDO0FBQ0YsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUM7QUFFcEMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxVQUFrQjtJQUMvQyxJQUFJO1FBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDdkIsVUFBVSxFQUNWLGNBQWMsRUFDZCxNQUFNLEVBQ04sY0FBYyxDQUNmLENBQUM7UUFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztLQUMzQztJQUFDLFdBQU07UUFDTixPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsS0FBYTtJ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QWpCRCxnREFpQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBkaXJFeGlzdHMgfSBmcm9tICcuLi91dGlsL2ZzJztcbmltcG9ydCB7IGdlbmVyYXRlRGVmYXVsdENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9kZWZhdWx0LW9wZW4tbmV4dC1jb25maWcnO1xuXG4vLyBNaXJyb3Igb2YgT3Blbk5leHQncyBORVhUX1JFTEVBU0VfREFURVMgKGhlbHBlci5qcykuIFVzZWQgdG8gYXV0by1wYXNzXG4vLyAtLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQgd2hlbiB0aGUgdXNlcidzIE5leHQgbWFqb3IgaXMgcGFzdCBpdHMgMi15ZWFyIHdpbmRvdyxcbi8vIHNvIHBpcGVsaW5lIGJ1aWxkcyBkb24ndCBmYWlsIG9uIE9wZW5OZXh0J3MgcG9saWN5IGdhdGUuXG5jb25zdCBORVhUX1JFTEVBU0VfREFURVM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gIDE2OiAnMjAyNS0xMC0yMScsXG4gIDE1OiAnMjAyNC0xMC0yMScsXG4gIDE0OiAnMjAyMy0xMC0yNicsXG4gIDEzOiAnMjAyMi0xMC0yNicsXG4gIDEyOiAnMjAyMS0xMC0yNicsXG59O1xuY29uc3QgTkVYVF9TVVBQT1JUX1dJTkRPV19ZRUFSUyA9IDI7XG5cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdE5leHRNYWpvcihwcm9qZWN0RGlyOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa2dQYXRoID0gcGF0aC5qb2luKFxuICAgICAgcHJvamVjdERpcixcbiAgICAgICdub2RlX21vZHVsZXMnLFxuICAgICAgJ25leHQnLFxuICAgICAgJ3BhY2thZ2UuanNvbidcbiAgICApO1xuICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUocGtnUGF0aCwgJ3V0Zi04JykpO1xuICAgIGNvbnN0IG1ham9yID0gcGFyc2VJbnQoU3RyaW5nKHBrZy52ZXJzaW9uKS5zcGxpdCgnLicpWzBdLCAxMCk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTihtYWpvcikgPyBudWxsIDogbWFqb3I7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTmV4dE1ham9yVW5zdXBwb3J0ZWQobWFqb3I6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCByZWxlYXNlRGF0ZSA9IE5FWFRfUkVMRUFTRV9EQVRFU1ttYWpvcl07XG4gIGlmICghcmVsZWFzZURhdGUpIHJldHVybiBtYWpvciA8IDEyO1xuICBjb25zdCBlb2wgPSBuZXcgRGF0ZShyZWxlYXNlRGF0ZSk7XG4gIGVvbC5zZXRGdWxsWWVhcihlb2wuZ2V0RnVsbFllYXIoKSArIE5FWFRfU1VQUE9SVF9XSU5ET1dfWUVBUlMpO1xuICByZXR1cm4gRGF0ZS5ub3coKSA+IGVvbC5nZXRUaW1lKCk7XG59XG5cbi8vIFBhdGggaW5zaWRlIDxwcm9qZWN0RGlyPiB3aGVyZSB3ZSBtYXRlcmlhbGl6ZSBvdmVycmlkZSBidW5kbGVzIHNvIHRoZVxuLy8gYXV0by1nZW5lcmF0ZWQgb3Blbi1uZXh0LmNvbmZpZyBjYW4gcmVmZXJlbmNlIHRoZW0gdmlhIGEgcmVsYXRpdmUgcGF0aC5cbi8vIFJlbGF0aXZlIGZvcm0gbmVlZGVkIGJlY2F1c2UgYWJzb2x1dGUgX19kaXJuYW1lIHBhdGhzIGJyZWFrIHdoZW4gdGhlIENMSSBpc1xuLy8gbmNjLWJ1bmRsZWQgaW50byBhIHNpbmdsZSBmaWxlIChzdWJkaXJlY3RvcnkgdHJlZSBubyBsb25nZXIgZXhpc3RzKS5cbmNvbnN0IFBDR19PVkVSUklERVNfUkVMID0gJy5wY2cvb3ZlcnJpZGVzJztcblxuLy8gTG9hZGVyIGNvcGllZCBpbnRvIDxwcm9qZWN0RGlyPi9ub2RlX21vZHVsZXMvLnBjZy8gYXQgYnVpbGQgdGltZSBzb1xuLy8gbmV4dC5jb25maWcgY2FuIHJlZmVyZW5jZSBpdCBhcyAnbm9kZV9tb2R1bGVzLy5wY2cvcGNnLWltYWdlLWxvYWRlci5qcydcbi8vIHdpdGhvdXQgd3JpdGluZyBpbnRvIHRoZSB1c2VyJ3Mgc291cmNlIHRyZWUgb3IgYWRkaW5nIGVzYS1wY2ctY2xpIHRvXG4vLyB0aGVpciBwYWNrYWdlLmpzb24uIG5vZGVfbW9kdWxlcyBpcyBnaXRpZ25vcmVkIGFuZCB3ZWJwYWNrIGhhbmRsZXMgcGF0aHNcbi8vIHVuZGVyIGl0IG5hdGl2ZWx5LlxuY29uc3QgUENHX0lNQUdFX0xPQURFUl9GSUxFTkFNRSA9ICdwY2ctaW1hZ2UtbG9hZGVyLmpzJztcbmNvbnN0IFBDR19JTUFHRV9MT0FERVJfUkVMX0RJUiA9ICdub2RlX21vZHVsZXMvLnBjZyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1hdGVyaWFsaXplSW1hZ2VMb2FkZXIocHJvamVjdERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNyYyA9IHBhdGguam9pbihcbiAgICBfX2Rpcm5hbWUsXG4gICAgJy4uJyxcbiAgICAnLi4nLFxuICAgICdydW50aW1lJyxcbiAgICBQQ0dfSU1BR0VfTE9BREVSX0ZJTEVOQU1FXG4gICk7XG4gIGNvbnN0IGRlc3REaXIgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgUENHX0lNQUdFX0xPQURFUl9SRUxfRElSKTtcbiAgY29uc3QgZGVzdCA9IHBhdGguam9pbihkZXN0RGlyLCBQQ0dfSU1BR0VfTE9BREVSX0ZJTEVOQU1FKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5ta2RpcihkZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmMsIGRlc3QpO1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbYnVpbGRdIHJ1bnRpbWUvJHtQQ0dfSU1BR0VfTE9BREVSX0ZJTEVOQU1FfSBtaXNzaW5nIGZyb20gZXNhLXBjZy1jbGksIGAgK1xuICAgICAgICAgIGBvciAke3Byb2plY3REaXJ9L25vZGVfbW9kdWxlcyBpcyBtaXNzaW5nLiBgICtcbiAgICAgICAgICAnUnVuIGBucG0gaW5zdGFsbGAgaW4gdGhlIHByb2plY3QsIGFuZCByZWluc3RhbGwgZXNhLXBjZy1jbGkgaWYgaXRzIHJ1bnRpbWUvIGlzIGdvbmUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1hdGVyaWFsaXplT3ZlcnJpZGVzKHByb2plY3REaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBMYXp5IHJlcXVpcmUg4oCUIGtlZXBzIHRoZSBpbmxpbmUtb3ZlcnJpZGVzIGJ1bmRsZSBvdXQgb2YgdGhlIGltcG9ydCBncmFwaFxuICAvLyBmb3IgY29kZSBwYXRocyB0aGF0IGRvbid0IGF1dG8tZ2VuZXJhdGUgdGhlIGNvbmZpZy5cbiAgbGV0IElOTElORV9PVkVSUklERVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHRyeSB7XG4gICAgKHsgSU5MSU5FX09WRVJSSURFUyB9ID0gcmVxdWlyZSgnLi4vX2lubGluZS1vdmVycmlkZXMnKSk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdbYnVpbGRdIGRpc3QvX2lubGluZS1vdmVycmlkZXMuanMgbWlzc2luZyBmcm9tIGVzYS1wY2ctY2xpLiAnICtcbiAgICAgICAgICAnVGhlIHB1Ymxpc2hlZCBwYWNrYWdlIHdhcyBidWlsdCB3aXRob3V0IHNjcmlwdHMvYnVuZGxlLW92ZXJyaWRlcy5qcy4gJyArXG4gICAgICAgICAgJ1JlaW5zdGFsbCBhIG5ld2VyIGVzYS1wY2ctY2xpIChidWlsdCB3aXRoIHRoZSBmdWxsIGBwbnBtIGJ1aWxkYCBwaXBlbGluZSkuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgUENHX09WRVJSSURFU19SRUwpO1xuICBmb3IgKGNvbnN0IFtyZWxQYXRoLCBzb3VyY2VdIG9mIE9iamVjdC5lbnRyaWVzKElOTElORV9PVkVSUklERVMpIGFzIFtcbiAgICBzdHJpbmcsXG4gICAgc3RyaW5nLFxuICBdW10pIHtcbiAgICBjb25zdCB0YXJnZXQgPSBwYXRoLmpvaW4ob3ZlcnJpZGVzUm9vdCwgcmVsUGF0aCk7XG4gICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHRhcmdldCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0YXJnZXQsIHNvdXJjZSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cE92ZXJyaWRlcyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb3ZlcnJpZGVzUm9vdCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCBQQ0dfT1ZFUlJJREVTX1JFTCk7XG4gIGF3YWl0IGZzLnJtKG92ZXJyaWRlc1Jvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgLy8gQWxzbyB0cnkgdG8gcmVtb3ZlIHRoZSAucGNnIHBhcmVudCBpZiBpdCdzIGVtcHR5OyBpZ25vcmUgaWYgbm90LlxuICBhd2FpdCBmcy5ybWRpcihwYXRoLmpvaW4ocHJvamVjdERpciwgJy5wY2cnKSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyB7XG4gIGRpcjogc3RyaW5nO1xuICBjb25maWc/OiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgZm9yY2VVbnN1cHBvcnRlZE5leHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGQob3B0czogQnVpbGRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLnJlc29sdmUob3B0cy5kaXIpO1xuXG4gIGNvbnN0IHBrZ0pzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5hY2Nlc3MocGtnSnNvblBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTmV4dC5qcyBwcm9qZWN0IG5vdCBmb3VuZCBhdCAke3Byb2plY3REaXJ9IChubyBwYWNrYWdlLmpzb24pYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBvcGVuTmV4dERpciA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnLm9wZW4tbmV4dCcpO1xuXG4gIGxldCBjb25maWdQYXRoID0gb3B0cy5jb25maWc7XG4gIGxldCB0ZW1wQ29uZmlnID0gZmFsc2U7XG5cbiAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFsnb3Blbi1uZXh0LmNvbmZpZy50cycsICdvcGVuLW5leHQuY29uZmlnLmpzJ107XG4gICAgZm9yIChjb25zdCBjIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgYyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MocCk7XG4gICAgICAgIGNvbmZpZ1BhdGggPSBwO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbmZpZ1BhdGgpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdbYnVpbGRdIE5vIG9wZW4tbmV4dC5jb25maWcgZm91bmQsIGdlbmVyYXRpbmcgZGVmYXVsdCBjb25maWcuLi4nXG4gICAgKTtcbiAgICBjb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvcGVuLW5leHQuY29uZmlnLnRzJyk7XG4gICAgYXdhaXQgbWF0ZXJpYWxpemVPdmVycmlkZXMocHJvamVjdERpcik7XG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGdlbmVyYXRlRGVmYXVsdENvbmZpZyh7XG4gICAgICBvdmVycmlkZXNEaXI6IGAuLyR7UENHX09WRVJSSURFU19SRUx9YCxcbiAgICB9KTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoY29uZmlnUGF0aCwgY29uZmlnQ29udGVudCk7XG4gICAgdGVtcENvbmZpZyA9IHRydWU7XG4gIH1cblxuICBpZiAob3B0cy5kcnlSdW4pIHtcbiAgICBjb25zb2xlLmxvZygnW2J1aWxkXSBEcnkgcnVuIG1vZGUg4oCUIGJ1aWxkIHBsYW46Jyk7XG4gICAgY29uc29sZS5sb2coYCAgUHJvamVjdCBkaXI6ICR7cHJvamVjdERpcn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBDb25maWc6ICR7Y29uZmlnUGF0aH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBPdXRwdXQ6ICR7b3Blbk5leHREaXJ9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZGlyRXhpc3RzKG9wZW5OZXh0RGlyKSkge1xuICAgICAgY29uc29sZS5sb2coJ1tidWlsZF0gQ2xlYW5pbmcgb2xkIC5vcGVuLW5leHQvIGRpcmVjdG9yeS4uLicpO1xuICAgICAgYXdhaXQgZnMucm0ob3Blbk5leHREaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWJ1Zykge1xuICAgICAgcHJvY2Vzcy5lbnYuT1BFTl9ORVhUX0RFQlVHID0gJ3RydWUnO1xuICAgIH1cblxuICAgIGxldCBmb3JjZVVuc3VwcG9ydGVkID0gb3B0cy5mb3JjZVVuc3VwcG9ydGVkTmV4dCA9PT0gdHJ1ZTtcbiAgICBpZiAoIWZvcmNlVW5zdXBwb3J0ZWQgJiYgcHJvY2Vzcy5lbnYuUENHX1NUUklDVF9ORVhUX1NVUFBPUlQgIT09ICcxJykge1xuICAgICAgY29uc3QgbmV4dE1ham9yID0gYXdhaXQgZGV0ZWN0TmV4dE1ham9yKHByb2plY3REaXIpO1xuICAgICAgaWYgKG5leHRNYWpvciAhPT0gbnVsbCAmJiBpc05leHRNYWpvclVuc3VwcG9ydGVkKG5leHRNYWpvcikpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbYnVpbGRdIE5leHQgJHtuZXh0TWFqb3J9LnggaXMgcGFzdCBPcGVuTmV4dCdzICR7TkVYVF9TVVBQT1JUX1dJTkRPV19ZRUFSU30teWVhciBzdXBwb3J0IHdpbmRvdyDigJQgYCArXG4gICAgICAgICAgICAnYXV0by1lbmFibGluZyAtLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQuICcgK1xuICAgICAgICAgICAgJ1NldCBQQ0dfU1RSSUNUX05FWFRfU1VQUE9SVD0xIHRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4nXG4gICAgICAgICk7XG4gICAgICAgIGZvcmNlVW5zdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IG1hdGVyaWFsaXplSW1hZ2VMb2FkZXIocHJvamVjdERpcik7XG4gICAgYXdhaXQgY2hlY2tJbWFnZUxvYWRlckNvbmZpZyhwcm9qZWN0RGlyKTtcblxuICAgIGNvbnNvbGUubG9nKCdbYnVpbGRdIFJ1bm5pbmcgT3Blbk5leHQgYnVpbGQuLi4nKTtcbiAgICBjb25zdCBwcmV2Q3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcm9qZWN0RGlyKTtcbiAgICAgIC8vIE9wZW5OZXh0IHJlc29sdmVzIGBuZXh0YCB2aWEgcHJvY2Vzcy5jd2QoKSAvIHsgcGF0aHM6IFthcHBQYXRoXSB9LFxuICAgICAgLy8gc28gbG9hZGluZyBpdCBmcm9tIHRoZSBDTEkncyBvd24gbm9kZV9tb2R1bGVzIHN0aWxsIGZpbmRzIHRoZSB1c2VyJ3MgTmV4dC5cbiAgICAgIGNvbnN0IG9wZW5OZXh0QnVpbGQgPSByZXF1aXJlKCdAb3Blbm5leHRqcy9hd3MvYnVpbGQuanMnKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlQ29uZmlnUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdERpciwgY29uZmlnUGF0aCEpO1xuICAgICAgYXdhaXQgb3Blbk5leHRCdWlsZC5idWlsZChcbiAgICAgICAgcmVsYXRpdmVDb25maWdQYXRoLFxuICAgICAgICAnQG9wZW5uZXh0anMvYXdzJyxcbiAgICAgICAgZm9yY2VVbnN1cHBvcnRlZFxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcmV2Q3dkKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW2J1aWxkXSBCdWlsZCBjb21wbGV0ZSEnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGVtcENvbmZpZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKGNvbmZpZ1BhdGghKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tidWlsZF0gV2FybmluZzogZmFpbGVkIHRvIGNsZWFuIHVwIHRlbXBvcmFyeSBjb25maWcgZmlsZSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsZWFudXBPdmVycmlkZXMocHJvamVjdERpcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbYnVpbGRdIFdhcm5pbmc6IGZhaWxlZCB0byBjbGVhbiB1cCAke1BDR19PVkVSUklERVNfUkVMfS9gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IE5FWFRfQ09ORklHX0ZJTEVTID0gW1xuICAnbmV4dC5jb25maWcuanMnLFxuICAnbmV4dC5jb25maWcubWpzJyxcbiAgJ25leHQuY29uZmlnLnRzJyxcbl07XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWROZXh0Q29uZmlnKHByb2plY3REaXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBmb3IgKGNvbnN0IGYgb2YgTkVYVF9DT05GSUdfRklMRVMpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihwcm9qZWN0RGlyLCBmKSwgJ3V0Zi04Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyB0cnkgbmV4dCBjYW5kaWRhdGVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogVmVyaWZ5IGBuZXh0LmNvbmZpZy57anMsbWpzLHRzfWAgd2lyZXMgYGltYWdlcy5sb2FkZXIgPSBcImN1c3RvbVwiYCBBTkRcbiAqIGBpbWFnZXMubG9hZGVyRmlsZWAgcmVmZXJlbmNlcyB0aGUgbG9hZGVyIHRoYXQgYG1hdGVyaWFsaXplSW1hZ2VMb2FkZXJgXG4gKiBqdXN0IHdyb3RlIGludG8gYDxwcm9qZWN0RGlyPi9ub2RlX21vZHVsZXMvLnBjZy9gLiBXaXRob3V0IHRoYXQgd2lyaW5nXG4gKiBOZXh0IGZhbGxzIGJhY2sgdG8gdGhlIGJ1aWx0LWluIC9fbmV4dC9pbWFnZSBoYW5kbGVyIGFuZCBgPEltYWdlPmAgVVJMc1xuICogbmV2ZXIgcmVhY2ggdGhlIHdyYXBwZXIncyBgL19wY2cvaW1hZ2UvKmAgcm91dGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrSW1hZ2VMb2FkZXJDb25maWcocHJvamVjdERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWROZXh0Q29uZmlnKHByb2plY3REaXIpO1xuICAgIGlmIChjb250ZW50ID09PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgaGFzQ3VzdG9tTG9hZGVyID0gL2xvYWRlclxccyo6XFxzKlsnXCJdY3VzdG9tWydcIl0vLnRlc3QoY29udGVudCk7XG4gICAgY29uc3QgaGFzTG9hZGVyRmlsZSA9IGNvbnRlbnQuaW5jbHVkZXMoJ3BjZy1pbWFnZS1sb2FkZXInKTtcbiAgICBpZiAoIWhhc0N1c3RvbUxvYWRlciB8fCAhaGFzTG9hZGVyRmlsZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW2J1aWxkXSBXYXJuaW5nOiBuZXh0LmNvbmZpZyBtdXN0IGNvbmZpZ3VyZSBpbWFnZXMubG9hZGVyID0gXCJjdXN0b21cIiAnICtcbiAgICAgICAgICAnYW5kIHNldCBpbWFnZXMubG9hZGVyRmlsZSB0byBcIm5vZGVfbW9kdWxlcy8ucGNnL3BjZy1pbWFnZS1sb2FkZXIuanNcIiDigJQgJyArXG4gICAgICAgICAgJ3dpdGhvdXQgYm90aCwgPEltYWdlPiBVUkxzIHdpbGwgbm90IGJlIHJvdXRlZCB0aHJvdWdoIC9fcGNnL2ltYWdlL29wdGltaXplLidcbiAgICAgICk7XG4gICAgfVxuICB9IGNhdGNoIHt9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdWlsZENvbW1hbmQoKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgnYnVpbGQnKVxuICAgIC5kZXNjcmlwdGlvbignQnVpbGQgTmV4dC5qcyBwcm9qZWN0IGZvciBkZXBsb3ltZW50IHZpYSBwYWdlcy1jYWNoZS1nYXRld2F5JylcbiAgICAub3B0aW9uKCctLWRpciA8cGF0aD4nLCAnTmV4dC5qcyBwcm9qZWN0IGRpcmVjdG9yeScsICcuJylcbiAgICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnb3Blbi1uZXh0LmNvbmZpZy50cyBwYXRoJylcbiAgICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSBkZWJ1ZyBtb2RlJylcbiAgICAub3B0aW9uKCctLWRyeS1ydW4nLCAnU2hvdyBidWlsZCBwbGFuIHdpdGhvdXQgZXhlY3V0aW5nJylcbiAgICAub3B0aW9uKCctLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQnLCAnQWxsb3cgdW5zdXBwb3J0ZWQgTmV4dC5qcyB2ZXJzaW9ucycpXG4gICAgLmFjdGlvbihhc3luYyBvcHRpb25zID0+IHtcbiAgICAgIGF3YWl0IHJ1bkJ1aWxkKHtcbiAgICAgICAgZGlyOiBvcHRpb25zLmRpcixcbiAgICAgICAgY29uZmlnOiBvcHRpb25zLmNvbmZpZyxcbiAgICAgICAgZGVidWc6IG9wdGlvbnMuZGVidWcsXG4gICAgICAgIGRyeVJ1bjogb3B0aW9ucy5kcnlSdW4sXG4gICAgICAgIGZvcmNlVW5zdXBwb3J0ZWROZXh0OiBvcHRpb25zLmZvcmNlVW5zdXBwb3J0ZWROZXh0LFxuICAgICAgfSk7XG4gICAgfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export interface DeployOptions {
|
|
3
|
+
dir: string;
|
|
4
|
+
localDev: boolean;
|
|
5
|
+
gateway: string;
|
|
6
|
+
token: string;
|
|
7
|
+
appId: string;
|
|
8
|
+
buildId: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function runDeploy(opts: DeployOptions): Promise<void>;
|
|
11
|
+
export declare function createDeployCommand(): Command;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDeployCommand = exports.runDeploy = void 0;
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const fs = require("fs/promises");
|
|
6
|
+
const commander_1 = require("commander");
|
|
7
|
+
const oss_adapter_1 = require("../adapters/oss.adapter");
|
|
8
|
+
const upload_cache_1 = require("./upload-cache");
|
|
9
|
+
const fs_1 = require("../util/fs");
|
|
10
|
+
async function fetchStsToken(gateway, token) {
|
|
11
|
+
const url = `${gateway}/deploy/sts-token`;
|
|
12
|
+
const res = await fetch(url, {
|
|
13
|
+
method: 'POST',
|
|
14
|
+
headers: {
|
|
15
|
+
Authorization: `Bearer ${token}`,
|
|
16
|
+
'Content-Type': 'application/json',
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
if (!res.ok) {
|
|
20
|
+
throw new Error(`STS token request failed: ${res.status} ${res.statusText}`);
|
|
21
|
+
}
|
|
22
|
+
return res.json();
|
|
23
|
+
}
|
|
24
|
+
async function runDeploy(opts) {
|
|
25
|
+
const openNextDir = path.join(opts.dir, '.open-next');
|
|
26
|
+
if (!(await (0, fs_1.dirExists)(openNextDir))) {
|
|
27
|
+
throw new Error(`.open-next/ directory not found at ${openNextDir}`);
|
|
28
|
+
}
|
|
29
|
+
if (opts.localDev) {
|
|
30
|
+
await runLocalDeploy(opts);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
await runCentralDeploy(opts);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.runDeploy = runDeploy;
|
|
37
|
+
/**
|
|
38
|
+
* Local-dev 模式:不再拷贝 assets/server-functions/cache 到 .pcg-local/。
|
|
39
|
+
* `pcg serve` 直接读 .open-next/,无需中间拷贝。
|
|
40
|
+
*
|
|
41
|
+
* 仅保留可选的"上传 cache 到 OSS",方便本地测试覆盖真实 OSS 缓存路径。
|
|
42
|
+
*/
|
|
43
|
+
async function runLocalDeploy(opts) {
|
|
44
|
+
if (!opts.gateway || !opts.token) {
|
|
45
|
+
console.log('[deploy] local: nothing to do (no --gateway/--token; pcg serve reads .open-next/ directly)');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
console.log(`[deploy] local: fetching STS credentials from ${opts.gateway}...`);
|
|
50
|
+
const stsCredentials = await fetchStsToken(opts.gateway, opts.token);
|
|
51
|
+
console.log('[deploy] local: uploading cache to OSS...');
|
|
52
|
+
const adapter = new oss_adapter_1.OSSUploadAdapter(stsCredentials);
|
|
53
|
+
const result = await (0, upload_cache_1.runUploadCache)({
|
|
54
|
+
dir: opts.dir,
|
|
55
|
+
appId: opts.appId,
|
|
56
|
+
buildId: opts.buildId,
|
|
57
|
+
adapter,
|
|
58
|
+
});
|
|
59
|
+
const ok = result.total - result.failed;
|
|
60
|
+
console.log(`[deploy] local deploy complete: cloud-cache=${ok}/${result.total}`);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
console.warn(`[deploy] local: cloud cache upload failed (${err.message})`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function runCentralDeploy(opts) {
|
|
67
|
+
if (!opts.gateway || !opts.token) {
|
|
68
|
+
throw new Error('Central mode requires --gateway and --token');
|
|
69
|
+
}
|
|
70
|
+
console.log('[deploy] central: platform deploy step (TBD)...');
|
|
71
|
+
console.log('[deploy] central: fetching STS credentials...');
|
|
72
|
+
const stsCredentials = await fetchStsToken(opts.gateway, opts.token);
|
|
73
|
+
const adapter = new oss_adapter_1.OSSUploadAdapter(stsCredentials);
|
|
74
|
+
const cacheResult = await (0, upload_cache_1.runUploadCache)({
|
|
75
|
+
dir: opts.dir,
|
|
76
|
+
appId: opts.appId,
|
|
77
|
+
buildId: opts.buildId,
|
|
78
|
+
adapter,
|
|
79
|
+
});
|
|
80
|
+
console.log(`[deploy] central deploy complete: cache=${cacheResult.total}`);
|
|
81
|
+
}
|
|
82
|
+
function createDeployCommand() {
|
|
83
|
+
return new commander_1.Command('deploy')
|
|
84
|
+
.description('Deploy Next.js build artifacts to cache gateway')
|
|
85
|
+
.option('-d, --dir <path>', 'Build output directory', '.')
|
|
86
|
+
.option('--local-dev', 'Local dev mode: only optional cache upload (pcg serve reads .open-next/ directly)')
|
|
87
|
+
.option('--gateway <url>', 'Gateway URL')
|
|
88
|
+
.option('--token <jwt>', 'JWT token')
|
|
89
|
+
.action(async (options) => {
|
|
90
|
+
const localDev = options.localDev || process.env.LOCAL_DEV === 'true';
|
|
91
|
+
const gateway = options.gateway || process.env.CACHE_SERVICE_ENDPOINT || (localDev ? 'http://localhost:7001' : '');
|
|
92
|
+
const token = options.token || process.env.CACHE_AUTH_TOKEN || '';
|
|
93
|
+
const appId = process.env.APP_ID || 'local_user/local_app';
|
|
94
|
+
let buildId = process.env.BUILD_ID || '';
|
|
95
|
+
if (!buildId) {
|
|
96
|
+
const buildIdPath = path.join(options.dir, '.open-next', 'assets', 'BUILD_ID');
|
|
97
|
+
try {
|
|
98
|
+
buildId = (await fs.readFile(buildIdPath, 'utf-8')).trim();
|
|
99
|
+
}
|
|
100
|
+
catch (_a) {
|
|
101
|
+
buildId = 'local_build';
|
|
102
|
+
console.warn(`[deploy] BUILD_ID not found at ${buildIdPath}, using fallback "${buildId}"`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
await runDeploy({
|
|
106
|
+
dir: options.dir,
|
|
107
|
+
localDev,
|
|
108
|
+
gateway,
|
|
109
|
+
token,
|
|
110
|
+
appId,
|
|
111
|
+
buildId,
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
exports.createDeployCommand = createDeployCommand;
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2RlcGxveS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFDN0Isa0NBQWtDO0FBQ2xDLHlDQUFvQztBQUVwQyx5REFBMkQ7QUFDM0QsaURBQWdEO0FBQ2hELG1DQUF1QztBQVd2QyxLQUFLLFVBQVUsYUFBYSxDQUFDLE9BQWUsRUFBRSxLQUFhO0lBQ3pELE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxtQkFBbUIsQ0FBQztJQUMxQyxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUU7UUFDM0IsTUFBTSxFQUFFLE1BQU07UUFDZCxPQUFPLEVBQUU7WUFDUCxhQUFhLEVBQUUsVUFBVSxLQUFLLEVBQUU7WUFDaEMsY0FBYyxFQUFFLGtCQUFrQjtTQUNuQztLQUNGLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztLQUM5RTtJQUVELE9BQU8sR0FBRyxDQUFDLElBQUksRUFBK0IsQ0FBQztBQUNqRCxDQUFDO0FBRU0sS0FBSyxVQUFVLFNBQVMsQ0FBQyxJQUFtQjtJQUNqRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDdEQsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFBLGNBQVMsRUFBQyxXQUFXLENBQUMsQ0FBQyxFQUFFO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLFdBQVcsRUFBRSxDQUFDLENBQUM7S0FDdEU7SUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDakIsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7S0FD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bnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgU1RTVG9rZW5SZXNwb25zZSB9IGZyb20gJ0BwY2cvcHJvdG9jb2wnO1xuaW1wb3J0IHsgT1NTVXBsb2FkQWRhcHRlciB9IGZyb20gJy4uL2FkYXB0ZXJzL29zcy5hZGFwdGVyJztcbmltcG9ydCB7IHJ1blVwbG9hZENhY2hlIH0gZnJvbSAnLi91cGxvYWQtY2FjaGUnO1xuaW1wb3J0IHsgZGlyRXhpc3RzIH0gZnJvbSAnLi4vdXRpbC9mcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95T3B0aW9ucyB7XG4gIGRpcjogc3RyaW5nO1xuICBsb2NhbERldjogYm9vbGVhbjtcbiAgZ2F0ZXdheTogc3RyaW5nO1xuICB0b2tlbjogc3RyaW5nO1xuICBhcHBJZDogc3RyaW5nO1xuICBidWlsZElkOiBzdHJpbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoU3RzVG9rZW4oZ2F0ZXdheTogc3RyaW5nLCB0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxTVFNUb2tlblJlc3BvbnNlPiB7XG4gIGNvbnN0IHVybCA9IGAke2dhdGV3YXl9L2RlcGxveS9zdHMtdG9rZW5gO1xuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfSxcbiAgfSk7XG5cbiAgaWYgKCFyZXMub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNUUyB0b2tlbiByZXF1ZXN0IGZhaWxlZDogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuICB9XG5cbiAgcmV0dXJuIHJlcy5qc29uKCkgYXMgUHJvbWlzZTxTVFNUb2tlblJlc3BvbnNlPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkRlcGxveShvcHRzOiBEZXBsb3lPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG9wZW5OZXh0RGlyID0gcGF0aC5qb2luKG9wdHMuZGlyLCAnLm9wZW4tbmV4dCcpO1xuICBpZiAoIShhd2FpdCBkaXJFeGlzdHMob3Blbk5leHREaXIpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgLm9wZW4tbmV4dC8gZGlyZWN0b3J5IG5vdCBmb3VuZCBhdCAke29wZW5OZXh0RGlyfWApO1xuICB9XG5cbiAgaWYgKG9wdHMubG9jYWxEZXYpIHtcbiAgICBhd2FpdCBydW5Mb2NhbERlcGxveShvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBydW5DZW50cmFsRGVwbG95KG9wdHMpO1xuICB9XG59XG5cbi8qKlxuICogTG9jYWwtZGV2IOaooeW8j++8muS4jeWGjeaLt+i0nSBhc3NldHMvc2VydmVyLWZ1bmN0aW9ucy9jYWNoZSDliLAgLnBjZy1sb2NhbC/jgIJcbiAqIGBwY2cgc2VydmVgIOebtOaOpeivuyAub3Blbi1uZXh0L++8jOaXoOmcgOS4remXtOaLt+i0neOAglxuICpcbiAqIOS7heS/neeVmeWPr+mAieeahFwi5LiK5LygIGNhY2hlIOWIsCBPU1NcIu+8jOaWueS+v+acrOWcsOa1i+ivleimhuebluecn+WuniBPU1Mg57yT5a2Y6Lev5b6E44CCXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkxvY2FsRGVwbG95KG9wdHM6IERlcGxveU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFvcHRzLmdhdGV3YXkgfHwgIW9wdHMudG9rZW4pIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdbZGVwbG95XSBsb2NhbDogbm90aGluZyB0byBkbyAobm8gLS1nYXRld2F5Ly0tdG9rZW47IHBjZyBzZXJ2ZSByZWFkcyAub3Blbi1uZXh0LyBkaXJlY3RseSknXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnNvbGUubG9nKGBbZGVwbG95XSBsb2NhbDogZmV0Y2hpbmcgU1RTIGNyZWRlbnRpYWxzIGZyb20gJHtvcHRzLmdhdGV3YXl9Li4uYCk7XG4gICAgY29uc3Qgc3RzQ3JlZGVudGlhbHMgPSBhd2FpdCBmZXRjaFN0c1Rva2VuKG9wdHMuZ2F0ZXdheSwgb3B0cy50b2tlbik7XG5cbiAgICBjb25zb2xlLmxvZygnW2RlcGxveV0gbG9jYWw6IHVwbG9hZGluZyBjYWNoZSB0byBPU1MuLi4nKTtcbiAgICBjb25zdCBhZGFwdGVyID0gbmV3IE9TU1VwbG9hZEFkYXB0ZXIoc3RzQ3JlZGVudGlhbHMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1blVwbG9hZENhY2hlKHtcbiAgICAgIGRpcjogb3B0cy5kaXIsXG4gICAgICBhcHBJZDogb3B0cy5hcHBJZCxcbiAgICAgIGJ1aWxkSWQ6IG9wdHMuYnVpbGRJZCxcbiAgICAgIGFkYXB0ZXIsXG4gICAgfSk7XG4gICAgY29uc3Qgb2sgPSByZXN1bHQudG90YWwgLSByZXN1bHQuZmFpbGVkO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtkZXBsb3ldIGxvY2FsIGRlcGxveSBjb21wbGV0ZTogY2xvdWQtY2FjaGU9JHtva30vJHtyZXN1bHQudG90YWx9YFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgY29uc29sZS53YXJuKGBbZGVwbG95XSBsb2NhbDogY2xvdWQgY2FjaGUgdXBsb2FkIGZhaWxlZCAoJHtlcnIubWVzc2FnZX0pYCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuQ2VudHJhbERlcGxveShvcHRzOiBEZXBsb3lPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghb3B0cy5nYXRld2F5IHx8ICFvcHRzLnRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDZW50cmFsIG1vZGUgcmVxdWlyZXMgLS1nYXRld2F5IGFuZCAtLXRva2VuJyk7XG4gIH1cblxuICBjb25zb2xlLmxvZygnW2RlcGxveV0gY2VudHJhbDogcGxhdGZvcm0gZGVwbG95IHN0ZXAgKFRCRCkuLi4nKTtcblxuICBjb25zb2xlLmxvZygnW2RlcGxveV0gY2VudHJhbDogZmV0Y2hpbmcgU1RTIGNyZWRlbnRpYWxzLi4uJyk7XG4gIGNvbnN0IHN0c0NyZWRlbnRpYWxzID0gYXdhaXQgZmV0Y2hTdHNUb2tlbihvcHRzLmdhdGV3YXksIG9wdHMudG9rZW4pO1xuXG4gIGNvbnN0IGFkYXB0ZXIgPSBuZXcgT1NTVXBsb2FkQWRhcHRlcihzdHNDcmVkZW50aWFscyk7XG4gIGNvbnN0IGNhY2hlUmVzdWx0ID0gYXdhaXQgcnVuVXBsb2FkQ2FjaGUoe1xuICAgIGRpcjogb3B0cy5kaXIsXG4gICAgYXBwSWQ6IG9wdHMuYXBwSWQsXG4gICAgYnVpbGRJZDogb3B0cy5idWlsZElkLFxuICAgIGFkYXB0ZXIsXG4gIH0pO1xuXG4gIGNvbnNvbGUubG9nKGBbZGVwbG95XSBjZW50cmFsIGRlcGxveSBjb21wbGV0ZTogY2FjaGU9JHtjYWNoZVJlc3VsdC50b3RhbH1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlcGxveUNvbW1hbmQoKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgnZGVwbG95JylcbiAgICAuZGVzY3JpcHRpb24oJ0RlcGxveSBOZXh0LmpzIGJ1aWxkIGFydGlmYWN0cyB0byBjYWNoZSBnYXRld2F5JylcbiAgICAub3B0aW9uKCctZCwgLS1kaXIgPHBhdGg+JywgJ0J1aWxkIG91dHB1dCBkaXJlY3RvcnknLCAnLicpXG4gICAgLm9wdGlvbignLS1sb2NhbC1kZXYnLCAnTG9jYWwgZGV2IG1vZGU6IG9ubHkgb3B0aW9uYWwgY2FjaGUgdXBsb2FkIChwY2cgc2VydmUgcmVhZHMgLm9wZW4tbmV4dC8gZGlyZWN0bHkpJylcbiAgICAub3B0aW9uKCctLWdhdGV3YXkgPHVybD4nLCAnR2F0ZXdheSBVUkwnKVxuICAgIC5vcHRpb24oJy0tdG9rZW4gPGp3dD4nLCAnSldUIHRva2VuJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBsb2NhbERldiA9IG9wdGlvbnMubG9jYWxEZXYgfHwgcHJvY2Vzcy5lbnYuTE9DQUxfREVWID09PSAndHJ1ZSc7XG4gICAgICBjb25zdCBnYXRld2F5ID0gb3B0aW9ucy5nYXRld2F5IHx8IHByb2Nlc3MuZW52LkNBQ0hFX1NFUlZJQ0VfRU5EUE9JTlQgfHwgKGxvY2FsRGV2ID8gJ2h0dHA6Ly9sb2NhbGhvc3Q6NzAwMScgOiAnJyk7XG4gICAgICBjb25zdCB0b2tlbiA9IG9wdGlvbnMudG9rZW4gfHwgcHJvY2Vzcy5lbnYuQ0FDSEVfQVVUSF9UT0tFTiB8fCAnJztcblxuICAgICAgY29uc3QgYXBwSWQgPSBwcm9jZXNzLmVudi5BUFBfSUQgfHwgJ2xvY2FsX3VzZXIvbG9jYWxfYXBwJztcbiAgICAgIGxldCBidWlsZElkID0gcHJvY2Vzcy5lbnYuQlVJTERfSUQgfHwgJyc7XG4gICAgICBpZiAoIWJ1aWxkSWQpIHtcbiAgICAgICAgY29uc3QgYnVpbGRJZFBhdGggPSBwYXRoLmpvaW4ob3B0aW9ucy5kaXIsICcub3Blbi1uZXh0JywgJ2Fzc2V0cycsICdCVUlMRF9JRCcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJ1aWxkSWQgPSAoYXdhaXQgZnMucmVhZEZpbGUoYnVpbGRJZFBhdGgsICd1dGYtOCcpKS50cmltKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGJ1aWxkSWQgPSAnbG9jYWxfYnVpbGQnO1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW2RlcGxveV0gQlVJTERfSUQgbm90IGZvdW5kIGF0ICR7YnVpbGRJZFBhdGh9LCB1c2luZyBmYWxsYmFjayBcIiR7YnVpbGRJZH1cImApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHJ1bkRlcGxveSh7XG4gICAgICAgIGRpcjogb3B0aW9ucy5kaXIsXG4gICAgICAgIGxvY2FsRGV2LFxuICAgICAgICBnYXRld2F5LFxuICAgICAgICB0b2tlbixcbiAgICAgICAgYXBwSWQsXG4gICAgICAgIGJ1aWxkSWQsXG4gICAgICB9KTtcbiAgICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { CacheRefreshResponse } from '../_protocol';
|
|
3
|
+
export interface PurgeOptions {
|
|
4
|
+
gateway?: string;
|
|
5
|
+
secret?: string;
|
|
6
|
+
aliuid?: string;
|
|
7
|
+
routinename?: string;
|
|
8
|
+
version?: string;
|
|
9
|
+
hostname: string;
|
|
10
|
+
siteId: string | number;
|
|
11
|
+
urls: string[];
|
|
12
|
+
json?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function runPurge(opts: PurgeOptions): Promise<CacheRefreshResponse>;
|
|
15
|
+
export declare function createPurgeCommand(): Command;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPurgeCommand = exports.runPurge = void 0;
|
|
4
|
+
const fs = require("fs/promises");
|
|
5
|
+
const commander_1 = require("commander");
|
|
6
|
+
const gateway_auth_1 = require("../runtime/gateway-auth");
|
|
7
|
+
const PURGE_TIMEOUT_MS = 30000;
|
|
8
|
+
function resolveConfig(opts) {
|
|
9
|
+
const gateway = opts.gateway || process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;
|
|
10
|
+
const secret = opts.secret || process.env.ESA_CACHE_GW_AUTH_KEY;
|
|
11
|
+
const aliuid = opts.aliuid || process.env.ESA_CACHE_GW_ALIUID;
|
|
12
|
+
const routinename = opts.routinename || process.env.ESA_CACHE_GW_ROUTINENAME;
|
|
13
|
+
const version = opts.version || process.env.ESA_CACHE_GW_VERSION;
|
|
14
|
+
const missing = [];
|
|
15
|
+
if (!gateway)
|
|
16
|
+
missing.push('--gateway / ESA_CACHE_GW_GATEWAY_ENDPOINT');
|
|
17
|
+
if (!secret)
|
|
18
|
+
missing.push('--secret / ESA_CACHE_GW_AUTH_KEY');
|
|
19
|
+
if (!aliuid)
|
|
20
|
+
missing.push('--aliuid / ESA_CACHE_GW_ALIUID');
|
|
21
|
+
if (!routinename)
|
|
22
|
+
missing.push('--routinename / ESA_CACHE_GW_ROUTINENAME');
|
|
23
|
+
if (!version)
|
|
24
|
+
missing.push('--version / ESA_CACHE_GW_VERSION');
|
|
25
|
+
if (missing.length > 0) {
|
|
26
|
+
throw new Error(`Missing gateway auth config: ${missing.join(', ')}`);
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
gatewayUrl: gateway.replace(/\/+$/, ''),
|
|
30
|
+
secret: secret,
|
|
31
|
+
aliuid: aliuid,
|
|
32
|
+
routinename: routinename,
|
|
33
|
+
version: version,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
async function readStdin() {
|
|
37
|
+
const chunks = [];
|
|
38
|
+
for await (const chunk of process.stdin) {
|
|
39
|
+
chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
|
|
40
|
+
}
|
|
41
|
+
return Buffer.concat(chunks).toString('utf-8');
|
|
42
|
+
}
|
|
43
|
+
async function loadUrlsFile(filePath) {
|
|
44
|
+
const content = filePath === '-' ? await readStdin() : await fs.readFile(filePath, 'utf-8');
|
|
45
|
+
return content
|
|
46
|
+
.split(/\r?\n/)
|
|
47
|
+
.map(line => line.trim())
|
|
48
|
+
.filter(line => line.length > 0 && !line.startsWith('#'));
|
|
49
|
+
}
|
|
50
|
+
function dedupe(urls) {
|
|
51
|
+
return Array.from(new Set(urls.map(u => u.trim()).filter(Boolean)));
|
|
52
|
+
}
|
|
53
|
+
async function runPurge(opts) {
|
|
54
|
+
if (!opts.hostname)
|
|
55
|
+
throw new Error('hostname is required');
|
|
56
|
+
if (opts.siteId === undefined || opts.siteId === null || opts.siteId === '') {
|
|
57
|
+
throw new Error('siteId is required');
|
|
58
|
+
}
|
|
59
|
+
if (!Array.isArray(opts.urls) || opts.urls.length === 0) {
|
|
60
|
+
throw new Error('urls must be a non-empty array');
|
|
61
|
+
}
|
|
62
|
+
const cfg = resolveConfig(opts);
|
|
63
|
+
const body = {
|
|
64
|
+
hostname: opts.hostname,
|
|
65
|
+
siteId: opts.siteId,
|
|
66
|
+
urls: opts.urls,
|
|
67
|
+
};
|
|
68
|
+
const res = await (0, gateway_auth_1.gatewayFetch)(cfg, '/cache/refresh', {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
headers: { 'Content-Type': 'application/json' },
|
|
71
|
+
body: JSON.stringify(body),
|
|
72
|
+
timeoutMs: PURGE_TIMEOUT_MS,
|
|
73
|
+
});
|
|
74
|
+
const text = await res.text();
|
|
75
|
+
let payload;
|
|
76
|
+
try {
|
|
77
|
+
payload = text ? JSON.parse(text) : {};
|
|
78
|
+
}
|
|
79
|
+
catch (_a) {
|
|
80
|
+
throw new Error(`Cache refresh: HTTP ${res.status}, non-JSON response: ${text.slice(0, 200)}`);
|
|
81
|
+
}
|
|
82
|
+
if (!res.ok) {
|
|
83
|
+
const msg = (payload === null || payload === void 0 ? void 0 : payload.error) || `HTTP ${res.status}`;
|
|
84
|
+
throw new Error(`Cache refresh failed: ${msg}`);
|
|
85
|
+
}
|
|
86
|
+
return payload;
|
|
87
|
+
}
|
|
88
|
+
exports.runPurge = runPurge;
|
|
89
|
+
function createPurgeCommand() {
|
|
90
|
+
return new commander_1.Command('purge')
|
|
91
|
+
.description('Refresh CDN cache for a list of URLs via the gateway')
|
|
92
|
+
.option('--gateway <url>', 'Gateway URL (env: ESA_CACHE_GW_GATEWAY_ENDPOINT)')
|
|
93
|
+
.option('--secret <key>', 'HMAC secret (env: ESA_CACHE_GW_AUTH_KEY)')
|
|
94
|
+
.option('--aliuid <uid>', 'AliUid (env: ESA_CACHE_GW_ALIUID)')
|
|
95
|
+
.option('--routinename <name>', 'Routine name (env: ESA_CACHE_GW_ROUTINENAME)')
|
|
96
|
+
.option('--version <ver>', 'Version (env: ESA_CACHE_GW_VERSION)')
|
|
97
|
+
.requiredOption('-H, --hostname <host>', 'Hostname to refresh')
|
|
98
|
+
.requiredOption('-s, --site-id <id>', 'ESA siteId associated with hostname')
|
|
99
|
+
.option('-u, --url <url...>', 'URLs to refresh (repeatable / variadic)')
|
|
100
|
+
.option('-f, --urls-file <path>', 'File with one URL per line ("-" reads stdin; lines starting with "#" are skipped)')
|
|
101
|
+
.option('--json', 'Output raw JSON response instead of human-readable text')
|
|
102
|
+
.action(async (options) => {
|
|
103
|
+
var _a, _b, _c;
|
|
104
|
+
const fileUrls = options.urlsFile
|
|
105
|
+
? await loadUrlsFile(options.urlsFile)
|
|
106
|
+
: [];
|
|
107
|
+
const flagUrls = Array.isArray(options.url) ? options.url : [];
|
|
108
|
+
const urls = dedupe([...flagUrls, ...fileUrls]);
|
|
109
|
+
try {
|
|
110
|
+
const result = await runPurge({
|
|
111
|
+
gateway: options.gateway,
|
|
112
|
+
secret: options.secret,
|
|
113
|
+
aliuid: options.aliuid,
|
|
114
|
+
routinename: options.routinename,
|
|
115
|
+
version: options.version,
|
|
116
|
+
hostname: options.hostname,
|
|
117
|
+
siteId: options.siteId,
|
|
118
|
+
urls,
|
|
119
|
+
json: options.json,
|
|
120
|
+
});
|
|
121
|
+
if (options.json) {
|
|
122
|
+
console.log(JSON.stringify(result, null, 2));
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
console.log(`[purge] ok: backend=${result.backend} taskId=${(_a = result.taskId) !== null && _a !== void 0 ? _a : '-'} purged=${result.purgedUrlCount} apiRequestId=${(_b = result.apiRequestId) !== null && _b !== void 0 ? _b : '-'}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
console.error(`[purge] ${(_c = err === null || err === void 0 ? void 0 : err.message) !== null && _c !== void 0 ? _c : String(err)}`);
|
|
130
|
+
process.exitCode = 1;
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
exports.createPurgeCommand = createPurgeCommand;
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvcHVyZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0NBQWtDO0FBQ2xDLHlDQUFvQztBQUtwQywwREFBMEU7QUFFMUUsTUFBTSxnQkFBZ0IsR0FBRyxLQUFNLENBQUM7QUFnQmhDLFNBQVMsYUFBYSxDQUFDLElBQWtCO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQztJQUMxRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDO0lBQzlELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQztJQUM3RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7SUFFakUsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0lBQ3hFLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQzlELElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQzVELElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzNFLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxDQUFDLElB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MUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dCQUN0QixJQUFJO2dCQUNKLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTthQUNuQixDQUFDLENBQUM7WUFFSCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7Z0JBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDOUM7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FDVCx1QkFBdUIsTUFBTSxDQUFDLE9BQU8sV0FBVyxNQUFBLE1BQU0sQ0FBQyxNQUFNLG1DQUFJLEdBQUcsV0FBVyxNQUFNLENBQUMsY0FBYyxpQkFBaUIsTUFBQSxNQUFNLENBQUMsWUFBWSxtQ0FBSSxHQUFHLEVBQUUsQ0FDbEosQ0FBQzthQUNIO1NBQ0Y7UUFBQyxPQUFPLEdBQVEsRUFBRTtZQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsTUFBQSxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsT0FBTyxtQ0FBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hELE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBbkRELGdEQW1EQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHtcbiAgQ2FjaGVSZWZyZXNoUmVxdWVzdCxcbiAgQ2FjaGVSZWZyZXNoUmVzcG9uc2UsXG59IGZyb20gJ0BwY2cvcHJvdG9jb2wnO1xuaW1wb3J0IHsgR2F0ZXdheUF1dGhDb25maWcsIGdhdGV3YXlGZXRjaCB9IGZyb20gJy4uL3J1bnRpbWUvZ2F0ZXdheS1hdXRoJztcblxuY29uc3QgUFVSR0VfVElNRU9VVF9NUyA9IDMwXzAwMDtcblxuZXhwb3J0IGludGVyZmFjZSBQdXJnZU9wdGlvbnMge1xuICBnYXRld2F5Pzogc3RyaW5nO1xuICBzZWNyZXQ/OiBzdHJpbmc7XG4gIGFsaXVpZD86IHN0cmluZztcbiAgcm91dGluZW5hbWU/OiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGhvc3RuYW1lOiBzdHJpbmc7XG4gIHNpdGVJZDogc3RyaW5nIHwgbnVtYmVyO1xuICB1cmxzOiBzdHJpbmdbXTtcbiAganNvbj86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSZXNvbHZlZENvbmZpZyBleHRlbmRzIEdhdGV3YXlBdXRoQ29uZmlnIHt9XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25maWcob3B0czogUHVyZ2VPcHRpb25zKTogUmVzb2x2ZWRDb25maWcge1xuICBjb25zdCBnYXRld2F5ID0gb3B0cy5nYXRld2F5IHx8IHByb2Nlc3MuZW52LkVTQV9DQUNIRV9HV19HQVRFV0FZX0VORFBPSU5UO1xuICBjb25zdCBzZWNyZXQgPSBvcHRzLnNlY3JldCB8fCBwcm9jZXNzLmVudi5FU0FfQ0FDSEVfR1dfQVVUSF9LRVk7XG4gIGNvbnN0IGFsaXVpZCA9IG9wdHMuYWxpdWlkIHx8IHByb2Nlc3MuZW52LkVTQV9DQUNIRV9HV19BTElVSUQ7XG4gIGNvbnN0IHJvdXRpbmVuYW1lID0gb3B0cy5yb3V0aW5lbmFtZSB8fCBwcm9jZXNzLmVudi5FU0FfQ0FDSEVfR1dfUk9VVElORU5BTUU7XG4gIGNvbnN0IHZlcnNpb24gPSBvcHRzLnZlcnNpb24gfHwgcHJvY2Vzcy5lbnYuRVNBX0NBQ0hFX0dXX1ZFUlNJT047XG5cbiAgY29uc3QgbWlzc2luZzogc3RyaW5nW10gPSBbXTtcbiAgaWYgKCFnYXRld2F5KSBtaXNzaW5nLnB1c2goJy0tZ2F0ZXdheSAvIEVTQV9DQUNIRV9HV19HQVRFV0FZX0VORFBPSU5UJyk7XG4gIGlmICghc2VjcmV0KSBtaXNzaW5nLnB1c2goJy0tc2VjcmV0IC8gRVNBX0NBQ0hFX0dXX0FVVEhfS0VZJyk7XG4gIGlmICghYWxpdWlkKSBtaXNzaW5nLnB1c2goJy0tYWxpdWlkIC8gRVNBX0NBQ0hFX0dXX0FMSVVJRCcpO1xuICBpZiAoIXJvdXRpbmVuYW1lKSBtaXNzaW5nLnB1c2goJy0tcm91dGluZW5hbWUgLyBFU0FfQ0FDSEVfR1dfUk9VVElORU5BTUUnKTtcbiAgaWYgKCF2ZXJzaW9uKSBtaXNzaW5nLnB1c2goJy0tdmVyc2lvbiAvIEVTQV9DQUNIRV9HV19WRVJTSU9OJyk7XG4gIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZ2F0ZXdheSBhdXRoIGNvbmZpZzogJHttaXNzaW5nLmpvaW4oJywgJyl9YCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdhdGV3YXlVcmw6IGdhdGV3YXkhLnJlcGxhY2UoL1xcLyskLywgJycpLFxuICAgIHNlY3JldDogc2VjcmV0ISxcbiAgICBhbGl1aWQ6IGFsaXVpZCEsXG4gICAgcm91dGluZW5hbWU6IHJvdXRpbmVuYW1lISxcbiAgICB2ZXJzaW9uOiB2ZXJzaW9uISxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFN0ZGluKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBwcm9jZXNzLnN0ZGluKSB7XG4gICAgY2h1bmtzLnB1c2godHlwZW9mIGNodW5rID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKGNodW5rKSA6IGNodW5rKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKCd1dGYtOCcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkVXJsc0ZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgY29udGVudCA9XG4gICAgZmlsZVBhdGggPT09ICctJyA/IGF3YWl0IHJlYWRTdGRpbigpIDogYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICByZXR1cm4gY29udGVudFxuICAgIC5zcGxpdCgvXFxyP1xcbi8pXG4gICAgLm1hcChsaW5lID0+IGxpbmUudHJpbSgpKVxuICAgIC5maWx0ZXIobGluZSA9PiBsaW5lLmxlbmd0aCA+IDAgJiYgIWxpbmUuc3RhcnRzV2l0aCgnIycpKTtcbn1cblxuZnVuY3Rpb24gZGVkdXBlKHVybHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHVybHMubWFwKHUgPT4gdS50cmltKCkpLmZpbHRlcihCb29sZWFuKSkpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuUHVyZ2UoXG4gIG9wdHM6IFB1cmdlT3B0aW9uc1xuKTogUHJvbWlzZTxDYWNoZVJlZnJlc2hSZXNwb25zZT4ge1xuICBpZiAoIW9wdHMuaG9zdG5hbWUpIHRocm93IG5ldyBFcnJvcignaG9zdG5hbWUgaXMgcmVxdWlyZWQnKTtcbiAgaWYgKG9wdHMuc2l0ZUlkID09PSB1bmRlZmluZWQgfHwgb3B0cy5zaXRlSWQgPT09IG51bGwgfHwgb3B0cy5zaXRlSWQgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzaXRlSWQgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICBpZiAoIUFycmF5LmlzQXJyYXkob3B0cy51cmxzKSB8fCBvcHRzLnVybHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1cmxzIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXknKTtcbiAgfVxuXG4gIGNvbnN0IGNmZyA9IHJlc29sdmVDb25maWcob3B0cyk7XG4gIGNvbnN0IGJvZHk6IENhY2hlUmVmcmVzaFJlcXVlc3QgPSB7XG4gICAgaG9zdG5hbWU6IG9wdHMuaG9zdG5hbWUsXG4gICAgc2l0ZUlkOiBvcHRzLnNpdGVJZCxcbiAgICB1cmxzOiBvcHRzLnVybHMsXG4gIH07XG5cbiAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNmZywgJy9jYWNoZS9yZWZyZXNoJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIHRpbWVvdXRNczogUFVSR0VfVElNRU9VVF9NUyxcbiAgfSk7XG5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gIGxldCBwYXlsb2FkOiBhbnk7XG4gIHRyeSB7XG4gICAgcGF5bG9hZCA9IHRleHQgPyBKU09OLnBhcnNlKHRleHQpIDoge307XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYWNoZSByZWZyZXNoOiBIVFRQICR7cmVzLnN0YXR1c30sIG5vbi1KU09OIHJlc3BvbnNlOiAke3RleHQuc2xpY2UoMCwgMjAwKX1gXG4gICAgKTtcbiAgfVxuXG4gIGlmICghcmVzLm9rKSB7XG4gICAgY29uc3QgbXNnID0gcGF5bG9hZD8uZXJyb3IgfHwgYEhUVFAgJHtyZXMuc3RhdHVzfWA7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYWNoZSByZWZyZXNoIGZhaWxlZDogJHttc2d9YCk7XG4gIH1cblxuICByZXR1cm4gcGF5bG9hZCBhcyBDYWNoZVJlZnJlc2hSZXNwb25zZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVB1cmdlQ29tbWFuZCgpOiBDb21tYW5kIHtcbiAgcmV0dXJuIG5ldyBDb21tYW5kKCdwdXJnZScpXG4gICAgLmRlc2NyaXB0aW9uKCdSZWZyZXNoIENETiBjYWNoZSBmb3IgYSBsaXN0IG9mIFVSTHMgdmlhIHRoZSBnYXRld2F5JylcbiAgICAub3B0aW9uKCctLWdhdGV3YXkgPHVybD4nLCAnR2F0ZXdheSBVUkwgKGVudjogRVNBX0NBQ0hFX0dXX0dBVEVXQVlfRU5EUE9JTlQpJylcbiAgICAub3B0aW9uKCctLXNlY3JldCA8a2V5PicsICdITUFDIHNlY3JldCAoZW52OiBFU0FfQ0FDSEVfR1dfQVVUSF9LRVkpJylcbiAgICAub3B0aW9uKCctLWFsaXVpZCA8dWlkPicsICdBbGlVaWQgKGVudjogRVNBX0NBQ0hFX0dXX0FMSVVJRCknKVxuICAgIC5vcHRpb24oXG4gICAgICAnLS1yb3V0aW5lbmFtZSA8bmFtZT4nLFxuICAgICAgJ1JvdXRpbmUgbmFtZSAoZW52OiBFU0FfQ0FDSEVfR1dfUk9VVElORU5BTUUpJ1xuICAgIClcbiAgICAub3B0aW9uKCctLXZlcnNpb24gPHZlcj4nLCAnVmVyc2lvbiAoZW52OiBFU0FfQ0FDSEVfR1dfVkVSU0lPTiknKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLUgsIC0taG9zdG5hbWUgPGhvc3Q+JywgJ0hvc3RuYW1lIHRvIHJlZnJlc2gnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLXMsIC0tc2l0ZS1pZCA8aWQ+JywgJ0VTQSBzaXRlSWQgYXNzb2NpYXRlZCB3aXRoIGhvc3RuYW1lJylcbiAgICAub3B0aW9uKCctdSwgLS11cmwgPHVybC4uLj4nLCAnVVJMcyB0byByZWZyZXNoIChyZXBlYXRhYmxlIC8gdmFyaWFkaWMpJylcbiAgICAub3B0aW9uKFxuICAgICAgJy1mLCAtLXVybHMtZmlsZSA8cGF0aD4nLFxuICAgICAgJ0ZpbGUgd2l0aCBvbmUgVVJMIHBlciBsaW5lIChcIi1cIiByZWFkcyBzdGRpbjsgbGluZXMgc3RhcnRpbmcgd2l0aCBcIiNcIiBhcmUgc2tpcHBlZCknXG4gICAgKVxuICAgIC5vcHRpb24oJy0tanNvbicsICdPdXRwdXQgcmF3IEpTT04gcmVzcG9uc2UgaW5zdGVhZCBvZiBodW1hbi1yZWFkYWJsZSB0ZXh0JylcbiAgICAuYWN0aW9uKGFzeW5jIG9wdGlvbnMgPT4ge1xuICAgICAgY29uc3QgZmlsZVVybHMgPSBvcHRpb25zLnVybHNGaWxlXG4gICAgICAgID8gYXdhaXQgbG9hZFVybHNGaWxlKG9wdGlvbnMudXJsc0ZpbGUpXG4gICAgICAgIDogW107XG4gICAgICBjb25zdCBmbGFnVXJsczogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KG9wdGlvbnMudXJsKSA/IG9wdGlvbnMudXJsIDogW107XG4gICAgICBjb25zdCB1cmxzID0gZGVkdXBlKFsuLi5mbGFnVXJscywgLi4uZmlsZVVybHNdKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuUHVyZ2Uoe1xuICAgICAgICAgIGdhdGV3YXk6IG9wdGlvbnMuZ2F0ZXdheSxcbiAgICAgICAgICBzZWNyZXQ6IG9wdGlvbnMuc2VjcmV0LFxuICAgICAgICAgIGFsaXVpZDogb3B0aW9ucy5hbGl1aWQsXG4gICAgICAgICAgcm91dGluZW5hbWU6IG9wdGlvbnMucm91dGluZW5hbWUsXG4gICAgICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uLFxuICAgICAgICAgIGhvc3RuYW1lOiBvcHRpb25zLmhvc3RuYW1lLFxuICAgICAgICAgIHNpdGVJZDogb3B0aW9ucy5zaXRlSWQsXG4gICAgICAgICAgdXJscyxcbiAgICAgICAgICBqc29uOiBvcHRpb25zLmpzb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBbcHVyZ2VdIG9rOiBiYWNrZW5kPSR7cmVzdWx0LmJhY2tlbmR9IHRhc2tJZD0ke3Jlc3VsdC50YXNrSWQgPz8gJy0nfSBwdXJnZWQ9JHtyZXN1bHQucHVyZ2VkVXJsQ291bnR9IGFwaVJlcXVlc3RJZD0ke3Jlc3VsdC5hcGlSZXF1ZXN0SWQgPz8gJy0nfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbcHVyZ2VdICR7ZXJyPy5tZXNzYWdlID8/IFN0cmluZyhlcnIpfWApO1xuICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export interface ServeOptions {
|
|
3
|
+
dir: string;
|
|
4
|
+
port: number;
|
|
5
|
+
gateway?: string;
|
|
6
|
+
/** 本地便利:`<aliuid>/<routinename>`,内部拆成 ESA_CACHE_GW_ALIUID + ROUTINENAME */
|
|
7
|
+
appId?: string;
|
|
8
|
+
/** HMAC secret,注入到 ESA_CACHE_GW_AUTH_KEY。优先级高于 token。 */
|
|
9
|
+
secret?: string;
|
|
10
|
+
/** @deprecated 旧 JWT,已不再使用,仅保留向后兼容 */
|
|
11
|
+
token?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function runServe(opts: ServeOptions): Promise<void>;
|
|
14
|
+
export declare function createServeCommand(): Command;
|