primitive-admin 1.2.0-alpha.0 → 1.2.0-alpha.2
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 +6 -4
- package/dist/bin/primitive.js +22 -24
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/agent-sessions.d.ts +20 -0
- package/dist/src/commands/agent-sessions.js +275 -0
- package/dist/src/commands/agent-sessions.js.map +1 -0
- package/dist/src/commands/apps-children.d.ts +54 -0
- package/dist/src/commands/apps-children.js +578 -0
- package/dist/src/commands/apps-children.js.map +1 -0
- package/dist/src/commands/apps.js +88 -9
- package/dist/src/commands/apps.js.map +1 -1
- package/dist/src/commands/auth-sessions.d.ts +3 -3
- package/dist/src/commands/auth-sessions.js +117 -23
- package/dist/src/commands/auth-sessions.js.map +1 -1
- package/dist/src/commands/auth.js +248 -15
- package/dist/src/commands/auth.js.map +1 -1
- package/dist/src/commands/connections.js +1 -5
- package/dist/src/commands/connections.js.map +1 -1
- package/dist/src/commands/databases.js +7 -109
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/documents.d.ts +29 -0
- package/dist/src/commands/documents.js +676 -191
- package/dist/src/commands/documents.js.map +1 -1
- package/dist/src/commands/env.d.ts +9 -1
- package/dist/src/commands/env.js +158 -45
- package/dist/src/commands/env.js.map +1 -1
- package/dist/src/commands/functions.js +7 -1
- package/dist/src/commands/functions.js.map +1 -1
- package/dist/src/commands/init.js +2 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/integrations.js +14 -2
- package/dist/src/commands/integrations.js.map +1 -1
- package/dist/src/commands/prompts.js +4 -0
- package/dist/src/commands/prompts.js.map +1 -1
- package/dist/src/commands/scripts.js +1 -1
- package/dist/src/commands/scripts.js.map +1 -1
- package/dist/src/commands/sessions.js +3 -8
- package/dist/src/commands/sessions.js.map +1 -1
- package/dist/src/commands/sync-app-settings.d.ts +25 -7
- package/dist/src/commands/sync-app-settings.js +81 -20
- package/dist/src/commands/sync-app-settings.js.map +1 -1
- package/dist/src/commands/sync.d.ts +183 -12
- package/dist/src/commands/sync.js +974 -452
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/tokens.js +1 -6
- package/dist/src/commands/tokens.js.map +1 -1
- package/dist/src/commands/users.js +77 -2
- package/dist/src/commands/users.js.map +1 -1
- package/dist/src/lib/api-client.d.ts +161 -35
- package/dist/src/lib/api-client.js +210 -86
- package/dist/src/lib/api-client.js.map +1 -1
- package/dist/src/lib/app-settings-descriptor.d.ts +9 -1
- package/dist/src/lib/app-settings-descriptor.js +22 -10
- package/dist/src/lib/app-settings-descriptor.js.map +1 -1
- package/dist/src/lib/auth-flow.d.ts +41 -1
- package/dist/src/lib/auth-flow.js +45 -16
- package/dist/src/lib/auth-flow.js.map +1 -1
- package/dist/src/lib/child-apps-local.d.ts +184 -0
- package/dist/src/lib/child-apps-local.js +282 -0
- package/dist/src/lib/child-apps-local.js.map +1 -0
- package/dist/src/lib/ci-session-request.d.ts +22 -0
- package/dist/src/lib/ci-session-request.js +51 -0
- package/dist/src/lib/ci-session-request.js.map +1 -0
- package/dist/src/lib/codegen-shared/generatedFiles.d.ts +4 -1
- package/dist/src/lib/codegen-shared/generatedFiles.js +19 -13
- package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -1
- package/dist/src/lib/config-object-descriptor.js +5 -5
- package/dist/src/lib/config-object-descriptor.js.map +1 -1
- package/dist/src/lib/config-payload.js +2 -3
- package/dist/src/lib/config-payload.js.map +1 -1
- package/dist/src/lib/config-surface.d.ts +2 -1
- package/dist/src/lib/config-surface.js +7 -28
- package/dist/src/lib/config-surface.js.map +1 -1
- package/dist/src/lib/credentials-store.d.ts +17 -2
- package/dist/src/lib/credentials-store.js +72 -6
- package/dist/src/lib/credentials-store.js.map +1 -1
- package/dist/src/lib/document-export-lookups.d.ts +31 -0
- package/dist/src/lib/document-export-lookups.js +53 -0
- package/dist/src/lib/document-export-lookups.js.map +1 -0
- package/dist/src/lib/document-export-permissions.d.ts +7 -5
- package/dist/src/lib/document-export-permissions.js +7 -5
- package/dist/src/lib/document-export-permissions.js.map +1 -1
- package/dist/src/lib/env-resolver-core.d.ts +69 -1
- package/dist/src/lib/env-resolver-core.js +137 -20
- package/dist/src/lib/env-resolver-core.js.map +1 -1
- package/dist/src/lib/env-resolver.d.ts +14 -2
- package/dist/src/lib/env-resolver.js +32 -10
- package/dist/src/lib/env-resolver.js.map +1 -1
- package/dist/src/lib/function-run.d.ts +4 -1
- package/dist/src/lib/function-run.js +24 -4
- package/dist/src/lib/function-run.js.map +1 -1
- package/dist/src/lib/function-sync.d.ts +5 -2
- package/dist/src/lib/function-sync.js +7 -4
- package/dist/src/lib/function-sync.js.map +1 -1
- package/dist/src/lib/generated-config-surfaces.d.ts +49 -50
- package/dist/src/lib/generated-config-surfaces.js +283 -166
- package/dist/src/lib/generated-config-surfaces.js.map +1 -1
- package/dist/src/lib/generated-sdk-types.d.ts +1 -1
- package/dist/src/lib/generated-sdk-types.js +1 -1
- package/dist/src/lib/generated-sdk-types.js.map +1 -1
- package/dist/src/lib/init-adopt.js +12 -3
- package/dist/src/lib/init-adopt.js.map +1 -1
- package/dist/src/lib/local-state.d.ts +17 -1
- package/dist/src/lib/local-state.js +94 -15
- package/dist/src/lib/local-state.js.map +1 -1
- package/dist/src/lib/local-test-cases.d.ts +5 -2
- package/dist/src/lib/local-test-cases.js +7 -4
- package/dist/src/lib/local-test-cases.js.map +1 -1
- package/dist/src/lib/log-inspection.d.ts +25 -0
- package/dist/src/lib/log-inspection.js +24 -0
- package/dist/src/lib/log-inspection.js.map +1 -1
- package/dist/src/lib/logout-admin-session.d.ts +2 -1
- package/dist/src/lib/logout-admin-session.js +7 -1
- package/dist/src/lib/logout-admin-session.js.map +1 -1
- package/dist/src/lib/pull-write.d.ts +31 -0
- package/dist/src/lib/pull-write.js +49 -0
- package/dist/src/lib/pull-write.js.map +1 -0
- package/dist/src/lib/root-import-decision.d.ts +59 -0
- package/dist/src/lib/root-import-decision.js +95 -0
- package/dist/src/lib/root-import-decision.js.map +1 -0
- package/dist/src/lib/scope-request.d.ts +69 -0
- package/dist/src/lib/scope-request.js +188 -0
- package/dist/src/lib/scope-request.js.map +1 -0
- package/dist/src/lib/session-id.d.ts +9 -0
- package/dist/src/lib/session-id.js +28 -0
- package/dist/src/lib/session-id.js.map +1 -0
- package/dist/src/lib/snapshots.d.ts +17 -1
- package/dist/src/lib/snapshots.js +50 -2
- package/dist/src/lib/snapshots.js.map +1 -1
- package/dist/src/lib/sync-paths.d.ts +35 -0
- package/dist/src/lib/sync-paths.js +57 -5
- package/dist/src/lib/sync-paths.js.map +1 -1
- package/dist/src/lib/transient-retry.d.ts +34 -0
- package/dist/src/lib/transient-retry.js +57 -0
- package/dist/src/lib/transient-retry.js.map +1 -0
- package/dist/src/types/index.d.ts +21 -4
- package/package.json +4 -3
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `primitive apps children` — child apps of the current environment's parent
|
|
3
|
+
* (#4119, project `child-apps`).
|
|
4
|
+
*
|
|
5
|
+
* apps children create <slug> create a child, register it here, push the tree into it
|
|
6
|
+
* apps children list one page of the parent's children
|
|
7
|
+
* apps children get <slug> one child, and how it relates to this machine
|
|
8
|
+
* apps children delete <slug> hard-delete a child and its local state
|
|
9
|
+
*
|
|
10
|
+
* Two hidden verbs, `add-preview-origin` and `remove-preview-origin`, write a
|
|
11
|
+
* child's preview origins for `cf-deploy --preview-alias` (#4120).
|
|
12
|
+
*
|
|
13
|
+
* Every verb acts on the PARENT: the committed environment named by the
|
|
14
|
+
* current environment's `tree`. With a child selected that is the child's
|
|
15
|
+
* parent, so `create` makes a sibling. A child is registered on this machine
|
|
16
|
+
* as a machine-local environment (#4117) named by its slug; `env use <slug>`
|
|
17
|
+
* attaches one another admin created (`attachChildEnvironment`, below).
|
|
18
|
+
*
|
|
19
|
+
* Local state is related to server children by app id, never by name — see
|
|
20
|
+
* `lib/child-apps-local.ts`.
|
|
21
|
+
*/
|
|
22
|
+
import { existsSync } from "fs";
|
|
23
|
+
import { join } from "path";
|
|
24
|
+
import { ApiClient } from "../lib/api-client.js";
|
|
25
|
+
import { loadCredentials } from "../lib/config.js";
|
|
26
|
+
import { ChildRegistrationError, currentGitBranch, drainChildren, findChildBySlug, findStaleLocalEntries, gitBranchExists, isGitRepository, readLocalEnvironmentRefs, registerChildEnvironment, removeLocalStateForApp, resolveParentEnvironment, runFirstPush, } from "../lib/child-apps-local.js";
|
|
27
|
+
import { confirmPrompt } from "../lib/confirm-prompt.js";
|
|
28
|
+
import { PROJECT_CONFIG_DISPLAY_NAME, PROJECT_TREE_DIR, isCommittedEnvironment, localStatePathForConfigPath, readLocalState, } from "../lib/env-resolver-core.js";
|
|
29
|
+
import { getProjectConfig, resetEnvResolver } from "../lib/env-resolver.js";
|
|
30
|
+
import { ensureLocalStateIgnored, writeLocalSelection } from "../lib/local-state.js";
|
|
31
|
+
import { pageCursorOption, pageLimitOption, parsePageLimit, printEmptyPage, printPageHint, } from "../lib/list-options.js";
|
|
32
|
+
import { error, formatDate, formatTable, info, json, keyValue, result as printResult, success, warn, } from "../lib/output.js";
|
|
33
|
+
import { normalizeCliListEnvelope } from "../lib/paginate.js";
|
|
34
|
+
const LOCAL_STATE_LABEL = ".primitive/local.json";
|
|
35
|
+
/** Said when a child is registered under `PRIMITIVE_TOKEN` (#3890). */
|
|
36
|
+
const NO_LOGIN_COPIED = "PRIMITIVE_TOKEN is in use, so no login was copied for the child; it is reached with the same token.";
|
|
37
|
+
function parentOrExit() {
|
|
38
|
+
try {
|
|
39
|
+
return resolveParentEnvironment();
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
error(err.message || String(err));
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function localRefsOrExit(configPath, refusal) {
|
|
47
|
+
try {
|
|
48
|
+
return readLocalEnvironmentRefs(configPath);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
error(err.message || String(err));
|
|
52
|
+
error(refusal);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Makes sure `.primitive/local.json` is git-ignored before a command writes
|
|
58
|
+
* it, or exits naming the one-line remedy — the check `env use` makes, shared
|
|
59
|
+
* so a registration is held to the same rule as a selection. `rerun` is the
|
|
60
|
+
* command to run again once the remedy is applied.
|
|
61
|
+
*/
|
|
62
|
+
export function ensureLocalStateIgnoredOrExit(configPath, rerun) {
|
|
63
|
+
const coverage = ensureLocalStateIgnored(localStatePathForConfigPath(configPath));
|
|
64
|
+
if (coverage.status === "excluded") {
|
|
65
|
+
info(`Added "${coverage.pattern}" to ${coverage.excludePath} so the selection stays out of git.`);
|
|
66
|
+
info(`Consider committing "${LOCAL_STATE_LABEL}" to .gitignore so the whole team is covered.`);
|
|
67
|
+
}
|
|
68
|
+
else if (coverage.status === "failed") {
|
|
69
|
+
// Stop rather than write: an unignored local.json is committable state.
|
|
70
|
+
error(`Could not confirm ${LOCAL_STATE_LABEL} is git-ignored: ${coverage.detail}`);
|
|
71
|
+
error(`Add "${LOCAL_STATE_LABEL}" to your .gitignore and run '${rerun}' again — ` +
|
|
72
|
+
`the selection is per-machine state and must never be committable.`);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Prints what `removeLocalStateForApp` removed, naming the parent environment
|
|
78
|
+
* to select when the removed entry was this machine's selection. A cleanup
|
|
79
|
+
* that stopped part-way is an error (exit code 1) naming how to finish it.
|
|
80
|
+
*/
|
|
81
|
+
export function reportLocalStateRemoval(removed) {
|
|
82
|
+
for (const r of removed) {
|
|
83
|
+
if (r.failure) {
|
|
84
|
+
error(`The local environment "${r.name}" was not fully removed: ${r.failure}. ` +
|
|
85
|
+
`Its entry is kept; fix the problem and run 'primitive apps children delete ${r.name}' with "${r.tree}" selected to finish.`);
|
|
86
|
+
process.exitCode = 1;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const parts = [
|
|
90
|
+
"entry",
|
|
91
|
+
...(r.loginRemoved ? ["login"] : []),
|
|
92
|
+
...(r.baselineRemoved ? ["baseline"] : []),
|
|
93
|
+
...(r.backupsRemoved ? ["backups"] : []),
|
|
94
|
+
];
|
|
95
|
+
success(`Removed the local environment "${r.name}" (${parts.join(", ")}).`);
|
|
96
|
+
if (r.selectionCleared) {
|
|
97
|
+
info(`"${r.name}" was selected on this machine; run 'primitive env use ${r.tree}' to select its parent.`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* After an app is deleted on the server, removes this machine's state for it
|
|
103
|
+
* — every machine-local entry holding its app id — and reports it. Outside a
|
|
104
|
+
* project, or with local state that cannot be read, there is nothing to match
|
|
105
|
+
* against and nothing is removed.
|
|
106
|
+
*/
|
|
107
|
+
export function removeLocalStateAfterDelete(configPath, appId) {
|
|
108
|
+
if (!configPath)
|
|
109
|
+
return;
|
|
110
|
+
try {
|
|
111
|
+
reportLocalStateRemoval(removeLocalStateForApp(configPath, appId));
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
warn(`Could not check ${LOCAL_STATE_LABEL} for app ${appId}: ${err.message || String(err)}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** A child's branch for a table cell, marked `(gone)` when the checkout has no such local branch. */
|
|
118
|
+
function branchCell(branch, projectRoot, inRepo) {
|
|
119
|
+
if (!branch)
|
|
120
|
+
return "-";
|
|
121
|
+
return inRepo && !gitBranchExists(projectRoot, branch) ? `${branch} (gone)` : branch;
|
|
122
|
+
}
|
|
123
|
+
function ownerCell(child) {
|
|
124
|
+
return child.owner?.email ?? child.ownerAdminId ?? "-";
|
|
125
|
+
}
|
|
126
|
+
/** How a server child relates to this machine: the entry holding its app id, if any. */
|
|
127
|
+
function localFields(child, refs, selection) {
|
|
128
|
+
const ref = refs.find((r) => r.entry.appId === child.appId);
|
|
129
|
+
return {
|
|
130
|
+
local: Boolean(ref),
|
|
131
|
+
selected: Boolean(ref) && ref.name === selection,
|
|
132
|
+
localName: ref?.name ?? null,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Attaches the child `slug` of the current environment's parent as a
|
|
137
|
+
* machine-local environment and selects it: `env use <slug>` for a name that
|
|
138
|
+
* is neither a committed environment nor a local entry. Lists the parent's
|
|
139
|
+
* children, refuses an unknown slug and a child whose app is already
|
|
140
|
+
* registered here under another name, then registers it as `apps children
|
|
141
|
+
* create` does (baseline, login, entry). Exits on any refusal, writing nothing.
|
|
142
|
+
*/
|
|
143
|
+
export async function attachChildEnvironment(slug) {
|
|
144
|
+
let parent;
|
|
145
|
+
try {
|
|
146
|
+
parent = resolveParentEnvironment();
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
error(`Environment "${slug}" does not exist. Run 'primitive env list' to see available environments.`);
|
|
150
|
+
info(`To attach a child app named "${slug}", its parent environment must resolve: ${err.message || String(err)}`);
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
ensureLocalStateIgnoredOrExit(parent.configPath, `primitive env use ${slug}`);
|
|
154
|
+
const client = new ApiClient();
|
|
155
|
+
let child;
|
|
156
|
+
try {
|
|
157
|
+
child = findChildBySlug(await drainChildren(client, parent.parentAppId), slug);
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
error(err.message || String(err));
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
if (!child) {
|
|
164
|
+
error(`Environment "${slug}" does not exist, and "${parent.parentName}" (${parent.parentAppId}) has no child app "${slug}". ` +
|
|
165
|
+
`Run 'primitive env list' to see this machine's environments, or 'primitive apps children list' to see the children.`);
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
const holders = localRefsOrExit(parent.configPath, `Not attaching "${slug}": fix ${LOCAL_STATE_LABEL} first so its entries can be checked.`).filter((ref) => ref.entry.appId === child.appId);
|
|
169
|
+
if (holders.length > 0) {
|
|
170
|
+
const name = holders[0].name;
|
|
171
|
+
error(`Child app "${slug}" (${child.appId}) is already registered on this machine as "${name}". Run 'primitive env use ${name}' to select it.`);
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
let loginCopied = true;
|
|
175
|
+
try {
|
|
176
|
+
({ loginCopied } = registerChildEnvironment({
|
|
177
|
+
configPath: parent.configPath,
|
|
178
|
+
name: slug,
|
|
179
|
+
tree: parent.parentName,
|
|
180
|
+
apiUrl: parent.parentApiUrl,
|
|
181
|
+
appId: child.appId,
|
|
182
|
+
appName: child.name,
|
|
183
|
+
parentAppId: parent.parentAppId,
|
|
184
|
+
credentials: loadCredentials(),
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
error(err.message || String(err));
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
writeLocalSelection(parent.configPath, slug);
|
|
192
|
+
resetEnvResolver();
|
|
193
|
+
success(`Attached child app "${child.name}" as "${slug}" and selected it on this machine.`);
|
|
194
|
+
if (!loginCopied)
|
|
195
|
+
info(NO_LOGIN_COPIED);
|
|
196
|
+
keyValue("App ID", child.appId);
|
|
197
|
+
keyValue("Parent", `${parent.parentName} (${parent.parentAppId})`);
|
|
198
|
+
keyValue("Tree", `${parent.parentName} (machine-local, ${LOCAL_STATE_LABEL})`);
|
|
199
|
+
info(`Run 'primitive config diff' to compare primitive/${parent.parentName}/ with the child.`);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* The hidden `add-preview-origin` / `remove-preview-origin <slug> <origin>`
|
|
203
|
+
* verbs, which `cf-deploy --preview-alias` runs after a preview upload. The
|
|
204
|
+
* slug is resolved among the parent's children; with `--app-id`, a child
|
|
205
|
+
* whose app id differs (a renamed entry, a sibling's slug, a recreated child)
|
|
206
|
+
* is refused before any write.
|
|
207
|
+
*/
|
|
208
|
+
function registerPreviewOriginVerb(children, verb) {
|
|
209
|
+
const adding = verb === "add-preview-origin";
|
|
210
|
+
children
|
|
211
|
+
.command(verb, { hidden: true })
|
|
212
|
+
.description(adding ? "Add a preview origin to a child app" : "Remove a preview origin from a child app")
|
|
213
|
+
.argument("<slug>", "Child slug")
|
|
214
|
+
.argument("<origin>", "One exact origin, e.g. https://feature-x-my-worker.example.workers.dev")
|
|
215
|
+
.option("--app-id <id>", "Refuse unless the child with this slug has this app id")
|
|
216
|
+
.option("--json", "Output as JSON")
|
|
217
|
+
.action(async (slug, origin, options) => {
|
|
218
|
+
const parent = parentOrExit();
|
|
219
|
+
const client = new ApiClient();
|
|
220
|
+
try {
|
|
221
|
+
const child = findChildBySlug(await drainChildren(client, parent.parentAppId), slug);
|
|
222
|
+
if (!child) {
|
|
223
|
+
error(`"${parent.parentName}" (${parent.parentAppId}) has no child app "${slug}". Run 'primitive apps children list' to see its children.`);
|
|
224
|
+
process.exit(1);
|
|
225
|
+
}
|
|
226
|
+
if (options.appId !== undefined && options.appId !== child.appId) {
|
|
227
|
+
error(`The child "${slug}" of "${parent.parentName}" is app ${child.appId}, not ${options.appId}; nothing was written. ` +
|
|
228
|
+
`Run 'primitive apps children get ${slug}' to see which app this machine has registered under that name.`);
|
|
229
|
+
process.exit(1);
|
|
230
|
+
}
|
|
231
|
+
const written = adding
|
|
232
|
+
? await client.addChildPreviewOrigin(parent.parentAppId, slug, origin)
|
|
233
|
+
: await client.removeChildPreviewOrigin(parent.parentAppId, slug, origin);
|
|
234
|
+
if (options.json) {
|
|
235
|
+
json({
|
|
236
|
+
appId: written.appId,
|
|
237
|
+
childSlug: written.childSlug,
|
|
238
|
+
previewOrigins: written.previewOrigins,
|
|
239
|
+
});
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
success(adding
|
|
243
|
+
? `Added the preview origin to child "${slug}" (${written.appId}).`
|
|
244
|
+
: `Removed the preview origin from child "${slug}" (${written.appId}).`);
|
|
245
|
+
printResult("Preview origins", written.previewOrigins.length > 0 ? written.previewOrigins.join(", ") : "(none)");
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
error(err.message || String(err));
|
|
249
|
+
process.exit(1);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
/** Registers `apps children` and its verbs under the `apps` group. */
|
|
254
|
+
export function registerAppsChildrenCommands(apps) {
|
|
255
|
+
const children = apps
|
|
256
|
+
.command("children")
|
|
257
|
+
.description("Create, list, inspect and delete child apps of the current environment's app")
|
|
258
|
+
.addHelpText("after", `
|
|
259
|
+
A child app is a copy of the parent app (its settings and, unless --no-secrets,
|
|
260
|
+
its secrets), owned by you and deleted when idle. On this machine it is a
|
|
261
|
+
machine-local environment named by its slug that shares the parent's
|
|
262
|
+
primitive/<env>/ tree. With a child selected, these verbs act on its parent.
|
|
263
|
+
|
|
264
|
+
Examples:
|
|
265
|
+
$ primitive apps children create feature-x # create, register, select, push the tree
|
|
266
|
+
$ primitive apps children list
|
|
267
|
+
$ primitive apps children get feature-x
|
|
268
|
+
$ primitive apps children delete feature-x --yes
|
|
269
|
+
$ primitive env use feature-x # attach a child another admin created
|
|
270
|
+
`);
|
|
271
|
+
children
|
|
272
|
+
.command("create")
|
|
273
|
+
.description("Create a child app of the current environment's app and push the tree into it")
|
|
274
|
+
.argument("<slug>", "Child slug: lowercase letters, digits and dashes; also its local environment name")
|
|
275
|
+
.option("--branch <name>", "Git branch the child is for (default: the checkout's current branch)")
|
|
276
|
+
.option("--idle-days <n>", "Days without activity before the child is deleted (7-30, default 30)")
|
|
277
|
+
.option("--no-secrets", "Do not copy the parent's secrets")
|
|
278
|
+
.option("--no-use", "Do not select the child on this machine")
|
|
279
|
+
.option("--json", "Output as JSON")
|
|
280
|
+
.action(async (slug, options) => {
|
|
281
|
+
const parent = parentOrExit();
|
|
282
|
+
const project = getProjectConfig();
|
|
283
|
+
if (isCommittedEnvironment(project, slug)) {
|
|
284
|
+
error(`"${slug}" is a committed environment in ${PROJECT_CONFIG_DISPLAY_NAME}; a child app's slug is also its local environment name, so it needs one of its own.`);
|
|
285
|
+
process.exit(1);
|
|
286
|
+
}
|
|
287
|
+
const refs = localRefsOrExit(parent.configPath, `Not creating "${slug}": fix ${LOCAL_STATE_LABEL} first so the child can be registered.`);
|
|
288
|
+
const existing = refs.find((ref) => ref.name === slug);
|
|
289
|
+
if (existing) {
|
|
290
|
+
error(existing.entry.tree === parent.parentName
|
|
291
|
+
? `"${slug}" is already registered on this machine as a child of "${parent.parentName}" (app ${existing.entry.appId}). Run 'primitive apps children delete ${slug}' first, or choose another slug.`
|
|
292
|
+
: `"${slug}" is already registered on this machine for the "${existing.entry.tree}" tree (app ${existing.entry.appId}). Run 'primitive env use ${slug}' to work on it, or choose another slug.`);
|
|
293
|
+
process.exit(1);
|
|
294
|
+
}
|
|
295
|
+
let idleDays;
|
|
296
|
+
if (options.idleDays !== undefined) {
|
|
297
|
+
if (!/^\d+$/.test(String(options.idleDays).trim())) {
|
|
298
|
+
error(`--idle-days must be a whole number of days (the server accepts 7-30); got "${options.idleDays}".`);
|
|
299
|
+
process.exit(1);
|
|
300
|
+
}
|
|
301
|
+
idleDays = Number(options.idleDays);
|
|
302
|
+
}
|
|
303
|
+
ensureLocalStateIgnoredOrExit(parent.configPath, `primitive apps children create ${slug}`);
|
|
304
|
+
const branch = options.branch ?? currentGitBranch(parent.projectRoot) ?? undefined;
|
|
305
|
+
const client = new ApiClient();
|
|
306
|
+
let app;
|
|
307
|
+
try {
|
|
308
|
+
app = await client.createApp({
|
|
309
|
+
parentAppId: parent.parentAppId,
|
|
310
|
+
childSlug: slug,
|
|
311
|
+
...(branch !== undefined ? { branch } : {}),
|
|
312
|
+
...(idleDays !== undefined ? { idleDays } : {}),
|
|
313
|
+
copySecrets: options.secrets !== false,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
catch (err) {
|
|
317
|
+
error(err.message || String(err));
|
|
318
|
+
process.exit(1);
|
|
319
|
+
}
|
|
320
|
+
let loginCopied = true;
|
|
321
|
+
try {
|
|
322
|
+
({ loginCopied } = registerChildEnvironment({
|
|
323
|
+
configPath: parent.configPath,
|
|
324
|
+
name: slug,
|
|
325
|
+
tree: parent.parentName,
|
|
326
|
+
apiUrl: parent.parentApiUrl,
|
|
327
|
+
appId: app.appId,
|
|
328
|
+
appName: app.name,
|
|
329
|
+
parentAppId: parent.parentAppId,
|
|
330
|
+
credentials: loadCredentials(),
|
|
331
|
+
}));
|
|
332
|
+
if (!loginCopied)
|
|
333
|
+
info(NO_LOGIN_COPIED);
|
|
334
|
+
}
|
|
335
|
+
catch (err) {
|
|
336
|
+
error(err instanceof ChildRegistrationError ? err.message : String(err?.message || err));
|
|
337
|
+
error(`Child app ${app.appId} ("${app.name}") was created on the server but is not registered on this machine. Run 'primitive env use ${slug}' to register it.`);
|
|
338
|
+
process.exit(1);
|
|
339
|
+
}
|
|
340
|
+
const selected = options.use !== false;
|
|
341
|
+
if (selected) {
|
|
342
|
+
writeLocalSelection(parent.configPath, slug);
|
|
343
|
+
resetEnvResolver();
|
|
344
|
+
}
|
|
345
|
+
if (!options.json) {
|
|
346
|
+
success(`Created child app "${app.name}".`);
|
|
347
|
+
keyValue("App ID", app.appId);
|
|
348
|
+
keyValue("Parent", `${parent.parentName} (${parent.parentAppId})`);
|
|
349
|
+
keyValue("Environment", `${slug} (machine-local, tree ${parent.parentName})`);
|
|
350
|
+
keyValue("Selected", selected);
|
|
351
|
+
}
|
|
352
|
+
const push = { ran: false, exitCode: null };
|
|
353
|
+
if (!existsSync(join(parent.projectRoot, PROJECT_TREE_DIR, parent.parentName))) {
|
|
354
|
+
info(`There is no primitive/${parent.parentName}/ tree yet, so nothing was pushed. Run 'primitive --env ${parent.parentName} config pull', then 'primitive --env ${slug} config push'.`);
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
info(`Pushing primitive/${parent.parentName}/ into the child: primitive --env ${slug} config push --yes`);
|
|
358
|
+
push.ran = true;
|
|
359
|
+
push.exitCode = runFirstPush(slug, { json: Boolean(options.json) });
|
|
360
|
+
}
|
|
361
|
+
if (options.json) {
|
|
362
|
+
json({ app, environment: { name: slug, tree: parent.parentName, selected }, push });
|
|
363
|
+
}
|
|
364
|
+
if (push.ran && push.exitCode !== 0) {
|
|
365
|
+
error(`The first push into "${slug}" failed. The child is created and registered; fix the problem above and run 'primitive --env ${slug} config push'.`);
|
|
366
|
+
process.exit(1);
|
|
367
|
+
}
|
|
368
|
+
if (!options.json && !selected) {
|
|
369
|
+
info(`Run 'primitive env use ${slug}' to select it.`);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
children
|
|
373
|
+
.command("list")
|
|
374
|
+
.description("List the child apps of the current environment's app")
|
|
375
|
+
.addOption(pageLimitOption())
|
|
376
|
+
.addOption(pageCursorOption())
|
|
377
|
+
.option("--json", "Output as JSON")
|
|
378
|
+
.action(async (options) => {
|
|
379
|
+
const parent = parentOrExit();
|
|
380
|
+
const limit = parsePageLimit(options.limit);
|
|
381
|
+
const client = new ApiClient();
|
|
382
|
+
try {
|
|
383
|
+
const page = normalizeCliListEnvelope(await client.listAppChildren(parent.parentAppId, { limit, cursor: options.cursor }));
|
|
384
|
+
const refs = readLocalEnvironmentRefs(parent.configPath);
|
|
385
|
+
const selection = readLocalState(parent.configPath).selectedEnvironment;
|
|
386
|
+
// Entries whose child is gone are found against the WHOLE listing,
|
|
387
|
+
// whatever page is shown — read once, and only when there is an
|
|
388
|
+
// entry of this parent to check.
|
|
389
|
+
const ofParent = refs.filter((ref) => ref.entry.tree === parent.parentName);
|
|
390
|
+
let stale = [];
|
|
391
|
+
if (ofParent.length > 0) {
|
|
392
|
+
const whole = !options.cursor && !page.hasMore
|
|
393
|
+
? page.items
|
|
394
|
+
: await drainChildren(client, parent.parentAppId);
|
|
395
|
+
stale = findStaleLocalEntries(ofParent, parent.parentName, whole);
|
|
396
|
+
}
|
|
397
|
+
const items = page.items.map((child) => ({ ...child, ...localFields(child, refs, selection) }));
|
|
398
|
+
if (options.json) {
|
|
399
|
+
json({
|
|
400
|
+
...page,
|
|
401
|
+
items,
|
|
402
|
+
staleLocal: stale.map((ref) => ({ name: ref.name, appId: ref.entry.appId })),
|
|
403
|
+
});
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
if (items.length === 0) {
|
|
407
|
+
printEmptyPage(page, `child apps of "${parent.parentName}"`);
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
const inRepo = isGitRepository(parent.projectRoot);
|
|
411
|
+
console.log(formatTable(items.map((item) => ({
|
|
412
|
+
slug: item.childSlug,
|
|
413
|
+
owner: ownerCell(item),
|
|
414
|
+
branch: branchCell(item.branch, parent.projectRoot, inRepo),
|
|
415
|
+
created: formatDate(item.createdAt),
|
|
416
|
+
lastActivity: formatDate(item.lastActivityAt),
|
|
417
|
+
expires: formatDate(item.expiresAt),
|
|
418
|
+
local: item.selected
|
|
419
|
+
? "selected"
|
|
420
|
+
: item.local
|
|
421
|
+
? item.localName === item.childSlug
|
|
422
|
+
? "registered"
|
|
423
|
+
: `registered as ${item.localName}`
|
|
424
|
+
: "",
|
|
425
|
+
})), [
|
|
426
|
+
{ header: "SLUG", key: "slug" },
|
|
427
|
+
{ header: "OWNER", key: "owner" },
|
|
428
|
+
{ header: "BRANCH", key: "branch" },
|
|
429
|
+
{ header: "CREATED", key: "created" },
|
|
430
|
+
{ header: "LAST ACTIVITY", key: "lastActivity" },
|
|
431
|
+
{ header: "EXPIRES", key: "expires" },
|
|
432
|
+
{ header: "LOCAL", key: "local" },
|
|
433
|
+
]));
|
|
434
|
+
printPageHint(page);
|
|
435
|
+
}
|
|
436
|
+
for (const ref of stale) {
|
|
437
|
+
warn(`"${ref.name}" is registered on this machine for app ${ref.entry.appId}, which is no longer a child of "${parent.parentName}" (deleted elsewhere). Run 'primitive apps children delete ${ref.name}' to remove its local state.`);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
catch (err) {
|
|
441
|
+
error(err.message || String(err));
|
|
442
|
+
process.exit(1);
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
children
|
|
446
|
+
.command("get")
|
|
447
|
+
.description("Show one child app of the current environment's app")
|
|
448
|
+
.argument("<slug>", "Child slug")
|
|
449
|
+
.option("--json", "Output as JSON")
|
|
450
|
+
.action(async (slug, options) => {
|
|
451
|
+
const parent = parentOrExit();
|
|
452
|
+
const client = new ApiClient();
|
|
453
|
+
try {
|
|
454
|
+
const child = findChildBySlug(await drainChildren(client, parent.parentAppId), slug);
|
|
455
|
+
const refs = readLocalEnvironmentRefs(parent.configPath);
|
|
456
|
+
const named = refs.find((ref) => ref.name === slug);
|
|
457
|
+
if (!child) {
|
|
458
|
+
if (named && named.entry.tree === parent.parentName) {
|
|
459
|
+
error(`Child app "${slug}" (${named.entry.appId}) is registered on this machine but is no longer a child of "${parent.parentName}": it was deleted elsewhere. Run 'primitive apps children delete ${slug}' to remove its local state.`);
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
error(`"${parent.parentName}" (${parent.parentAppId}) has no child app "${slug}". Run 'primitive apps children list' to see its children.`);
|
|
463
|
+
}
|
|
464
|
+
process.exit(1);
|
|
465
|
+
}
|
|
466
|
+
const selection = readLocalState(parent.configPath).selectedEnvironment;
|
|
467
|
+
const fields = localFields(child, refs, selection);
|
|
468
|
+
const conflict = !fields.local && named
|
|
469
|
+
? { name: named.name, appId: named.entry.appId, tree: named.entry.tree }
|
|
470
|
+
: null;
|
|
471
|
+
if (options.json) {
|
|
472
|
+
json({ ...child, ...fields, localConflict: conflict });
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
const inRepo = isGitRepository(parent.projectRoot);
|
|
476
|
+
printResult("Slug", child.childSlug);
|
|
477
|
+
printResult("App ID", child.appId);
|
|
478
|
+
printResult("Name", child.name);
|
|
479
|
+
printResult("Parent", `${parent.parentName} (${child.parentAppId})`);
|
|
480
|
+
printResult("Owner", ownerCell(child));
|
|
481
|
+
printResult("Branch", branchCell(child.branch, parent.projectRoot, inRepo));
|
|
482
|
+
printResult("Idle days", child.idleDays);
|
|
483
|
+
printResult("Created", formatDate(child.createdAt));
|
|
484
|
+
printResult("Last activity", formatDate(child.lastActivityAt));
|
|
485
|
+
printResult("Expires", formatDate(child.expiresAt));
|
|
486
|
+
if (child.previewOrigins && child.previewOrigins.length > 0) {
|
|
487
|
+
printResult("Preview origins", child.previewOrigins.join(", "));
|
|
488
|
+
}
|
|
489
|
+
if (fields.local) {
|
|
490
|
+
printResult("Local", `${fields.localName === slug ? "registered" : `registered as "${fields.localName}"`}${fields.selected ? ", selected" : ""}`);
|
|
491
|
+
}
|
|
492
|
+
else if (conflict) {
|
|
493
|
+
printResult("Local", "not registered");
|
|
494
|
+
warn(`The local environment "${slug}" holds a different app, ${conflict.appId} (tree "${conflict.tree}"), so this child cannot be attached under its slug on this machine.`);
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
printResult("Local", `not registered — run 'primitive env use ${slug}' to attach it`);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
catch (err) {
|
|
501
|
+
error(err.message || String(err));
|
|
502
|
+
process.exit(1);
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
registerPreviewOriginVerb(children, "add-preview-origin");
|
|
506
|
+
registerPreviewOriginVerb(children, "remove-preview-origin");
|
|
507
|
+
children
|
|
508
|
+
.command("delete")
|
|
509
|
+
.description("Delete a child app of the current environment's app, and its local state")
|
|
510
|
+
.argument("<slug>", "Child slug")
|
|
511
|
+
.option("-y, --yes", "Skip confirmation prompt")
|
|
512
|
+
.action(async (slug, options) => {
|
|
513
|
+
const parent = parentOrExit();
|
|
514
|
+
const client = new ApiClient();
|
|
515
|
+
let child;
|
|
516
|
+
let all;
|
|
517
|
+
let refs;
|
|
518
|
+
try {
|
|
519
|
+
all = await drainChildren(client, parent.parentAppId);
|
|
520
|
+
child = findChildBySlug(all, slug);
|
|
521
|
+
refs = readLocalEnvironmentRefs(parent.configPath);
|
|
522
|
+
}
|
|
523
|
+
catch (err) {
|
|
524
|
+
error(err.message || String(err));
|
|
525
|
+
process.exit(1);
|
|
526
|
+
}
|
|
527
|
+
const named = refs.find((ref) => ref.name === slug);
|
|
528
|
+
const confirmOrExit = async (question) => {
|
|
529
|
+
if (options.yes)
|
|
530
|
+
return;
|
|
531
|
+
let confirmed;
|
|
532
|
+
try {
|
|
533
|
+
confirmed = await confirmPrompt(question);
|
|
534
|
+
}
|
|
535
|
+
catch (err) {
|
|
536
|
+
error(err.message);
|
|
537
|
+
process.exit(1);
|
|
538
|
+
}
|
|
539
|
+
if (!confirmed) {
|
|
540
|
+
info("Cancelled.");
|
|
541
|
+
process.exit(0);
|
|
542
|
+
}
|
|
543
|
+
};
|
|
544
|
+
if (child) {
|
|
545
|
+
await confirmOrExit(`Delete child app "${child.name}" (${child.appId}) and all of its data?`);
|
|
546
|
+
try {
|
|
547
|
+
await client.deleteApp(child.appId);
|
|
548
|
+
}
|
|
549
|
+
catch (err) {
|
|
550
|
+
error(err.message || String(err));
|
|
551
|
+
process.exit(1);
|
|
552
|
+
}
|
|
553
|
+
success(`Deleted child app "${child.name}" (${child.appId}).`);
|
|
554
|
+
reportLocalStateRemoval(removeLocalStateForApp(parent.configPath, child.appId));
|
|
555
|
+
if (named && named.entry.appId !== child.appId) {
|
|
556
|
+
info(`The local environment "${slug}" holds a different app, ${named.entry.appId} (tree "${named.entry.tree}"); it was left alone.`);
|
|
557
|
+
}
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
if (!named) {
|
|
561
|
+
error(`"${parent.parentName}" (${parent.parentAppId}) has no child app "${slug}", and nothing named "${slug}" is registered on this machine.`);
|
|
562
|
+
process.exit(1);
|
|
563
|
+
}
|
|
564
|
+
if (named.entry.tree !== parent.parentName) {
|
|
565
|
+
error(`"${slug}" is registered on this machine for the "${named.entry.tree}" tree, not "${parent.parentName}". Run 'primitive env use ${named.entry.tree}' and delete it from there.`);
|
|
566
|
+
process.exit(1);
|
|
567
|
+
}
|
|
568
|
+
const listed = all.find((c) => c.appId === named.entry.appId);
|
|
569
|
+
if (listed) {
|
|
570
|
+
error(`The local environment "${slug}" holds the child "${listed.childSlug}" (${listed.appId}). Run 'primitive apps children delete ${listed.childSlug}' to delete it.`);
|
|
571
|
+
process.exit(1);
|
|
572
|
+
}
|
|
573
|
+
await confirmOrExit(`Child app "${slug}" (${named.entry.appId}) was deleted elsewhere. Remove its local state from this machine?`);
|
|
574
|
+
info(`Child app "${slug}" (${named.entry.appId}) is no longer a child of "${parent.parentName}"; removing its local state.`);
|
|
575
|
+
reportLocalStateRemoval(removeLocalStateForApp(parent.configPath, named.entry.appId));
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
//# sourceMappingURL=apps-children.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apps-children.js","sourceRoot":"","sources":["../../../src/commands/apps-children.ts"],"names":[],"mappings":"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"}
|