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.
Files changed (47) hide show
  1. package/README.md +1 -1
  2. package/dist/src/commands/apps-children.d.ts +1 -1
  3. package/dist/src/commands/apps-children.js +170 -28
  4. package/dist/src/commands/apps-children.js.map +1 -1
  5. package/dist/src/commands/auth.js +41 -6
  6. package/dist/src/commands/auth.js.map +1 -1
  7. package/dist/src/commands/config.js +43 -4
  8. package/dist/src/commands/config.js.map +1 -1
  9. package/dist/src/commands/databases.js +130 -53
  10. package/dist/src/commands/databases.js.map +1 -1
  11. package/dist/src/commands/init.d.ts +7 -0
  12. package/dist/src/commands/init.js +9 -1
  13. package/dist/src/commands/init.js.map +1 -1
  14. package/dist/src/commands/sync.d.ts +118 -6
  15. package/dist/src/commands/sync.js +594 -55
  16. package/dist/src/commands/sync.js.map +1 -1
  17. package/dist/src/lib/child-apps-local.d.ts +45 -21
  18. package/dist/src/lib/child-apps-local.js +68 -30
  19. package/dist/src/lib/child-apps-local.js.map +1 -1
  20. package/dist/src/lib/credentials-store.d.ts +38 -3
  21. package/dist/src/lib/credentials-store.js +175 -9
  22. package/dist/src/lib/credentials-store.js.map +1 -1
  23. package/dist/src/lib/function-collect.d.ts +1 -1
  24. package/dist/src/lib/function-collect.js +4 -0
  25. package/dist/src/lib/function-collect.js.map +1 -1
  26. package/dist/src/lib/generated-config-surfaces.d.ts +148 -0
  27. package/dist/src/lib/generated-config-surfaces.js +208 -25
  28. package/dist/src/lib/generated-config-surfaces.js.map +1 -1
  29. package/dist/src/lib/generated-sdk-types.d.ts +1 -1
  30. package/dist/src/lib/generated-sdk-types.js +1 -1
  31. package/dist/src/lib/generated-sdk-types.js.map +1 -1
  32. package/dist/src/lib/local-state.d.ts +21 -6
  33. package/dist/src/lib/local-state.js +78 -34
  34. package/dist/src/lib/local-state.js.map +1 -1
  35. package/dist/src/lib/push-failure-report.d.ts +45 -0
  36. package/dist/src/lib/push-failure-report.js +57 -0
  37. package/dist/src/lib/push-failure-report.js.map +1 -0
  38. package/dist/src/lib/sync-selectors.d.ts +5 -1
  39. package/dist/src/lib/sync-selectors.js +23 -13
  40. package/dist/src/lib/sync-selectors.js.map +1 -1
  41. package/dist/src/lib/transient-retry.d.ts +9 -0
  42. package/dist/src/lib/transient-retry.js +37 -0
  43. package/dist/src/lib/transient-retry.js.map +1 -1
  44. package/dist/src/lib/vars-override.d.ts +105 -0
  45. package/dist/src/lib/vars-override.js +143 -0
  46. package/dist/src/lib/vars-override.js.map +1 -0
  47. 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.5",
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.5",
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",