esa-pcg-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -0
  3. package/dist/_inline-overrides.js +7 -0
  4. package/dist/_protocol/endpoints.d.ts +14 -0
  5. package/dist/_protocol/endpoints.js +24 -0
  6. package/dist/_protocol/index.d.ts +3 -0
  7. package/dist/_protocol/index.js +20 -0
  8. package/dist/_protocol/keys.d.ts +27 -0
  9. package/dist/_protocol/keys.js +36 -0
  10. package/dist/_protocol/types.d.ts +72 -0
  11. package/dist/_protocol/types.js +3 -0
  12. package/dist/adapters/adapter.interface.d.ts +8 -0
  13. package/dist/adapters/adapter.interface.js +3 -0
  14. package/dist/adapters/converters/passthrough.d.ts +16 -0
  15. package/dist/adapters/converters/passthrough.js +19 -0
  16. package/dist/adapters/index.d.ts +3 -0
  17. package/dist/adapters/index.js +8 -0
  18. package/dist/adapters/local-fs.adapter.d.ts +12 -0
  19. package/dist/adapters/local-fs.adapter.js +37 -0
  20. package/dist/adapters/oss.adapter.d.ts +13 -0
  21. package/dist/adapters/oss.adapter.js +26 -0
  22. package/dist/adapters/wrappers/node-server.d.ts +57 -0
  23. package/dist/adapters/wrappers/node-server.js +282 -0
  24. package/dist/bin/cli.d.ts +2 -0
  25. package/dist/bin/cli.js +21 -0
  26. package/dist/commands/build.d.ts +10 -0
  27. package/dist/commands/build.js +247 -0
  28. package/dist/commands/deploy.d.ts +11 -0
  29. package/dist/commands/deploy.js +116 -0
  30. package/dist/commands/purge.d.ts +15 -0
  31. package/dist/commands/purge.js +135 -0
  32. package/dist/commands/serve.d.ts +14 -0
  33. package/dist/commands/serve.js +162 -0
  34. package/dist/commands/upload-assets.d.ts +12 -0
  35. package/dist/commands/upload-assets.js +46 -0
  36. package/dist/commands/upload-cache.d.ts +13 -0
  37. package/dist/commands/upload-cache.js +70 -0
  38. package/dist/compile/compileCacheAssetsManifest.d.ts +1 -0
  39. package/dist/compile/compileCacheAssetsManifest.js +67 -0
  40. package/dist/config/default-open-next-config.d.ts +3 -0
  41. package/dist/config/default-open-next-config.js +30 -0
  42. package/dist/index.d.ts +13 -0
  43. package/dist/index.js +36 -0
  44. package/dist/overrides/incrementalCache/gateway.d.ts +32 -0
  45. package/dist/overrides/incrementalCache/gateway.js +160 -0
  46. package/dist/overrides/tagCache/gateway.d.ts +26 -0
  47. package/dist/overrides/tagCache/gateway.js +211 -0
  48. package/dist/runtime/gateway-auth.d.ts +51 -0
  49. package/dist/runtime/gateway-auth.js +121 -0
  50. package/dist/runtime/image-proxy.d.ts +16 -0
  51. package/dist/runtime/image-proxy.js +149 -0
  52. package/dist/util/fs.d.ts +3 -0
  53. package/dist/util/fs.js +39 -0
  54. package/package.json +47 -0
  55. package/runtime/pcg-image-loader.js +13 -0
@@ -0,0 +1,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;