primitive-admin 1.2.0-alpha.5 → 1.2.0-alpha.7
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 -1
- package/dist/src/commands/apps-children.d.ts +1 -1
- package/dist/src/commands/apps-children.js +170 -28
- package/dist/src/commands/apps-children.js.map +1 -1
- package/dist/src/commands/auth.js +41 -6
- package/dist/src/commands/auth.js.map +1 -1
- package/dist/src/commands/config.js +43 -4
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/databases.js +130 -53
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/init.d.ts +7 -0
- package/dist/src/commands/init.js +9 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/sync.d.ts +118 -6
- package/dist/src/commands/sync.js +594 -55
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/lib/child-apps-local.d.ts +45 -21
- package/dist/src/lib/child-apps-local.js +68 -30
- package/dist/src/lib/child-apps-local.js.map +1 -1
- package/dist/src/lib/credentials-store.d.ts +38 -3
- package/dist/src/lib/credentials-store.js +175 -9
- package/dist/src/lib/credentials-store.js.map +1 -1
- package/dist/src/lib/function-collect.d.ts +1 -1
- package/dist/src/lib/function-collect.js +4 -0
- package/dist/src/lib/function-collect.js.map +1 -1
- package/dist/src/lib/generated-config-surfaces.d.ts +148 -0
- package/dist/src/lib/generated-config-surfaces.js +208 -25
- 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/local-state.d.ts +21 -6
- package/dist/src/lib/local-state.js +78 -34
- package/dist/src/lib/local-state.js.map +1 -1
- package/dist/src/lib/push-failure-report.d.ts +45 -0
- package/dist/src/lib/push-failure-report.js +57 -0
- package/dist/src/lib/push-failure-report.js.map +1 -0
- package/dist/src/lib/sync-selectors.d.ts +5 -1
- package/dist/src/lib/sync-selectors.js +23 -13
- package/dist/src/lib/sync-selectors.js.map +1 -1
- package/dist/src/lib/transient-retry.d.ts +9 -0
- package/dist/src/lib/transient-retry.js +37 -0
- package/dist/src/lib/transient-retry.js.map +1 -1
- package/dist/src/lib/vars-override.d.ts +105 -0
- package/dist/src/lib/vars-override.js +143 -0
- package/dist/src/lib/vars-override.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A child app's own config var values: `vars.<name>.override.toml` (#4485).
|
|
3
|
+
*
|
|
4
|
+
* A machine-local environment `<name>` (#4117) shares the committed
|
|
5
|
+
* environment's `primitive/<tree>/`, so the `vars.toml` there holds the
|
|
6
|
+
* parent's values. Vars whose value belongs to one app — its database ids, a
|
|
7
|
+
* webhook URL embedding its app id, an OAuth origin — need a place of their
|
|
8
|
+
* own that survives a push, a diff and a pull without touching what merges to
|
|
9
|
+
* main. That place is `primitive/<tree>/vars.<name>.override.toml`, a flat
|
|
10
|
+
* `KEY = "value"` table under the same rules as `vars.toml`:
|
|
11
|
+
*
|
|
12
|
+
* - It is read only when `<name>` is the SELECTED environment. A committed
|
|
13
|
+
* environment has no override, so a file named for one is never read.
|
|
14
|
+
* - It LAYERS over `vars.toml`: its keys replace or add, every other key keeps
|
|
15
|
+
* `vars.toml`'s value, and no key can be made absent on the child.
|
|
16
|
+
* - It is machine-local and git-ignored (`primitive/*\/*.override.toml`).
|
|
17
|
+
*
|
|
18
|
+
* Everything here is pure apart from `readLocalVars`, which reads the two
|
|
19
|
+
* files; the commands own the writes.
|
|
20
|
+
*/
|
|
21
|
+
import { existsSync, readFileSync } from "fs";
|
|
22
|
+
import { basename, join } from "path";
|
|
23
|
+
import { parseConfigToml, stringifyConfigToml } from "./config-toml.js";
|
|
24
|
+
import { assertSafePathComponent } from "./sync-paths.js";
|
|
25
|
+
/** The tree's shared var file. */
|
|
26
|
+
export const VARS_FILE_NAME = "vars.toml";
|
|
27
|
+
/**
|
|
28
|
+
* The gitignore pattern that keeps every override file out of a commit,
|
|
29
|
+
* written by `primitive init` and carried by both app templates.
|
|
30
|
+
*/
|
|
31
|
+
export const VARS_OVERRIDE_GITIGNORE_PATTERN = "primitive/*/*.override.toml";
|
|
32
|
+
/** `vars.<name>.override.toml` — the override file's name inside the tree. */
|
|
33
|
+
export function varsOverrideFileName(name) {
|
|
34
|
+
assertSafePathComponent(name, "environment name");
|
|
35
|
+
return `vars.${name}.override.toml`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The override file for `env` in the tree `configDir`, or `null` for a
|
|
39
|
+
* committed environment, which never has one. Refuses a name that is not a
|
|
40
|
+
* safe path component.
|
|
41
|
+
*/
|
|
42
|
+
export function varsOverridePath(configDir, env) {
|
|
43
|
+
if (!env.local)
|
|
44
|
+
return null;
|
|
45
|
+
return join(configDir, varsOverrideFileName(env.name));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* `base` with `override`'s keys replacing or adding to it. Either side may be
|
|
49
|
+
* absent; the result is a new table.
|
|
50
|
+
*/
|
|
51
|
+
export function layerVars(base, override) {
|
|
52
|
+
return { ...(base ?? {}), ...(override ?? {}) };
|
|
53
|
+
}
|
|
54
|
+
function readVarTable(path) {
|
|
55
|
+
if (!existsSync(path))
|
|
56
|
+
return null;
|
|
57
|
+
try {
|
|
58
|
+
return parseConfigToml(readFileSync(path, "utf-8"));
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
throw new Error(`${basename(path)}: ${err?.message || String(err)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Reads `vars.toml` in `configDir` and the override at `overridePath`, and
|
|
66
|
+
* layers them. A file that cannot be parsed throws an error naming it.
|
|
67
|
+
*/
|
|
68
|
+
export function readLocalVars(configDir, overridePath) {
|
|
69
|
+
const basePath = join(configDir, VARS_FILE_NAME);
|
|
70
|
+
const base = readVarTable(basePath);
|
|
71
|
+
const override = overridePath ? readVarTable(overridePath) : null;
|
|
72
|
+
const overrideKeys = Object.keys(override ?? {}).sort();
|
|
73
|
+
return {
|
|
74
|
+
basePath,
|
|
75
|
+
base,
|
|
76
|
+
overridePath,
|
|
77
|
+
override,
|
|
78
|
+
layered: layerVars(base, override),
|
|
79
|
+
overridingKeys: overrideKeys.filter((key) => base !== null && key in base),
|
|
80
|
+
addedKeys: overrideKeys.filter((key) => base === null || !(key in base)),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The override file's body: a header saying what the file is, then the keys
|
|
85
|
+
* sorted. An empty table is a comment-only file.
|
|
86
|
+
*/
|
|
87
|
+
export function serializeVarsOverride(vars, target) {
|
|
88
|
+
const sorted = {};
|
|
89
|
+
for (const key of Object.keys(vars).sort())
|
|
90
|
+
sorted[key] = vars[key];
|
|
91
|
+
const header = `# Config var values for the machine-local environment "${target.name}" only.\n` +
|
|
92
|
+
`# Layered over primitive/${target.tree}/${VARS_FILE_NAME} when "${target.name}" is\n` +
|
|
93
|
+
"# selected: a key here replaces or adds to that file's value. Machine-local —\n" +
|
|
94
|
+
"# never commit this file. Non-secret values only; use `primitive secrets`\n" +
|
|
95
|
+
"# for credentials.\n\n";
|
|
96
|
+
return header + stringifyConfigToml(sorted);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* What `config pull` on a machine-local environment writes into its override
|
|
100
|
+
* file. `vars.toml` is never written by such a pull, so each pulled key —
|
|
101
|
+
* every key on the server or in the override, or only `selectedKeys` — is
|
|
102
|
+
* resolved against it: a server value equal to `vars.toml`'s is dropped from
|
|
103
|
+
* the override, any other server value is held there, and a key the server no
|
|
104
|
+
* longer has is removed. Keys outside the selection stay as they are.
|
|
105
|
+
*/
|
|
106
|
+
export function planVarsOverridePull(serverVars, baseVars, selectedKeys, currentOverride, target) {
|
|
107
|
+
const server = new Map(serverVars.map((v) => [v.key, String(v.value ?? "")]));
|
|
108
|
+
const vars = {};
|
|
109
|
+
for (const [key, value] of Object.entries(currentOverride))
|
|
110
|
+
vars[key] = String(value);
|
|
111
|
+
const pulled = selectedKeys ?? new Set([...server.keys(), ...Object.keys(currentOverride)]);
|
|
112
|
+
for (const key of pulled) {
|
|
113
|
+
const value = server.get(key);
|
|
114
|
+
if (value === undefined || (key in baseVars && String(baseVars[key]) === value)) {
|
|
115
|
+
delete vars[key];
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
vars[key] = value;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return { vars, content: serializeVarsOverride(vars, target) };
|
|
122
|
+
}
|
|
123
|
+
/** The one line push, diff and pull print when an override is in play. */
|
|
124
|
+
export function varsOverrideSummaryLine(fileName, keys) {
|
|
125
|
+
return (`Vars override: ${fileName} (${keys.overridingKeys.length} overriding ${VARS_FILE_NAME}, ` +
|
|
126
|
+
`${keys.addedKeys.length} added)`);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The note a push on a child with an override prints when it changed the
|
|
130
|
+
* value of a var that already existed and left at least one function as it
|
|
131
|
+
* was. Functions read vars through a cache keyed by function version, so an
|
|
132
|
+
* unchanged function keeps the value it first read until a new version of it
|
|
133
|
+
* is pushed or its isolate is recycled. `null` when neither applies.
|
|
134
|
+
*/
|
|
135
|
+
export function cachedVarsNote(changedKeys, skippedFunctionCount) {
|
|
136
|
+
if (changedKeys.length === 0 || skippedFunctionCount === 0)
|
|
137
|
+
return null;
|
|
138
|
+
const keys = [...changedKeys].sort().join(", ");
|
|
139
|
+
return (`Note: changed var value(s) ${keys}; ${skippedFunctionCount} unchanged function(s) were not re-pushed. ` +
|
|
140
|
+
"A running function version caches the vars it has read, so it keeps the old value " +
|
|
141
|
+
"until a new version of it is pushed (any change to its code or TOML) or its isolate recycles.");
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=vars-override.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vars-override.js","sourceRoot":"","sources":["../../../src/lib/vars-override.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "primitive-admin",
|
|
3
|
-
"version": "1.2.0-alpha.
|
|
3
|
+
"version": "1.2.0-alpha.7",
|
|
4
4
|
"description": "CLI for administering Primitive applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"commander": "^12.1.0",
|
|
59
59
|
"esbuild": "0.25.12",
|
|
60
60
|
"inquirer": "^9.2.12",
|
|
61
|
-
"js-bao": "0.12.0-alpha.
|
|
61
|
+
"js-bao": "0.12.0-alpha.7",
|
|
62
62
|
"mime-types": "^2.1.35",
|
|
63
63
|
"open": "^10.0.3",
|
|
64
64
|
"smol-toml": "1.7.0",
|