@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 +1 -0
- package/USER-MANUAL.md +53 -1
- package/dist/src/cli/commands/app-from.d.ts +4 -0
- package/dist/src/cli/commands/app-from.js +260 -0
- package/dist/src/cli/commands/app-from.js.map +1 -0
- package/dist/src/cli/commands/app.d.ts +8 -1
- package/dist/src/cli/commands/app.js +5 -1
- package/dist/src/cli/commands/app.js.map +1 -1
- package/dist/src/cli/help.js +9 -0
- package/dist/src/cli/help.js.map +1 -1
- package/dist/src/cli/launcher.js +7 -1
- package/dist/src/cli/launcher.js.map +1 -1
- package/dist/src/cli/prompt.d.ts +19 -0
- package/dist/src/cli/prompt.js +65 -0
- package/dist/src/cli/prompt.js.map +1 -0
- package/dist/src/generators/app/from.d.ts +86 -0
- package/dist/src/generators/app/from.js +759 -0
- package/dist/src/generators/app/from.js.map +1 -0
- package/dist/src/generators/app/generator.js +21 -8
- package/dist/src/generators/app/generator.js.map +1 -1
- package/dist/src/generators/app/schema.d.ts +6 -0
- package/dist/src/generators/app/schema.json +19 -2
- package/dist/src/lib/env/empty.d.ts +16 -0
- package/dist/src/lib/env/empty.js +81 -0
- package/dist/src/lib/env/empty.js.map +1 -0
- package/dist/src/lib/env-encryption/env-file.d.ts +4 -0
- package/dist/src/lib/env-encryption/env-file.js +8 -2
- package/dist/src/lib/env-encryption/env-file.js.map +1 -1
- package/package.json +1 -1
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,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":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAmD;AACnD,kCAAqC;AACrC,wCAA+C;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../src/cli/commands/app.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/help.js
CHANGED
|
@@ -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
|
package/dist/src/cli/help.js.map
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/src/cli/launcher.js
CHANGED
|
@@ -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: {
|
|
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":";;;;AAAA,iDAA0C;AAC1C,+CAAyB;AACzB,mDAA6B;AAI7B,mCAAmC;AACnC,yCAA6C;AAE7C,kDAAkD;AACrC,QAAA,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAEjF,uFAAuF;AAC1E,QAAA,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACxC,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,SAAS;IACT,OAAO;IACP,YAAY;IACZ,WAAW;IACX,OAAO;IACP,SAAS;IACT,KAAK;IACL,QAAQ;CACT,CAAC,CAAC;AAEH,4FAA4F;AAC/E,QAAA,iBAAiB,GAAqC;IACjE,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,OAAO;IACZ,OAAO,EAAE,QAAQ;IACjB,KAAK,EAAE,OAAO;IACd,UAAU,EAAE,QAAQ;IACpB,SAAS,EAAE,QAAQ;IACnB,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,QAAQ;IACjB,GAAG,EAAE,QAAQ;IACb,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,kGAAkG;AACrF,QAAA,sBAAsB,GAA+D;IAChG,GAAG,EAAE,
|
|
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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"}
|