@ethlete/cli 3.0.0-next.16 → 3.0.0-next.18

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 (58) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +8 -0
  3. package/package.json +1 -1
  4. package/src/lib/api/api-context.d.ts +15 -0
  5. package/src/lib/api/api-context.js +23 -0
  6. package/src/lib/api/api-context.js.map +1 -0
  7. package/src/lib/api/api-state.d.ts +31 -0
  8. package/src/lib/api/api-state.js +80 -0
  9. package/src/lib/api/api-state.js.map +1 -0
  10. package/src/lib/api/definition.d.ts +37 -1
  11. package/src/lib/api/definition.js +12 -2
  12. package/src/lib/api/definition.js.map +1 -1
  13. package/src/lib/api/doctor.d.ts +16 -0
  14. package/src/lib/api/doctor.js +71 -0
  15. package/src/lib/api/doctor.js.map +1 -0
  16. package/src/lib/api/fingerprint.d.ts +18 -0
  17. package/src/lib/api/fingerprint.js +63 -0
  18. package/src/lib/api/fingerprint.js.map +1 -0
  19. package/src/lib/api/git.d.ts +2 -0
  20. package/src/lib/api/git.js +7 -1
  21. package/src/lib/api/git.js.map +1 -1
  22. package/src/lib/api/help.js +31 -4
  23. package/src/lib/api/help.js.map +1 -1
  24. package/src/lib/api/index.d.ts +4 -0
  25. package/src/lib/api/index.js +4 -0
  26. package/src/lib/api/index.js.map +1 -1
  27. package/src/lib/api/load-definitions.js +3 -0
  28. package/src/lib/api/load-definitions.js.map +1 -1
  29. package/src/lib/api/lock.d.ts +46 -0
  30. package/src/lib/api/lock.js +144 -0
  31. package/src/lib/api/lock.js.map +1 -0
  32. package/src/lib/api/parse-argv.d.ts +12 -0
  33. package/src/lib/api/parse-argv.js +31 -0
  34. package/src/lib/api/parse-argv.js.map +1 -0
  35. package/src/lib/api/run-locked.d.ts +14 -0
  36. package/src/lib/api/run-locked.js +62 -0
  37. package/src/lib/api/run-locked.js.map +1 -0
  38. package/src/lib/api/run-ready.d.ts +60 -0
  39. package/src/lib/api/run-ready.js +212 -0
  40. package/src/lib/api/run-ready.js.map +1 -0
  41. package/src/lib/api/run-snapshot.d.ts +33 -0
  42. package/src/lib/api/run-snapshot.js +124 -0
  43. package/src/lib/api/run-snapshot.js.map +1 -0
  44. package/src/lib/api/run-status.d.ts +9 -0
  45. package/src/lib/api/run-status.js +55 -0
  46. package/src/lib/api/run-status.js.map +1 -0
  47. package/src/lib/api/run.d.ts +1 -1
  48. package/src/lib/api/run.js +192 -9
  49. package/src/lib/api/run.js.map +1 -1
  50. package/src/lib/api/seeds.d.ts +55 -0
  51. package/src/lib/api/seeds.js +215 -0
  52. package/src/lib/api/seeds.js.map +1 -0
  53. package/src/lib/api/snapshot.d.ts +63 -0
  54. package/src/lib/api/snapshot.js +132 -0
  55. package/src/lib/api/snapshot.js.map +1 -0
  56. package/src/lib/api/validate-definition.d.ts +7 -0
  57. package/src/lib/api/validate-definition.js +79 -0
  58. package/src/lib/api/validate-definition.js.map +1 -0
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runReadyCommand = exports.waitForHealth = exports.resolveProfileSeeds = exports.HEALTH_RETRY_MS = exports.HEALTH_TIMEOUT_MS = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs_1 = require("fs");
6
+ const promises_1 = require("timers/promises");
7
+ const api_context_1 = require("./api-context");
8
+ const api_state_1 = require("./api-state");
9
+ const compose_1 = require("./compose");
10
+ const doctor_1 = require("./doctor");
11
+ const fingerprint_1 = require("./fingerprint");
12
+ const lock_1 = require("./lock");
13
+ const resolve_checkout_1 = require("./resolve-checkout");
14
+ const run_locked_1 = require("./run-locked");
15
+ const run_snapshot_1 = require("./run-snapshot");
16
+ const seeds_1 = require("./seeds");
17
+ const suggest_1 = require("./suggest");
18
+ const snapshot_1 = require("./snapshot");
19
+ exports.HEALTH_TIMEOUT_MS = 60000;
20
+ exports.HEALTH_RETRY_MS = 2000;
21
+ const has = (record, key) => Object.prototype.hasOwnProperty.call(record, key);
22
+ /** Each name is `fixtures`, a seed of `.ethlete/seeds/<api>/seeds.json`, or an `exec` entry, checked in that order. */
23
+ const resolveProfileSeeds = (options) => {
24
+ var _a, _b;
25
+ const { root, name, api, profileName, seeds } = options;
26
+ const manifest = (0, seeds_1.readSeedManifest)(root, name);
27
+ const units = [];
28
+ for (const seed of seeds) {
29
+ const fromManifest = manifest.ok && (seed === 'fixtures' ? manifest.value.fixtures !== undefined : has(manifest.value.seeds, seed))
30
+ ? (0, seeds_1.seedSteps)({
31
+ manifest: manifest.value,
32
+ names: seed === 'fixtures' ? [] : [seed],
33
+ withFixtures: seed === 'fixtures',
34
+ api: name,
35
+ })
36
+ : undefined;
37
+ if (fromManifest === null || fromManifest === void 0 ? void 0 : fromManifest.ok) {
38
+ const last = units[units.length - 1];
39
+ if ((last === null || last === void 0 ? void 0 : last.kind) === 'steps')
40
+ last.steps.push(...fromManifest.value);
41
+ else
42
+ units.push({ kind: 'steps', steps: [...fromManifest.value] });
43
+ continue;
44
+ }
45
+ if (((_a = api.exec) === null || _a === void 0 ? void 0 : _a[seed]) !== undefined) {
46
+ units.push({ kind: 'exec', name: seed });
47
+ continue;
48
+ }
49
+ const candidates = [
50
+ ...(manifest.ok && manifest.value.fixtures ? ['fixtures'] : []),
51
+ ...(manifest.ok ? Object.keys(manifest.value.seeds) : []),
52
+ ...Object.keys((_b = api.exec) !== null && _b !== void 0 ? _b : {}),
53
+ ];
54
+ return {
55
+ ok: false,
56
+ problem: `The ${profileName} profile of the ${name} API names "${seed}", which is no seed, fixtures list or exec entry.` +
57
+ `${(0, suggest_1.didYouMean)(seed, candidates)}\n\nKnown: ${candidates.length > 0 ? candidates.join(', ') : 'none'}` +
58
+ (manifest.ok ? '' : `\n\n${manifest.problem}`),
59
+ };
60
+ }
61
+ return { ok: true, value: units };
62
+ };
63
+ exports.resolveProfileSeeds = resolveProfileSeeds;
64
+ /** GETs `url` until it answers `expect`, every `retryMs` for up to `timeoutMs`. */
65
+ const waitForHealth = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
66
+ const { url, expect, fetch: get = fetch, sleep = (ms) => tslib_1.__awaiter(void 0, void 0, void 0, function* () { return void (yield (0, promises_1.setTimeout)(ms)); }), now = Date.now, timeoutMs = exports.HEALTH_TIMEOUT_MS, retryMs = exports.HEALTH_RETRY_MS, } = options;
67
+ const startedAt = now();
68
+ for (;;) {
69
+ let last;
70
+ try {
71
+ const left = Math.max(1, timeoutMs - (now() - startedAt));
72
+ const response = yield get(url, { signal: AbortSignal.timeout(Math.min(retryMs * 5, left)) });
73
+ if (response.status === expect)
74
+ return { ok: true };
75
+ last = `status ${response.status}`;
76
+ }
77
+ catch (error) {
78
+ last = error.message;
79
+ }
80
+ if (now() - startedAt >= timeoutMs)
81
+ return { ok: false, last };
82
+ yield sleep(retryMs);
83
+ }
84
+ });
85
+ exports.waitForHealth = waitForHealth;
86
+ const step = (text) => console.error(`\n==> ${text}`);
87
+ /** Runs `ready <api> --profile <p>` and returns the exit code. */
88
+ const runReadyCommand = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
89
+ var _a, _b, _c, _d, _e;
90
+ const { root, name, api, invocation, profile: profileName, wait, now = Date.now } = options;
91
+ const startedAt = now();
92
+ const profileNames = Object.keys((_a = api.profiles) !== null && _a !== void 0 ? _a : {});
93
+ const profile = profileName === undefined ? undefined : (_b = api.profiles) === null || _b === void 0 ? void 0 : _b[profileName];
94
+ if (profileName === undefined || profile === undefined) {
95
+ console.error((profileName === undefined
96
+ ? `ready needs a profile: ${invocation} ready ${name} --profile <profile>.`
97
+ : `The ${name} API has no profile "${profileName}".${(0, suggest_1.didYouMean)(profileName, profileNames)}`) +
98
+ `\n\nProfiles: ${profileNames.length > 0 ? profileNames.join(', ') : 'none'}`);
99
+ return 1;
100
+ }
101
+ const units = (0, exports.resolveProfileSeeds)({ root, name, api, profileName, seeds: profile.seeds });
102
+ if (!units.ok) {
103
+ console.error(units.problem);
104
+ return 1;
105
+ }
106
+ const context = (0, api_context_1.stateDirectoryOf)({ root, name, api });
107
+ if (!context.ok) {
108
+ console.error((0, resolve_checkout_1.checkoutProblem)({ failure: context, name, invocation }));
109
+ return 1;
110
+ }
111
+ const tool = (0, compose_1.resolveComposeTool)();
112
+ if (!tool) {
113
+ console.error(`No compose tool found. Tried: ${(0, compose_1.composeToolNames)().join(', ')}.`);
114
+ return 1;
115
+ }
116
+ const { checkout, directory } = context;
117
+ const env = Object.assign(Object.assign(Object.assign({}, (0, compose_1.engineEnv)(tool.engine)), process.env), (0, api_context_1.definedEntries)((_d = (_c = api.env) === null || _c === void 0 ? void 0 : _c.call(api)) !== null && _d !== void 0 ? _d : {}));
118
+ let token;
119
+ if ((0, lock_1.heldLockFromEnv)(directory)) {
120
+ step('Using the API lock this command runs under');
121
+ }
122
+ else {
123
+ step('Taking the API lock');
124
+ const acquired = yield (0, lock_1.acquireApiLock)({
125
+ directory,
126
+ command: `${invocation} ready ${name} --profile ${profileName}`,
127
+ cwd: root,
128
+ wait,
129
+ system: options.lockSystem,
130
+ onHeld: (holder) => console.error(`Waiting for the API lock, held by ${(0, lock_1.describeApiLock)(holder, directory)}.`),
131
+ });
132
+ if (!acquired.ok) {
133
+ console.error(`Gave up after ${wait} s. The API lock is held by ${(0, lock_1.describeApiLock)(acquired.holder, directory)}.`);
134
+ return run_locked_1.LOCK_TIMEOUT_EXIT_CODE;
135
+ }
136
+ token = acquired.lock.token;
137
+ }
138
+ try {
139
+ step(`Starting ${name}`);
140
+ const upCode = yield options.up();
141
+ if (upCode !== 0)
142
+ return upCode;
143
+ step('Checking the API (doctor --fix)');
144
+ if (!(0, doctor_1.runDoctor)({ name, api, tool, cwd: checkout.composePath, env, invocation, fix: true }).ok)
145
+ return 1;
146
+ const fingerprint = (0, fingerprint_1.fingerprintApi)({
147
+ root,
148
+ name,
149
+ repoPath: checkout.repoPath,
150
+ migrationsDir: api.migrationsDir,
151
+ seeds: profile.seeds,
152
+ });
153
+ const state = (0, api_state_1.readApiState)(directory);
154
+ const [binary, ...prefix] = tool.compose;
155
+ const compose = { binary, prefix, cwd: checkout.composePath, env };
156
+ const file = (0, snapshot_1.snapshotFilePath)({ root, api: name, name: profileName, fingerprint });
157
+ if (state && !state.dirty && state.profile === profileName && state.fingerprint === fingerprint) {
158
+ step(`Already ready: ${profileName} at ${fingerprint}`);
159
+ }
160
+ else if (profile.snapshot && (0, fs_1.existsSync)(file)) {
161
+ step(`Restoring the ${profileName} snapshot ${fingerprint}`);
162
+ const restored = yield (0, snapshot_1.restoreSnapshot)({
163
+ file,
164
+ snapshot: profile.snapshot,
165
+ compose,
166
+ state: { directory, profile: profileName, fingerprint },
167
+ });
168
+ if (restored !== 0)
169
+ return restored;
170
+ }
171
+ else {
172
+ (0, api_state_1.markApiStateDirty)(directory);
173
+ for (const unit of units.value) {
174
+ step(`Seeding ${unit.kind === 'exec' ? unit.name : unit.steps.map(({ label }) => label).join(', ')}`);
175
+ const seeded = yield options.runSeeds(unit);
176
+ if (seeded !== 0)
177
+ return seeded;
178
+ }
179
+ if (profile.snapshot) {
180
+ step(`Saving the ${profileName} snapshot ${fingerprint}`);
181
+ (0, run_snapshot_1.warnUnlessSnapshotIgnored)(root, file);
182
+ const saved = yield (0, snapshot_1.saveSnapshot)({ file, snapshot: profile.snapshot, compose });
183
+ if (saved !== 0)
184
+ return saved;
185
+ }
186
+ (0, api_state_1.writeApiState)({ directory, state: { profile: profileName, fingerprint, dirty: false } });
187
+ }
188
+ if (profile.health) {
189
+ const expect = (_e = profile.health.expect) !== null && _e !== void 0 ? _e : 200;
190
+ step(`Waiting for ${profile.health.url} to answer ${expect}`);
191
+ const health = yield (0, exports.waitForHealth)({
192
+ url: profile.health.url,
193
+ expect,
194
+ fetch: options.fetch,
195
+ sleep: options.sleep,
196
+ now,
197
+ });
198
+ if (!health.ok) {
199
+ console.error(`${profile.health.url} did not answer ${expect} within ${exports.HEALTH_TIMEOUT_MS / 1000} s. Last: ${health.last}.`);
200
+ return 1;
201
+ }
202
+ }
203
+ console.log(`${name} is ready: profile ${profileName}, fingerprint ${fingerprint}, in ${((now() - startedAt) / 1000).toFixed(1)} s.`);
204
+ return 0;
205
+ }
206
+ finally {
207
+ if (token !== undefined)
208
+ (0, lock_1.releaseApiLock)(directory, token);
209
+ }
210
+ });
211
+ exports.runReadyCommand = runReadyCommand;
212
+ //# sourceMappingURL=run-ready.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-ready.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/api/run-ready.ts"],"names":[],"mappings":";;;;AAAA,2BAAgC;AAChC,8CAAsD;AACtD,+CAAiE;AACjE,2CAA6E;AAC7E,uCAA4E;AAE5E,qCAAqC;AACrC,+CAA+C;AAC/C,iCAAsG;AACtG,yDAAqD;AACrD,6CAAsD;AACtD,iDAA2D;AAC3D,mCAAgE;AAChE,uCAAuC;AACvC,yCAA6E;AAOhE,QAAA,iBAAiB,GAAG,KAAM,CAAC;AAC3B,QAAA,eAAe,GAAG,IAAK,CAAC;AAErC,MAAM,GAAG,GAAG,CAAC,MAAc,EAAE,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE/F,uHAAuH;AAChH,MAAM,mBAAmB,GAAG,CAAC,OAMnC,EAA2B,EAAE;;IAC5B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAA,wBAAgB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,YAAY,GAChB,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC5G,CAAC,CAAC,IAAA,iBAAS,EAAC;gBACR,QAAQ,EAAE,QAAQ,CAAC,KAAK;gBACxB,KAAK,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACxC,YAAY,EAAE,IAAI,KAAK,UAAU;gBACjC,GAAG,EAAE,IAAI;aACV,CAAC;YACJ,CAAC,CAAC,SAAS,CAAC;QAEhB,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAErC,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,MAAK,OAAO;gBAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;;gBAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAEnE,SAAS;QACX,CAAC;QAED,IAAI,CAAA,MAAA,GAAG,CAAC,IAAI,0CAAG,IAAI,CAAC,MAAK,SAAS,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAEzC,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG;YACjB,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,MAAM,CAAC,IAAI,CAAC,MAAA,GAAG,CAAC,IAAI,mCAAI,EAAE,CAAC;SAC/B,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EACL,OAAO,WAAW,mBAAmB,IAAI,eAAe,IAAI,mDAAmD;gBAC/G,GAAG,IAAA,oBAAU,EAAC,IAAI,EAAE,UAAU,CAAC,cAAc,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;gBACrG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC,CAAC;AArDW,QAAA,mBAAmB,uBAqD9B;AAEF,mFAAmF;AAC5E,MAAM,aAAa,GAAG,CAAO,OAQnC,EAAuD,EAAE;IACxD,MAAM,EACJ,GAAG,EACH,MAAM,EACN,KAAK,EAAE,GAAG,GAAG,KAAK,EAClB,KAAK,GAAG,CAAO,EAAE,EAAE,EAAE,0DAAC,OAAA,KAAK,CAAC,MAAM,IAAA,qBAAK,EAAC,EAAE,CAAC,CAAC,CAAA,GAAA,EAC5C,GAAG,GAAG,IAAI,CAAC,GAAG,EACd,SAAS,GAAG,yBAAiB,EAC7B,OAAO,GAAG,uBAAe,GAC1B,GAAG,OAAO,CAAC;IACZ,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;IAExB,SAAS,CAAC;QACR,IAAI,IAAY,CAAC;QAEjB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YAE9F,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YAEpD,IAAI,GAAG,UAAU,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,GAAI,KAAe,CAAC,OAAO,CAAC;QAClC,CAAC;QAED,IAAI,GAAG,EAAE,GAAG,SAAS,IAAI,SAAS;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAE/D,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAA,CAAC;AAtCW,QAAA,aAAa,iBAsCxB;AAiBF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;AAE9D,kEAAkE;AAC3D,MAAM,eAAe,GAAG,CAAO,OAAwB,EAAmB,EAAE;;IACjF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IAC5F,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;IACxB,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAA,GAAG,CAAC,QAAQ,mCAAI,EAAE,CAAC,CAAC;IACrD,MAAM,OAAO,GAA2B,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAA,GAAG,CAAC,QAAQ,0CAAG,WAAW,CAAC,CAAC;IAE5G,IAAI,WAAW,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACvD,OAAO,CAAC,KAAK,CACX,CAAC,WAAW,KAAK,SAAS;YACxB,CAAC,CAAC,0BAA0B,UAAU,UAAU,IAAI,uBAAuB;YAC3E,CAAC,CAAC,OAAO,IAAI,wBAAwB,WAAW,KAAK,IAAA,oBAAU,EAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;YAC7F,iBAAiB,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAChF,CAAC;QAEF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,2BAAmB,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAE1F,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE7B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,8BAAgB,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAEtD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,IAAA,kCAAe,EAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAEvE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,IAAI,GAAG,IAAA,4BAAkB,GAAE,CAAC;IAElC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,iCAAiC,IAAA,0BAAgB,GAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACxC,MAAM,GAAG,iDAAQ,IAAA,mBAAS,EAAC,IAAI,CAAC,MAAM,CAAC,GAAK,OAAO,CAAC,GAAG,GAAK,IAAA,4BAAc,EAAC,MAAA,MAAA,GAAG,CAAC,GAAG,mDAAI,mCAAI,EAAE,CAAC,CAAE,CAAC;IAChG,IAAI,KAAyB,CAAC;IAE9B,IAAI,IAAA,sBAAe,EAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAE5B,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EAAC;YACpC,SAAS;YACT,OAAO,EAAE,GAAG,UAAU,UAAU,IAAI,cAAc,WAAW,EAAE;YAC/D,GAAG,EAAE,IAAI;YACT,IAAI;YACJ,MAAM,EAAE,OAAO,CAAC,UAAU;YAC1B,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,qCAAqC,IAAA,sBAAe,EAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC;SAC9G,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,+BAA+B,IAAA,sBAAe,EAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;YAElH,OAAO,mCAAsB,CAAC;QAChC,CAAC;QAED,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC;QACH,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QAEzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,CAAC;QAElC,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAEhC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAExC,IAAI,CAAC,IAAA,kBAAS,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC;QAExG,MAAM,WAAW,GAAG,IAAA,4BAAc,EAAC;YACjC,IAAI;YACJ,IAAI;YACJ,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAA,wBAAY,EAAC,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QACzC,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;QACnE,MAAM,IAAI,GAAG,IAAA,2BAAgB,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;QAEnF,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,WAAW,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;YAChG,IAAI,CAAC,kBAAkB,WAAW,OAAO,WAAW,EAAE,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAA,eAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,iBAAiB,WAAW,aAAa,WAAW,EAAE,CAAC,CAAC;YAE7D,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAe,EAAC;gBACrC,IAAI;gBACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,OAAO;gBACP,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE;aACxD,CAAC,CAAC;YAEH,IAAI,QAAQ,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,IAAA,6BAAiB,EAAC,SAAS,CAAC,CAAC;YAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC/B,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAEtG,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAE5C,IAAI,MAAM,KAAK,CAAC;oBAAE,OAAO,MAAM,CAAC;YAClC,CAAC;YAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,IAAI,CAAC,cAAc,WAAW,aAAa,WAAW,EAAE,CAAC,CAAC;gBAC1D,IAAA,wCAAyB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAEtC,MAAM,KAAK,GAAG,MAAM,IAAA,uBAAY,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;gBAEhF,IAAI,KAAK,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAC;YAChC,CAAC;YAED,IAAA,yBAAa,EAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,CAAC,MAAM,mCAAI,GAAG,CAAC;YAE5C,IAAI,CAAC,eAAe,OAAO,CAAC,MAAM,CAAC,GAAG,cAAc,MAAM,EAAE,CAAC,CAAC;YAE9D,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC;gBACjC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG;gBACvB,MAAM;gBACN,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,GAAG;aACJ,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CACX,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,mBAAmB,MAAM,WAAW,yBAAiB,GAAG,IAAI,aAAa,MAAM,CAAC,IAAI,GAAG,CAC7G,CAAC;gBAEF,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CACT,GAAG,IAAI,sBAAsB,WAAW,iBAAiB,WAAW,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CACzH,CAAC;QAEF,OAAO,CAAC,CAAC;IACX,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,KAAK,SAAS;YAAE,IAAA,qBAAc,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC,CAAA,CAAC;AA7JW,QAAA,eAAe,mBA6J1B"}
@@ -0,0 +1,33 @@
1
+ import { ApiDefinition, ApiProfile } from './definition';
2
+ type Parsed<T> = {
3
+ ok: true;
4
+ value: T;
5
+ } | {
6
+ ok: false;
7
+ problem: string;
8
+ };
9
+ /** `requested`, or the one profile with a `snapshot` block. */
10
+ export declare const chooseSnapshotProfile: (options: {
11
+ name: string;
12
+ api: ApiDefinition;
13
+ requested: string | undefined;
14
+ }) => Parsed<{
15
+ profileName: string;
16
+ profile: ApiProfile & {
17
+ snapshot: NonNullable<ApiProfile["snapshot"]>;
18
+ };
19
+ }>;
20
+ export declare const warnUnlessSnapshotIgnored: (root: string, file: string) => void;
21
+ export type RunSnapshotOptions = {
22
+ root: string;
23
+ name: string;
24
+ api: ApiDefinition;
25
+ invocation: string;
26
+ action: string | undefined;
27
+ snapshotName: string | undefined;
28
+ profile: string | undefined;
29
+ wait: number | undefined;
30
+ };
31
+ /** Runs `snapshot save|restore <api> <name>` and returns the exit code. */
32
+ export declare const runSnapshotCommand: (options: RunSnapshotOptions) => Promise<number>;
33
+ export {};
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runSnapshotCommand = exports.warnUnlessSnapshotIgnored = exports.chooseSnapshotProfile = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const path_1 = require("path");
6
+ const api_context_1 = require("./api-context");
7
+ const fingerprint_1 = require("./fingerprint");
8
+ const git_1 = require("./git");
9
+ const lock_1 = require("./lock");
10
+ const run_locked_1 = require("./run-locked");
11
+ const resolve_checkout_1 = require("./resolve-checkout");
12
+ const compose_1 = require("./compose");
13
+ const snapshot_1 = require("./snapshot");
14
+ /** `requested`, or the one profile with a `snapshot` block. */
15
+ const chooseSnapshotProfile = (options) => {
16
+ var _a, _b;
17
+ const { name, api, requested } = options;
18
+ const profiles = Object.entries((_a = api.profiles) !== null && _a !== void 0 ? _a : {});
19
+ const withSnapshot = profiles.filter(([, profile]) => profile.snapshot !== undefined);
20
+ const pick = (profileName, profile) => {
21
+ if (!profile) {
22
+ return {
23
+ ok: false,
24
+ problem: `The ${name} API has no profile "${profileName}". Profiles: ${profiles.map(([key]) => key).join(', ') || 'none'}`,
25
+ };
26
+ }
27
+ return profile.snapshot
28
+ ? { ok: true, value: { profileName, profile: Object.assign(Object.assign({}, profile), { snapshot: profile.snapshot }) } }
29
+ : { ok: false, problem: `The profile "${profileName}" of the ${name} API declares no snapshot.` };
30
+ };
31
+ if (requested !== undefined)
32
+ return pick(requested, (_b = api.profiles) === null || _b === void 0 ? void 0 : _b[requested]);
33
+ if (withSnapshot.length === 1) {
34
+ const [[profileName, profile]] = withSnapshot;
35
+ return pick(profileName, profile);
36
+ }
37
+ return {
38
+ ok: false,
39
+ problem: withSnapshot.length === 0
40
+ ? `The ${name} API has no profile with a snapshot block.`
41
+ : `The ${name} API has several profiles with a snapshot block. Choose one with --profile <name>: ${withSnapshot
42
+ .map(([key]) => key)
43
+ .join(', ')}`,
44
+ };
45
+ };
46
+ exports.chooseSnapshotProfile = chooseSnapshotProfile;
47
+ const warnUnlessSnapshotIgnored = (root, file) => {
48
+ if ((0, git_1.ignoredByGit)(root, (0, path_1.relative)(root, file)) === false) {
49
+ console.warn(`${(0, path_1.relative)(root, file)} is not gitignored, so a snapshot could be committed. ` +
50
+ `Add "/.ethlete/snapshots/" to .gitignore.\n`);
51
+ }
52
+ };
53
+ exports.warnUnlessSnapshotIgnored = warnUnlessSnapshotIgnored;
54
+ /** Runs `snapshot save|restore <api> <name>` and returns the exit code. */
55
+ const runSnapshotCommand = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
56
+ var _a, _b;
57
+ const { root, name, api, invocation, action, snapshotName, profile: requested, wait } = options;
58
+ const usage = `${invocation} snapshot save|restore <api> <name> [--profile <profile>]`;
59
+ if ((action !== 'save' && action !== 'restore') || snapshotName === undefined) {
60
+ console.error(`snapshot needs an action and a name: ${usage}`);
61
+ return 1;
62
+ }
63
+ if (!snapshot_1.SNAPSHOT_NAME.test(snapshotName)) {
64
+ console.error(`"${snapshotName}" is not a snapshot name. Use letters, digits, ".", "-" and "_".`);
65
+ return 1;
66
+ }
67
+ const chosen = (0, exports.chooseSnapshotProfile)({ name, api, requested });
68
+ if (!chosen.ok) {
69
+ console.error(chosen.problem);
70
+ return 1;
71
+ }
72
+ const context = (0, api_context_1.stateDirectoryOf)({ root, name, api, needs: 'env' });
73
+ if (!context.ok) {
74
+ console.error((0, resolve_checkout_1.checkoutProblem)({ failure: context, name, invocation }));
75
+ return 1;
76
+ }
77
+ const tool = (0, compose_1.resolveComposeTool)();
78
+ if (!tool) {
79
+ console.error(`No compose tool found. Tried: ${(0, compose_1.composeToolNames)().join(', ')}.`);
80
+ return 1;
81
+ }
82
+ const { profileName, profile } = chosen.value;
83
+ const { checkout, directory } = context;
84
+ const fingerprint = (0, fingerprint_1.fingerprintApi)({
85
+ root,
86
+ name,
87
+ repoPath: checkout.repoPath,
88
+ migrationsDir: api.migrationsDir,
89
+ seeds: profile.seeds,
90
+ });
91
+ const file = (0, snapshot_1.snapshotFilePath)({ root, api: name, name: snapshotName, fingerprint });
92
+ const [binary, ...prefix] = tool.compose;
93
+ const compose = {
94
+ binary,
95
+ prefix,
96
+ cwd: checkout.composePath,
97
+ env: Object.assign(Object.assign(Object.assign({}, (0, compose_1.engineEnv)(tool.engine)), process.env), (0, api_context_1.definedEntries)((_b = (_a = api.env) === null || _a === void 0 ? void 0 : _a.call(api)) !== null && _b !== void 0 ? _b : {})),
98
+ };
99
+ (0, exports.warnUnlessSnapshotIgnored)(root, file);
100
+ if (action === 'save')
101
+ return (0, snapshot_1.saveSnapshot)({ file, snapshot: profile.snapshot, compose });
102
+ const state = { directory, profile: profileName, fingerprint };
103
+ if ((0, lock_1.heldLockFromEnv)(directory))
104
+ return (0, snapshot_1.restoreSnapshot)({ file, snapshot: profile.snapshot, compose, state });
105
+ const acquired = yield (0, lock_1.acquireApiLock)({
106
+ directory,
107
+ command: `${invocation} snapshot restore ${name} ${snapshotName}`,
108
+ cwd: root,
109
+ wait,
110
+ onHeld: (holder) => console.error(`Waiting for the API lock, held by ${(0, lock_1.describeApiLock)(holder, directory)}.`),
111
+ });
112
+ if (!acquired.ok) {
113
+ console.error(`Gave up after ${wait} s. The API lock is held by ${(0, lock_1.describeApiLock)(acquired.holder, directory)}.`);
114
+ return run_locked_1.LOCK_TIMEOUT_EXIT_CODE;
115
+ }
116
+ try {
117
+ return yield (0, snapshot_1.restoreSnapshot)({ file, snapshot: profile.snapshot, compose, state });
118
+ }
119
+ finally {
120
+ (0, lock_1.releaseApiLock)(directory, acquired.lock.token);
121
+ }
122
+ });
123
+ exports.runSnapshotCommand = runSnapshotCommand;
124
+ //# sourceMappingURL=run-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-snapshot.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/api/run-snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { ApiDefinition } from './definition';
2
+ /** Prints profile, fingerprints, dirty flag, snapshot and lock holder of one API. Always exit 0 unless the checkout is missing. */
3
+ export declare const runStatusCommand: (options: {
4
+ root: string;
5
+ name: string;
6
+ api: ApiDefinition;
7
+ invocation: string;
8
+ profile: string | undefined;
9
+ }) => 0 | 1;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runStatusCommand = void 0;
4
+ const api_context_1 = require("./api-context");
5
+ const api_state_1 = require("./api-state");
6
+ const fingerprint_1 = require("./fingerprint");
7
+ const fs_1 = require("fs");
8
+ const lock_1 = require("./lock");
9
+ const resolve_checkout_1 = require("./resolve-checkout");
10
+ const snapshot_1 = require("./snapshot");
11
+ /** Prints profile, fingerprints, dirty flag, snapshot and lock holder of one API. Always exit 0 unless the checkout is missing. */
12
+ const runStatusCommand = (options) => {
13
+ var _a, _b, _c;
14
+ const { root, name, api, invocation, profile: requested } = options;
15
+ const context = (0, api_context_1.stateDirectoryOf)({ root, name, api });
16
+ if (!context.ok) {
17
+ console.error((0, resolve_checkout_1.checkoutProblem)({ failure: context, name, invocation }));
18
+ return 1;
19
+ }
20
+ const { checkout, directory } = context;
21
+ const state = (0, api_state_1.readApiState)(directory);
22
+ const profileName = (_a = requested !== null && requested !== void 0 ? requested : state === null || state === void 0 ? void 0 : state.profile) !== null && _a !== void 0 ? _a : undefined;
23
+ const profile = profileName === undefined ? undefined : (_b = api.profiles) === null || _b === void 0 ? void 0 : _b[profileName];
24
+ const current = profile
25
+ ? (0, fingerprint_1.fingerprintApi)({
26
+ root,
27
+ name,
28
+ repoPath: checkout.repoPath,
29
+ migrationsDir: api.migrationsDir,
30
+ seeds: profile.seeds,
31
+ })
32
+ : undefined;
33
+ const snapshots = current === undefined ? [] : (0, snapshot_1.listSnapshots)({ root, api: name, fingerprint: current });
34
+ const lock = (0, lock_1.readApiLock)(directory);
35
+ const rows = [
36
+ ['profile', profileName !== null && profileName !== void 0 ? profileName : 'none'],
37
+ ['stored', (_c = state === null || state === void 0 ? void 0 : state.fingerprint) !== null && _c !== void 0 ? _c : 'none'],
38
+ ['current', current !== null && current !== void 0 ? current : (profileName === undefined ? 'none' : `no profile "${profileName}"`)],
39
+ ['dirty', state ? (state.dirty ? 'yes' : 'no') : 'unknown'],
40
+ ['snapshot', snapshots.length > 0 ? snapshots.join(', ') : 'none for the current fingerprint'],
41
+ [
42
+ 'lock',
43
+ lock
44
+ ? (0, lock_1.describeApiLock)(lock, directory)
45
+ : (0, fs_1.existsSync)((0, lock_1.lockPath)(directory))
46
+ ? `unreadable (${(0, lock_1.lockPath)(directory)})`
47
+ : 'free',
48
+ ],
49
+ ];
50
+ const width = Math.max(...rows.map(([label]) => label.length));
51
+ console.log(rows.map(([label, value]) => ` ${label.padEnd(width)} ${value}`).join('\n'));
52
+ return 0;
53
+ };
54
+ exports.runStatusCommand = runStatusCommand;
55
+ //# sourceMappingURL=run-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-status.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/api/run-status.ts"],"names":[],"mappings":"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"}
@@ -7,4 +7,4 @@ export type RunApiCommandOptions = {
7
7
  /** How the caller is invoked, used in the usage line. */
8
8
  invocation?: string;
9
9
  };
10
- export declare const runApiCommand: ({ apis, argv, root, invocation, }: RunApiCommandOptions) => Promise<number>;
10
+ export declare const runApiCommand: ({ apis, argv: rawArgv, root, invocation, }: RunApiCommandOptions) => Promise<number>;