primitive-admin 1.0.55 → 1.0.57

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 (92) hide show
  1. package/assets/skill/skills/primitive-platform/SKILL.md +230 -2
  2. package/dist/bin/primitive.js +1 -1
  3. package/dist/src/commands/database-types.js +4 -4
  4. package/dist/src/commands/database-types.js.map +1 -1
  5. package/dist/src/commands/databases.js +5 -5
  6. package/dist/src/commands/databases.js.map +1 -1
  7. package/dist/src/commands/documents.js +2 -2
  8. package/dist/src/commands/documents.js.map +1 -1
  9. package/dist/src/commands/guides.d.ts +15 -12
  10. package/dist/src/commands/guides.js +22 -15
  11. package/dist/src/commands/guides.js.map +1 -1
  12. package/dist/src/commands/metadata.js +48 -3
  13. package/dist/src/commands/metadata.js.map +1 -1
  14. package/dist/src/commands/scripts.d.ts +18 -0
  15. package/dist/src/commands/scripts.js +59 -5
  16. package/dist/src/commands/scripts.js.map +1 -1
  17. package/dist/src/commands/sync-app-settings.d.ts +14 -4
  18. package/dist/src/commands/sync-app-settings.js +48 -8
  19. package/dist/src/commands/sync-app-settings.js.map +1 -1
  20. package/dist/src/commands/sync.d.ts +100 -0
  21. package/dist/src/commands/sync.js +1578 -402
  22. package/dist/src/commands/sync.js.map +1 -1
  23. package/dist/src/commands/workflows.js +23 -6
  24. package/dist/src/commands/workflows.js.map +1 -1
  25. package/dist/src/lib/api-client.d.ts +27 -1
  26. package/dist/src/lib/api-client.js +25 -2
  27. package/dist/src/lib/api-client.js.map +1 -1
  28. package/dist/src/lib/app-settings-descriptor.js +4 -0
  29. package/dist/src/lib/app-settings-descriptor.js.map +1 -1
  30. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +21 -0
  31. package/dist/src/lib/codegen-shared/generatedFiles.js +40 -0
  32. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -1
  33. package/dist/src/lib/codegen-shared/prettierStable.d.ts +262 -0
  34. package/dist/src/lib/codegen-shared/prettierStable.js +610 -0
  35. package/dist/src/lib/codegen-shared/prettierStable.js.map +1 -0
  36. package/dist/src/lib/db-codegen/dbGenerator.js +8 -5
  37. package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -1
  38. package/dist/src/lib/db-codegen/dbNaming.d.ts +5 -0
  39. package/dist/src/lib/db-codegen/dbNaming.js +8 -2
  40. package/dist/src/lib/db-codegen/dbNaming.js.map +1 -1
  41. package/dist/src/lib/db-codegen/dbTemplates.d.ts +17 -2
  42. package/dist/src/lib/db-codegen/dbTemplates.js +85 -40
  43. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -1
  44. package/dist/src/lib/db-codegen/dbTsTypes.d.ts +13 -22
  45. package/dist/src/lib/db-codegen/dbTsTypes.js +33 -28
  46. package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -1
  47. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.d.ts +11 -0
  48. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js +11 -0
  49. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js.map +1 -1
  50. package/dist/src/lib/generated-allowlist.js +7 -0
  51. package/dist/src/lib/generated-allowlist.js.map +1 -1
  52. package/dist/src/lib/platform-owned.d.ts +37 -0
  53. package/dist/src/lib/platform-owned.js +46 -0
  54. package/dist/src/lib/platform-owned.js.map +1 -0
  55. package/dist/src/lib/swift-codegen/dbGenerator.d.ts +32 -0
  56. package/dist/src/lib/swift-codegen/dbGenerator.js +338 -36
  57. package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -1
  58. package/dist/src/lib/swift-codegen/dbSwiftTypes.d.ts +1 -1
  59. package/dist/src/lib/swift-codegen/dbSwiftTypes.js +1 -1
  60. package/dist/src/lib/swift-codegen/generator.d.ts +1 -0
  61. package/dist/src/lib/swift-codegen/generator.js +91 -3
  62. package/dist/src/lib/swift-codegen/generator.js.map +1 -1
  63. package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +90 -0
  64. package/dist/src/lib/swift-codegen/siblingSymbols.js +152 -0
  65. package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -0
  66. package/dist/src/lib/sync-resource-types.d.ts +222 -10
  67. package/dist/src/lib/sync-resource-types.js +407 -20
  68. package/dist/src/lib/sync-resource-types.js.map +1 -1
  69. package/dist/src/lib/template.d.ts +1 -1
  70. package/dist/src/lib/template.js +6 -3
  71. package/dist/src/lib/template.js.map +1 -1
  72. package/dist/src/lib/toml-metadata-config.js +18 -0
  73. package/dist/src/lib/toml-metadata-config.js.map +1 -1
  74. package/dist/src/lib/workflow-apply.js +12 -2
  75. package/dist/src/lib/workflow-apply.js.map +1 -1
  76. package/dist/src/lib/workflow-codegen/generator.d.ts +9 -0
  77. package/dist/src/lib/workflow-codegen/generator.js +126 -55
  78. package/dist/src/lib/workflow-codegen/generator.js.map +1 -1
  79. package/dist/src/lib/workflow-codegen/invokerIR.d.ts +6 -8
  80. package/dist/src/lib/workflow-codegen/invokerIR.js +8 -8
  81. package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -1
  82. package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +17 -1
  83. package/dist/src/lib/workflow-codegen/schemaToTs.js +59 -38
  84. package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -1
  85. package/dist/src/lib/workflow-payload.d.ts +19 -0
  86. package/dist/src/lib/workflow-payload.js +21 -0
  87. package/dist/src/lib/workflow-payload.js.map +1 -1
  88. package/dist/src/lib/workflow-toml-validator.d.ts +30 -0
  89. package/dist/src/lib/workflow-toml-validator.js +206 -0
  90. package/dist/src/lib/workflow-toml-validator.js.map +1 -1
  91. package/dist/src/types/index.d.ts +1 -0
  92. package/package.json +2 -1
@@ -31,8 +31,13 @@ import * as path from "path";
31
31
  import { writeOrCheckGeneratedFiles, } from "../codegen-shared/generatedFiles.js";
32
32
  import { fingerprintToml } from "../db-codegen/dbFingerprint.js";
33
33
  import { describeWorkflowInvoker } from "../workflow-codegen/invokerIR.js";
34
- import { renderSwiftRootType } from "./schemaToSwift.js";
34
+ import { renderSwiftRootType, SwiftCodegenError } from "./schemaToSwift.js";
35
35
  import { structTypeName, workflowSwiftFactoryName } from "./swiftNaming.js";
36
+ // Foreign banner guarded against when a workflow run shares an output dir with
37
+ // the database Swift generator (issue #1653, class 3b). Function-time use only,
38
+ // so the generator.ts ↔ dbGenerator.ts import cycle resolves safely.
39
+ import { DB_SWIFT_BANNER_PREFIX } from "./dbGenerator.js";
40
+ import { assertNoRetainedSiblingCollision, assertNoForeignGeneratorSymbolCollision, } from "./siblingSymbols.js";
36
41
  /** Suffix identifying a generated Swift file. */
37
42
  export const GENERATED_SWIFT_FILE_SUFFIX = ".generated.swift";
38
43
  /**
@@ -149,7 +154,18 @@ export function renderWorkflowSwiftFile(input) {
149
154
  ].join("\n");
150
155
  const imports = ["import Foundation", `import ${CLIENT_MODULE}`].join("\n");
151
156
  const content = [banner, imports, wf.inputDecl, wf.outputDecl, renderInvoker(wf)].join("\n\n") + "\n";
152
- return { key: wf.key, content };
157
+ // Every top-level Swift symbol this file declares: the `<Key>Input` /
158
+ // `<Key>Output` types, the `<Key>Workflow` invoker struct, and its
159
+ // free-function factory. Enumerating ALL of them (issue #1653, Codex
160
+ // refinement) lets the run-scoped registry catch a cross-workflow collision on
161
+ // any of them, not just Input/Output.
162
+ const symbols = [
163
+ wf.inputTypeName,
164
+ wf.outputTypeName,
165
+ `${wf.base}Workflow`,
166
+ workflowSwiftFactoryName(wf.key),
167
+ ];
168
+ return { key: wf.key, content, symbols };
153
169
  }
154
170
  /**
155
171
  * Run Swift workflow codegen end-to-end. One `<key>.generated.swift` per
@@ -158,14 +174,78 @@ export function renderWorkflowSwiftFile(input) {
158
174
  */
159
175
  export async function generateWorkflowSwiftTypes(options) {
160
176
  const outAbs = path.resolve(options.outputDir);
177
+ // Run-scoped registry: emitted top-level Swift symbol → the workflow key that
178
+ // emitted it. Two DIFFERENT keys emitting the same symbol redeclare when all
179
+ // `.generated.swift` files compile into one module (issue #1653, class 1).
180
+ const symbolOwner = new Map();
161
181
  const filesToWrite = new Map();
162
182
  for (const input of options.inputs) {
163
183
  const rendered = renderWorkflowSwiftFile(input);
164
184
  if (!rendered)
165
- continue; // reserved workflow — no file
185
+ continue; // reserved workflow — no file, no symbols
186
+ for (const symbol of rendered.symbols) {
187
+ const prior = symbolOwner.get(symbol);
188
+ if (prior !== undefined && prior !== rendered.key) {
189
+ throw new SwiftCodegenError(`swift workflow codegen: type-name collision — workflow keys ` +
190
+ `"${prior}" and "${rendered.key}" both produce Swift type ` +
191
+ `"${symbol}", which redeclare when all .generated.swift files ` +
192
+ `compile into one module. Rename one workflow key so the two differ ` +
193
+ `after Swift PascalCase normalization.`, { sourceFile: `workflows/${rendered.key}.toml` });
194
+ }
195
+ symbolOwner.set(symbol, rendered.key);
196
+ }
166
197
  const filePath = path.join(outAbs, `${rendered.key}${GENERATED_SWIFT_FILE_SUFFIX}`);
167
198
  filesToWrite.set(filePath, rendered.content);
168
199
  }
200
+ // Filtered-run sibling collision (issue #1653, class 1 for `--single` runs).
201
+ // A `singleWorkflow` run renders only the selected key; its retained sibling
202
+ // `.generated.swift` files stay on disk but never enter `symbolOwner` above,
203
+ // so a symbol this run emits could still redeclare against a sibling once
204
+ // every file compiles into one module. The foreign-banner write guard does NOT
205
+ // cover this (siblings carry the SAME banner and a different filename, so there
206
+ // is no path or banner collision). Compare against the retained siblings' own
207
+ // declared symbols — no persistent manifest (sponsor decision #1).
208
+ if (options.singleWorkflow === true) {
209
+ await assertNoRetainedSiblingCollision({
210
+ outputDir: outAbs,
211
+ ownershipBanner: SWIFT_BANNER_PREFIX,
212
+ suffix: GENERATED_SWIFT_FILE_SUFFIX,
213
+ emitted: symbolOwner,
214
+ ownPaths: filesToWrite.keys(),
215
+ makeError: ({ symbol, owner, siblingStem }) => new SwiftCodegenError(`swift workflow codegen: type-name collision with a retained sibling — ` +
216
+ `workflow key "${owner}" (this run) and the existing ` +
217
+ `"${siblingStem}${GENERATED_SWIFT_FILE_SUFFIX}" both declare Swift ` +
218
+ `symbol "${symbol}", which redeclares when all .generated.swift files ` +
219
+ `compile into one module. A filtered (single-workflow) run does not ` +
220
+ `regenerate siblings, so both files coexist. Rename one workflow key, ` +
221
+ `or regenerate the whole output directory.`, { sourceFile: `workflows/${owner}.toml` }),
222
+ });
223
+ }
224
+ // Cross-generator namespace collision (issue #1857), the mirror of the check
225
+ // in the DB generator. A workflow's top-level symbol (`<Key>Input`, etc.) can
226
+ // match the namespace enum name a DATABASE-generated file already declares in
227
+ // a shared output dir — e.g. workflow `foo` emits a top-level struct `FooInput`
228
+ // while db type `foo-input` emits `public enum FooInput`. Their filenames
229
+ // differ, so the foreign-banner WRITE guard below (path-only) never trips, and
230
+ // the retained-sibling guard above only scans workflow-owned files. This scan
231
+ // reads the DB-owned siblings' declared top-level symbols and throws if any of
232
+ // this run's emitted symbols collides. It runs on every workflow run (not just
233
+ // filtered), because a full workflow run does not regenerate DB files — they
234
+ // coexist regardless of ordering.
235
+ await assertNoForeignGeneratorSymbolCollision({
236
+ outputDir: outAbs,
237
+ foreignBanner: DB_SWIFT_BANNER_PREFIX,
238
+ suffix: GENERATED_SWIFT_FILE_SUFFIX,
239
+ emitted: symbolOwner,
240
+ makeError: ({ symbol, owner, siblingStem }) => new SwiftCodegenError(`swift workflow codegen: type-name collision with a database-generated ` +
241
+ `file — workflow key "${owner}" emits Swift type "${symbol}", but the ` +
242
+ `existing "${siblingStem}${GENERATED_SWIFT_FILE_SUFFIX}" (owned by the ` +
243
+ `database Swift generator) already declares a top-level "${symbol}" in ` +
244
+ `the same output directory, which redeclares when all .generated.swift ` +
245
+ `files compile into one module. Rename the workflow or the ` +
246
+ `"${siblingStem}" database type so the two differ after Swift ` +
247
+ `normalization, or give one generator a separate --output directory.`, { sourceFile: `workflows/${owner}.toml` }),
248
+ });
169
249
  return await writeOrCheckGeneratedFiles({
170
250
  outputDir: outAbs,
171
251
  filesToWrite,
@@ -173,6 +253,14 @@ export async function generateWorkflowSwiftTypes(options) {
173
253
  fullOwnership: options.singleWorkflow !== true,
174
254
  generatedSuffix: GENERATED_SWIFT_FILE_SUFFIX,
175
255
  ownershipBanner: SWIFT_BANNER_PREFIX,
256
+ // Class 3b: never clobber a file owned by the database Swift generator.
257
+ foreignOwnershipBanners: [DB_SWIFT_BANNER_PREFIX],
258
+ onForeignBannerCollision: ({ filePath, foreignBanner }) => new SwiftCodegenError(`swift codegen: output collision — this run would overwrite ` +
259
+ `"${path.basename(filePath)}" in the shared output directory, which ` +
260
+ `is already owned by a different generator (banner ` +
261
+ `"${foreignBanner.trim()}"). A workflow key and a database type with ` +
262
+ `the same name cannot share an output directory; give one generator a ` +
263
+ `separate --output directory.`),
176
264
  });
177
265
  }
178
266
  //# sourceMappingURL=generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../src/lib/swift-codegen/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../src/lib/swift-codegen/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Retained-sibling collision detection for filtered Swift codegen runs
3
+ * (issue #1653, class 3a for `--single` runs).
4
+ *
5
+ * A `singleType` / `singleWorkflow` run renders ONLY the selected input, but its
6
+ * sibling `.generated.swift` files stay on disk (they are deliberately retained
7
+ * — orphan cleanup is scoped to the filtered file). Those siblings never enter
8
+ * the run-scoped in-memory registry, which sees only `options.inputs`, so a
9
+ * symbol the filtered run emits could still redeclare against a sibling once all
10
+ * files compile into one module.
11
+ *
12
+ * The cross-generator foreign-banner write guard does NOT cover this: siblings
13
+ * carry the SAME ownership banner and a DIFFERENT filename, so there is neither a
14
+ * path collision nor a foreign banner to trip. This module closes that gap by
15
+ * re-deriving each retained sibling's declared top-level symbols directly from
16
+ * the file on disk and comparing them against the run's emitted symbols — no
17
+ * persistent symbol manifest (sponsor decision #1 reserved that for a follow-up).
18
+ */
19
+ /** Parse the module-level Swift symbols declared in a generated file's source. */
20
+ export declare function parseTopLevelSwiftSymbols(content: string): string[];
21
+ /**
22
+ * Map each retained sibling's declared top-level symbol → the sibling's file
23
+ * stem (its owner). Only generator-owned files (content starts with
24
+ * `ownershipBanner`) are considered; the run's own output paths are excluded so
25
+ * a filtered re-run never collides with the file it is about to rewrite. On the
26
+ * first sibling that declares a symbol, that sibling wins (deterministic by
27
+ * directory-read order).
28
+ */
29
+ export declare function collectRetainedSiblingSymbols(opts: {
30
+ outputDir: string;
31
+ ownershipBanner: string;
32
+ suffix: string;
33
+ excludePaths: Iterable<string>;
34
+ }): Promise<Map<string, string>>;
35
+ /**
36
+ * Throw if any symbol this filtered run emits collides with a retained sibling
37
+ * already on disk. `emitted` maps symbol → the emitting input's owner key; a
38
+ * sibling owning the SAME symbol under a DIFFERENT stem is a redeclaration. The
39
+ * caller supplies `makeError` so the shared module stays free of the Swift
40
+ * error type.
41
+ */
42
+ export declare function assertNoRetainedSiblingCollision(opts: {
43
+ outputDir: string;
44
+ ownershipBanner: string;
45
+ suffix: string;
46
+ emitted: Map<string, string>;
47
+ ownPaths: Iterable<string>;
48
+ makeError: (info: {
49
+ symbol: string;
50
+ owner: string;
51
+ siblingStem: string;
52
+ }) => Error;
53
+ }): Promise<void>;
54
+ /**
55
+ * Throw if any symbol this run emits collides with a top-level symbol declared
56
+ * by a file owned by ANOTHER generator (a DIFFERENT ownership banner) in the
57
+ * same output dir (issue #1857).
58
+ *
59
+ * The same-banner retained-sibling guard above and the foreign-banner WRITE
60
+ * guard both miss this class. When database and workflow Swift codegen share an
61
+ * output dir, a database type `foo-input` emits `public enum FooInput` in
62
+ * `foo-input.generated.swift`, while workflow `foo` emits a top-level struct
63
+ * `FooInput` in `foo.generated.swift`. The two symbols redeclare when the files
64
+ * compile into one module, but:
65
+ * - the retained-sibling guard only scans files carrying THIS generator's own
66
+ * banner, so it never reads the other generator's file; and
67
+ * - the foreign-banner write guard only fires on identical file PATHS, and
68
+ * these filenames differ.
69
+ * So both generators succeed and `swift build` fails with an invalid
70
+ * redeclaration. This guard closes the gap: whichever generator runs second
71
+ * finds the other's file already on disk and reports the clash. It intentionally
72
+ * runs on every run (full or filtered), because a full run does not regenerate
73
+ * the foreign generator's files — they always coexist.
74
+ *
75
+ * `emitted` maps symbol → the emitting input's owner key. A foreign file owning
76
+ * the SAME symbol is always a redeclaration: foreign files carry a different
77
+ * banner and (because same-path clashes are caught by the write guard) a
78
+ * different filename, so there is no self-collision to exclude.
79
+ */
80
+ export declare function assertNoForeignGeneratorSymbolCollision(opts: {
81
+ outputDir: string;
82
+ foreignBanner: string;
83
+ suffix: string;
84
+ emitted: Map<string, string>;
85
+ makeError: (info: {
86
+ symbol: string;
87
+ owner: string;
88
+ siblingStem: string;
89
+ }) => Error;
90
+ }): Promise<void>;
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Retained-sibling collision detection for filtered Swift codegen runs
3
+ * (issue #1653, class 3a for `--single` runs).
4
+ *
5
+ * A `singleType` / `singleWorkflow` run renders ONLY the selected input, but its
6
+ * sibling `.generated.swift` files stay on disk (they are deliberately retained
7
+ * — orphan cleanup is scoped to the filtered file). Those siblings never enter
8
+ * the run-scoped in-memory registry, which sees only `options.inputs`, so a
9
+ * symbol the filtered run emits could still redeclare against a sibling once all
10
+ * files compile into one module.
11
+ *
12
+ * The cross-generator foreign-banner write guard does NOT cover this: siblings
13
+ * carry the SAME ownership banner and a DIFFERENT filename, so there is neither a
14
+ * path collision nor a foreign banner to trip. This module closes that gap by
15
+ * re-deriving each retained sibling's declared top-level symbols directly from
16
+ * the file on disk and comparing them against the run's emitted symbols — no
17
+ * persistent symbol manifest (sponsor decision #1 reserved that for a follow-up).
18
+ */
19
+ import * as path from "path";
20
+ import { promises as fsp } from "fs";
21
+ /**
22
+ * Top-level Swift declarations a generated file exposes to its module. Anchored
23
+ * to column 0 so nested (indented) enum/struct declarations and the `<Type>Ops`
24
+ * factory's struct methods are excluded — only module-level symbols can collide
25
+ * across files. A backtick-escaped reserved-word identifier is unescaped so the
26
+ * key matches what the emitter tracks in its registry.
27
+ *
28
+ * The identifier character class mirrors the emitter's alphabet in
29
+ * `swiftNaming.ts` exactly (`isLetter` = `\p{L}`, `isAsciiDigit` = ASCII `0`–`9`,
30
+ * plus `_`), so the parser recognizes precisely what the emitter can emit —
31
+ * including Unicode-letter identifiers like `ÉFlowInput` that an ASCII-only
32
+ * `[A-Za-z0-9_]+` capture would miss (issue #1705). The `u` flag makes `\p{L}`
33
+ * a valid Unicode property escape.
34
+ */
35
+ const TOP_LEVEL_DECL = /^public (?:struct|typealias|enum|func)\s+`?([\p{L}0-9_]+)`?/u;
36
+ /** Parse the module-level Swift symbols declared in a generated file's source. */
37
+ export function parseTopLevelSwiftSymbols(content) {
38
+ const symbols = [];
39
+ for (const line of content.split("\n")) {
40
+ const m = TOP_LEVEL_DECL.exec(line);
41
+ if (m)
42
+ symbols.push(m[1]);
43
+ }
44
+ return symbols;
45
+ }
46
+ /**
47
+ * Map each retained sibling's declared top-level symbol → the sibling's file
48
+ * stem (its owner). Only generator-owned files (content starts with
49
+ * `ownershipBanner`) are considered; the run's own output paths are excluded so
50
+ * a filtered re-run never collides with the file it is about to rewrite. On the
51
+ * first sibling that declares a symbol, that sibling wins (deterministic by
52
+ * directory-read order).
53
+ */
54
+ export async function collectRetainedSiblingSymbols(opts) {
55
+ const exclude = new Set([...opts.excludePaths].map((p) => path.resolve(p)));
56
+ const out = new Map();
57
+ let entries;
58
+ try {
59
+ entries = await fsp.readdir(opts.outputDir, { withFileTypes: true });
60
+ }
61
+ catch {
62
+ return out; // output dir absent → no siblings
63
+ }
64
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
65
+ if (!entry.isFile() || !entry.name.endsWith(opts.suffix))
66
+ continue;
67
+ const filePath = path.resolve(opts.outputDir, entry.name);
68
+ if (exclude.has(filePath))
69
+ continue;
70
+ let content;
71
+ try {
72
+ content = await fsp.readFile(filePath, "utf-8");
73
+ }
74
+ catch {
75
+ continue;
76
+ }
77
+ if (!content.startsWith(opts.ownershipBanner))
78
+ continue; // not ours
79
+ const stem = entry.name.slice(0, -opts.suffix.length);
80
+ for (const symbol of parseTopLevelSwiftSymbols(content)) {
81
+ if (!out.has(symbol))
82
+ out.set(symbol, stem);
83
+ }
84
+ }
85
+ return out;
86
+ }
87
+ /**
88
+ * Throw if any symbol this filtered run emits collides with a retained sibling
89
+ * already on disk. `emitted` maps symbol → the emitting input's owner key; a
90
+ * sibling owning the SAME symbol under a DIFFERENT stem is a redeclaration. The
91
+ * caller supplies `makeError` so the shared module stays free of the Swift
92
+ * error type.
93
+ */
94
+ export async function assertNoRetainedSiblingCollision(opts) {
95
+ const siblings = await collectRetainedSiblingSymbols({
96
+ outputDir: opts.outputDir,
97
+ ownershipBanner: opts.ownershipBanner,
98
+ suffix: opts.suffix,
99
+ excludePaths: opts.ownPaths,
100
+ });
101
+ if (siblings.size === 0)
102
+ return;
103
+ for (const [symbol, owner] of opts.emitted) {
104
+ const siblingStem = siblings.get(symbol);
105
+ if (siblingStem !== undefined && siblingStem !== owner) {
106
+ throw opts.makeError({ symbol, owner, siblingStem });
107
+ }
108
+ }
109
+ }
110
+ /**
111
+ * Throw if any symbol this run emits collides with a top-level symbol declared
112
+ * by a file owned by ANOTHER generator (a DIFFERENT ownership banner) in the
113
+ * same output dir (issue #1857).
114
+ *
115
+ * The same-banner retained-sibling guard above and the foreign-banner WRITE
116
+ * guard both miss this class. When database and workflow Swift codegen share an
117
+ * output dir, a database type `foo-input` emits `public enum FooInput` in
118
+ * `foo-input.generated.swift`, while workflow `foo` emits a top-level struct
119
+ * `FooInput` in `foo.generated.swift`. The two symbols redeclare when the files
120
+ * compile into one module, but:
121
+ * - the retained-sibling guard only scans files carrying THIS generator's own
122
+ * banner, so it never reads the other generator's file; and
123
+ * - the foreign-banner write guard only fires on identical file PATHS, and
124
+ * these filenames differ.
125
+ * So both generators succeed and `swift build` fails with an invalid
126
+ * redeclaration. This guard closes the gap: whichever generator runs second
127
+ * finds the other's file already on disk and reports the clash. It intentionally
128
+ * runs on every run (full or filtered), because a full run does not regenerate
129
+ * the foreign generator's files — they always coexist.
130
+ *
131
+ * `emitted` maps symbol → the emitting input's owner key. A foreign file owning
132
+ * the SAME symbol is always a redeclaration: foreign files carry a different
133
+ * banner and (because same-path clashes are caught by the write guard) a
134
+ * different filename, so there is no self-collision to exclude.
135
+ */
136
+ export async function assertNoForeignGeneratorSymbolCollision(opts) {
137
+ const foreign = await collectRetainedSiblingSymbols({
138
+ outputDir: opts.outputDir,
139
+ ownershipBanner: opts.foreignBanner,
140
+ suffix: opts.suffix,
141
+ excludePaths: [], // foreign-banner files are never this run's own outputs
142
+ });
143
+ if (foreign.size === 0)
144
+ return;
145
+ for (const [symbol, owner] of opts.emitted) {
146
+ const siblingStem = foreign.get(symbol);
147
+ if (siblingStem !== undefined) {
148
+ throw opts.makeError({ symbol, owner, siblingStem });
149
+ }
150
+ }
151
+ }
152
+ //# sourceMappingURL=siblingSymbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"siblingSymbols.js","sourceRoot":"","sources":["../../../../src/lib/swift-codegen/siblingSymbols.ts"],"names":[],"mappings":"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"}