@palantir/pack.document-schema.type-gen 0.32.0 → 0.34.0

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 (131) hide show
  1. package/README.md +7 -0
  2. package/build/esm/commands/ir/__tests__/irDeployFirstParty.test.js +1 -1
  3. package/build/esm/commands/ir/__tests__/irDeployFirstParty.test.js.map +1 -1
  4. package/build/esm/commands/ir/__tests__/irUpdateSchemaHandler.test.js +96 -0
  5. package/build/esm/commands/ir/__tests__/irUpdateSchemaHandler.test.js.map +1 -0
  6. package/build/esm/commands/ir/__tests__/resolveIrInput.test.js +80 -0
  7. package/build/esm/commands/ir/__tests__/resolveIrInput.test.js.map +1 -1
  8. package/build/esm/commands/ir/irDeployHandler.js +6 -1
  9. package/build/esm/commands/ir/irDeployHandler.js.map +1 -1
  10. package/build/esm/commands/ir/irGenAssetHandler.js +6 -1
  11. package/build/esm/commands/ir/irGenAssetHandler.js.map +1 -1
  12. package/build/esm/commands/ir/irGenTypesHandler.js +7 -3
  13. package/build/esm/commands/ir/irGenTypesHandler.js.map +1 -1
  14. package/build/esm/commands/ir/irUpdateSchemaHandler.js +19 -12
  15. package/build/esm/commands/ir/irUpdateSchemaHandler.js.map +1 -1
  16. package/build/esm/commands/ir/resolveIrInput.js +6 -5
  17. package/build/esm/commands/ir/resolveIrInput.js.map +1 -1
  18. package/build/esm/commands/schema/registerSchemaCommands.js +1 -1
  19. package/build/esm/commands/schema/registerSchemaCommands.js.map +1 -1
  20. package/build/esm/commands/schema/schemaIrHandler.js +15 -8
  21. package/build/esm/commands/schema/schemaIrHandler.js.map +1 -1
  22. package/build/esm/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.js.map +1 -1
  23. package/build/esm/lib/pack-docschema-api/pack-docschema-ir/unionDef.js.map +1 -1
  24. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js +1 -1
  25. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js.map +1 -1
  26. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js +1 -1
  27. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js.map +1 -1
  28. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js +1 -1
  29. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js.map +1 -1
  30. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js +1 -1
  31. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js.map +1 -1
  32. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js +1 -1
  33. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js.map +1 -1
  34. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js +1 -1
  35. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js.map +1 -1
  36. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js +1 -1
  37. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js.map +1 -1
  38. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js +1 -1
  39. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js.map +1 -1
  40. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js +1 -1
  41. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js.map +1 -1
  42. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js +1 -1
  43. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js.map +1 -1
  44. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js +1 -1
  45. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js.map +1 -1
  46. package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js +71 -0
  47. package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js.map +1 -1
  48. package/build/esm/utils/ir/convertIrToWireSchema.js +10 -7
  49. package/build/esm/utils/ir/convertIrToWireSchema.js.map +1 -1
  50. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js +1 -1
  51. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js.map +1 -1
  52. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -1
  53. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
  54. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
  55. package/build/esm/utils/schema/__tests__/assertSdkNamesUnique.test.js +178 -0
  56. package/build/esm/utils/schema/__tests__/assertSdkNamesUnique.test.js.map +1 -0
  57. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +71 -1
  58. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -1
  59. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js +122 -3
  60. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js.map +1 -1
  61. package/build/esm/utils/schema/assertSdkNamesUnique.js +151 -0
  62. package/build/esm/utils/schema/assertSdkNamesUnique.js.map +1 -0
  63. package/build/esm/utils/schema/generateIndexFromSchema.js +3 -5
  64. package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -1
  65. package/build/esm/utils/schema/generateInternalFromSchema.js +42 -19
  66. package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
  67. package/build/esm/utils/schema/generateModelMetadataFromSchema.js +9 -11
  68. package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -1
  69. package/build/esm/utils/schema/generateScopeFromSchema.js +6 -9
  70. package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -1
  71. package/build/esm/utils/schema/generateVersionedTypesFromSchema.js +8 -9
  72. package/build/esm/utils/schema/generateVersionedTypesFromSchema.js.map +1 -1
  73. package/build/esm/utils/schema/generateVersionedZodFromSchema.js +13 -16
  74. package/build/esm/utils/schema/generateVersionedZodFromSchema.js.map +1 -1
  75. package/build/esm/utils/schema/resolveSchemaChain.js +137 -21
  76. package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
  77. package/build/esm/utils/schema/runtimeSchema.js +47 -0
  78. package/build/esm/utils/schema/runtimeSchema.js.map +1 -1
  79. package/build/esm/utils/schema/writeAllSdkFiles.js +2 -0
  80. package/build/esm/utils/schema/writeAllSdkFiles.js.map +1 -1
  81. package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
  82. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
  83. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
  84. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
  85. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
  86. package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
  87. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
  88. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
  89. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
  90. package/build/esm/utils/steps/convertStepsToIr.js +30 -2
  91. package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
  92. package/build/types/commands/ir/__tests__/irUpdateSchemaHandler.test.d.ts +2 -0
  93. package/build/types/commands/ir/__tests__/irUpdateSchemaHandler.test.d.ts.map +1 -0
  94. package/build/types/commands/ir/irDeployHandler.d.ts +1 -1
  95. package/build/types/commands/ir/irDeployHandler.d.ts.map +1 -1
  96. package/build/types/commands/ir/irGenAssetHandler.d.ts +1 -1
  97. package/build/types/commands/ir/irGenAssetHandler.d.ts.map +1 -1
  98. package/build/types/commands/ir/irGenTypesHandler.d.ts.map +1 -1
  99. package/build/types/commands/ir/irUpdateSchemaHandler.d.ts.map +1 -1
  100. package/build/types/commands/ir/resolveIrInput.d.ts +1 -0
  101. package/build/types/commands/ir/resolveIrInput.d.ts.map +1 -1
  102. package/build/types/commands/schema/schemaIrHandler.d.ts +3 -3
  103. package/build/types/commands/schema/schemaIrHandler.d.ts.map +1 -1
  104. package/build/types/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.d.ts +1 -0
  105. package/build/types/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.d.ts.map +1 -1
  106. package/build/types/lib/pack-docschema-api/pack-docschema-ir/unionDef.d.ts +3 -0
  107. package/build/types/lib/pack-docschema-api/pack-docschema-ir/unionDef.d.ts.map +1 -1
  108. package/build/types/utils/ir/convertIrToWireSchema.d.ts +2 -2
  109. package/build/types/utils/ir/convertIrToWireSchema.d.ts.map +1 -1
  110. package/build/types/utils/schema/__tests__/assertSdkNamesUnique.test.d.ts +2 -0
  111. package/build/types/utils/schema/__tests__/assertSdkNamesUnique.test.d.ts.map +1 -0
  112. package/build/types/utils/schema/assertSdkNamesUnique.d.ts +9 -0
  113. package/build/types/utils/schema/assertSdkNamesUnique.d.ts.map +1 -0
  114. package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -1
  115. package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -1
  116. package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -1
  117. package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -1
  118. package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts.map +1 -1
  119. package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts.map +1 -1
  120. package/build/types/utils/schema/resolveSchemaChain.d.ts +24 -1
  121. package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
  122. package/build/types/utils/schema/runtimeSchema.d.ts +19 -0
  123. package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -1
  124. package/build/types/utils/schema/writeAllSdkFiles.d.ts.map +1 -1
  125. package/build/types/utils/steps/convertStepsToIr.d.ts +4 -0
  126. package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
  127. package/package.json +19 -5
  128. package/build/esm/utils/unknownVariantSuffix.js +0 -22
  129. package/build/esm/utils/unknownVariantSuffix.js.map +0 -1
  130. package/build/types/utils/unknownVariantSuffix.d.ts +0 -3
  131. package/build/types/utils/unknownVariantSuffix.d.ts.map +0 -1
@@ -16,7 +16,8 @@
16
16
 
17
17
  import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
18
18
  import { convertFieldTypeToDescriptor, convertFieldTypeToInternalTypeScript, convertFieldTypeToInternalZod } from "../ir/irFieldHelpers.js";
19
- import { chainNeedsUpgradeFns } from "./resolveSchemaChain.js";
19
+ import { chainNeedsUpgradeFns, getEntryMinorVersion, upgradeStepKey } from "./resolveSchemaChain.js";
20
+ import { internalSchemaName, internalTypeName, upgradesName, versionedInternalTypeName } from "./runtimeSchema.js";
20
21
 
21
22
  /** Collected info about all fields for a model across all versions. */
22
23
 
@@ -42,6 +43,8 @@ function getAddedInVersion(fieldInfo) {
42
43
 
43
44
  /**
44
45
  * Collect all record model info across all versions and compute upgrade steps.
46
+ * Takes the full chain (with minor versions), so a field added in 1.1 gets its
47
+ * own step and counts as missing from 1.0 records.
45
48
  */
46
49
  function collectRecordModels(chain) {
47
50
  const allRecordModels = new Map();
@@ -67,11 +70,13 @@ function collectRecordModels(chain) {
67
70
  fieldType: field.fieldType,
68
71
  isOptional: field.isOptional === true,
69
72
  presentInVersions: new Set([version]),
73
+ presentInEntries: 1,
70
74
  alwaysOptional: field.isOptional === true,
71
75
  everOptional: field.isOptional === true
72
76
  });
73
77
  } else {
74
78
  existing.presentInVersions.add(version);
79
+ existing.presentInEntries += 1;
75
80
  if (field.isOptional !== true) {
76
81
  existing.alwaysOptional = false;
77
82
  }
@@ -124,6 +129,7 @@ function collectRecordModels(chain) {
124
129
  if (addedFields.size > 0 || removedFields.length > 0) {
125
130
  model.steps.push({
126
131
  addedInVersion: currEntry.version,
132
+ addedInMinorVersion: getEntryMinorVersion(currEntry),
127
133
  fields: addedFields,
128
134
  removedFields
129
135
  });
@@ -132,10 +138,10 @@ function collectRecordModels(chain) {
132
138
  }
133
139
 
134
140
  // Mark fields that are not present in ALL versions as optional in internal type
135
- const totalVersions = chain.length;
141
+ const totalEntries = chain.length;
136
142
  for (const model of allRecordModels.values()) {
137
143
  for (const [, fieldInfo] of model.allFields) {
138
- if (fieldInfo.presentInVersions.size < totalVersions) {
144
+ if (fieldInfo.presentInEntries < totalEntries) {
139
145
  fieldInfo.alwaysOptional = true;
140
146
  }
141
147
  }
@@ -151,7 +157,7 @@ function generateInternalTypes(allRecordModels) {
151
157
  output += "\n";
152
158
  for (const [modelKey, model] of sortedEntries(allRecordModels)) {
153
159
  output += `/** Internal representation containing all fields across all schema versions. */\n`;
154
- output += `export interface ${modelKey}__Internal {\n`;
160
+ output += `export interface ${internalTypeName(modelKey)} {\n`;
155
161
  for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {
156
162
  const tsType = convertFieldTypeToInternalTypeScript(fieldInfo.fieldType, fieldInfo.isOptional);
157
163
  const optional = fieldInfo.alwaysOptional ? "?" : "";
@@ -199,7 +205,7 @@ function generatePerVersionInternalTypes(chain) {
199
205
  fields
200
206
  } of versions) {
201
207
  output += `/** Internal representation of ${modelKey} at schema version ${version}. */\n`;
202
- output += `export interface ${modelKey}__v${version} {\n`;
208
+ output += `export interface ${versionedInternalTypeName(modelKey, version)} {\n`;
203
209
  const sortedFields = [...fields].sort((a, b) => a.key.localeCompare(b.key));
204
210
  for (const field of sortedFields) {
205
211
  const tsType = convertFieldTypeToInternalTypeScript(field.fieldType, field.isOptional === true);
@@ -226,7 +232,7 @@ function generateUpgrades(allRecordModels, latestIr) {
226
232
  output += `import type { ${imports.join(", ")} } from "@palantir/pack.document-schema.model-types";\n\n`;
227
233
  }
228
234
  for (const [modelKey, model] of sortedEntries(allRecordModels)) {
229
- output += `export const ${modelKey}Upgrades: UpgradeRegistry<"${modelKey}"> = {\n`;
235
+ output += `export const ${upgradesName(modelKey)}: UpgradeRegistry<"${modelKey}"> = {\n`;
230
236
  output += ` modelName: "${modelKey}",\n`;
231
237
 
232
238
  // allFields
@@ -242,6 +248,9 @@ function generateUpgrades(allRecordModels, latestIr) {
242
248
  for (const step of model.steps) {
243
249
  output += ` {\n`;
244
250
  output += ` addedInVersion: ${step.addedInVersion},\n`;
251
+ if (step.addedInMinorVersion > 0) {
252
+ output += ` addedInMinorVersion: ${step.addedInMinorVersion},\n`;
253
+ }
245
254
  output += ` fields: {\n`;
246
255
  for (const [fieldName, fieldMeta] of step.fields) {
247
256
  output += ` ${fieldName}: {\n`;
@@ -262,7 +271,7 @@ function generateUpgrades(allRecordModels, latestIr) {
262
271
  for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {
263
272
  if (modelDef.type !== "union") continue;
264
273
  const union = modelDef.union;
265
- output += `export const ${modelKey}Upgrades: UnionUpgradeRegistry<"${modelKey}"> = {\n`;
274
+ output += `export const ${upgradesName(modelKey)}: UnionUpgradeRegistry<"${modelKey}"> = {\n`;
266
275
  output += ` modelName: "${modelKey}",\n`;
267
276
  output += ` discriminant: "${union.discriminant}",\n`;
268
277
  output += ` variants: {\n`;
@@ -270,6 +279,13 @@ function generateUpgrades(allRecordModels, latestIr) {
270
279
  output += ` "${variantKey}": "${variantModelKey}",\n`;
271
280
  }
272
281
  output += ` },\n`;
282
+ if (union.variantMetadata != null) {
283
+ output += ` variantAddedInVersions: {\n`;
284
+ for (const [variantKey, meta] of Object.entries(union.variantMetadata)) {
285
+ output += ` "${variantKey}": ${meta.addedInVersion},\n`;
286
+ }
287
+ output += ` },\n`;
288
+ }
273
289
  output += `};\n\n`;
274
290
  }
275
291
  return output;
@@ -282,7 +298,7 @@ function generateInternalSchemaContent(allRecordModels) {
282
298
  let output = GENERATED_FILE_HEADER;
283
299
  output += `import { z } from "zod";\n\n`;
284
300
  for (const [modelKey, model] of sortedEntries(allRecordModels)) {
285
- output += `export const ${modelKey}InternalSchema = z.object({\n`;
301
+ output += `export const ${internalSchemaName(modelKey)} = z.object({\n`;
286
302
  for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {
287
303
  // Use everOptional: a field optional in ANY version must stay optional
288
304
  // in the internal schema because older documents may legitimately omit it.
@@ -319,9 +335,10 @@ function generateUpgradeFns(chain, allRecordModels) {
319
335
  const neededTypes = new Set();
320
336
  for (const [modelKey, model] of sortedEntries(allRecordModels)) {
321
337
  for (const step of model.steps) {
338
+ // A derived field's function takes the previous major's type, e.g. `Pick<ShapeBox__v1, "color">`
339
+ // for a 2.0 step. Minor versions can't use `derivedFrom`, so minor steps never need it.
322
340
  const currentIdx = chain.findIndex(c => c.version === step.addedInVersion);
323
- if (currentIdx <= 0) continue;
324
- const priorVersion = chain[currentIdx - 1].version;
341
+ const priorVersion = currentIdx > 0 ? chain[currentIdx - 1].version : undefined;
325
342
  const fields = [];
326
343
  for (const [fieldName, fieldMeta] of step.fields) {
327
344
  fields.push({
@@ -330,21 +347,23 @@ function generateUpgradeFns(chain, allRecordModels) {
330
347
  });
331
348
  }
332
349
  if (fields.length === 0) continue;
350
+ if (priorVersion == null && fields.some(f => f.derivedFrom.length > 0)) continue;
333
351
  let list = perModel.get(modelKey);
334
352
  if (list == null) {
335
353
  list = [];
336
354
  perModel.set(modelKey, list);
337
355
  }
338
356
  list.push({
357
+ stepKey: upgradeStepKey(step.addedInVersion, step.addedInMinorVersion),
339
358
  currentVersion: step.addedInVersion,
340
359
  priorVersion,
341
360
  fields
342
361
  });
343
362
  // Prior-version type only needed when at least one field derives from it.
344
- if (fields.some(f => f.derivedFrom.length > 0)) {
345
- neededTypes.add(`${modelKey}__v${priorVersion}`);
363
+ if (priorVersion != null && fields.some(f => f.derivedFrom.length > 0)) {
364
+ neededTypes.add(versionedInternalTypeName(modelKey, priorVersion));
346
365
  }
347
- neededTypes.add(`${modelKey}__v${step.addedInVersion}`);
366
+ neededTypes.add(versionedInternalTypeName(modelKey, step.addedInVersion));
348
367
  }
349
368
  }
350
369
  let output = GENERATED_FILE_HEADER;
@@ -359,7 +378,7 @@ function generateUpgradeFns(chain, allRecordModels) {
359
378
  output += ` * call site. Derived fields receive their declared source fields; required\n`;
360
379
  output += ` * additive fields receive no arguments. Optional additive fields are absent\n`;
361
380
  output += ` * — \`undefined\` is a legal value at the new version, so the runtime lens\n`;
362
- output += ` * leaves them alone.\n`;
381
+ output += ` * leaves them alone. Keys are \`v2\` for version 2.0 and \`v2_1\` for 2.1.\n`;
363
382
  output += ` */\n`;
364
383
  if (perModel.size === 0) {
365
384
  output += `// eslint-disable-next-line @typescript-eslint/no-empty-object-type\n`;
@@ -369,14 +388,17 @@ function generateUpgradeFns(chain, allRecordModels) {
369
388
  for (const [modelKey, steps] of Array.from(perModel.entries()).sort(([a], [b]) => a.localeCompare(b))) {
370
389
  output += ` ${modelKey}: {\n`;
371
390
  for (const step of steps) {
372
- output += ` v${step.currentVersion}: {\n`;
391
+ output += ` ${step.stepKey}: {\n`;
392
+ const currentType = versionedInternalTypeName(modelKey, step.currentVersion);
373
393
  for (const f of step.fields) {
374
- const returnType = `${modelKey}__v${step.currentVersion}["${f.fieldName}"]`;
394
+ const returnType = `${currentType}["${f.fieldName}"]`;
375
395
  if (f.derivedFrom.length === 0) {
376
396
  output += ` ${f.fieldName}: () => ${returnType};\n`;
377
397
  } else {
398
+ // Steps with derived fields always have a prior version (others are skipped above).
399
+ const priorType = versionedInternalTypeName(modelKey, step.priorVersion);
378
400
  const pickKeys = f.derivedFrom.map(d => `"${d}"`).join(" | ");
379
- output += ` ${f.fieldName}: (oldFields: Pick<${modelKey}__v${step.priorVersion}, ${pickKeys}>) => ${returnType};\n`;
401
+ output += ` ${f.fieldName}: (oldFields: Pick<${priorType}, ${pickKeys}>) => ${returnType};\n`;
380
402
  }
381
403
  }
382
404
  output += ` };\n`;
@@ -396,9 +418,10 @@ export function generateInternalFromChain(resolved) {
396
418
  const {
397
419
  chain
398
420
  } = resolved;
421
+ const stepChain = resolved.stepChain ?? chain;
399
422
  const latestIr = chain[chain.length - 1].ir;
400
- const allRecordModels = collectRecordModels(chain);
401
- const internalTypes = generateInternalTypes(allRecordModels) + (chainNeedsUpgradeFns(chain) ? generatePerVersionInternalTypes(chain) : "");
423
+ const allRecordModels = collectRecordModels(stepChain);
424
+ const internalTypes = generateInternalTypes(allRecordModels) + (chainNeedsUpgradeFns(stepChain) ? generatePerVersionInternalTypes(chain) : "");
402
425
  const upgrades = generateUpgrades(allRecordModels, latestIr);
403
426
  const internalSchema = generateInternalSchemaContent(allRecordModels);
404
427
  const internalUpgradeFns = generateUpgradeFns(chain, allRecordModels);
@@ -1 +1 @@
1
- {"version":3,"file":"generateInternalFromSchema.js","names":["GENERATED_FILE_HEADER","convertFieldTypeToDescriptor","convertFieldTypeToInternalTypeScript","convertFieldTypeToInternalZod","chainNeedsUpgradeFns","sortedEntries","map","Array","from","entries","sort","a","b","localeCompare","getAddedInVersion","fieldInfo","Math","min","presentInVersions","collectRecordModels","chain","allRecordModels","Map","version","ir","modelKey","modelDef","Object","models","type","has","set","allFields","steps","model","get","field","record","fields","existing","key","fieldType","isOptional","Set","alwaysOptional","everOptional","add","i","length","prevEntry","currEntry","currModelDef","prevModelDef","prevFields","f","currFields","addedFields","recordUpgrades","migrations","fieldKey","annotation","derivedFrom","removedFields","push","size","addedInVersion","totalVersions","values","generateInternalTypes","output","fieldName","tsType","optional","generatePerVersionInternalTypes","perModelVersions","list","sortedModels","versions","sortedFields","generateUpgrades","latestIr","hasRecords","hasUnions","some","m","imports","join","typeDescriptor","step","fieldMeta","d","union","discriminant","variantKey","variantModelKey","variants","generateInternalSchemaContent","zodType","generateUpgradeFns","perModel","neededTypes","currentIdx","findIndex","c","priorVersion","currentVersion","sorted","returnType","pickKeys","generateInternalFromChain","resolved","internalTypes","upgrades","internalSchema","internalUpgradeFns"],"sources":["generateInternalFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n IFieldDef,\n IFieldTypeUnion,\n IRealTimeDocumentSchema,\n} from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport {\n convertFieldTypeToDescriptor,\n convertFieldTypeToInternalTypeScript,\n convertFieldTypeToInternalZod,\n} from \"../ir/irFieldHelpers.js\";\nimport {\n chainNeedsUpgradeFns,\n type ResolvedIrChain,\n type VersionedIrEntry,\n} from \"./resolveSchemaChain.js\";\n\nexport interface InternalTypesOutput {\n /** _internal/types.ts content */\n internalTypes: string;\n /** _internal/upgrades.ts content */\n upgrades: string;\n /** _internal/schema.ts content */\n internalSchema: string;\n /** _internal/upgradeFns.ts content */\n internalUpgradeFns: string;\n}\n\n/** Collected info about all fields for a model across all versions. */\ninterface AllFieldInfo {\n fieldType: IFieldTypeUnion;\n isOptional: boolean;\n /** Versions where this field exists. */\n presentInVersions: Set<number>;\n /** Whether field is always optional. */\n alwaysOptional: boolean;\n /** Whether field is optional in at least one version. */\n everOptional: boolean;\n}\n\n/**\n * Represents an upgrade step for a model between version transitions.\n *\n * `fields` only contains entries that require lens treatment — derived fields\n * (`derivedFrom.length > 0`) and required additive fields (`derivedFrom.length\n * === 0 && !isOptional`). Optional additive fields are absent because\n * `undefined` is a legal value at the current version and the lens has no\n * work to do.\n */\ninterface UpgradeStep {\n addedInVersion: number;\n fields: Map<string, { derivedFrom: string[]; isOptional: boolean }>;\n removedFields: string[];\n}\n\ninterface RecordModelInfo {\n allFields: Map<string, AllFieldInfo>;\n steps: UpgradeStep[];\n}\n\n/**\n * Helper to iterate sorted entries of a Map.\n */\nfunction sortedEntries<V>(map: Map<string, V>): [string, V][] {\n return Array.from(map.entries()).sort(([a], [b]) => a.localeCompare(b));\n}\n\nfunction getAddedInVersion(fieldInfo: AllFieldInfo): number {\n return Math.min(...fieldInfo.presentInVersions);\n}\n\n/**\n * Collect all record model info across all versions and compute upgrade steps.\n */\nfunction collectRecordModels(\n chain: VersionedIrEntry[],\n): Map<string, RecordModelInfo> {\n const allRecordModels = new Map<string, RecordModelInfo>();\n\n // Initialize models from all versions\n for (const { version, ir } of chain) {\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n if (!allRecordModels.has(modelKey)) {\n allRecordModels.set(modelKey, {\n allFields: new Map(),\n steps: [],\n });\n }\n\n const model = allRecordModels.get(modelKey)!;\n\n for (const field of modelDef.record.fields) {\n const existing = model.allFields.get(field.key);\n if (existing == null) {\n model.allFields.set(field.key, {\n fieldType: field.fieldType,\n isOptional: field.isOptional === true,\n presentInVersions: new Set([version]),\n alwaysOptional: field.isOptional === true,\n everOptional: field.isOptional === true,\n });\n } else {\n existing.presentInVersions.add(version);\n if (field.isOptional !== true) {\n existing.alwaysOptional = false;\n }\n if (field.isOptional === true) {\n existing.everOptional = true;\n }\n }\n }\n }\n }\n\n // Compute upgrade steps from version diffs\n for (let i = 1; i < chain.length; i++) {\n const prevEntry = chain[i - 1]!;\n const currEntry = chain[i]!;\n\n for (const [modelKey, currModelDef] of Object.entries(currEntry.ir.models)) {\n if (currModelDef.type !== \"record\") continue;\n\n const prevModelDef = prevEntry.ir.models[modelKey];\n if (prevModelDef == null || prevModelDef.type !== \"record\") continue;\n\n const model = allRecordModels.get(modelKey);\n if (model == null) continue;\n\n const prevFields = new Set(prevModelDef.record.fields.map(f => f.key));\n const currFields = new Set(currModelDef.record.fields.map(f => f.key));\n\n // Fields added in this version that require lens treatment. Optional\n // additive fields are skipped — `undefined` is a legal v_current value\n // for them, so the lens has nothing to invent.\n const addedFields = new Map<\n string,\n { derivedFrom: string[]; isOptional: boolean }\n >();\n const recordUpgrades = currEntry.migrations?.[modelKey];\n for (const field of currModelDef.record.fields) {\n const fieldKey = field.key;\n if (prevFields.has(fieldKey)) continue;\n const isOptional = field.isOptional === true;\n const annotation = recordUpgrades?.[fieldKey];\n const derivedFrom = annotation != null ? [...annotation.derivedFrom] : [];\n if (derivedFrom.length === 0 && isOptional) continue;\n addedFields.set(fieldKey, { derivedFrom, isOptional });\n }\n\n // Fields absent from this version relative to the previous one (i.e. deprecated fields).\n const removedFields: string[] = [];\n for (const fieldKey of prevFields) {\n if (!currFields.has(fieldKey)) {\n removedFields.push(fieldKey);\n }\n }\n\n if (addedFields.size > 0 || removedFields.length > 0) {\n model.steps.push({\n addedInVersion: currEntry.version,\n fields: addedFields,\n removedFields,\n });\n }\n }\n }\n\n // Mark fields that are not present in ALL versions as optional in internal type\n const totalVersions = chain.length;\n for (const model of allRecordModels.values()) {\n for (const [, fieldInfo] of model.allFields) {\n if (fieldInfo.presentInVersions.size < totalVersions) {\n fieldInfo.alwaysOptional = true;\n }\n }\n }\n\n return allRecordModels;\n}\n\n/**\n * Generate _internal/types.ts content.\n */\nfunction generateInternalTypes(\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n let output = GENERATED_FILE_HEADER;\n output += \"\\n\";\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `/** Internal representation containing all fields across all schema versions. */\\n`;\n output += `export interface ${modelKey}__Internal {\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const tsType = convertFieldTypeToInternalTypeScript(\n fieldInfo.fieldType,\n fieldInfo.isOptional,\n );\n const optional = fieldInfo.alwaysOptional ? \"?\" : \"\";\n output += ` readonly ${fieldName}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\\n\";\n }\n\n return output;\n}\n\n/**\n * Generate per-version internal interfaces (e.g. `ShapeBox__v1`, `ShapeBox__v2`).\n *\n * Each interface contains only the fields present in that version, with their\n * actual optionality taken straight from that version's IR. The downstream\n * `DocumentUpgradeFns` generator uses these so each upgrade function's\n * parameter can `Pick` the prior version's fields and its return type can\n * index the current version's field type precisely.\n */\nfunction generatePerVersionInternalTypes(\n chain: VersionedIrEntry[],\n): string {\n // Group by model so each model's versions appear together in ascending order.\n const perModelVersions = new Map<\n string,\n { version: number; fields: readonly IFieldDef[] }[]\n >();\n\n for (const { version, ir } of chain) {\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n let list = perModelVersions.get(modelKey);\n if (list == null) {\n list = [];\n perModelVersions.set(modelKey, list);\n }\n list.push({ version, fields: modelDef.record.fields });\n }\n }\n\n let output = \"\";\n const sortedModels = Array.from(perModelVersions.entries()).sort(([a], [b]) =>\n a.localeCompare(b)\n );\n for (const [modelKey, versions] of sortedModels) {\n for (const { version, fields } of versions) {\n output += `/** Internal representation of ${modelKey} at schema version ${version}. */\\n`;\n output += `export interface ${modelKey}__v${version} {\\n`;\n const sortedFields = [...fields].sort((a, b) => a.key.localeCompare(b.key));\n for (const field of sortedFields) {\n const tsType = convertFieldTypeToInternalTypeScript(\n field.fieldType,\n field.isOptional === true,\n );\n const optional = field.isOptional === true ? \"?\" : \"\";\n output += ` readonly ${field.key}${optional}: ${tsType};\\n`;\n }\n output += \"}\\n\\n\";\n }\n }\n return output;\n}\n\n/**\n * Generate _internal/upgrades.ts content.\n */\nfunction generateUpgrades(\n allRecordModels: Map<string, RecordModelInfo>,\n latestIr: IRealTimeDocumentSchema,\n): string {\n let output = GENERATED_FILE_HEADER;\n\n const hasRecords = allRecordModels.size > 0;\n const hasUnions = Object.values(latestIr.models).some(m => m.type === \"union\");\n\n const imports: string[] = [];\n if (hasRecords) imports.push(\"UpgradeRegistry\");\n if (hasUnions) imports.push(\"UnionUpgradeRegistry\");\n\n if (imports.length > 0) {\n output += `import type { ${\n imports.join(\", \")\n } } from \"@palantir/pack.document-schema.model-types\";\\n\\n`;\n }\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `export const ${modelKey}Upgrades: UpgradeRegistry<\"${modelKey}\"> = {\\n`;\n output += ` modelName: \"${modelKey}\",\\n`;\n\n // allFields\n output += ` allFields: {\\n`;\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const typeDescriptor = convertFieldTypeToDescriptor(\n fieldInfo.fieldType,\n fieldInfo.isOptional,\n );\n output += ` ${fieldName}: { type: ${typeDescriptor}, addedInVersion: ${\n getAddedInVersion(fieldInfo)\n } },\\n`;\n }\n output += ` },\\n`;\n\n // steps\n output += ` steps: [\\n`;\n for (const step of model.steps) {\n output += ` {\\n`;\n output += ` addedInVersion: ${step.addedInVersion},\\n`;\n output += ` fields: {\\n`;\n for (const [fieldName, fieldMeta] of step.fields) {\n output += ` ${fieldName}: {\\n`;\n output += ` derivedFrom: [${\n fieldMeta.derivedFrom.map(d => `\"${d}\"`).join(\", \")\n }],\\n`;\n output += ` },\\n`;\n }\n output += ` },\\n`;\n if (step.removedFields.length > 0) {\n output += ` removedFields: [${step.removedFields.map(f => `\"${f}\"`).join(\", \")}],\\n`;\n }\n output += ` },\\n`;\n }\n output += ` ],\\n`;\n\n output += `};\\n\\n`;\n }\n\n // Generate UnionUpgradeRegistry entries for union models\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type !== \"union\") continue;\n\n const union = modelDef.union;\n output += `export const ${modelKey}Upgrades: UnionUpgradeRegistry<\"${modelKey}\"> = {\\n`;\n output += ` modelName: \"${modelKey}\",\\n`;\n output += ` discriminant: \"${union.discriminant}\",\\n`;\n output += ` variants: {\\n`;\n for (const [variantKey, variantModelKey] of Object.entries(union.variants)) {\n output += ` \"${variantKey}\": \"${variantModelKey}\",\\n`;\n }\n output += ` },\\n`;\n output += `};\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/schema.ts content.\n */\nfunction generateInternalSchemaContent(\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n let output = GENERATED_FILE_HEADER;\n output += `import { z } from \"zod\";\\n\\n`;\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `export const ${modelKey}InternalSchema = z.object({\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n // Use everOptional: a field optional in ANY version must stay optional\n // in the internal schema because older documents may legitimately omit it.\n const zodType = convertFieldTypeToInternalZod(\n fieldInfo.fieldType,\n fieldInfo.alwaysOptional || fieldInfo.everOptional,\n );\n output += ` ${fieldName}: ${zodType},\\n`;\n }\n\n output += `}).passthrough();\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/upgradeFns.ts content: a typed `DocumentUpgradeFns`\n * interface enumerating every upgrade function the app must supply at boot.\n *\n * For each `(modelName, v${version}, fieldName)` triple in a step's `fields`,\n * emit one property:\n * - Derived (`derivedFrom.length > 0`):\n * `(oldFields: Pick<<Model>__v<prior>, derivedFrom[number]>) => <Model>__v<current>[fieldName]`.\n * - Required additive (`derivedFrom.length === 0`):\n * `() => <Model>__v<current>[fieldName]`.\n *\n * Optional additive fields are filtered out at step-collection time and don't\n * appear here — `undefined` is a legal v<current> value for them, so the app\n * has no obligation to invent one.\n *\n * The interface is consumed by the generated `DocumentModel` factory in\n * `models.ts`, which requires it as a parameter when the schema needs any\n * upgrade functions. Schemas with no required fields added past v1 emit an\n * empty interface (still exported for type-uniformity in downstream code).\n */\nfunction generateUpgradeFns(\n chain: VersionedIrEntry[],\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n interface UpgradeFnEntry {\n fieldName: string;\n derivedFrom: readonly string[];\n }\n interface StepEntry {\n currentVersion: number;\n priorVersion: number;\n fields: UpgradeFnEntry[];\n }\n\n const perModel = new Map<string, StepEntry[]>();\n const neededTypes = new Set<string>();\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n for (const step of model.steps) {\n const currentIdx = chain.findIndex(c => c.version === step.addedInVersion);\n if (currentIdx <= 0) continue;\n const priorVersion = chain[currentIdx - 1]!.version;\n\n const fields: UpgradeFnEntry[] = [];\n for (const [fieldName, fieldMeta] of step.fields) {\n fields.push({ fieldName, derivedFrom: [...fieldMeta.derivedFrom] });\n }\n if (fields.length === 0) continue;\n\n let list = perModel.get(modelKey);\n if (list == null) {\n list = [];\n perModel.set(modelKey, list);\n }\n list.push({\n currentVersion: step.addedInVersion,\n priorVersion,\n fields,\n });\n // Prior-version type only needed when at least one field derives from it.\n if (fields.some(f => f.derivedFrom.length > 0)) {\n neededTypes.add(`${modelKey}__v${priorVersion}`);\n }\n neededTypes.add(`${modelKey}__v${step.addedInVersion}`);\n }\n }\n\n let output = GENERATED_FILE_HEADER;\n output += `\\n`;\n\n if (neededTypes.size > 0) {\n const sorted = Array.from(neededTypes).sort();\n output += `import type { ${sorted.join(\", \")} } from \"./types.js\";\\n\\n`;\n }\n\n output += `/**\\n`;\n output += ` * Typed upgrade functions the application must supply at boot. Coverage is\\n`;\n output +=\n ` * exhaustive: missing or extra entries fail type-check at the \\`DocumentModel(...)\\`\\n`;\n output += ` * call site. Derived fields receive their declared source fields; required\\n`;\n output += ` * additive fields receive no arguments. Optional additive fields are absent\\n`;\n output += ` * — \\`undefined\\` is a legal value at the new version, so the runtime lens\\n`;\n output += ` * leaves them alone.\\n`;\n output += ` */\\n`;\n if (perModel.size === 0) {\n output += `// eslint-disable-next-line @typescript-eslint/no-empty-object-type\\n`;\n output += `export interface DocumentUpgradeFns {}\\n`;\n } else {\n output += `export interface DocumentUpgradeFns {\\n`;\n for (\n const [modelKey, steps] of Array.from(perModel.entries()).sort(([a], [b]) =>\n a.localeCompare(b)\n )\n ) {\n output += ` ${modelKey}: {\\n`;\n for (const step of steps) {\n output += ` v${step.currentVersion}: {\\n`;\n for (const f of step.fields) {\n const returnType = `${modelKey}__v${step.currentVersion}[\"${f.fieldName}\"]`;\n if (f.derivedFrom.length === 0) {\n output += ` ${f.fieldName}: () => ${returnType};\\n`;\n } else {\n const pickKeys = f.derivedFrom.map(d => `\"${d}\"`).join(\" | \");\n output +=\n ` ${f.fieldName}: (oldFields: Pick<${modelKey}__v${step.priorVersion}, ${pickKeys}>) => ${returnType};\\n`;\n }\n }\n output += ` };\\n`;\n }\n output += ` };\\n`;\n }\n output += `}\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/types.ts, _internal/upgrades.ts, _internal/schema.ts and\n * _internal/upgradeFns.ts from an already-resolved versioned IR chain.\n */\nexport function generateInternalFromChain(\n resolved: ResolvedIrChain,\n): InternalTypesOutput {\n const { chain } = resolved;\n const latestIr = chain[chain.length - 1]!.ir;\n\n const allRecordModels = collectRecordModels(chain);\n\n const internalTypes = generateInternalTypes(allRecordModels)\n + (chainNeedsUpgradeFns(chain) ? generatePerVersionInternalTypes(chain) : \"\");\n const upgrades = generateUpgrades(allRecordModels, latestIr);\n const internalSchema = generateInternalSchemaContent(allRecordModels);\n const internalUpgradeFns = generateUpgradeFns(chain, allRecordModels);\n\n return { internalTypes, upgrades, internalSchema, internalUpgradeFns };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"generateInternalFromSchema.js","names":["GENERATED_FILE_HEADER","convertFieldTypeToDescriptor","convertFieldTypeToInternalTypeScript","convertFieldTypeToInternalZod","chainNeedsUpgradeFns","getEntryMinorVersion","upgradeStepKey","internalSchemaName","internalTypeName","upgradesName","versionedInternalTypeName","sortedEntries","map","Array","from","entries","sort","a","b","localeCompare","getAddedInVersion","fieldInfo","Math","min","presentInVersions","collectRecordModels","chain","allRecordModels","Map","version","ir","modelKey","modelDef","Object","models","type","has","set","allFields","steps","model","get","field","record","fields","existing","key","fieldType","isOptional","Set","presentInEntries","alwaysOptional","everOptional","add","i","length","prevEntry","currEntry","currModelDef","prevModelDef","prevFields","f","currFields","addedFields","recordUpgrades","migrations","fieldKey","annotation","derivedFrom","removedFields","push","size","addedInVersion","addedInMinorVersion","totalEntries","values","generateInternalTypes","output","fieldName","tsType","optional","generatePerVersionInternalTypes","perModelVersions","list","sortedModels","versions","sortedFields","generateUpgrades","latestIr","hasRecords","hasUnions","some","m","imports","join","typeDescriptor","step","fieldMeta","d","union","discriminant","variantKey","variantModelKey","variants","variantMetadata","meta","generateInternalSchemaContent","zodType","generateUpgradeFns","perModel","neededTypes","currentIdx","findIndex","c","priorVersion","undefined","stepKey","currentVersion","sorted","currentType","returnType","priorType","pickKeys","generateInternalFromChain","resolved","stepChain","internalTypes","upgrades","internalSchema","internalUpgradeFns"],"sources":["generateInternalFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n IFieldDef,\n IFieldTypeUnion,\n IRealTimeDocumentSchema,\n} from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport {\n convertFieldTypeToDescriptor,\n convertFieldTypeToInternalTypeScript,\n convertFieldTypeToInternalZod,\n} from \"../ir/irFieldHelpers.js\";\nimport {\n chainNeedsUpgradeFns,\n getEntryMinorVersion,\n type ResolvedIrChain,\n upgradeStepKey,\n type VersionedIrEntry,\n} from \"./resolveSchemaChain.js\";\nimport {\n internalSchemaName,\n internalTypeName,\n upgradesName,\n versionedInternalTypeName,\n} from \"./runtimeSchema.js\";\n\nexport interface InternalTypesOutput {\n /** _internal/types.ts content */\n internalTypes: string;\n /** _internal/upgrades.ts content */\n upgrades: string;\n /** _internal/schema.ts content */\n internalSchema: string;\n /** _internal/upgradeFns.ts content */\n internalUpgradeFns: string;\n}\n\n/** Collected info about all fields for a model across all versions. */\ninterface AllFieldInfo {\n fieldType: IFieldTypeUnion;\n isOptional: boolean;\n /** Major versions where this field exists. */\n presentInVersions: Set<number>;\n /** How many versions have this field, counting 3.0, 3.1 and 3.2 separately. Fewer than all → optional. */\n presentInEntries: number;\n /** Whether field is always optional. */\n alwaysOptional: boolean;\n /** Whether field is optional in at least one version. */\n everOptional: boolean;\n}\n\n/**\n * Represents an upgrade step for a model between version transitions.\n *\n * `fields` only contains entries that require lens treatment — derived fields\n * (`derivedFrom.length > 0`) and required additive fields (`derivedFrom.length\n * === 0 && !isOptional`). Optional additive fields are absent because\n * `undefined` is a legal value at the current version and the lens has no\n * work to do.\n */\ninterface UpgradeStep {\n addedInVersion: number;\n addedInMinorVersion: number;\n fields: Map<string, UpgradeStepField>;\n removedFields: string[];\n}\n\ninterface UpgradeStepField {\n derivedFrom: string[];\n isOptional: boolean;\n}\n\ninterface RecordModelInfo {\n allFields: Map<string, AllFieldInfo>;\n steps: UpgradeStep[];\n}\n\n/**\n * Helper to iterate sorted entries of a Map.\n */\nfunction sortedEntries<V>(map: Map<string, V>): [string, V][] {\n return Array.from(map.entries()).sort(([a], [b]) => a.localeCompare(b));\n}\n\nfunction getAddedInVersion(fieldInfo: AllFieldInfo): number {\n return Math.min(...fieldInfo.presentInVersions);\n}\n\n/**\n * Collect all record model info across all versions and compute upgrade steps.\n * Takes the full chain (with minor versions), so a field added in 1.1 gets its\n * own step and counts as missing from 1.0 records.\n */\nfunction collectRecordModels(\n chain: VersionedIrEntry[],\n): Map<string, RecordModelInfo> {\n const allRecordModels = new Map<string, RecordModelInfo>();\n\n // Initialize models from all versions\n for (const { version, ir } of chain) {\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n if (!allRecordModels.has(modelKey)) {\n allRecordModels.set(modelKey, {\n allFields: new Map(),\n steps: [],\n });\n }\n\n const model = allRecordModels.get(modelKey)!;\n\n for (const field of modelDef.record.fields) {\n const existing = model.allFields.get(field.key);\n if (existing == null) {\n model.allFields.set(field.key, {\n fieldType: field.fieldType,\n isOptional: field.isOptional === true,\n presentInVersions: new Set([version]),\n presentInEntries: 1,\n alwaysOptional: field.isOptional === true,\n everOptional: field.isOptional === true,\n });\n } else {\n existing.presentInVersions.add(version);\n existing.presentInEntries += 1;\n if (field.isOptional !== true) {\n existing.alwaysOptional = false;\n }\n if (field.isOptional === true) {\n existing.everOptional = true;\n }\n }\n }\n }\n }\n\n // Compute upgrade steps from version diffs\n for (let i = 1; i < chain.length; i++) {\n const prevEntry = chain[i - 1]!;\n const currEntry = chain[i]!;\n\n for (const [modelKey, currModelDef] of Object.entries(currEntry.ir.models)) {\n if (currModelDef.type !== \"record\") continue;\n\n const prevModelDef = prevEntry.ir.models[modelKey];\n if (prevModelDef == null || prevModelDef.type !== \"record\") continue;\n\n const model = allRecordModels.get(modelKey);\n if (model == null) continue;\n\n const prevFields = new Set(prevModelDef.record.fields.map(f => f.key));\n const currFields = new Set(currModelDef.record.fields.map(f => f.key));\n\n // Fields added in this version that require lens treatment. Optional\n // additive fields are skipped — `undefined` is a legal v_current value\n // for them, so the lens has nothing to invent.\n const addedFields = new Map<string, UpgradeStepField>();\n const recordUpgrades = currEntry.migrations?.[modelKey];\n for (const field of currModelDef.record.fields) {\n const fieldKey = field.key;\n if (prevFields.has(fieldKey)) continue;\n const isOptional = field.isOptional === true;\n const annotation = recordUpgrades?.[fieldKey];\n const derivedFrom = annotation != null ? [...annotation.derivedFrom] : [];\n if (derivedFrom.length === 0 && isOptional) continue;\n addedFields.set(fieldKey, { derivedFrom, isOptional });\n }\n\n // Fields absent from this version relative to the previous one (i.e. deprecated fields).\n const removedFields: string[] = [];\n for (const fieldKey of prevFields) {\n if (!currFields.has(fieldKey)) {\n removedFields.push(fieldKey);\n }\n }\n\n if (addedFields.size > 0 || removedFields.length > 0) {\n model.steps.push({\n addedInVersion: currEntry.version,\n addedInMinorVersion: getEntryMinorVersion(currEntry),\n fields: addedFields,\n removedFields,\n });\n }\n }\n }\n\n // Mark fields that are not present in ALL versions as optional in internal type\n const totalEntries = chain.length;\n for (const model of allRecordModels.values()) {\n for (const [, fieldInfo] of model.allFields) {\n if (fieldInfo.presentInEntries < totalEntries) {\n fieldInfo.alwaysOptional = true;\n }\n }\n }\n\n return allRecordModels;\n}\n\n/**\n * Generate _internal/types.ts content.\n */\nfunction generateInternalTypes(\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n let output = GENERATED_FILE_HEADER;\n output += \"\\n\";\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `/** Internal representation containing all fields across all schema versions. */\\n`;\n output += `export interface ${internalTypeName(modelKey)} {\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const tsType = convertFieldTypeToInternalTypeScript(\n fieldInfo.fieldType,\n fieldInfo.isOptional,\n );\n const optional = fieldInfo.alwaysOptional ? \"?\" : \"\";\n output += ` readonly ${fieldName}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\\n\";\n }\n\n return output;\n}\n\n/**\n * Generate per-version internal interfaces (e.g. `ShapeBox__v1`, `ShapeBox__v2`).\n *\n * Each interface contains only the fields present in that version, with their\n * actual optionality taken straight from that version's IR. The downstream\n * `DocumentUpgradeFns` generator uses these so each upgrade function's\n * parameter can `Pick` the prior version's fields and its return type can\n * index the current version's field type precisely.\n */\nfunction generatePerVersionInternalTypes(\n chain: VersionedIrEntry[],\n): string {\n // Group by model so each model's versions appear together in ascending order.\n const perModelVersions = new Map<\n string,\n { version: number; fields: readonly IFieldDef[] }[]\n >();\n\n for (const { version, ir } of chain) {\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n let list = perModelVersions.get(modelKey);\n if (list == null) {\n list = [];\n perModelVersions.set(modelKey, list);\n }\n list.push({ version, fields: modelDef.record.fields });\n }\n }\n\n let output = \"\";\n const sortedModels = Array.from(perModelVersions.entries()).sort(([a], [b]) =>\n a.localeCompare(b)\n );\n for (const [modelKey, versions] of sortedModels) {\n for (const { version, fields } of versions) {\n output += `/** Internal representation of ${modelKey} at schema version ${version}. */\\n`;\n output += `export interface ${versionedInternalTypeName(modelKey, version)} {\\n`;\n const sortedFields = [...fields].sort((a, b) => a.key.localeCompare(b.key));\n for (const field of sortedFields) {\n const tsType = convertFieldTypeToInternalTypeScript(\n field.fieldType,\n field.isOptional === true,\n );\n const optional = field.isOptional === true ? \"?\" : \"\";\n output += ` readonly ${field.key}${optional}: ${tsType};\\n`;\n }\n output += \"}\\n\\n\";\n }\n }\n return output;\n}\n\n/**\n * Generate _internal/upgrades.ts content.\n */\nfunction generateUpgrades(\n allRecordModels: Map<string, RecordModelInfo>,\n latestIr: IRealTimeDocumentSchema,\n): string {\n let output = GENERATED_FILE_HEADER;\n\n const hasRecords = allRecordModels.size > 0;\n const hasUnions = Object.values(latestIr.models).some(m => m.type === \"union\");\n\n const imports: string[] = [];\n if (hasRecords) imports.push(\"UpgradeRegistry\");\n if (hasUnions) imports.push(\"UnionUpgradeRegistry\");\n\n if (imports.length > 0) {\n output += `import type { ${\n imports.join(\", \")\n } } from \"@palantir/pack.document-schema.model-types\";\\n\\n`;\n }\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `export const ${upgradesName(modelKey)}: UpgradeRegistry<\"${modelKey}\"> = {\\n`;\n output += ` modelName: \"${modelKey}\",\\n`;\n\n // allFields\n output += ` allFields: {\\n`;\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const typeDescriptor = convertFieldTypeToDescriptor(\n fieldInfo.fieldType,\n fieldInfo.isOptional,\n );\n output += ` ${fieldName}: { type: ${typeDescriptor}, addedInVersion: ${\n getAddedInVersion(fieldInfo)\n } },\\n`;\n }\n output += ` },\\n`;\n\n // steps\n output += ` steps: [\\n`;\n for (const step of model.steps) {\n output += ` {\\n`;\n output += ` addedInVersion: ${step.addedInVersion},\\n`;\n if (step.addedInMinorVersion > 0) {\n output += ` addedInMinorVersion: ${step.addedInMinorVersion},\\n`;\n }\n output += ` fields: {\\n`;\n for (const [fieldName, fieldMeta] of step.fields) {\n output += ` ${fieldName}: {\\n`;\n output += ` derivedFrom: [${\n fieldMeta.derivedFrom.map(d => `\"${d}\"`).join(\", \")\n }],\\n`;\n output += ` },\\n`;\n }\n output += ` },\\n`;\n if (step.removedFields.length > 0) {\n output += ` removedFields: [${step.removedFields.map(f => `\"${f}\"`).join(\", \")}],\\n`;\n }\n output += ` },\\n`;\n }\n output += ` ],\\n`;\n\n output += `};\\n\\n`;\n }\n\n // Generate UnionUpgradeRegistry entries for union models\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type !== \"union\") continue;\n\n const union = modelDef.union;\n output += `export const ${upgradesName(modelKey)}: UnionUpgradeRegistry<\"${modelKey}\"> = {\\n`;\n output += ` modelName: \"${modelKey}\",\\n`;\n output += ` discriminant: \"${union.discriminant}\",\\n`;\n output += ` variants: {\\n`;\n for (const [variantKey, variantModelKey] of Object.entries(union.variants)) {\n output += ` \"${variantKey}\": \"${variantModelKey}\",\\n`;\n }\n output += ` },\\n`;\n if (union.variantMetadata != null) {\n output += ` variantAddedInVersions: {\\n`;\n for (const [variantKey, meta] of Object.entries(union.variantMetadata)) {\n output += ` \"${variantKey}\": ${meta.addedInVersion},\\n`;\n }\n output += ` },\\n`;\n }\n output += `};\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/schema.ts content.\n */\nfunction generateInternalSchemaContent(\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n let output = GENERATED_FILE_HEADER;\n output += `import { z } from \"zod\";\\n\\n`;\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `export const ${internalSchemaName(modelKey)} = z.object({\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n // Use everOptional: a field optional in ANY version must stay optional\n // in the internal schema because older documents may legitimately omit it.\n const zodType = convertFieldTypeToInternalZod(\n fieldInfo.fieldType,\n fieldInfo.alwaysOptional || fieldInfo.everOptional,\n );\n output += ` ${fieldName}: ${zodType},\\n`;\n }\n\n output += `}).passthrough();\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/upgradeFns.ts content: a typed `DocumentUpgradeFns`\n * interface enumerating every upgrade function the app must supply at boot.\n *\n * For each `(modelName, v${version}, fieldName)` triple in a step's `fields`,\n * emit one property:\n * - Derived (`derivedFrom.length > 0`):\n * `(oldFields: Pick<<Model>__v<prior>, derivedFrom[number]>) => <Model>__v<current>[fieldName]`.\n * - Required additive (`derivedFrom.length === 0`):\n * `() => <Model>__v<current>[fieldName]`.\n *\n * Optional additive fields are filtered out at step-collection time and don't\n * appear here — `undefined` is a legal v<current> value for them, so the app\n * has no obligation to invent one.\n *\n * The interface is consumed by the generated `DocumentModel` factory in\n * `models.ts`, which requires it as a parameter when the schema needs any\n * upgrade functions. Schemas with no required fields added past v1 emit an\n * empty interface (still exported for type-uniformity in downstream code).\n */\nfunction generateUpgradeFns(\n chain: VersionedIrEntry[],\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n interface UpgradeFnEntry {\n fieldName: string;\n derivedFrom: readonly string[];\n }\n interface StepEntry {\n stepKey: string;\n currentVersion: number;\n priorVersion: number | undefined;\n fields: UpgradeFnEntry[];\n }\n\n const perModel = new Map<string, StepEntry[]>();\n const neededTypes = new Set<string>();\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n for (const step of model.steps) {\n // A derived field's function takes the previous major's type, e.g. `Pick<ShapeBox__v1, \"color\">`\n // for a 2.0 step. Minor versions can't use `derivedFrom`, so minor steps never need it.\n const currentIdx = chain.findIndex(c => c.version === step.addedInVersion);\n const priorVersion = currentIdx > 0 ? chain[currentIdx - 1]!.version : undefined;\n\n const fields: UpgradeFnEntry[] = [];\n for (const [fieldName, fieldMeta] of step.fields) {\n fields.push({ fieldName, derivedFrom: [...fieldMeta.derivedFrom] });\n }\n if (fields.length === 0) continue;\n if (priorVersion == null && fields.some(f => f.derivedFrom.length > 0)) continue;\n\n let list = perModel.get(modelKey);\n if (list == null) {\n list = [];\n perModel.set(modelKey, list);\n }\n list.push({\n stepKey: upgradeStepKey(step.addedInVersion, step.addedInMinorVersion),\n currentVersion: step.addedInVersion,\n priorVersion,\n fields,\n });\n // Prior-version type only needed when at least one field derives from it.\n if (priorVersion != null && fields.some(f => f.derivedFrom.length > 0)) {\n neededTypes.add(versionedInternalTypeName(modelKey, priorVersion));\n }\n neededTypes.add(versionedInternalTypeName(modelKey, step.addedInVersion));\n }\n }\n\n let output = GENERATED_FILE_HEADER;\n output += `\\n`;\n\n if (neededTypes.size > 0) {\n const sorted = Array.from(neededTypes).sort();\n output += `import type { ${sorted.join(\", \")} } from \"./types.js\";\\n\\n`;\n }\n\n output += `/**\\n`;\n output += ` * Typed upgrade functions the application must supply at boot. Coverage is\\n`;\n output +=\n ` * exhaustive: missing or extra entries fail type-check at the \\`DocumentModel(...)\\`\\n`;\n output += ` * call site. Derived fields receive their declared source fields; required\\n`;\n output += ` * additive fields receive no arguments. Optional additive fields are absent\\n`;\n output += ` * — \\`undefined\\` is a legal value at the new version, so the runtime lens\\n`;\n output += ` * leaves them alone. Keys are \\`v2\\` for version 2.0 and \\`v2_1\\` for 2.1.\\n`;\n output += ` */\\n`;\n if (perModel.size === 0) {\n output += `// eslint-disable-next-line @typescript-eslint/no-empty-object-type\\n`;\n output += `export interface DocumentUpgradeFns {}\\n`;\n } else {\n output += `export interface DocumentUpgradeFns {\\n`;\n for (\n const [modelKey, steps] of Array.from(perModel.entries()).sort(([a], [b]) =>\n a.localeCompare(b)\n )\n ) {\n output += ` ${modelKey}: {\\n`;\n for (const step of steps) {\n output += ` ${step.stepKey}: {\\n`;\n const currentType = versionedInternalTypeName(modelKey, step.currentVersion);\n for (const f of step.fields) {\n const returnType = `${currentType}[\"${f.fieldName}\"]`;\n if (f.derivedFrom.length === 0) {\n output += ` ${f.fieldName}: () => ${returnType};\\n`;\n } else {\n // Steps with derived fields always have a prior version (others are skipped above).\n const priorType = versionedInternalTypeName(modelKey, step.priorVersion!);\n const pickKeys = f.derivedFrom.map(d => `\"${d}\"`).join(\" | \");\n output +=\n ` ${f.fieldName}: (oldFields: Pick<${priorType}, ${pickKeys}>) => ${returnType};\\n`;\n }\n }\n output += ` };\\n`;\n }\n output += ` };\\n`;\n }\n output += `}\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/types.ts, _internal/upgrades.ts, _internal/schema.ts and\n * _internal/upgradeFns.ts from an already-resolved versioned IR chain.\n */\nexport function generateInternalFromChain(\n resolved: ResolvedIrChain,\n): InternalTypesOutput {\n const { chain } = resolved;\n const stepChain = resolved.stepChain ?? chain;\n const latestIr = chain[chain.length - 1]!.ir;\n\n const allRecordModels = collectRecordModels(stepChain);\n\n const internalTypes = generateInternalTypes(allRecordModels)\n + (chainNeedsUpgradeFns(stepChain) ? generatePerVersionInternalTypes(chain) : \"\");\n const upgrades = generateUpgrades(allRecordModels, latestIr);\n const internalSchema = generateInternalSchemaContent(allRecordModels);\n const internalUpgradeFns = generateUpgradeFns(chain, allRecordModels);\n\n return { internalTypes, upgrades, internalSchema, internalUpgradeFns };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -14,11 +14,10 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { formatVariantName } from "@palantir/pack.schema";
18
17
  import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
19
18
  import { findExternalRefType } from "../ir/irFieldHelpers.js";
20
19
  import { chainNeedsUpgradeFns, resolveMinVersion } from "./resolveSchemaChain.js";
21
- import { INTERNAL_UPGRADE_FNS_PATH, INTERNAL_UPGRADES_PATH, modelName, SCHEMA_REEXPORT_PATH, schemaName, TYPES_REEXPORT_PATH } from "./runtimeSchema.js";
20
+ import { INTERNAL_UPGRADE_FNS_PATH, INTERNAL_UPGRADES_PATH, modelName, SCHEMA_REEXPORT_PATH, schemaName, TYPES_REEXPORT_PATH, unionVariantName, upgradesName } from "./runtimeSchema.js";
22
21
  function extractExternalRefFieldTypes(record) {
23
22
  const refs = [];
24
23
  for (const field of record.fields) {
@@ -42,7 +41,8 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
42
41
  minVersion
43
42
  } = resolveMinVersion(chain, minSupportedVersion);
44
43
  const latestIr = chain[chain.length - 1].ir;
45
- const needsUpgradeFns = chainNeedsUpgradeFns(chain);
44
+ const stepChain = resolved.stepChain ?? chain;
45
+ const needsUpgradeFns = chainNeedsUpgradeFns(stepChain);
46
46
 
47
47
  // --- Generate models.ts ---
48
48
  let output = GENERATED_FILE_HEADER;
@@ -59,7 +59,7 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
59
59
  } else if (modelDef.type === "union") {
60
60
  unionNames.push(modelKey);
61
61
  for (const variantName of Object.keys(modelDef.union.variants)) {
62
- const variantModelName = `${modelKey}${formatVariantName(variantName)}`;
62
+ const variantModelName = unionVariantName(modelKey, variantName);
63
63
  variantNames.push(variantModelName);
64
64
  unionByVariantName.set(variantModelName, modelKey);
65
65
  }
@@ -85,8 +85,8 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
85
85
  }
86
86
 
87
87
  // Upgrade imports (only if there are upgrades)
88
- const upgradeNames = [...recordNames, ...unionNames].map(n => `${n}Upgrades`);
89
- const needsUpgradeRegistry = chain.length > 1 || unionNames.length > 0;
88
+ const upgradeNames = [...recordNames, ...unionNames].map(n => upgradesName(n));
89
+ const needsUpgradeRegistry = stepChain.length > 1 || unionNames.length > 0;
90
90
  if (needsUpgradeRegistry && upgradeNames.length > 0) {
91
91
  output += `import { ${upgradeNames.join(", ")} } from "${INTERNAL_UPGRADES_PATH}";\n`;
92
92
  }
@@ -127,8 +127,7 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
127
127
 
128
128
  // Generate variant models
129
129
  for (const variantName of Object.keys(union.variants)) {
130
- const formattedVariant = formatVariantName(variantName);
131
- const variantTypeName = `${modelKey}${formattedVariant}`;
130
+ const variantTypeName = unionVariantName(modelKey, variantName);
132
131
  const variantMetadata = [];
133
132
  variantMetadata.push(` discriminant: "${union.discriminant}",`);
134
133
  variantMetadata.push(` name: "${variantTypeName}",`);
@@ -150,8 +149,7 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
150
149
  } else if (modelDef.type === "union") {
151
150
  modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);
152
151
  for (const variantName of Object.keys(modelDef.union.variants)) {
153
- const formattedVariant = formatVariantName(variantName);
154
- const variantTypeName = `${modelKey}${formattedVariant}`;
152
+ const variantTypeName = unionVariantName(modelKey, variantName);
155
153
  modelEntries.push(` ${variantTypeName}: ${modelName(variantTypeName)}`);
156
154
  }
157
155
  }
@@ -162,7 +160,7 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
162
160
  const allUpgradeNames = [...recordNames, ...unionNames];
163
161
  if (needsUpgradeRegistry && allUpgradeNames.length > 0) {
164
162
  // A variant model uses its union's registry, which finds the variant by its discriminant.
165
- const upgradeEntries = [...allUpgradeNames.map(n => ` ${n}: ${n}Upgrades,`), ...variantNames.map(n => ` ${n}: ${unionByVariantName.get(n)}Upgrades,`)].join("\n");
163
+ const upgradeEntries = [...allUpgradeNames.map(n => ` ${n}: ${upgradesName(n)},`), ...variantNames.map(n => ` ${n}: ${upgradesName(unionByVariantName.get(n))},`)].join("\n");
166
164
  upgradesBlock = ` upgrades: {\n${upgradeEntries}\n },\n`;
167
165
  } else {
168
166
  upgradesBlock = "";
@@ -1 +1 @@
1
- {"version":3,"file":"generateModelMetadataFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","findExternalRefType","chainNeedsUpgradeFns","resolveMinVersion","INTERNAL_UPGRADE_FNS_PATH","INTERNAL_UPGRADES_PATH","modelName","SCHEMA_REEXPORT_PATH","schemaName","TYPES_REEXPORT_PATH","extractExternalRefFieldTypes","record","refs","field","fields","refType","fieldType","push","key","generateModelMetadataFromChain","resolved","minSupportedVersion","chain","latestVersion","minVersion","latestIr","length","ir","needsUpgradeFns","output","recordNames","unionNames","variantNames","unionByVariantName","Map","modelKey","modelDef","Object","entries","models","type","variantName","keys","union","variants","variantModelName","set","allModelNames","sort","modelTypesImports","join","schemaNames","map","n","upgradeNames","needsUpgradeRegistry","externalRefs","metadataFields","discriminant","formattedVariant","variantTypeName","variantMetadata","modelEntries","upgradesBlock","allUpgradeNames","upgradeEntries","get","metadataBody","modelEntriesBody","e","replace","modelsFile"],"sources":["generateModelMetadataFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { formatVariantName } from \"@palantir/pack.schema\";\nimport type { IRecordDef } from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport { findExternalRefType } from \"../ir/irFieldHelpers.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { chainNeedsUpgradeFns, resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n INTERNAL_UPGRADE_FNS_PATH,\n INTERNAL_UPGRADES_PATH,\n modelName,\n SCHEMA_REEXPORT_PATH,\n schemaName,\n TYPES_REEXPORT_PATH,\n} from \"./runtimeSchema.js\";\n\nexport interface ModelMetadataOutput {\n /** models.ts content -- DocumentModel with version metadata and upgrade references */\n modelsFile: string;\n}\n\nfunction extractExternalRefFieldTypes(\n record: IRecordDef,\n): Array<[string, string]> {\n const refs: Array<[string, string]> = [];\n for (const field of record.fields) {\n const refType = findExternalRefType(field.fieldType);\n if (refType != null) {\n refs.push([field.key, refType]);\n }\n }\n return refs;\n}\n\n/**\n * Generate models.ts from an already-resolved versioned IR chain.\n */\nexport function generateModelMetadataFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): ModelMetadataOutput {\n const { chain } = resolved;\n const { latestVersion, minVersion } = resolveMinVersion(chain, minSupportedVersion);\n const latestIr = chain[chain.length - 1]!.ir;\n const needsUpgradeFns = chainNeedsUpgradeFns(chain);\n\n // --- Generate models.ts ---\n let output = GENERATED_FILE_HEADER;\n\n // Collect model names for imports\n const recordNames: string[] = [];\n const unionNames: string[] = [];\n const variantNames: string[] = [];\n // Each variant model's union, e.g. NodeShapeBox -> NodeShape.\n const unionByVariantName = new Map<string, string>();\n\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n recordNames.push(modelKey);\n } else if (modelDef.type === \"union\") {\n unionNames.push(modelKey);\n for (const variantName of Object.keys(modelDef.union.variants)) {\n const variantModelName = `${modelKey}${formatVariantName(variantName)}`;\n variantNames.push(variantModelName);\n unionByVariantName.set(variantModelName, modelKey);\n }\n }\n }\n\n const allModelNames = [...recordNames, ...unionNames, ...variantNames].sort();\n\n // Imports\n const modelTypesImports: string[] = [\"DocumentSchema\"];\n if (recordNames.length > 0) modelTypesImports.push(\"RecordModel\");\n if (unionNames.length > 0) modelTypesImports.push(\"UnionModel\");\n if (needsUpgradeFns) modelTypesImports.push(\"UpgradeFns\");\n\n output += `import type { ${\n modelTypesImports.sort().join(\", \")\n } } from \"@palantir/pack.document-schema.model-types\";\\n`;\n output += `import { Metadata } from \"@palantir/pack.document-schema.model-types\";\\n`;\n\n if (allModelNames.length > 0) {\n output += `import type { ${allModelNames.join(\", \")} } from \"${TYPES_REEXPORT_PATH}\";\\n`;\n }\n\n // Schema imports\n const schemaNames = allModelNames.map(n => schemaName(n));\n if (schemaNames.length > 0) {\n output += `import { ${schemaNames.join(\", \")} } from \"${SCHEMA_REEXPORT_PATH}\";\\n`;\n }\n\n // Upgrade imports (only if there are upgrades)\n const upgradeNames = [...recordNames, ...unionNames].map(n => `${n}Upgrades`);\n const needsUpgradeRegistry = chain.length > 1 || unionNames.length > 0;\n if (needsUpgradeRegistry && upgradeNames.length > 0) {\n output += `import { ${upgradeNames.join(\", \")} } from \"${INTERNAL_UPGRADES_PATH}\";\\n`;\n }\n\n // DocumentUpgradeFns type is needed by the factory's parameter signature.\n if (needsUpgradeFns) {\n output += `import type { DocumentUpgradeFns } from \"${INTERNAL_UPGRADE_FNS_PATH}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate model constants\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n const externalRefs = extractExternalRefFieldTypes(modelDef.record);\n const metadataFields: string[] = [];\n\n if (externalRefs.length > 0) {\n const entries = externalRefs.map(([field, type]) => ` ${field}: \"${type}\",`).join(\n \"\\n\",\n );\n metadataFields.push(` externalRefFieldTypes: {\\n${entries}\\n },`);\n }\n metadataFields.push(` name: \"${modelKey}\",`);\n\n output += `export interface ${modelName(modelKey)} extends RecordModel<${modelKey}, typeof ${\n schemaName(modelKey)\n }> {}\\n`;\n output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\\n`;\n output += ` __type: {} as ${modelKey},\\n`;\n output += ` zodSchema: ${schemaName(modelKey)},\\n`;\n output += ` [Metadata]: {\\n${metadataFields.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n } else if (modelDef.type === \"union\") {\n const union = modelDef.union;\n const metadataFields: string[] = [];\n metadataFields.push(` discriminant: \"${union.discriminant}\",`);\n metadataFields.push(` name: \"${modelKey}\",`);\n\n output += `export interface ${modelName(modelKey)} extends UnionModel<${modelKey}, typeof ${\n schemaName(modelKey)\n }> {}\\n`;\n output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\\n`;\n output += ` __type: {} as ${modelKey},\\n`;\n output += ` zodSchema: ${schemaName(modelKey)},\\n`;\n output += ` [Metadata]: {\\n${metadataFields.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n\n // Generate variant models\n for (const variantName of Object.keys(union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${modelKey}${formattedVariant}`;\n const variantMetadata: string[] = [];\n variantMetadata.push(` discriminant: \"${union.discriminant}\",`);\n variantMetadata.push(` name: \"${variantTypeName}\",`);\n\n output += `export interface ${\n modelName(variantTypeName)\n } extends UnionModel<${variantTypeName}, typeof ${schemaName(variantTypeName)}> {}\\n`;\n output += `export const ${modelName(variantTypeName)}: ${modelName(variantTypeName)} = {\\n`;\n output += ` __type: {} as ${variantTypeName},\\n`;\n output += ` zodSchema: ${schemaName(variantTypeName)},\\n`;\n output += ` [Metadata]: {\\n${variantMetadata.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n }\n }\n }\n\n // Generate DocumentModel\n const modelEntries: string[] = [];\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);\n } else if (modelDef.type === \"union\") {\n modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);\n for (const variantName of Object.keys(modelDef.union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${modelKey}${formattedVariant}`;\n modelEntries.push(` ${variantTypeName}: ${modelName(variantTypeName)}`);\n }\n }\n }\n\n // Build upgrades map (includes both record and union entries)\n let upgradesBlock: string;\n const allUpgradeNames = [...recordNames, ...unionNames];\n if (needsUpgradeRegistry && allUpgradeNames.length > 0) {\n // A variant model uses its union's registry, which finds the variant by its discriminant.\n const upgradeEntries = [\n ...allUpgradeNames.map(n => ` ${n}: ${n}Upgrades,`),\n ...variantNames.map(n => ` ${n}: ${unionByVariantName.get(n)}Upgrades,`),\n ].join(\"\\n\");\n upgradesBlock = ` upgrades: {\\n${upgradeEntries}\\n },\\n`;\n } else {\n upgradesBlock = \"\";\n }\n\n // Common metadata literal: shared between the const and factory forms.\n let metadataBody = ` [Metadata]: {\\n`;\n metadataBody += ` version: ${latestVersion},\\n`;\n if (minVersion !== latestVersion) {\n metadataBody += ` minSupportedVersion: ${minVersion},\\n`;\n }\n metadataBody += upgradesBlock;\n\n const modelEntriesBody = modelEntries.map(e => ` ${e}`).join(\",\\n\");\n\n if (needsUpgradeFns) {\n // Factory form: schema has at least one derived field or required additive\n // field, so the runtime requires the app to supply typed upgrade functions.\n // The factory makes this a compile-time requirement — apps can't get a\n // DocumentSchema value without passing them.\n output += `/**\\n`;\n output += ` * Construct the DocumentModel for this SDK, wiring in the typed forward\\n`;\n output += ` * functions the runtime needs to materialize fields added past v1.\\n`;\n output += ` */\\n`;\n output += `export function DocumentModel(upgradeFns: DocumentUpgradeFns): DocumentSchema {\\n`;\n output += ` return {\\n`;\n output += `${modelEntriesBody},\\n`;\n output += metadataBody;\n output += ` upgradeFns: upgradeFns as unknown as UpgradeFns,\\n`;\n output += ` },\\n`;\n output += ` };\\n`;\n output += `}\\n\\n`;\n output += `export type DocumentModel = ReturnType<typeof DocumentModel>;\\n`;\n } else {\n // Const form: no field added past v1 needs lens treatment, so no upgrade\n // functions are required.\n output += `export const DocumentModel = {\\n`;\n output += `${modelEntriesBody},\\n`;\n // Const form indents one level less than the factory body.\n output += metadataBody.replace(/^ {4}/gm, \" \");\n output += ` },\\n`;\n output += `} as const satisfies DocumentSchema;\\n\\n`;\n output += `export type DocumentModel = typeof DocumentModel;\\n`;\n }\n\n return { modelsFile: output };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"generateModelMetadataFromSchema.js","names":["GENERATED_FILE_HEADER","findExternalRefType","chainNeedsUpgradeFns","resolveMinVersion","INTERNAL_UPGRADE_FNS_PATH","INTERNAL_UPGRADES_PATH","modelName","SCHEMA_REEXPORT_PATH","schemaName","TYPES_REEXPORT_PATH","unionVariantName","upgradesName","extractExternalRefFieldTypes","record","refs","field","fields","refType","fieldType","push","key","generateModelMetadataFromChain","resolved","minSupportedVersion","chain","latestVersion","minVersion","latestIr","length","ir","stepChain","needsUpgradeFns","output","recordNames","unionNames","variantNames","unionByVariantName","Map","modelKey","modelDef","Object","entries","models","type","variantName","keys","union","variants","variantModelName","set","allModelNames","sort","modelTypesImports","join","schemaNames","map","n","upgradeNames","needsUpgradeRegistry","externalRefs","metadataFields","discriminant","variantTypeName","variantMetadata","modelEntries","upgradesBlock","allUpgradeNames","upgradeEntries","get","metadataBody","modelEntriesBody","e","replace","modelsFile"],"sources":["generateModelMetadataFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { IRecordDef } from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport { findExternalRefType } from \"../ir/irFieldHelpers.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { chainNeedsUpgradeFns, resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n INTERNAL_UPGRADE_FNS_PATH,\n INTERNAL_UPGRADES_PATH,\n modelName,\n SCHEMA_REEXPORT_PATH,\n schemaName,\n TYPES_REEXPORT_PATH,\n unionVariantName,\n upgradesName,\n} from \"./runtimeSchema.js\";\n\nexport interface ModelMetadataOutput {\n /** models.ts content -- DocumentModel with version metadata and upgrade references */\n modelsFile: string;\n}\n\nfunction extractExternalRefFieldTypes(\n record: IRecordDef,\n): Array<[string, string]> {\n const refs: Array<[string, string]> = [];\n for (const field of record.fields) {\n const refType = findExternalRefType(field.fieldType);\n if (refType != null) {\n refs.push([field.key, refType]);\n }\n }\n return refs;\n}\n\n/**\n * Generate models.ts from an already-resolved versioned IR chain.\n */\nexport function generateModelMetadataFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): ModelMetadataOutput {\n const { chain } = resolved;\n const { latestVersion, minVersion } = resolveMinVersion(chain, minSupportedVersion);\n const latestIr = chain[chain.length - 1]!.ir;\n const stepChain = resolved.stepChain ?? chain;\n const needsUpgradeFns = chainNeedsUpgradeFns(stepChain);\n\n // --- Generate models.ts ---\n let output = GENERATED_FILE_HEADER;\n\n // Collect model names for imports\n const recordNames: string[] = [];\n const unionNames: string[] = [];\n const variantNames: string[] = [];\n // Each variant model's union, e.g. NodeShapeBox -> NodeShape.\n const unionByVariantName = new Map<string, string>();\n\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n recordNames.push(modelKey);\n } else if (modelDef.type === \"union\") {\n unionNames.push(modelKey);\n for (const variantName of Object.keys(modelDef.union.variants)) {\n const variantModelName = unionVariantName(modelKey, variantName);\n variantNames.push(variantModelName);\n unionByVariantName.set(variantModelName, modelKey);\n }\n }\n }\n\n const allModelNames = [...recordNames, ...unionNames, ...variantNames].sort();\n\n // Imports\n const modelTypesImports: string[] = [\"DocumentSchema\"];\n if (recordNames.length > 0) modelTypesImports.push(\"RecordModel\");\n if (unionNames.length > 0) modelTypesImports.push(\"UnionModel\");\n if (needsUpgradeFns) modelTypesImports.push(\"UpgradeFns\");\n\n output += `import type { ${\n modelTypesImports.sort().join(\", \")\n } } from \"@palantir/pack.document-schema.model-types\";\\n`;\n output += `import { Metadata } from \"@palantir/pack.document-schema.model-types\";\\n`;\n\n if (allModelNames.length > 0) {\n output += `import type { ${allModelNames.join(\", \")} } from \"${TYPES_REEXPORT_PATH}\";\\n`;\n }\n\n // Schema imports\n const schemaNames = allModelNames.map(n => schemaName(n));\n if (schemaNames.length > 0) {\n output += `import { ${schemaNames.join(\", \")} } from \"${SCHEMA_REEXPORT_PATH}\";\\n`;\n }\n\n // Upgrade imports (only if there are upgrades)\n const upgradeNames = [...recordNames, ...unionNames].map(n => upgradesName(n));\n const needsUpgradeRegistry = stepChain.length > 1 || unionNames.length > 0;\n if (needsUpgradeRegistry && upgradeNames.length > 0) {\n output += `import { ${upgradeNames.join(\", \")} } from \"${INTERNAL_UPGRADES_PATH}\";\\n`;\n }\n\n // DocumentUpgradeFns type is needed by the factory's parameter signature.\n if (needsUpgradeFns) {\n output += `import type { DocumentUpgradeFns } from \"${INTERNAL_UPGRADE_FNS_PATH}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate model constants\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n const externalRefs = extractExternalRefFieldTypes(modelDef.record);\n const metadataFields: string[] = [];\n\n if (externalRefs.length > 0) {\n const entries = externalRefs.map(([field, type]) => ` ${field}: \"${type}\",`).join(\n \"\\n\",\n );\n metadataFields.push(` externalRefFieldTypes: {\\n${entries}\\n },`);\n }\n metadataFields.push(` name: \"${modelKey}\",`);\n\n output += `export interface ${modelName(modelKey)} extends RecordModel<${modelKey}, typeof ${\n schemaName(modelKey)\n }> {}\\n`;\n output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\\n`;\n output += ` __type: {} as ${modelKey},\\n`;\n output += ` zodSchema: ${schemaName(modelKey)},\\n`;\n output += ` [Metadata]: {\\n${metadataFields.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n } else if (modelDef.type === \"union\") {\n const union = modelDef.union;\n const metadataFields: string[] = [];\n metadataFields.push(` discriminant: \"${union.discriminant}\",`);\n metadataFields.push(` name: \"${modelKey}\",`);\n\n output += `export interface ${modelName(modelKey)} extends UnionModel<${modelKey}, typeof ${\n schemaName(modelKey)\n }> {}\\n`;\n output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\\n`;\n output += ` __type: {} as ${modelKey},\\n`;\n output += ` zodSchema: ${schemaName(modelKey)},\\n`;\n output += ` [Metadata]: {\\n${metadataFields.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n\n // Generate variant models\n for (const variantName of Object.keys(union.variants)) {\n const variantTypeName = unionVariantName(modelKey, variantName);\n const variantMetadata: string[] = [];\n variantMetadata.push(` discriminant: \"${union.discriminant}\",`);\n variantMetadata.push(` name: \"${variantTypeName}\",`);\n\n output += `export interface ${\n modelName(variantTypeName)\n } extends UnionModel<${variantTypeName}, typeof ${schemaName(variantTypeName)}> {}\\n`;\n output += `export const ${modelName(variantTypeName)}: ${modelName(variantTypeName)} = {\\n`;\n output += ` __type: {} as ${variantTypeName},\\n`;\n output += ` zodSchema: ${schemaName(variantTypeName)},\\n`;\n output += ` [Metadata]: {\\n${variantMetadata.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n }\n }\n }\n\n // Generate DocumentModel\n const modelEntries: string[] = [];\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);\n } else if (modelDef.type === \"union\") {\n modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);\n for (const variantName of Object.keys(modelDef.union.variants)) {\n const variantTypeName = unionVariantName(modelKey, variantName);\n modelEntries.push(` ${variantTypeName}: ${modelName(variantTypeName)}`);\n }\n }\n }\n\n // Build upgrades map (includes both record and union entries)\n let upgradesBlock: string;\n const allUpgradeNames = [...recordNames, ...unionNames];\n if (needsUpgradeRegistry && allUpgradeNames.length > 0) {\n // A variant model uses its union's registry, which finds the variant by its discriminant.\n const upgradeEntries = [\n ...allUpgradeNames.map(n => ` ${n}: ${upgradesName(n)},`),\n ...variantNames.map(n => ` ${n}: ${upgradesName(unionByVariantName.get(n)!)},`),\n ].join(\"\\n\");\n upgradesBlock = ` upgrades: {\\n${upgradeEntries}\\n },\\n`;\n } else {\n upgradesBlock = \"\";\n }\n\n // Common metadata literal: shared between the const and factory forms.\n let metadataBody = ` [Metadata]: {\\n`;\n metadataBody += ` version: ${latestVersion},\\n`;\n if (minVersion !== latestVersion) {\n metadataBody += ` minSupportedVersion: ${minVersion},\\n`;\n }\n metadataBody += upgradesBlock;\n\n const modelEntriesBody = modelEntries.map(e => ` ${e}`).join(\",\\n\");\n\n if (needsUpgradeFns) {\n // Factory form: schema has at least one derived field or required additive\n // field, so the runtime requires the app to supply typed upgrade functions.\n // The factory makes this a compile-time requirement — apps can't get a\n // DocumentSchema value without passing them.\n output += `/**\\n`;\n output += ` * Construct the DocumentModel for this SDK, wiring in the typed forward\\n`;\n output += ` * functions the runtime needs to materialize fields added past v1.\\n`;\n output += ` */\\n`;\n output += `export function DocumentModel(upgradeFns: DocumentUpgradeFns): DocumentSchema {\\n`;\n output += ` return {\\n`;\n output += `${modelEntriesBody},\\n`;\n output += metadataBody;\n output += ` upgradeFns: upgradeFns as unknown as UpgradeFns,\\n`;\n output += ` },\\n`;\n output += ` };\\n`;\n output += `}\\n\\n`;\n output += `export type DocumentModel = ReturnType<typeof DocumentModel>;\\n`;\n } else {\n // Const form: no field added past v1 needs lens treatment, so no upgrade\n // functions are required.\n output += `export const DocumentModel = {\\n`;\n output += `${modelEntriesBody},\\n`;\n // Const form indents one level less than the factory body.\n output += metadataBody.replace(/^ {4}/gm, \" \");\n output += ` },\\n`;\n output += `} as const satisfies DocumentSchema;\\n\\n`;\n output += `export type DocumentModel = typeof DocumentModel;\\n`;\n }\n\n return { modelsFile: output };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -16,7 +16,7 @@
16
16
 
17
17
  import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
18
18
  import { resolveMinVersion } from "./resolveSchemaChain.js";
19
- import { modelName, MODELS_PATH, typesFilePath, versionedTypeName, versionedWriteTypeName, writeTypesFilePath } from "./runtimeSchema.js";
19
+ import { modelName, MODELS_PATH, typesFilePath, versionedDocRefName, versionedTypeName, versionedWriteTypeName, writeTypesFilePath } from "./runtimeSchema.js";
20
20
 
21
21
  /**
22
22
  * Generate versionedDocRef.ts from a versioned schema chain.
@@ -86,7 +86,8 @@ export function generateScopeFromChain(resolved, minSupportedVersion) {
86
86
  version,
87
87
  ir
88
88
  } of supportedVersions) {
89
- output += `export interface VersionedDocRef_v${version} extends DocumentRef<DocumentModel> {\n`;
89
+ const docRefName = versionedDocRefName(version);
90
+ output += `export interface ${docRefName} extends DocumentRef<DocumentModel> {\n`;
90
91
  output += ` readonly version: ${version};\n`;
91
92
 
92
93
  // updateRecord overloads — record models get write types, union models get Partial<read>
@@ -121,12 +122,8 @@ export function generateScopeFromChain(resolved, minSupportedVersion) {
121
122
  }
122
123
 
123
124
  // Union type
124
- if (supportedVersions.length === 1) {
125
- output += `export type VersionedDocRef = VersionedDocRef_v${supportedVersions[0].version};\n`;
126
- } else {
127
- const unionMembers = supportedVersions.map(v => `VersionedDocRef_v${v.version}`).join(" | ");
128
- output += `export type VersionedDocRef = ${unionMembers};\n`;
129
- }
125
+ const unionMembers = supportedVersions.map(v => versionedDocRefName(v.version)).join(" | ");
126
+ output += `export type VersionedDocRef = ${unionMembers};\n`;
130
127
 
131
128
  // asVersioned — identity cast to unlock version-specific write overloads
132
129
  output += `\n/** Narrow a DocumentRef to a version-discriminated type for type-safe writes. */\n`;
@@ -135,7 +132,7 @@ export function generateScopeFromChain(resolved, minSupportedVersion) {
135
132
  output += `}\n`;
136
133
 
137
134
  // matchVersion — exhaustive version handler
138
- const handlerProps = supportedVersions.map(v => ` readonly ${v.version}: (doc: VersionedDocRef_v${v.version}) => R;`).join("\n");
135
+ const handlerProps = supportedVersions.map(v => ` readonly ${v.version}: (doc: ${versionedDocRefName(v.version)}) => R;`).join("\n");
139
136
  output += `\n/**\n`;
140
137
  output += ` * Exhaustive version handler. TypeScript enforces that every supported\n`;
141
138
  output += ` * version has a corresponding handler -- adding a new schema version\n`;