primitive-admin 1.0.53 → 1.0.55

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 (173) hide show
  1. package/README.md +38 -10
  2. package/dist/bin/primitive.js +8 -0
  3. package/dist/bin/primitive.js.map +1 -1
  4. package/dist/src/commands/apps.js +54 -2
  5. package/dist/src/commands/apps.js.map +1 -1
  6. package/dist/src/commands/auth.js +16 -6
  7. package/dist/src/commands/auth.js.map +1 -1
  8. package/dist/src/commands/blob-buckets.js +84 -7
  9. package/dist/src/commands/blob-buckets.js.map +1 -1
  10. package/dist/src/commands/catalog.js +3 -3
  11. package/dist/src/commands/catalog.js.map +1 -1
  12. package/dist/src/commands/collections.js +12 -9
  13. package/dist/src/commands/collections.js.map +1 -1
  14. package/dist/src/commands/databases.js +220 -82
  15. package/dist/src/commands/databases.js.map +1 -1
  16. package/dist/src/commands/documents.js +77 -0
  17. package/dist/src/commands/documents.js.map +1 -1
  18. package/dist/src/commands/group-type-configs.js +1 -9
  19. package/dist/src/commands/group-type-configs.js.map +1 -1
  20. package/dist/src/commands/groups.js +12 -6
  21. package/dist/src/commands/groups.js.map +1 -1
  22. package/dist/src/commands/guides.d.ts +161 -0
  23. package/dist/src/commands/guides.js +502 -84
  24. package/dist/src/commands/guides.js.map +1 -1
  25. package/dist/src/commands/integrations.js +2 -2
  26. package/dist/src/commands/integrations.js.map +1 -1
  27. package/dist/src/commands/metadata.d.ts +2 -0
  28. package/dist/src/commands/metadata.js +344 -0
  29. package/dist/src/commands/metadata.js.map +1 -0
  30. package/dist/src/commands/prompts.js +2 -2
  31. package/dist/src/commands/prompts.js.map +1 -1
  32. package/dist/src/commands/rule-sets.d.ts +1 -0
  33. package/dist/src/commands/rule-sets.js +25 -3
  34. package/dist/src/commands/rule-sets.js.map +1 -1
  35. package/dist/src/commands/scripts.d.ts +2 -0
  36. package/dist/src/commands/scripts.js +667 -0
  37. package/dist/src/commands/scripts.js.map +1 -0
  38. package/dist/src/commands/settings.d.ts +15 -0
  39. package/dist/src/commands/settings.js +102 -0
  40. package/dist/src/commands/settings.js.map +1 -0
  41. package/dist/src/commands/sync-app-settings.d.ts +105 -0
  42. package/dist/src/commands/sync-app-settings.js +339 -0
  43. package/dist/src/commands/sync-app-settings.js.map +1 -0
  44. package/dist/src/commands/sync.d.ts +204 -9
  45. package/dist/src/commands/sync.js +1706 -371
  46. package/dist/src/commands/sync.js.map +1 -1
  47. package/dist/src/commands/vars.d.ts +8 -0
  48. package/dist/src/commands/vars.js +110 -0
  49. package/dist/src/commands/vars.js.map +1 -0
  50. package/dist/src/commands/webhooks.js +17 -3
  51. package/dist/src/commands/webhooks.js.map +1 -1
  52. package/dist/src/commands/workflows.d.ts +30 -0
  53. package/dist/src/commands/workflows.js +667 -59
  54. package/dist/src/commands/workflows.js.map +1 -1
  55. package/dist/src/lib/api-client.d.ts +122 -18
  56. package/dist/src/lib/api-client.js +131 -2
  57. package/dist/src/lib/api-client.js.map +1 -1
  58. package/dist/src/lib/app-settings-descriptor.d.ts +108 -0
  59. package/dist/src/lib/app-settings-descriptor.js +250 -0
  60. package/dist/src/lib/app-settings-descriptor.js.map +1 -0
  61. package/dist/src/lib/batch.d.ts +26 -0
  62. package/dist/src/lib/batch.js +32 -0
  63. package/dist/src/lib/batch.js.map +1 -0
  64. package/dist/src/lib/block-layout.d.ts +160 -0
  65. package/dist/src/lib/block-layout.js +451 -0
  66. package/dist/src/lib/block-layout.js.map +1 -0
  67. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +76 -0
  68. package/dist/src/lib/codegen-shared/generatedFiles.js +144 -0
  69. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
  70. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +68 -0
  71. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +168 -0
  72. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -0
  73. package/dist/src/lib/config-toml.d.ts +10 -0
  74. package/dist/src/lib/config-toml.js +42 -0
  75. package/dist/src/lib/config-toml.js.map +1 -0
  76. package/dist/src/lib/config.d.ts +16 -0
  77. package/dist/src/lib/config.js +41 -0
  78. package/dist/src/lib/config.js.map +1 -1
  79. package/dist/src/lib/constants.d.ts +9 -0
  80. package/dist/src/lib/constants.js +9 -0
  81. package/dist/src/lib/constants.js.map +1 -1
  82. package/dist/src/lib/csv.d.ts +1 -2
  83. package/dist/src/lib/csv.js +3 -8
  84. package/dist/src/lib/csv.js.map +1 -1
  85. package/dist/src/lib/db-codegen/dbGenerator.d.ts +21 -65
  86. package/dist/src/lib/db-codegen/dbGenerator.js +117 -321
  87. package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -1
  88. package/dist/src/lib/db-codegen/dbNaming.d.ts +37 -0
  89. package/dist/src/lib/db-codegen/dbNaming.js +70 -0
  90. package/dist/src/lib/db-codegen/dbNaming.js.map +1 -1
  91. package/dist/src/lib/db-codegen/dbTemplates.d.ts +165 -5
  92. package/dist/src/lib/db-codegen/dbTemplates.js +292 -16
  93. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -1
  94. package/dist/src/lib/db-codegen/dbTsTypes.d.ts +7 -3
  95. package/dist/src/lib/db-codegen/dbTsTypes.js +23 -1
  96. package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -1
  97. package/dist/src/lib/db-codegen/dbTypeIR.d.ts +146 -0
  98. package/dist/src/lib/db-codegen/dbTypeIR.js +517 -0
  99. package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -0
  100. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.d.ts +101 -0
  101. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js +200 -0
  102. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js.map +1 -0
  103. package/dist/src/lib/generated-allowlist.js +43 -0
  104. package/dist/src/lib/generated-allowlist.js.map +1 -1
  105. package/dist/src/lib/init-config.js +2 -2
  106. package/dist/src/lib/init-config.js.map +1 -1
  107. package/dist/src/lib/output.d.ts +25 -5
  108. package/dist/src/lib/output.js +32 -4
  109. package/dist/src/lib/output.js.map +1 -1
  110. package/dist/src/lib/query-operators.d.ts +43 -0
  111. package/dist/src/lib/query-operators.js +80 -0
  112. package/dist/src/lib/query-operators.js.map +1 -0
  113. package/dist/src/lib/swift-codegen/dbGenerator.d.ts +68 -0
  114. package/dist/src/lib/swift-codegen/dbGenerator.js +380 -0
  115. package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -0
  116. package/dist/src/lib/swift-codegen/dbSwiftTypes.d.ts +42 -0
  117. package/dist/src/lib/swift-codegen/dbSwiftTypes.js +100 -0
  118. package/dist/src/lib/swift-codegen/dbSwiftTypes.js.map +1 -0
  119. package/dist/src/lib/swift-codegen/generator.d.ts +84 -0
  120. package/dist/src/lib/swift-codegen/generator.js +178 -0
  121. package/dist/src/lib/swift-codegen/generator.js.map +1 -0
  122. package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +72 -0
  123. package/dist/src/lib/swift-codegen/schemaToSwift.js +644 -0
  124. package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -0
  125. package/dist/src/lib/swift-codegen/swiftNaming.d.ts +85 -0
  126. package/dist/src/lib/swift-codegen/swiftNaming.js +198 -0
  127. package/dist/src/lib/swift-codegen/swiftNaming.js.map +1 -0
  128. package/dist/src/lib/sync-resource-types.d.ts +225 -0
  129. package/dist/src/lib/sync-resource-types.js +394 -0
  130. package/dist/src/lib/sync-resource-types.js.map +1 -0
  131. package/dist/src/lib/toml-database-config.d.ts +10 -19
  132. package/dist/src/lib/toml-database-config.js +28 -59
  133. package/dist/src/lib/toml-database-config.js.map +1 -1
  134. package/dist/src/lib/toml-metadata-config.d.ts +147 -0
  135. package/dist/src/lib/toml-metadata-config.js +463 -0
  136. package/dist/src/lib/toml-metadata-config.js.map +1 -0
  137. package/dist/src/lib/toml-native-form.d.ts +46 -0
  138. package/dist/src/lib/toml-native-form.js +78 -0
  139. package/dist/src/lib/toml-native-form.js.map +1 -0
  140. package/dist/src/lib/toml-params-validator.d.ts +34 -0
  141. package/dist/src/lib/toml-params-validator.js +118 -3
  142. package/dist/src/lib/toml-params-validator.js.map +1 -1
  143. package/dist/src/lib/workflow-apply.d.ts +86 -0
  144. package/dist/src/lib/workflow-apply.js +127 -0
  145. package/dist/src/lib/workflow-apply.js.map +1 -0
  146. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +129 -0
  147. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +269 -0
  148. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
  149. package/dist/src/lib/workflow-codegen/generator.d.ts +87 -0
  150. package/dist/src/lib/workflow-codegen/generator.js +290 -0
  151. package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
  152. package/dist/src/lib/workflow-codegen/invokerIR.d.ts +85 -0
  153. package/dist/src/lib/workflow-codegen/invokerIR.js +71 -0
  154. package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -0
  155. package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
  156. package/dist/src/lib/workflow-codegen/naming.js +81 -0
  157. package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
  158. package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +64 -0
  159. package/dist/src/lib/workflow-codegen/schemaToTs.js +282 -0
  160. package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
  161. package/dist/src/lib/workflow-fragments.js +3 -3
  162. package/dist/src/lib/workflow-fragments.js.map +1 -1
  163. package/dist/src/lib/workflow-payload.d.ts +68 -0
  164. package/dist/src/lib/workflow-payload.js +150 -0
  165. package/dist/src/lib/workflow-payload.js.map +1 -0
  166. package/dist/src/lib/workflow-toml-validator.d.ts +1 -1
  167. package/dist/src/lib/workflow-toml-validator.js +37 -1
  168. package/dist/src/lib/workflow-toml-validator.js.map +1 -1
  169. package/dist/src/types/index.d.ts +11 -0
  170. package/dist/src/validators.d.ts +4 -3
  171. package/dist/src/validators.js +6 -5
  172. package/dist/src/validators.js.map +1 -1
  173. package/package.json +7 -3
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Shared write / `--check` / stale-cleanup machinery for the CLI codegen
3
+ * commands (issue #1442, sponsor decision #6).
4
+ *
5
+ * Both `databases codegen` (#814) and `workflows codegen` (#1442) render a set
6
+ * of `*.generated.ts` files and then either write them to disk or, under
7
+ * `--check`, compare the would-be output byte-for-byte against what's on disk.
8
+ * The write/compare/cleanup half is identical between them, so it lives here
9
+ * rather than being cloned into each generator.
10
+ *
11
+ * The RENDERING (schema → TS) stays in each generator — only the on-disk
12
+ * lifecycle is shared: `mkdir`, write, orphan cleanup, and the `--check`
13
+ * missing/differs/stale comparison.
14
+ */
15
+ import * as path from "path";
16
+ import { promises as fsp } from "fs";
17
+ const DEFAULT_GENERATED_SUFFIX = ".generated.ts";
18
+ /**
19
+ * Write (or `--check`) a set of rendered generated files, handling orphan
20
+ * cleanup / stale detection. Pure lifecycle: the caller renders content, this
21
+ * owns the disk side.
22
+ */
23
+ export async function writeOrCheckGeneratedFiles(options) {
24
+ const outAbs = path.resolve(options.outputDir);
25
+ const suffix = options.generatedSuffix ?? DEFAULT_GENERATED_SUFFIX;
26
+ if (options.check === true) {
27
+ return await runCheck(outAbs, options.filesToWrite, options.fullOwnership, suffix, options.ownershipBanner);
28
+ }
29
+ await fsp.mkdir(outAbs, { recursive: true });
30
+ const deletedFiles = await cleanupGeneratedOutputs(outAbs, options.filesToWrite, options.fullOwnership, suffix, options.ownershipBanner);
31
+ const writtenFiles = [];
32
+ for (const [filePath, content] of options.filesToWrite) {
33
+ await fsp.writeFile(filePath, content, "utf-8");
34
+ writtenFiles.push(filePath);
35
+ }
36
+ writtenFiles.sort();
37
+ deletedFiles.sort();
38
+ return { writtenFiles, deletedFiles, mismatches: [] };
39
+ }
40
+ async function runCheck(outAbs, filesToWrite, fullOwnership, suffix, ownershipBanner) {
41
+ const mismatches = [];
42
+ for (const [filePath, expected] of filesToWrite) {
43
+ let actual;
44
+ try {
45
+ actual = await fsp.readFile(filePath, "utf-8");
46
+ }
47
+ catch (err) {
48
+ if (err && err.code === "ENOENT") {
49
+ actual = null;
50
+ }
51
+ else {
52
+ throw err;
53
+ }
54
+ }
55
+ if (actual === null) {
56
+ mismatches.push({ filePath, reason: "missing" });
57
+ }
58
+ else if (actual !== expected) {
59
+ mismatches.push({ filePath, reason: "differs" });
60
+ }
61
+ }
62
+ // Stale on-disk generated files the generator wouldn't produce also count as
63
+ // a mismatch (so CI catches dropped types/workflows). Skip when this run only
64
+ // owns a subset: `filesToWrite` is then partial, so sibling files aren't
65
+ // "stale" — they just weren't in scope.
66
+ if (fullOwnership && (await dirExists(outAbs))) {
67
+ const onDisk = await listOwnedGeneratedFiles(outAbs, suffix, ownershipBanner);
68
+ const expectedPaths = new Set(filesToWrite.keys());
69
+ for (const filePath of onDisk) {
70
+ if (!expectedPaths.has(filePath)) {
71
+ mismatches.push({ filePath, reason: "stale" });
72
+ }
73
+ }
74
+ }
75
+ return {
76
+ writtenFiles: [...filesToWrite.keys()].sort(),
77
+ deletedFiles: [],
78
+ mismatches,
79
+ };
80
+ }
81
+ async function cleanupGeneratedOutputs(outDir, filesToWrite, fullOwnership, suffix, ownershipBanner) {
82
+ // A filtered run only owns a subset; `filesToWrite` does not represent the
83
+ // full set of generated files, so skip orphan cleanup to avoid destroying
84
+ // sibling files. Full cleanup only happens on the unfiltered run.
85
+ if (!fullOwnership)
86
+ return [];
87
+ const onDisk = await listOwnedGeneratedFiles(outDir, suffix, ownershipBanner);
88
+ const expectedPaths = new Set(filesToWrite.keys());
89
+ const deleted = [];
90
+ for (const filePath of onDisk) {
91
+ if (!expectedPaths.has(filePath)) {
92
+ await fsp.unlink(filePath);
93
+ deleted.push(filePath);
94
+ }
95
+ }
96
+ return deleted;
97
+ }
98
+ /**
99
+ * List only the generator-owned files in `outDir`, decided by the `suffix`
100
+ * (`.generated.ts`) and, when given, an `ownershipBanner` prefix on the file's
101
+ * content. Hand-written files — and files owned by a DIFFERENT generator that
102
+ * happen to share the suffix — are never touched.
103
+ */
104
+ async function listOwnedGeneratedFiles(outDir, suffix, ownershipBanner) {
105
+ if (!(await dirExists(outDir)))
106
+ return [];
107
+ const entries = await fsp.readdir(outDir, { withFileTypes: true });
108
+ const owned = [];
109
+ for (const entry of entries) {
110
+ if (!entry.isFile())
111
+ continue;
112
+ if (!entry.name.endsWith(suffix))
113
+ continue;
114
+ const filePath = path.join(outDir, entry.name);
115
+ if (ownershipBanner) {
116
+ // Content-scoped ownership: only sweep files carrying THIS generator's
117
+ // banner, so a shared output dir keeps each generator's cleanup to its
118
+ // own files. A read failure means "not confidently ours" → skip it.
119
+ let contents;
120
+ try {
121
+ contents = await fsp.readFile(filePath, "utf-8");
122
+ }
123
+ catch {
124
+ continue;
125
+ }
126
+ if (!contents.startsWith(ownershipBanner))
127
+ continue;
128
+ }
129
+ owned.push(filePath);
130
+ }
131
+ return owned;
132
+ }
133
+ async function dirExists(dir) {
134
+ try {
135
+ const stat = await fsp.stat(dir);
136
+ return stat.isDirectory();
137
+ }
138
+ catch (err) {
139
+ if (err && err.code === "ENOENT")
140
+ return false;
141
+ throw err;
142
+ }
143
+ }
144
+ //# sourceMappingURL=generatedFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generatedFiles.js","sourceRoot":"","sources":["../../../../src/lib/codegen-shared/generatedFiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Shared source-directory resolution for the CLI codegen commands
3
+ * (`workflows codegen` #1442 and `databases codegen` #814, issue #1510).
4
+ *
5
+ * Both commands read a set of `*.toml` schemas out of a synced sub-directory
6
+ * (`workflows/` or `database-types/`) and render `*.generated.ts` beside them.
7
+ * Historically each command located that source directory by scanning EVERY
8
+ * `.primitive/sync/<env>/<appId>/<subdir>` slot and either hard-erroring on
9
+ * more than one (`workflows`) or silently merging across environments
10
+ * (`databases`, via a `seenTypes` dedup). Neither did any environment
11
+ * resolution, so `PRIMITIVE_ENV=dev workflows codegen` would happily generate
12
+ * from the `alpha` TOML while `databases codegen` followed a different env —
13
+ * the two generated-type trees could come from different environments in one
14
+ * run.
15
+ *
16
+ * This helper resolves the source directory the same way every other CLI
17
+ * command targets an environment: `--env` → `PRIMITIVE_ENV` →
18
+ * `defaultEnvironment` → single-env → error. `--sync-dir` and `--app` remain
19
+ * explicit overrides. It returns ONLY the resolved source directory; TOML
20
+ * collection, type filtering/dedup, and output-dir defaulting stay in each
21
+ * command.
22
+ *
23
+ * Design notes (binding, from the plan of record for #1510):
24
+ * - Call `getCurrentEnvironment()` DIRECTLY when no `--sync-dir` is given.
25
+ * `resolveSyncDir()`'s internal `safeEnv()` swallows the resolver's
26
+ * ambiguity error and falls back to `./config`, so genuine ambiguity must
27
+ * be surfaced here, not through `resolveSyncDir()`.
28
+ * - Throw plain `Error`s; the calling commands keep their existing
29
+ * `error(); process.exit(1)` convention (they catch at the boundary).
30
+ * - Do NOT use `resolveAppId()` — it is auth-oriented and exits the process,
31
+ * which is wrong for an offline codegen path.
32
+ * - Preserve the `--app`-alone legacy fallback: when `--app` is given, NO
33
+ * environment was explicitly requested, and env resolution fails (or there
34
+ * is no project config / legacy bare-dir mode), scan
35
+ * `.primitive/sync/<env>/<app>/<subdir>` for that specific app, resolving
36
+ * when it appears under exactly one env and erroring (naming the candidate
37
+ * envs) when it appears under more than one. This keeps the existing
38
+ * integration contract
39
+ * (`cli/tests/integration/workflows-codegen.test.ts`) intact.
40
+ * - Do NOT fall through to that scan when an environment WAS explicitly named
41
+ * (`--env` or `PRIMITIVE_ENV`) but is invalid/unknown: surface the
42
+ * resolver's error instead, so an explicit env selection never silently
43
+ * generates code from a different synced environment.
44
+ */
45
+ export interface ResolveCodegenSourceDirOptions {
46
+ /** `--app <app-id>` override, if the user passed it. */
47
+ app?: string;
48
+ /** `--sync-dir <path>` override, if the user passed it. */
49
+ syncDir?: string;
50
+ }
51
+ export interface ResolveCodegenSourceDirArgs {
52
+ /** The synced sub-directory to resolve, e.g. "workflows" or "database-types". */
53
+ subdir: string;
54
+ /** Parsed command options (`--app`, `--sync-dir`). */
55
+ options: ResolveCodegenSourceDirOptions;
56
+ /**
57
+ * Working directory the legacy scan is rooted at. Defaults to
58
+ * `process.cwd()`; parameterised so unit tests can point it at a tmp tree
59
+ * (vitest workers can't `chdir`).
60
+ */
61
+ cwd?: string;
62
+ }
63
+ /**
64
+ * Resolves the single source directory a codegen command should read its
65
+ * `*.toml` schemas from. Throws a plain `Error` (with a user-facing message)
66
+ * when the directory can't be resolved unambiguously or doesn't exist.
67
+ */
68
+ export declare function resolveCodegenSourceDir(args: ResolveCodegenSourceDirArgs): string;
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Shared source-directory resolution for the CLI codegen commands
3
+ * (`workflows codegen` #1442 and `databases codegen` #814, issue #1510).
4
+ *
5
+ * Both commands read a set of `*.toml` schemas out of a synced sub-directory
6
+ * (`workflows/` or `database-types/`) and render `*.generated.ts` beside them.
7
+ * Historically each command located that source directory by scanning EVERY
8
+ * `.primitive/sync/<env>/<appId>/<subdir>` slot and either hard-erroring on
9
+ * more than one (`workflows`) or silently merging across environments
10
+ * (`databases`, via a `seenTypes` dedup). Neither did any environment
11
+ * resolution, so `PRIMITIVE_ENV=dev workflows codegen` would happily generate
12
+ * from the `alpha` TOML while `databases codegen` followed a different env —
13
+ * the two generated-type trees could come from different environments in one
14
+ * run.
15
+ *
16
+ * This helper resolves the source directory the same way every other CLI
17
+ * command targets an environment: `--env` → `PRIMITIVE_ENV` →
18
+ * `defaultEnvironment` → single-env → error. `--sync-dir` and `--app` remain
19
+ * explicit overrides. It returns ONLY the resolved source directory; TOML
20
+ * collection, type filtering/dedup, and output-dir defaulting stay in each
21
+ * command.
22
+ *
23
+ * Design notes (binding, from the plan of record for #1510):
24
+ * - Call `getCurrentEnvironment()` DIRECTLY when no `--sync-dir` is given.
25
+ * `resolveSyncDir()`'s internal `safeEnv()` swallows the resolver's
26
+ * ambiguity error and falls back to `./config`, so genuine ambiguity must
27
+ * be surfaced here, not through `resolveSyncDir()`.
28
+ * - Throw plain `Error`s; the calling commands keep their existing
29
+ * `error(); process.exit(1)` convention (they catch at the boundary).
30
+ * - Do NOT use `resolveAppId()` — it is auth-oriented and exits the process,
31
+ * which is wrong for an offline codegen path.
32
+ * - Preserve the `--app`-alone legacy fallback: when `--app` is given, NO
33
+ * environment was explicitly requested, and env resolution fails (or there
34
+ * is no project config / legacy bare-dir mode), scan
35
+ * `.primitive/sync/<env>/<app>/<subdir>` for that specific app, resolving
36
+ * when it appears under exactly one env and erroring (naming the candidate
37
+ * envs) when it appears under more than one. This keeps the existing
38
+ * integration contract
39
+ * (`cli/tests/integration/workflows-codegen.test.ts`) intact.
40
+ * - Do NOT fall through to that scan when an environment WAS explicitly named
41
+ * (`--env` or `PRIMITIVE_ENV`) but is invalid/unknown: surface the
42
+ * resolver's error instead, so an explicit env selection never silently
43
+ * generates code from a different synced environment.
44
+ */
45
+ import { existsSync, readdirSync } from "fs";
46
+ import { basename, dirname, join } from "path";
47
+ import { getCurrentEnvironment, getExplicitEnvName } from "../env-resolver.js";
48
+ import { getCurrentAppId } from "../config.js";
49
+ import { resolveSyncDir, assertSafePathComponent } from "../sync-paths.js";
50
+ /**
51
+ * Resolves the single source directory a codegen command should read its
52
+ * `*.toml` schemas from. Throws a plain `Error` (with a user-facing message)
53
+ * when the directory can't be resolved unambiguously or doesn't exist.
54
+ */
55
+ export function resolveCodegenSourceDir(args) {
56
+ const { subdir, options } = args;
57
+ const cwd = args.cwd ?? process.cwd();
58
+ // 1. --sync-dir is an explicit override: use <sync-dir>/<subdir> verbatim.
59
+ if (options.syncDir) {
60
+ return requireExisting(join(options.syncDir, subdir), subdir, undefined);
61
+ }
62
+ // 2. Resolve the active environment. Call getCurrentEnvironment() directly
63
+ // (not via resolveSyncDir/safeEnv) so a genuinely ambiguous project
64
+ // surfaces the resolver's "No environment selected… Available: …" error
65
+ // with a non-zero exit — unless the caller narrowed the target with
66
+ // --app AND did not name an environment, in which case we fall back to the
67
+ // legacy per-app scan.
68
+ //
69
+ // The `--app`-alone fallback only applies when NO environment was
70
+ // explicitly requested (neither `--env` nor `PRIMITIVE_ENV`). When the
71
+ // user DID name an env but it's invalid/unknown, getCurrentEnvironment()
72
+ // throws; we must surface that error (non-zero exit) rather than silently
73
+ // scanning the app under some OTHER synced environment — that would
74
+ // generate code from the wrong env instead of honoring the explicit
75
+ // selection.
76
+ const explicitEnvRequested = getExplicitEnvName() !== null || !!process.env.PRIMITIVE_ENV;
77
+ let env;
78
+ try {
79
+ env = getCurrentEnvironment();
80
+ }
81
+ catch (err) {
82
+ if (options.app && !explicitEnvRequested) {
83
+ return scanSyncTree({ subdir, appId: options.app, cwd });
84
+ }
85
+ throw err;
86
+ }
87
+ // 3. Project mode: resolve the app id and build the env/app-scoped path.
88
+ if (env) {
89
+ const appId = options.app ?? env.config.appId ?? getCurrentAppId();
90
+ if (!appId) {
91
+ throw new Error(`No app configured for environment "${env.name}" in .primitive/config.json ` +
92
+ `and no --app given. Add "appId" to the environment or pass --app <app-id>.`);
93
+ }
94
+ // resolveSyncDir re-reads the (cached) resolved env and guards appId via
95
+ // assertSafePathComponent, so an unsafe --app is rejected here.
96
+ const dir = join(resolveSyncDir({ appId }), subdir);
97
+ return requireExisting(dir, subdir, appId);
98
+ }
99
+ // 4. Legacy / bare-dir mode (no .primitive/config.json): scan the sync tree,
100
+ // filtered to --app when given. This preserves the pre-#1510 behavior.
101
+ return scanSyncTree({ subdir, appId: options.app, cwd });
102
+ }
103
+ /**
104
+ * Legacy fallback: scan `<cwd>/.primitive/sync/<env>/<app>/<subdir>` for a
105
+ * source directory. When `appId` is given, only that app's slots are
106
+ * considered. Resolves to the single match; errors clearly on zero or on
107
+ * ambiguity (naming the candidate apps or envs).
108
+ */
109
+ function scanSyncTree(args) {
110
+ const { subdir, appId, cwd } = args;
111
+ // Defence-in-depth: an --app value flows into a file-system path below, so
112
+ // reject separators / `..` before using it.
113
+ if (appId)
114
+ assertSafePathComponent(appId, "appId");
115
+ const root = join(cwd, ".primitive", "sync");
116
+ const found = [];
117
+ if (existsSync(root)) {
118
+ for (const envName of readdirSync(root)) {
119
+ const envDir = join(root, envName);
120
+ try {
121
+ for (const app of readdirSync(envDir)) {
122
+ if (appId && app !== appId)
123
+ continue;
124
+ const candidate = join(envDir, app, subdir);
125
+ if (existsSync(candidate))
126
+ found.push(candidate);
127
+ }
128
+ }
129
+ catch {
130
+ // Not a directory (or unreadable) — skip.
131
+ }
132
+ }
133
+ }
134
+ if (found.length === 0) {
135
+ throw new Error(notFoundMessage(subdir, appId));
136
+ }
137
+ if (found.length > 1) {
138
+ if (appId) {
139
+ const envs = [
140
+ ...new Set(found.map((d) => basename(dirname(dirname(d))))),
141
+ ];
142
+ throw new Error(`App "${appId}" has a ${subdir}/ directory under multiple environments: ` +
143
+ `${envs.join(", ")}.\n` +
144
+ found.map((d) => ` ${d}`).join("\n") +
145
+ `\nPass --env <name> or --sync-dir to select one.`);
146
+ }
147
+ const apps = [...new Set(found.map((d) => basename(dirname(d))))];
148
+ throw new Error(`Found ${subdir}/ directories for more than one app/env:\n` +
149
+ found.map((d) => ` ${d}`).join("\n") +
150
+ `\nCodegen writes into one output dir, so it must run against one app. ` +
151
+ `Pass --app <app-id> (found: ${apps.join(", ")}) or --sync-dir to select one.`);
152
+ }
153
+ return found[0];
154
+ }
155
+ /** Verifies `dir` exists, throwing the standard "no source dir" error otherwise. */
156
+ function requireExisting(dir, subdir, appId) {
157
+ if (!existsSync(dir)) {
158
+ throw new Error(notFoundMessage(subdir, appId));
159
+ }
160
+ return dir;
161
+ }
162
+ function notFoundMessage(subdir, appId) {
163
+ return appId
164
+ ? `No ${subdir}/ directory found for app "${appId}" under .primitive/sync/. ` +
165
+ `Check the --app id, pass --sync-dir, or run \`primitive sync pull\` first.`
166
+ : `No ${subdir}/ directory found. Pass --sync-dir or run \`primitive sync pull\` first.`;
167
+ }
168
+ //# sourceMappingURL=resolveCodegenSourceDir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveCodegenSourceDir.js","sourceRoot":"","sources":["../../../../src/lib/codegen-shared/resolveCodegenSourceDir.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Parse a TOML source string with a TOML 1.0-compliant parser.
3
+ * Accepts heterogeneous inline arrays that the old `@iarna` rejected.
4
+ */
5
+ export declare function parseConfigToml(content: string): Record<string, any>;
6
+ /**
7
+ * Serialize a config object to TOML with a TOML 1.0-compliant serializer.
8
+ * Emits heterogeneous arrays natively instead of falling back to a JSON string.
9
+ */
10
+ export declare function stringifyConfigToml(data: any): string;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * The CLI's single TOML wrapper. Every TOML parse/stringify in the CLI routes
3
+ * through here — config files (database-type configs, workflows, collection-type
4
+ * configs, v2 block configs) and non-config files alike (app.toml, prompts,
5
+ * integrations, cron triggers, webhooks, rule-sets, codegen, ...).
6
+ *
7
+ * Config files can carry **heterogeneous arrays**: a settings-gated pipeline
8
+ * produces a CEL step-reference string next to a filter object, e.g.
9
+ * `"$and" = ["$steps.settings.first.peerVisible", { status = "approved" }]`.
10
+ * TOML 1.0.0 permits heterogeneous arrays; the previous library `@iarna`
11
+ * targeted TOML 0.5 and threw on them in **both** directions (`stringify` and
12
+ * `parse`). `smol-toml` is TOML 1.0-compliant and round-trips them, so #1450
13
+ * swapped the config paths and #1464 finished the migration — moving every
14
+ * remaining site here and removing `@iarna` entirely. Keeping one library
15
+ * means one set of parser semantics to reason about.
16
+ *
17
+ * Behavioral notes for the smol-toml swap (measured against `@iarna@2.2.5`):
18
+ * every divergence is a loud error, never silent value drift. smol throws on
19
+ * integers beyond 2^53 (`@iarna` returned a BigInt that then broke
20
+ * `JSON.stringify` on push), rejects control characters in comments (TOML 1.0
21
+ * ban), and throws on stringifying an array containing `null` (`@iarna`
22
+ * silently dropped it). `null`/`undefined` data-loss guards live in
23
+ * `canEmitNative` (`toml-database-config.ts`), not here. `smol` re-emits with
24
+ * slightly different formatting (`[]` not `[ ]`, no array-of-tables indent) —
25
+ * a one-time reformat on the next `pull`.
26
+ */
27
+ import * as smolToml from "smol-toml";
28
+ /**
29
+ * Parse a TOML source string with a TOML 1.0-compliant parser.
30
+ * Accepts heterogeneous inline arrays that the old `@iarna` rejected.
31
+ */
32
+ export function parseConfigToml(content) {
33
+ return smolToml.parse(content);
34
+ }
35
+ /**
36
+ * Serialize a config object to TOML with a TOML 1.0-compliant serializer.
37
+ * Emits heterogeneous arrays natively instead of falling back to a JSON string.
38
+ */
39
+ export function stringifyConfigToml(data) {
40
+ return smolToml.stringify(data);
41
+ }
42
+ //# sourceMappingURL=config-toml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-toml.js","sourceRoot":"","sources":["../../../src/lib/config-toml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,QAAQ,MAAM,WAAW,CAAC;AAEtC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAwB,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAS;IAC3C,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC"}
@@ -29,6 +29,22 @@ export declare function resolveAppId(appId: string | undefined, options: {
29
29
  * the serverUrl saved in the legacy credentials file.
30
30
  */
31
31
  export declare function getServerUrl(): string;
32
+ /**
33
+ * Resolves the API base URL to authenticate against, used by `primitive login`
34
+ * (issue #1343).
35
+ *
36
+ * Unlike getServerUrl(), this must work *before* any credentials exist (first
37
+ * login), so it never falls back to the stored credentials' serverUrl:
38
+ *
39
+ * - Project mode → the active environment's `apiUrl` (canonical). Lets
40
+ * getCurrentEnvironment() throw on an unresolvable env (ambiguous/unknown
41
+ * --env) so the caller can fail loudly instead of silently targeting prod.
42
+ * - Legacy mode (no .primitive/config.json) → DEFAULT_SERVER_URL, which
43
+ * honors the PRIMITIVE_SERVER_URL escape hatch (constants.ts).
44
+ *
45
+ * The trailing slash is stripped so callers can build `${url}/admin/api/...`.
46
+ */
47
+ export declare function getConfiguredServerUrl(): string;
32
48
  /**
33
49
  * Exposed so commands can check whether there's a pre-project-config
34
50
  * credentials file at ~/.primitive/credentials.json (used by migration
@@ -14,6 +14,8 @@
14
14
  */
15
15
  import { clearCredentialsStore, clearCurrentAppStore, loadCredentialsStore, peekLegacyCredentials, saveCredentialsStore, setCurrentAppStore, } from "./credentials-store.js";
16
16
  import { getCurrentEnvironment, getCurrentEnvNameSafe, } from "./env-resolver.js";
17
+ import { PROJECT_CONFIG_DISPLAY_NAME } from "./project-config.js";
18
+ import { DEFAULT_SERVER_URL } from "./constants.js";
17
19
  export function loadCredentials() {
18
20
  return loadCredentialsStore();
19
21
  }
@@ -55,6 +57,26 @@ export function getCurrentAppId() {
55
57
  export function resolveAppId(appId, options) {
56
58
  const resolved = appId || options.app || getCurrentAppId();
57
59
  if (!resolved) {
60
+ // When the active env declares an `appId` in .primitive/config.json but
61
+ // has no credentials slot, loadCredentialsStore() returns null (its
62
+ // null == unauthenticated contract), so getCurrentAppId() yields nothing
63
+ // even though an appId IS configured. In that case the accurate problem
64
+ // is that the user isn't authenticated for this env — not that no app was
65
+ // specified. (A creds slot would have blended in env.config.appId and made
66
+ // `resolved` truthy, so reaching here with a configured appId can only mean
67
+ // missing credentials.)
68
+ let env = null;
69
+ try {
70
+ env = getCurrentEnvironment();
71
+ }
72
+ catch {
73
+ // Env resolution failed (ambiguous/unknown env) — fall back to the
74
+ // original "No app specified." message below.
75
+ }
76
+ if (env && env.config.appId) {
77
+ console.error(`Not logged in to environment "${env.name}". An appId is configured in ${PROJECT_CONFIG_DISPLAY_NAME} but you're not authenticated. Run 'primitive -e ${env.name} login'.`);
78
+ process.exit(1);
79
+ }
58
80
  const envName = getCurrentEnvNameSafe();
59
81
  const hint = envName
60
82
  ? `(current environment: ${envName}). Set 'appId' in .primitive/config.json, pass --app, or run 'primitive use <app-id>'.`
@@ -85,6 +107,25 @@ export function getServerUrl() {
85
107
  }
86
108
  return credentials.serverUrl;
87
109
  }
110
+ /**
111
+ * Resolves the API base URL to authenticate against, used by `primitive login`
112
+ * (issue #1343).
113
+ *
114
+ * Unlike getServerUrl(), this must work *before* any credentials exist (first
115
+ * login), so it never falls back to the stored credentials' serverUrl:
116
+ *
117
+ * - Project mode → the active environment's `apiUrl` (canonical). Lets
118
+ * getCurrentEnvironment() throw on an unresolvable env (ambiguous/unknown
119
+ * --env) so the caller can fail loudly instead of silently targeting prod.
120
+ * - Legacy mode (no .primitive/config.json) → DEFAULT_SERVER_URL, which
121
+ * honors the PRIMITIVE_SERVER_URL escape hatch (constants.ts).
122
+ *
123
+ * The trailing slash is stripped so callers can build `${url}/admin/api/...`.
124
+ */
125
+ export function getConfiguredServerUrl() {
126
+ const env = getCurrentEnvironment(); // may throw on an unresolvable env
127
+ return (env ? env.config.apiUrl : DEFAULT_SERVER_URL).replace(/\/$/, "");
128
+ }
88
129
  /**
89
130
  * Exposed so commands can check whether there's a pre-project-config
90
131
  * credentials file at ~/.primitive/credentials.json (used by migration
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,11 @@
1
1
  export declare const PRODUCTION_SERVER_URL = "https://primitiveapi.com";
2
2
  export declare const DEFAULT_SERVER_URL: string;
3
+ /**
4
+ * The alpha deployment's canonical server URL. Mirrors
5
+ * `wrangler.toml [env.alpha] WORKER_URL` — keep the two in sync; if the alpha
6
+ * URL ever changes, update both. Used only by `primitive guides` to detect the
7
+ * alpha target and fetch guides from the `primitive-docs` `next` branch instead
8
+ * of `main` (issue #1463). This is an internal-only convenience;
9
+ * security-through-obscurity is acceptable.
10
+ */
11
+ export declare const ALPHA_SERVER_URL = "https://js-bao-wss-alpha.primitive-labs-dev.workers.dev";
@@ -1,3 +1,12 @@
1
1
  export const PRODUCTION_SERVER_URL = "https://primitiveapi.com";
2
2
  export const DEFAULT_SERVER_URL = process.env.PRIMITIVE_SERVER_URL || PRODUCTION_SERVER_URL;
3
+ /**
4
+ * The alpha deployment's canonical server URL. Mirrors
5
+ * `wrangler.toml [env.alpha] WORKER_URL` — keep the two in sync; if the alpha
6
+ * URL ever changes, update both. Used only by `primitive guides` to detect the
7
+ * alpha target and fetch guides from the `primitive-docs` `next` branch instead
8
+ * of `main` (issue #1463). This is an internal-only convenience;
9
+ * security-through-obscurity is acceptable.
10
+ */
11
+ export const ALPHA_SERVER_URL = "https://js-bao-wss-alpha.primitive-labs-dev.workers.dev";
3
12
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,qBAAqB,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,qBAAqB,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,yDAAyD,CAAC"}
@@ -44,5 +44,4 @@ export interface BuildRowsResult {
44
44
  * `importCsv`.
45
45
  */
46
46
  export declare function buildRows(rows: Record<string, any>[], options: BuildRowsOptions): BuildRowsResult;
47
- /** Split an array into fixed-size chunks. */
48
- export declare function chunk<T>(items: T[], size: number): T[][];
47
+ export { chunk } from "./batch.js";
@@ -166,12 +166,7 @@ export function buildRows(rows, options) {
166
166
  }
167
167
  return { batch, rowCount: batch.length };
168
168
  }
169
- /** Split an array into fixed-size chunks. */
170
- export function chunk(items, size) {
171
- const out = [];
172
- for (let i = 0; i < items.length; i += size) {
173
- out.push(items.slice(i, i + size));
174
- }
175
- return out;
176
- }
169
+ // `chunk()` moved to ./batch.ts (shared with `databases import`). Re-exported
170
+ // here so existing `import { chunk } from "../lib/csv.js"` callers keep working.
171
+ export { chunk } from "./batch.js";
177
172
  //# sourceMappingURL=csv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../src/lib/csv.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../src/lib/csv.ts"],"names":[],"mappings":"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"}