@mouryaamit/nx-polystack 1.1.1 → 1.2.1

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/README.md CHANGED
@@ -16,6 +16,7 @@ cd my-workspace
16
16
  pstack app --type=angular --name=portal
17
17
  pstack app --type=ionic --name=field-app --appId=com.acme.fieldapp
18
18
  pstack app --type=flutter --name=mobile
19
+ pstack app --from=portal --name=partner-portal # a copy of portal, env values emptied
19
20
  ```
20
21
 
21
22
  `pstack new` pins the plugin in the workspace. Inside a workspace, `pstack` hands commands to that
package/USER-MANUAL.md CHANGED
@@ -156,6 +156,8 @@ OPTIONS — app
156
156
  --dir=<path> Put the app in apps/<path>/<name> (v0.17.0+)
157
157
  --port=<n> Dev-server port (default: the lowest free port from 4200; v0.35.0+)
158
158
  --env-layout=<layout> Angular/Ionic — default | per-env (v0.35.0+)
159
+ --from=<app> New app from an existing one; asks for the rest in a terminal (v1.2.0+)
160
+ --envs=<a,b> --csp=keep|clear --yes With --from (see section 5)
159
161
 
160
162
  OPTIONS — shared (--app or --all required; v0.35.0+)
161
163
  --app=<a,b> Angular/Ionic apps to wire the shared assets and styles into
@@ -641,6 +643,53 @@ environments/<name>/
641
643
 
642
644
  Web builds (`build-web`, `serve`) need Flutter 3.22 or later. Add icons under `web/` if you want them.
643
645
 
646
+ ### A new app from an existing one (`--from`, v1.2.0)
647
+
648
+ ```bash
649
+ pstack app --from=<app> [--name=<name>] [--dir=<path>] [--port=<n>] [--base-href=<path>|none]
650
+ [--app-id=<id>] [--envs=dev,uat,prod] [--csp=keep|clear] [--tags=a,b] [--yes] [--dry-run]
651
+ ```
652
+
653
+ Duplicates an app pstack builds (Angular/Ionic with a release target, Flutter with flutter-build
654
+ targets) under a new name. In a terminal it asks for everything not given as a flag, with the base
655
+ app's values as defaults, shows a summary and asks to confirm; `--yes` (or a pipe, CI, or
656
+ `nx g @mouryaamit/nx-polystack:app --from=…`) takes the flags and defaults instead, and then
657
+ `--name` is required.
658
+
659
+ | Question | Default |
660
+ | ----------------------- | ---------------------------------------------------------------- |
661
+ | New app name | — |
662
+ | App folder under apps/ | `<name>`, or `<base folder>/<name>`; must end with the name |
663
+ | Dev-server port | the lowest free port from 4200 |
664
+ | Base href (uat/prod) | `/<name>/` when the base app has one, else `/` (`none` for none) |
665
+ | Capacitor appId (Ionic) | `com.example.<name>`; never the base app's |
666
+ | Environments to keep | all of the base app's (dev is always kept) |
667
+ | CSP allowlist | keep (`clear` starts from an empty one) |
668
+ | Tags | the base app's |
669
+
670
+ - **Copied:** the app folder (source, assets, tsconfig, ESLint, `csp-allowlist.json`, server configs)
671
+ and its `project.json` targets with every option (hardening included). Not copied: build output,
672
+ caches, `node_modules`, what the `.gitignore` files ignore, and possible secrets (`.env`,
673
+ keystores, `google-services.json`, …), which the report lists.
674
+ - **Renamed:** project name, paths and target references in `project.json` (relative paths follow a
675
+ different folder depth), `environments/<base>/` → `environments/<name>/`, the page title, the
676
+ Ionic `appId`/`appName`/package name, the Flutter `pubspec.yaml` name and `package:` imports,
677
+ the root npm scripts and the `tsconfig.base.json` alias of the app, and the listed encryption key
678
+ names in nx.json. `.htaccess`/`nginx.conf` written by `pstack csp` are written again.
679
+ - **Emptied:** every value in the kept env files, by type (`''`, `0`, `false`, `[]`, nested objects
680
+ the same way; `null` stays), including `production`, encrypted values and secret placeholders.
681
+ Values that are not literals become `''` and are listed. Keys, comments and the env layout stay.
682
+ - **Not copied from the release target:** the domain lock (`domains`, `includeWww`); the base href
683
+ and port are the new app's.
684
+ - Lines that still name the base app are listed (first 50) for review; nothing is guessed.
685
+
686
+ ```bash
687
+ pstack app --from=web # asks
688
+ pstack app --from=web --name=partner-portal --envs=uat,prod --csp=clear --yes
689
+ ```
690
+
691
+ Needs nx-polystack 1.2.0 in the workspace.
692
+
644
693
  ### Examples
645
694
 
646
695
  ```bash
@@ -1369,7 +1418,10 @@ npx nx g @mouryaamit/nx-polystack:infra --with=docs,ci --ci=jenkins
1369
1418
  "name": "portal", // string — required
1370
1419
  "type": "angular", // "angular" | "flutter" — required
1371
1420
  "tags": ["platform:web"], // string[] — optional
1372
- "cspConnectSrc": "https://..." // string — optional, angular only
1421
+ "cspConnectSrc": "https://...", // string — optional, angular only
1422
+ "from": "web", // string — optional: create the app from this app (v1.2.0)
1423
+ "envs": ["uat", "prod"], // with from — environments to keep (dev always kept)
1424
+ "csp": "keep" // with from — "keep" | "clear"
1373
1425
  }
1374
1426
  ```
1375
1427
 
@@ -0,0 +1,4 @@
1
+ import { CommandContext } from '../types';
2
+ import { AppDeps } from './app';
3
+ /** pstack app --from=<app>: a new app from an existing one (NX-66). */
4
+ export declare function runAppFrom(ctx: CommandContext, deps: AppDeps): Promise<number>;
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.runAppFrom = void 0;
27
+ const tree_1 = require("nx/src/generators/tree");
28
+ const from_1 = require("../../generators/app/from");
29
+ const app_dir_1 = require("../../lib/utils/app-dir");
30
+ const base_href_1 = require("../../lib/utils/base-href");
31
+ const project_json_files_1 = require("../../lib/utils/project-json-files");
32
+ const serve_port_1 = require("../../lib/utils/serve-port");
33
+ const args_1 = require("../args");
34
+ const prompt_1 = require("../prompt");
35
+ const run_tree_1 = require("../run-tree");
36
+ const types_1 = require("../types");
37
+ const app_1 = require("./app");
38
+ /** Flags of `pstack app` that come from the base app with --from. */
39
+ const NOT_WITH_FROM = ['type', 'i18n', 'push', 'deeplink', 'envLayout', 'cspConnectSrc'];
40
+ const list = (v) => v
41
+ .split(',')
42
+ .map((s) => s.trim())
43
+ .filter(Boolean);
44
+ const kebab = (flag) => flag.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
45
+ function valueFlag(ctx, key, example) {
46
+ if (ctx.flags[key] === true)
47
+ throw new types_1.CliError(`--${kebab(key)} needs a value, e.g. ${example}.`);
48
+ return (0, args_1.flagString)(ctx.flags, key);
49
+ }
50
+ /** pstack app --from=<app>: a new app from an existing one (NX-66). */
51
+ async function runAppFrom(ctx, deps) {
52
+ const from = valueFlag(ctx, 'from', '--from=web');
53
+ if (!from)
54
+ throw new types_1.CliError('--from needs the name of an app, e.g. --from=web.');
55
+ for (const flag of NOT_WITH_FROM) {
56
+ if (ctx.flags[flag] !== undefined) {
57
+ throw new types_1.CliError(`--${kebab(flag)} does not apply with --from (the new app takes it from ${from}).`);
58
+ }
59
+ }
60
+ // Flags, checked before anything is read.
61
+ const given = {};
62
+ given.name = valueFlag(ctx, 'name', '--name=partner-portal');
63
+ const dir = valueFlag(ctx, 'dir', '--dir=legacy');
64
+ if (dir !== undefined)
65
+ given.dir = dir === '.' ? '.' : checked(() => (0, app_dir_1.parseDir)(dir, 'app'));
66
+ const port = valueFlag(ctx, 'port', '--port=4210');
67
+ if (port !== undefined) {
68
+ const n = /^\d+$/.test(port) ? Number(port) : NaN;
69
+ const problem = (0, serve_port_1.portProblem)(n);
70
+ if (problem)
71
+ throw new types_1.CliError(problem.replace(/\(got NaN\)/, `(got ${port})`) + '.');
72
+ given.port = n;
73
+ }
74
+ const href = valueFlag(ctx, 'baseHref', '--base-href=/portal/ or --base-href=none');
75
+ if (href !== undefined) {
76
+ given.baseHref = href === 'none' ? null : checked(() => (0, base_href_1.checkBaseHref)(href));
77
+ }
78
+ given.appId = valueFlag(ctx, 'appId', '--app-id=com.acme.portal');
79
+ const envs = valueFlag(ctx, 'envs', '--envs=dev,uat,prod');
80
+ if (envs !== undefined)
81
+ given.envs = list(envs);
82
+ const csp = valueFlag(ctx, 'csp', '--csp=keep');
83
+ if (csp !== undefined) {
84
+ if (csp !== 'keep' && csp !== 'clear')
85
+ throw new types_1.CliError('--csp must be keep or clear.');
86
+ given.csp = csp;
87
+ }
88
+ const tags = valueFlag(ctx, 'tags', '--tags=scope:partner');
89
+ if (tags !== undefined)
90
+ given.tags = list(tags);
91
+ const yes = (0, args_1.flagBoolean)(ctx.flags, 'yes') || (0, args_1.flagBoolean)(ctx.flags, 'y');
92
+ const root = (0, app_1.requireWorkspace)(ctx.cwd, 'app');
93
+ const tree = new tree_1.FsTree(root, false);
94
+ const base = checked(() => (0, from_1.describeBaseApp)(tree, from));
95
+ const interactive = deps.interactive ?? (!yes && (0, prompt_1.isInteractive)());
96
+ // Flag values the questions would not ask again are checked now, not after them.
97
+ if (given.name !== undefined && !app_dir_1.NAME_RE.test(given.name)) {
98
+ throw new types_1.CliError(`--name="${given.name}" must be kebab-case (e.g. partner-portal).`);
99
+ }
100
+ const unknownEnvs = (given.envs ?? []).filter((e) => !base.envs.includes(e));
101
+ if (unknownEnvs.length > 0) {
102
+ throw new types_1.CliError(`${base.name} has no environment ${unknownEnvs.join(', ')} (it has ${base.envs.join(', ')}).`);
103
+ }
104
+ let answers = given;
105
+ if (interactive) {
106
+ const prompter = deps.prompter ?? (0, prompt_1.terminalPrompter)();
107
+ try {
108
+ answers = await ask(tree, base, given, prompter);
109
+ summary(base, answers).forEach((l) => console.log(l));
110
+ const ok = await prompter.ask(`Create ${answers.name}? (Y/n)`, 'y');
111
+ if (!/^y(es)?$/i.test(ok)) {
112
+ console.log('Nothing was changed.');
113
+ return 0;
114
+ }
115
+ }
116
+ finally {
117
+ prompter.close();
118
+ }
119
+ }
120
+ else if (!given.name) {
121
+ throw new types_1.CliError('--name is required with --from (or run pstack app --from in a terminal to be asked).\n\n' +
122
+ `Example: pstack app --from=${from} --name=partner-portal --yes`);
123
+ }
124
+ const { default: appGenerator } = await Promise.resolve().then(() => __importStar(require('../../generators/app/generator')));
125
+ await (0, run_tree_1.runInTree)(root, ctx, (t) => appGenerator(t, {
126
+ from,
127
+ name: answers.name,
128
+ type: base.type,
129
+ dir: answers.dir,
130
+ port: answers.port,
131
+ baseHref: answers.baseHref === null ? 'none' : answers.baseHref,
132
+ appId: answers.appId,
133
+ envs: answers.envs,
134
+ csp: answers.csp,
135
+ tags: answers.tags,
136
+ }));
137
+ return 0;
138
+ }
139
+ exports.runAppFrom = runAppFrom;
140
+ function checked(fn) {
141
+ try {
142
+ return fn();
143
+ }
144
+ catch (err) {
145
+ throw new types_1.CliError(err.message.replace(/^app( --from)?: /, ''));
146
+ }
147
+ }
148
+ /** The questions for what was not given as a flag (base app values as defaults). */
149
+ async function ask(tree, base, given, p) {
150
+ const a = { ...given };
151
+ const projects = new Set((0, project_json_files_1.scanProjects)(tree).map((x) => x.name));
152
+ const folderProblem = (name, dir) => {
153
+ const r = (0, app_dir_1.appRoot)(name, dir === '.' ? undefined : dir);
154
+ return tree.exists(r) ? `${r} already exists` : undefined;
155
+ };
156
+ if (!a.name) {
157
+ a.name = await (0, prompt_1.askValid)(p, 'New app name', undefined, (v) => {
158
+ if (!app_dir_1.NAME_RE.test(v))
159
+ return 'kebab-case, e.g. partner-portal';
160
+ if (v === base.name || projects.has(v))
161
+ return `a project named ${v} already exists`;
162
+ return a.dir !== undefined ? folderProblem(v, a.dir) : undefined;
163
+ });
164
+ }
165
+ const name = a.name;
166
+ if (given.dir === undefined) {
167
+ // The app's own folder under apps/ (default apps/[<base folder>/]<name>); it ends with the name.
168
+ const dirOf = (v) => v
169
+ .replace(/^apps\//, '')
170
+ .replace(/\/+$/, '')
171
+ .split('/')
172
+ .slice(0, -1)
173
+ .join('/');
174
+ const answer = await (0, prompt_1.askValid)(p, 'App folder under apps/', base.dir ? `${base.dir}/${name}` : name, (v) => {
175
+ const path = v.replace(/^apps\//, '').replace(/\/+$/, '');
176
+ if (path.split('/').pop() !== name) {
177
+ return `the folder must end with the app name (${name}), e.g. ${name} or legacy/${name}`;
178
+ }
179
+ const d = dirOf(v);
180
+ if (d === '')
181
+ return folderProblem(name, undefined);
182
+ try {
183
+ (0, app_dir_1.parseDir)(d, 'app');
184
+ }
185
+ catch (err) {
186
+ return err.message.replace(/^app: /, '').replace('--dir=', 'folder ');
187
+ }
188
+ return folderProblem(name, d);
189
+ });
190
+ a.dir = dirOf(answer) || '.';
191
+ }
192
+ if (given.port === undefined) {
193
+ const used = (0, serve_port_1.usedServePorts)(tree);
194
+ const free = (0, serve_port_1.nextFreePort)(used.map((u) => u.port));
195
+ a.port = Number(await (0, prompt_1.askValid)(p, 'Dev-server port', String(free), (v) => {
196
+ const n = /^\d+$/.test(v) ? Number(v) : NaN;
197
+ const problem = (0, serve_port_1.portProblem)(n);
198
+ if (problem)
199
+ return problem.replace(/^--port /, 'the port ');
200
+ const owner = used.find((u) => u.port === n);
201
+ return owner ? `port ${n} is used by ${owner.project}` : undefined;
202
+ }));
203
+ }
204
+ if (given.baseHref === undefined) {
205
+ const answer = await (0, prompt_1.askValid)(p, 'Base href of the release builds (none for none)', base.baseHref ? `/${name}/` : '/', (v) => {
206
+ if (v === 'none')
207
+ return undefined;
208
+ try {
209
+ (0, base_href_1.checkBaseHref)(v);
210
+ }
211
+ catch (err) {
212
+ return err.message;
213
+ }
214
+ return undefined;
215
+ });
216
+ a.baseHref = answer === 'none' ? null : answer;
217
+ }
218
+ if (base.type === 'ionic' && given.appId === undefined) {
219
+ a.appId = await (0, prompt_1.askValid)(p, 'Capacitor appId', (0, from_1.defaultAppId)(name), (v) => {
220
+ if (!from_1.APP_ID_RE.test(v))
221
+ return 'reverse-DNS, e.g. com.acme.portal';
222
+ return v === base.appId ? `that is ${base.name}'s appId; pick another` : undefined;
223
+ });
224
+ }
225
+ if (given.envs === undefined && base.envs.length > 1) {
226
+ const answer = await (0, prompt_1.askValid)(p, `Environments to keep (${base.devEnv} is always kept)`, base.envs.join(','), (v) => {
227
+ const unknown = list(v).filter((e) => !base.envs.includes(e));
228
+ return unknown.length > 0
229
+ ? `${base.name} has no ${unknown.join(', ')} (it has ${base.envs.join(', ')})`
230
+ : undefined;
231
+ });
232
+ a.envs = list(answer);
233
+ }
234
+ if (base.type !== 'flutter' && given.csp === undefined) {
235
+ const answer = await (0, prompt_1.askValid)(p, 'CSP allowlist: keep or clear', 'keep', (v) => v === 'keep' || v === 'clear' ? undefined : 'keep or clear');
236
+ a.csp = answer;
237
+ }
238
+ if (given.tags === undefined) {
239
+ a.tags = list(await p.ask('Tags (comma-separated)', base.tags.join(',')));
240
+ }
241
+ return a;
242
+ }
243
+ function summary(base, a) {
244
+ const envs = a.envs
245
+ ? base.envs.filter((e) => e === base.devEnv || a.envs?.includes(e))
246
+ : base.envs;
247
+ return [
248
+ '',
249
+ `${a.name} from ${base.name} (${base.type}):`,
250
+ ` folder ${(0, app_dir_1.appRoot)(a.name, a.dir === '.' ? undefined : a.dir ?? base.dir)}`,
251
+ ` port ${a.port ?? 'next free'}`,
252
+ ` base href ${a.baseHref ?? 'none'}`,
253
+ ...(base.type === 'ionic' ? [` appId ${a.appId}`] : []),
254
+ ` envs ${envs.join(', ')} (every value emptied)`,
255
+ ...(base.type !== 'flutter' ? [` CSP ${a.csp ?? 'keep'}`] : []),
256
+ ` tags ${(a.tags ?? base.tags).join(', ') || 'none'}`,
257
+ '',
258
+ ];
259
+ }
260
+ //# sourceMappingURL=app-from.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-from.js","sourceRoot":"","sources":["../../../../src/cli/commands/app-from.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
1
+ import { Prompter } from '../prompt';
1
2
  import { CommandContext } from '../types';
3
+ export interface AppDeps {
4
+ /** Answers the --from questions (default: the terminal). */
5
+ prompter?: Prompter;
6
+ /** Ask the --from questions (default: when stdin/stdout are a terminal and --yes is not set). */
7
+ interactive?: boolean;
8
+ }
2
9
  export declare function requireWorkspace(cwd: string, command: string): string;
3
- export declare function runApp(ctx: CommandContext): Promise<number>;
10
+ export declare function runApp(ctx: CommandContext, deps?: AppDeps): Promise<number>;
@@ -38,7 +38,11 @@ function requireWorkspace(cwd, command) {
38
38
  return root;
39
39
  }
40
40
  exports.requireWorkspace = requireWorkspace;
41
- async function runApp(ctx) {
41
+ async function runApp(ctx, deps = {}) {
42
+ if (ctx.flags['from'] !== undefined) {
43
+ const { runAppFrom } = await Promise.resolve().then(() => __importStar(require('./app-from')));
44
+ return runAppFrom(ctx, deps);
45
+ }
42
46
  const name = (0, args_1.flagString)(ctx.flags, 'name');
43
47
  const type = (0, args_1.flagString)(ctx.flags, 'type');
44
48
  if (!name) {
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../src/cli/commands/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../src/cli/commands/app.ts"],"names":[],"mappings":"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"}
@@ -75,6 +75,13 @@ OPTIONS — app
75
75
  --port=<n> Dev-server port (default: the lowest free port from 4200)
76
76
  --env-layout=<layout> Angular/Ionic — default (environment.ts for dev) | per-env
77
77
  (environment.dev|uat|prod.ts replacing environments/environment.ts)
78
+ --from=<app> Create the app from an existing one: copy, rename, every env value
79
+ emptied; asks for name, folder, port, base href, appId, envs, CSP
80
+ and tags in a terminal (v1.2.0+)
81
+ --envs=<a,b> With --from: environments to keep (dev is always kept)
82
+ --csp=keep|clear With --from: the base app's CSP allowlist
83
+ --base-href=none With --from: no base href
84
+ --yes With --from: no questions (flags and defaults)
78
85
 
79
86
  OPTIONS — shared (--app or --all required)
80
87
  --app=<a,b> Angular/Ionic apps to wire
@@ -278,6 +285,8 @@ EXAMPLES
278
285
  pstack release --app=portal --base-href=/portal/
279
286
  pstack app --type=angular --name=portal --base-href=/portal/
280
287
  pstack app --type=angular --name=admin --port=4300 --env-layout=per-env
288
+ pstack app --from=web
289
+ pstack app --from=web --name=partner-portal --envs=uat,prod --yes
281
290
  pstack shared --all
282
291
  nx run portal:clean
283
292
  pstack csp --app=portal --add=connect-src:https://api.example.com
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/cli/help.ts"],"names":[],"mappings":";;;AAAA,qDAAiD;AACjD,yCAAkD;AAElD,SAAgB,QAAQ,CAAC,OAAe;IACtC,OAAO;yCACgC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA4O5C,IAAA,8BAAa,GAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,EAC5F;IACE,IAAA,+BAAoB,EAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6ChC,CAAC,SAAS,EAAE,CAAC;AACd,CAAC;AA9RD,4BA8RC"}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/cli/help.ts"],"names":[],"mappings":";;;AAAA,qDAAiD;AACjD,yCAAkD;AAElD,SAAgB,QAAQ,CAAC,OAAe;IACtC,OAAO;yCACgC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAmP5C,IAAA,8BAAa,GAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,EAC5F;IACE,IAAA,+BAAoB,EAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+ChC,CAAC,SAAS,EAAE,CAAC;AACd,CAAC;AAvSD,4BAuSC"}
@@ -39,7 +39,13 @@ exports.MIN_LOCAL_VERSION = {
39
39
  };
40
40
  /** First plugin version that understands a flag of a command (checked when the flag is given). */
41
41
  exports.MIN_LOCAL_FLAG_VERSION = {
42
- app: { dir: '0.17.0', baseHref: '0.32.0', port: '0.35.0', envLayout: '0.35.0' },
42
+ app: {
43
+ dir: '0.17.0',
44
+ baseHref: '0.32.0',
45
+ port: '0.35.0',
46
+ envLayout: '0.35.0',
47
+ from: '1.2.0',
48
+ },
43
49
  env: { app: '0.34.0', all: '0.34.0', from: '0.34.0', baseHref: '0.34.0', domains: '0.34.0' },
44
50
  lib: { dir: '0.19.0' },
45
51
  csp: { import: '0.38.0' },
@@ -1 +1 @@
1
- {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../../src/cli/launcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../../src/cli/launcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /** Asks one question at a time; tests pass their own answers. */
2
+ export interface Prompter {
3
+ /** The answer, trimmed; the default when the answer is empty. */
4
+ ask(question: string, defaultValue?: string): Promise<string>;
5
+ close(): void;
6
+ }
7
+ /** An answer trimmed, without quotes around it ('/' or "/" is /). */
8
+ export declare function cleanAnswer(answer: string): string;
9
+ /** Questions are asked only when both ends are a terminal. */
10
+ export declare function isInteractive(): boolean;
11
+ /** A prompter on stdin/stdout (Node readline; no extra dependency). */
12
+ export declare function terminalPrompter(): Prompter;
13
+ /** A prompter answering from a list (tests); throws when it runs out. */
14
+ export declare function scriptedPrompter(answers: string[], asked?: string[]): Prompter;
15
+ /**
16
+ * Asks until `check` accepts the answer (it returns the problem, or undefined); gives up after
17
+ * three tries.
18
+ */
19
+ export declare function askValid(p: Prompter, question: string, defaultValue: string | undefined, check: (answer: string) => string | undefined, say?: (line: string) => void): Promise<string>;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.askValid = exports.scriptedPrompter = exports.terminalPrompter = exports.isInteractive = exports.cleanAnswer = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const readline = tslib_1.__importStar(require("readline"));
6
+ const types_1 = require("./types");
7
+ /** An answer trimmed, without quotes around it ('/' or "/" is /). */
8
+ function cleanAnswer(answer) {
9
+ const a = answer.trim();
10
+ const m = /^(['"])(.*)\1$/.exec(a);
11
+ return m ? m[2].trim() : a;
12
+ }
13
+ exports.cleanAnswer = cleanAnswer;
14
+ /** Questions are asked only when both ends are a terminal. */
15
+ function isInteractive() {
16
+ return Boolean(process.stdin.isTTY && process.stdout.isTTY);
17
+ }
18
+ exports.isInteractive = isInteractive;
19
+ /** A prompter on stdin/stdout (Node readline; no extra dependency). */
20
+ function terminalPrompter() {
21
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
22
+ return {
23
+ ask: (question, defaultValue) => new Promise((resolve) => {
24
+ const hint = defaultValue !== undefined && defaultValue !== '' ? ` [${defaultValue}]` : '';
25
+ rl.question(`${question}${hint}: `, (answer) => {
26
+ const a = cleanAnswer(answer);
27
+ resolve(a === '' ? defaultValue ?? '' : a);
28
+ });
29
+ }),
30
+ close: () => rl.close(),
31
+ };
32
+ }
33
+ exports.terminalPrompter = terminalPrompter;
34
+ /** A prompter answering from a list (tests); throws when it runs out. */
35
+ function scriptedPrompter(answers, asked = []) {
36
+ const queue = [...answers];
37
+ return {
38
+ ask: async (question, defaultValue) => {
39
+ asked.push(question);
40
+ if (queue.length === 0)
41
+ throw new Error(`no scripted answer for "${question}"`);
42
+ const a = cleanAnswer(queue.shift() ?? '');
43
+ return a === '' ? defaultValue ?? '' : a;
44
+ },
45
+ close: () => undefined,
46
+ };
47
+ }
48
+ exports.scriptedPrompter = scriptedPrompter;
49
+ const MAX_TRIES = 3;
50
+ /**
51
+ * Asks until `check` accepts the answer (it returns the problem, or undefined); gives up after
52
+ * three tries.
53
+ */
54
+ async function askValid(p, question, defaultValue, check, say = (l) => console.log(l)) {
55
+ for (let i = 0; i < MAX_TRIES; i++) {
56
+ const answer = await p.ask(question, defaultValue);
57
+ const problem = check(answer);
58
+ if (!problem)
59
+ return answer;
60
+ say(` ${problem}`);
61
+ }
62
+ throw new types_1.CliError(`no valid answer to "${question}"; nothing was changed.`);
63
+ }
64
+ exports.askValid = askValid;
65
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/cli/prompt.ts"],"names":[],"mappings":"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"}