@palantir/pack.document-schema.type-gen 0.9.0 → 0.10.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 (148) hide show
  1. package/build/esm/commands/asset/__tests__/buildPrefixRewriteFetch.test.js +85 -0
  2. package/build/esm/commands/asset/__tests__/buildPrefixRewriteFetch.test.js.map +1 -0
  3. package/build/esm/commands/asset/assetDeployHandler.js +36 -1
  4. package/build/esm/commands/asset/assetDeployHandler.js.map +1 -1
  5. package/build/esm/commands/asset/registerAssetCommands.js +1 -1
  6. package/build/esm/commands/asset/registerAssetCommands.js.map +1 -1
  7. package/build/esm/commands/ir/irGenTypesHandler.js +49 -0
  8. package/build/esm/commands/ir/irGenTypesHandler.js.map +1 -0
  9. package/build/esm/commands/ir/registerIrCommands.js +2 -0
  10. package/build/esm/commands/ir/registerIrCommands.js.map +1 -1
  11. package/build/esm/commands/schema/registerSchemaCommands.js +2 -2
  12. package/build/esm/commands/schema/registerSchemaCommands.js.map +1 -1
  13. package/build/esm/commands/schema/schemaIrHandler.js +56 -0
  14. package/build/esm/commands/schema/schemaIrHandler.js.map +1 -0
  15. package/build/esm/index.js +0 -6
  16. package/build/esm/index.js.map +1 -1
  17. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js +1 -1
  18. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js.map +1 -1
  19. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js +1 -1
  20. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js.map +1 -1
  21. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js +1 -1
  22. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js.map +1 -1
  23. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js +1 -1
  24. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js.map +1 -1
  25. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js +1 -1
  26. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js.map +1 -1
  27. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js +1 -1
  28. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js.map +1 -1
  29. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js +1 -1
  30. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js.map +1 -1
  31. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js +1 -1
  32. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js.map +1 -1
  33. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js +1 -1
  34. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js.map +1 -1
  35. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js +1 -1
  36. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js.map +1 -1
  37. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js +1 -1
  38. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js.map +1 -1
  39. package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js +23 -0
  40. package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js.map +1 -1
  41. package/build/esm/utils/ir/irFieldHelpers.js +383 -0
  42. package/build/esm/utils/ir/irFieldHelpers.js.map +1 -0
  43. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -1
  44. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
  45. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
  46. package/build/esm/utils/schema/__tests__/convertSchemaToSteps.test.js +13 -0
  47. package/build/esm/utils/schema/__tests__/convertSchemaToSteps.test.js.map +1 -1
  48. package/build/esm/utils/schema/__tests__/fixtures.js +76 -5
  49. package/build/esm/utils/schema/__tests__/fixtures.js.map +1 -1
  50. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +19 -7
  51. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -1
  52. package/build/esm/utils/schema/__tests__/generateModelMetadataFromSchema.test.js +7 -6
  53. package/build/esm/utils/schema/__tests__/generateModelMetadataFromSchema.test.js.map +1 -1
  54. package/build/esm/utils/schema/__tests__/generateScopeFromSchema.test.js +6 -5
  55. package/build/esm/utils/schema/__tests__/generateScopeFromSchema.test.js.map +1 -1
  56. package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js +19 -10
  57. package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js.map +1 -1
  58. package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js +15 -10
  59. package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js.map +1 -1
  60. package/build/esm/utils/schema/__tests__/generateVersionsFromSchema.test.js +6 -5
  61. package/build/esm/utils/schema/__tests__/generateVersionsFromSchema.test.js.map +1 -1
  62. package/build/esm/utils/schema/convertSchemaToSteps.js +6 -0
  63. package/build/esm/utils/schema/convertSchemaToSteps.js.map +1 -1
  64. package/build/esm/utils/schema/generateIndexFromSchema.js +15 -13
  65. package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -1
  66. package/build/esm/utils/schema/generateInternalFromSchema.js +68 -184
  67. package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
  68. package/build/esm/utils/schema/generateModelMetadataFromSchema.js +46 -69
  69. package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -1
  70. package/build/esm/utils/schema/generateScopeFromSchema.js +29 -33
  71. package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -1
  72. package/build/esm/utils/schema/generateTypesFromSchema.js +9 -1
  73. package/build/esm/utils/schema/generateTypesFromSchema.js.map +1 -1
  74. package/build/esm/utils/schema/generateVersionedTypesFromSchema.js +61 -155
  75. package/build/esm/utils/schema/generateVersionedTypesFromSchema.js.map +1 -1
  76. package/build/esm/utils/schema/generateVersionedZodFromSchema.js +58 -94
  77. package/build/esm/utils/schema/generateVersionedZodFromSchema.js.map +1 -1
  78. package/build/esm/utils/schema/generateVersionsFromSchema.js +7 -5
  79. package/build/esm/utils/schema/generateVersionsFromSchema.js.map +1 -1
  80. package/build/esm/utils/schema/loadSchemaModule.js +53 -0
  81. package/build/esm/utils/schema/loadSchemaModule.js.map +1 -0
  82. package/build/esm/utils/schema/resolveSchemaChain.js +59 -9
  83. package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
  84. package/build/esm/utils/schema/runtimeSchema.js +0 -27
  85. package/build/esm/utils/schema/runtimeSchema.js.map +1 -1
  86. package/build/esm/utils/schema/writeAllSdkFiles.js +111 -0
  87. package/build/esm/utils/schema/writeAllSdkFiles.js.map +1 -0
  88. package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
  89. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
  90. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
  91. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
  92. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
  93. package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
  94. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
  95. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
  96. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
  97. package/build/esm/utils/steps/__tests__/convertStepsToIr.test.js +93 -1
  98. package/build/esm/utils/steps/__tests__/convertStepsToIr.test.js.map +1 -1
  99. package/build/esm/utils/steps/convertStepsToIr.js +43 -35
  100. package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
  101. package/build/types/commands/asset/__tests__/buildPrefixRewriteFetch.test.d.ts +2 -0
  102. package/build/types/commands/asset/__tests__/buildPrefixRewriteFetch.test.d.ts.map +1 -0
  103. package/build/types/commands/asset/assetDeployHandler.d.ts +15 -0
  104. package/build/types/commands/asset/assetDeployHandler.d.ts.map +1 -1
  105. package/build/types/commands/asset/registerAssetCommands.d.ts.map +1 -1
  106. package/build/types/commands/ir/irGenTypesHandler.d.ts +8 -0
  107. package/build/types/commands/ir/irGenTypesHandler.d.ts.map +1 -0
  108. package/build/types/commands/ir/registerIrCommands.d.ts.map +1 -1
  109. package/build/types/commands/schema/registerSchemaCommands.d.ts.map +1 -1
  110. package/build/types/commands/schema/schemaIrHandler.d.ts +19 -0
  111. package/build/types/commands/schema/schemaIrHandler.d.ts.map +1 -0
  112. package/build/types/index.d.ts +1 -6
  113. package/build/types/index.d.ts.map +1 -1
  114. package/build/types/utils/ir/irFieldHelpers.d.ts +36 -0
  115. package/build/types/utils/ir/irFieldHelpers.d.ts.map +1 -0
  116. package/build/types/utils/schema/__tests__/fixtures.d.ts +10 -1
  117. package/build/types/utils/schema/__tests__/fixtures.d.ts.map +1 -1
  118. package/build/types/utils/schema/convertSchemaToSteps.d.ts.map +1 -1
  119. package/build/types/utils/schema/generateIndexFromSchema.d.ts +2 -2
  120. package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -1
  121. package/build/types/utils/schema/generateInternalFromSchema.d.ts +3 -6
  122. package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -1
  123. package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts +3 -8
  124. package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -1
  125. package/build/types/utils/schema/generateScopeFromSchema.d.ts +2 -2
  126. package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -1
  127. package/build/types/utils/schema/generateTypesFromSchema.d.ts.map +1 -1
  128. package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts +4 -7
  129. package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts.map +1 -1
  130. package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts +3 -7
  131. package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts.map +1 -1
  132. package/build/types/utils/schema/generateVersionsFromSchema.d.ts +3 -3
  133. package/build/types/utils/schema/generateVersionsFromSchema.d.ts.map +1 -1
  134. package/build/types/utils/schema/loadSchemaModule.d.ts +14 -0
  135. package/build/types/utils/schema/loadSchemaModule.d.ts.map +1 -0
  136. package/build/types/utils/schema/resolveSchemaChain.d.ts +29 -8
  137. package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
  138. package/build/types/utils/schema/runtimeSchema.d.ts +0 -32
  139. package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -1
  140. package/build/types/utils/schema/writeAllSdkFiles.d.ts +8 -0
  141. package/build/types/utils/schema/writeAllSdkFiles.d.ts.map +1 -0
  142. package/build/types/utils/steps/convertStepsToIr.d.ts +3 -3
  143. package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
  144. package/package.json +3 -3
  145. package/build/esm/commands/schema/schemaGenTypesHandler.js +0 -147
  146. package/build/esm/commands/schema/schemaGenTypesHandler.js.map +0 -1
  147. package/build/types/commands/schema/schemaGenTypesHandler.d.ts +0 -8
  148. package/build/types/commands/schema/schemaGenTypesHandler.d.ts.map +0 -1
@@ -16,56 +16,32 @@
16
16
 
17
17
  import { formatVariantName } from "../formatVariantName.js";
18
18
  import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
19
- import { resolveSchemaChain } from "./resolveSchemaChain.js";
20
- import { INTERNAL_UPGRADES_PATH, isRecordSchema, isUnionSchema, modelName, SCHEMA_REEXPORT_PATH, schemaName, TYPES_REEXPORT_PATH } from "./runtimeSchema.js";
21
- /**
22
- * Detect which external ref field types (docRef, mediaRef, objectRef, userRef)
23
- * are present on a record for its model metadata.
24
- */
25
- function findExternalRefType(field) {
26
- switch (field.type) {
27
- case "docRef":
28
- return "docRef";
29
- case "mediaRef":
30
- return "mediaRef";
31
- case "objectRef":
32
- return "objectRef";
33
- case "userRef":
34
- return "userRef";
35
- case "optional":
36
- return field.item ? findExternalRefType(field.item) : undefined;
37
- case "array":
38
- return field.items ? findExternalRefType(field.items) : undefined;
39
- default:
40
- return undefined;
41
- }
42
- }
19
+ import { findExternalRefType } from "../ir/irFieldHelpers.js";
20
+ import { resolveMinVersion } from "./resolveSchemaChain.js";
21
+ import { INTERNAL_UPGRADES_PATH, modelName, SCHEMA_REEXPORT_PATH, schemaName, TYPES_REEXPORT_PATH } from "./runtimeSchema.js";
43
22
  function extractExternalRefFieldTypes(record) {
44
23
  const refs = [];
45
- for (const [fieldName, fieldType] of Object.entries(record.fields)) {
46
- const refType = findExternalRefType(fieldType);
24
+ for (const field of record.fields) {
25
+ const refType = findExternalRefType(field.fieldType);
47
26
  if (refType != null) {
48
- refs.push([fieldName, refType]);
27
+ refs.push([field.key, refType]);
49
28
  }
50
29
  }
51
30
  return refs;
52
31
  }
53
32
 
54
33
  /**
55
- * Generate models.ts and schema manifest from a versioned schema chain.
56
- *
57
- * @param schema - The schema definition (initial or versioned)
58
- * @param minSupportedVersion - Minimum version this client supports (defaults to latest)
59
- * @param options - Configuration for import paths
60
- * @returns Object containing generated models.ts content and schema manifest JSON
34
+ * Generate models.ts from an already-resolved versioned IR chain.
61
35
  */
62
- export function generateModelMetadataFromSchema(schema, minSupportedVersion) {
36
+ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
37
+ const {
38
+ chain
39
+ } = resolved;
63
40
  const {
64
- chain,
65
41
  latestVersion,
66
42
  minVersion
67
- } = resolveSchemaChain(schema, minSupportedVersion);
68
- const latestSchema = chain[chain.length - 1].schema;
43
+ } = resolveMinVersion(chain, minSupportedVersion);
44
+ const latestIr = chain[chain.length - 1].ir;
69
45
 
70
46
  // --- Generate models.ts ---
71
47
  let output = GENERATED_FILE_HEADER;
@@ -74,13 +50,13 @@ export function generateModelMetadataFromSchema(schema, minSupportedVersion) {
74
50
  const recordNames = [];
75
51
  const unionNames = [];
76
52
  const variantNames = [];
77
- for (const [exportName, item] of Object.entries(latestSchema)) {
78
- if (isRecordSchema(item)) {
79
- recordNames.push(exportName);
80
- } else if (isUnionSchema(item)) {
81
- unionNames.push(exportName);
82
- for (const variantName of Object.keys(item.variants)) {
83
- variantNames.push(`${exportName}${formatVariantName(variantName)}`);
53
+ for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {
54
+ if (modelDef.type === "record") {
55
+ recordNames.push(modelKey);
56
+ } else if (modelDef.type === "union") {
57
+ unionNames.push(modelKey);
58
+ for (const variantName of Object.keys(modelDef.union.variants)) {
59
+ variantNames.push(`${modelKey}${formatVariantName(variantName)}`);
84
60
  }
85
61
  }
86
62
  }
@@ -110,38 +86,39 @@ export function generateModelMetadataFromSchema(schema, minSupportedVersion) {
110
86
  output += "\n";
111
87
 
112
88
  // Generate model constants
113
- for (const [exportName, item] of Object.entries(latestSchema)) {
114
- if (isRecordSchema(item)) {
115
- const externalRefs = extractExternalRefFieldTypes(item);
89
+ for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {
90
+ if (modelDef.type === "record") {
91
+ const externalRefs = extractExternalRefFieldTypes(modelDef.record);
116
92
  const metadataFields = [];
117
93
  if (externalRefs.length > 0) {
118
94
  const entries = externalRefs.map(([field, type]) => ` ${field}: "${type}",`).join("\n");
119
95
  metadataFields.push(` externalRefFieldTypes: {\n${entries}\n },`);
120
96
  }
121
- metadataFields.push(` name: "${exportName}",`);
122
- output += `export interface ${modelName(exportName)} extends RecordModel<${exportName}, typeof ${schemaName(exportName)}> {}\n`;
123
- output += `export const ${modelName(exportName)}: ${modelName(exportName)} = {\n`;
124
- output += ` __type: {} as ${exportName},\n`;
125
- output += ` zodSchema: ${schemaName(exportName)},\n`;
97
+ metadataFields.push(` name: "${modelKey}",`);
98
+ output += `export interface ${modelName(modelKey)} extends RecordModel<${modelKey}, typeof ${schemaName(modelKey)}> {}\n`;
99
+ output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\n`;
100
+ output += ` __type: {} as ${modelKey},\n`;
101
+ output += ` zodSchema: ${schemaName(modelKey)},\n`;
126
102
  output += ` [Metadata]: {\n${metadataFields.join("\n")}\n },\n`;
127
103
  output += `};\n\n`;
128
- } else if (isUnionSchema(item)) {
104
+ } else if (modelDef.type === "union") {
105
+ const union = modelDef.union;
129
106
  const metadataFields = [];
130
- metadataFields.push(` discriminant: "${item.discriminant}",`);
131
- metadataFields.push(` name: "${exportName}",`);
132
- output += `export interface ${modelName(exportName)} extends UnionModel<${exportName}, typeof ${schemaName(exportName)}> {}\n`;
133
- output += `export const ${modelName(exportName)}: ${modelName(exportName)} = {\n`;
134
- output += ` __type: {} as ${exportName},\n`;
135
- output += ` zodSchema: ${schemaName(exportName)},\n`;
107
+ metadataFields.push(` discriminant: "${union.discriminant}",`);
108
+ metadataFields.push(` name: "${modelKey}",`);
109
+ output += `export interface ${modelName(modelKey)} extends UnionModel<${modelKey}, typeof ${schemaName(modelKey)}> {}\n`;
110
+ output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\n`;
111
+ output += ` __type: {} as ${modelKey},\n`;
112
+ output += ` zodSchema: ${schemaName(modelKey)},\n`;
136
113
  output += ` [Metadata]: {\n${metadataFields.join("\n")}\n },\n`;
137
114
  output += `};\n\n`;
138
115
 
139
116
  // Generate variant models
140
- for (const variantName of Object.keys(item.variants)) {
117
+ for (const variantName of Object.keys(union.variants)) {
141
118
  const formattedVariant = formatVariantName(variantName);
142
- const variantTypeName = `${exportName}${formattedVariant}`;
119
+ const variantTypeName = `${modelKey}${formattedVariant}`;
143
120
  const variantMetadata = [];
144
- variantMetadata.push(` discriminant: "${item.discriminant}",`);
121
+ variantMetadata.push(` discriminant: "${union.discriminant}",`);
145
122
  variantMetadata.push(` name: "${variantTypeName}",`);
146
123
  output += `export interface ${modelName(variantTypeName)} extends UnionModel<${variantTypeName}, typeof ${schemaName(variantTypeName)}> {}\n`;
147
124
  output += `export const ${modelName(variantTypeName)}: ${modelName(variantTypeName)} = {\n`;
@@ -155,14 +132,14 @@ export function generateModelMetadataFromSchema(schema, minSupportedVersion) {
155
132
 
156
133
  // Generate DocumentModel
157
134
  const modelEntries = [];
158
- for (const [exportName, item] of Object.entries(latestSchema)) {
159
- if (isRecordSchema(item)) {
160
- modelEntries.push(` ${exportName}: ${modelName(exportName)}`);
161
- } else if (isUnionSchema(item)) {
162
- modelEntries.push(` ${exportName}: ${modelName(exportName)}`);
163
- for (const variantName of Object.keys(item.variants)) {
135
+ for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {
136
+ if (modelDef.type === "record") {
137
+ modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);
138
+ } else if (modelDef.type === "union") {
139
+ modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);
140
+ for (const variantName of Object.keys(modelDef.union.variants)) {
164
141
  const formattedVariant = formatVariantName(variantName);
165
- const variantTypeName = `${exportName}${formattedVariant}`;
142
+ const variantTypeName = `${modelKey}${formattedVariant}`;
166
143
  modelEntries.push(` ${variantTypeName}: ${modelName(variantTypeName)}`);
167
144
  }
168
145
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generateModelMetadataFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","resolveSchemaChain","INTERNAL_UPGRADES_PATH","isRecordSchema","isUnionSchema","modelName","SCHEMA_REEXPORT_PATH","schemaName","TYPES_REEXPORT_PATH","findExternalRefType","field","type","item","undefined","items","extractExternalRefFieldTypes","record","refs","fieldName","fieldType","Object","entries","fields","refType","push","generateModelMetadataFromSchema","schema","minSupportedVersion","chain","latestVersion","minVersion","latestSchema","length","output","recordNames","unionNames","variantNames","exportName","variantName","keys","variants","allModelNames","sort","modelTypesImports","join","schemaNames","map","n","upgradeNames","externalRefs","metadataFields","discriminant","formattedVariant","variantTypeName","variantMetadata","modelEntries","upgradesBlock","allUpgradeNames","upgradeEntries","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 { SchemaDefinition } from \"@palantir/pack.schema\";\nimport { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport { resolveSchemaChain } from \"./resolveSchemaChain.js\";\nimport type { RuntimeSchemaRecord, SchemaField } from \"./runtimeSchema.js\";\nimport {\n INTERNAL_UPGRADES_PATH,\n isRecordSchema,\n isUnionSchema,\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\n/**\n * Detect which external ref field types (docRef, mediaRef, objectRef, userRef)\n * are present on a record for its model metadata.\n */\nfunction findExternalRefType(field: SchemaField): string | undefined {\n switch (field.type) {\n case \"docRef\":\n return \"docRef\";\n case \"mediaRef\":\n return \"mediaRef\";\n case \"objectRef\":\n return \"objectRef\";\n case \"userRef\":\n return \"userRef\";\n case \"optional\":\n return field.item ? findExternalRefType(field.item) : undefined;\n case \"array\":\n return field.items ? findExternalRefType(field.items) : undefined;\n default:\n return undefined;\n }\n}\n\nfunction extractExternalRefFieldTypes(\n record: RuntimeSchemaRecord,\n): Array<[string, string]> {\n const refs: Array<[string, string]> = [];\n for (const [fieldName, fieldType] of Object.entries(record.fields)) {\n const refType = findExternalRefType(fieldType);\n if (refType != null) {\n refs.push([fieldName, refType]);\n }\n }\n return refs;\n}\n\n/**\n * Generate models.ts and schema manifest from a versioned schema chain.\n *\n * @param schema - The schema definition (initial or versioned)\n * @param minSupportedVersion - Minimum version this client supports (defaults to latest)\n * @param options - Configuration for import paths\n * @returns Object containing generated models.ts content and schema manifest JSON\n */\nexport function generateModelMetadataFromSchema(\n schema: SchemaDefinition,\n minSupportedVersion?: number,\n): ModelMetadataOutput {\n const { chain, latestVersion, minVersion } = resolveSchemaChain(schema, minSupportedVersion);\n const latestSchema = chain[chain.length - 1]!.schema;\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\n for (const [exportName, item] of Object.entries(latestSchema)) {\n if (isRecordSchema(item)) {\n recordNames.push(exportName);\n } else if (isUnionSchema(item)) {\n unionNames.push(exportName);\n for (const variantName of Object.keys(item.variants)) {\n variantNames.push(`${exportName}${formatVariantName(variantName)}`);\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\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 if (chain.length > 1 && upgradeNames.length > 0) {\n output += `import { ${upgradeNames.join(\", \")} } from \"${INTERNAL_UPGRADES_PATH}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate model constants\n for (const [exportName, item] of Object.entries(latestSchema)) {\n if (isRecordSchema(item)) {\n const externalRefs = extractExternalRefFieldTypes(item);\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: \"${exportName}\",`);\n\n output += `export interface ${\n modelName(exportName)\n } extends RecordModel<${exportName}, typeof ${schemaName(exportName)}> {}\\n`;\n output += `export const ${modelName(exportName)}: ${modelName(exportName)} = {\\n`;\n output += ` __type: {} as ${exportName},\\n`;\n output += ` zodSchema: ${schemaName(exportName)},\\n`;\n output += ` [Metadata]: {\\n${metadataFields.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n } else if (isUnionSchema(item)) {\n const metadataFields: string[] = [];\n metadataFields.push(` discriminant: \"${item.discriminant}\",`);\n metadataFields.push(` name: \"${exportName}\",`);\n\n output += `export interface ${\n modelName(exportName)\n } extends UnionModel<${exportName}, typeof ${schemaName(exportName)}> {}\\n`;\n output += `export const ${modelName(exportName)}: ${modelName(exportName)} = {\\n`;\n output += ` __type: {} as ${exportName},\\n`;\n output += ` zodSchema: ${schemaName(exportName)},\\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(item.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${exportName}${formattedVariant}`;\n const variantMetadata: string[] = [];\n variantMetadata.push(` discriminant: \"${item.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 [exportName, item] of Object.entries(latestSchema)) {\n if (isRecordSchema(item)) {\n modelEntries.push(` ${exportName}: ${modelName(exportName)}`);\n } else if (isUnionSchema(item)) {\n modelEntries.push(` ${exportName}: ${modelName(exportName)}`);\n for (const variantName of Object.keys(item.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${exportName}${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 (chain.length > 1 && allUpgradeNames.length > 0) {\n const upgradeEntries = allUpgradeNames.map(n => ` ${n}: ${n}Upgrades,`).join(\"\\n\");\n upgradesBlock = ` upgrades: {\\n${upgradeEntries}\\n },\\n`;\n } else {\n upgradesBlock = \"\";\n }\n\n output += `export const DocumentModel = {\\n`;\n output += `${modelEntries.join(\",\\n\")},\\n`;\n output += ` [Metadata]: {\\n`;\n output += ` version: ${latestVersion},\\n`;\n if (minVersion !== latestVersion) {\n output += ` minSupportedVersion: ${minVersion},\\n`;\n }\n output += upgradesBlock;\n output += ` },\\n`;\n output += `} as const satisfies DocumentSchema;\\n\\n`;\n output += `export type DocumentModel = typeof DocumentModel;\\n`;\n\n return { modelsFile: output };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"generateModelMetadataFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","findExternalRefType","resolveMinVersion","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","output","recordNames","unionNames","variantNames","modelKey","modelDef","Object","entries","models","type","variantName","keys","union","variants","allModelNames","sort","modelTypesImports","join","schemaNames","map","n","upgradeNames","externalRefs","metadataFields","discriminant","formattedVariant","variantTypeName","variantMetadata","modelEntries","upgradesBlock","allUpgradeNames","upgradeEntries","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 { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport { findExternalRefType } from \"../ir/irFieldHelpers.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\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\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\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 variantNames.push(`${modelKey}${formatVariantName(variantName)}`);\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\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 if (chain.length > 1 && upgradeNames.length > 0) {\n output += `import { ${upgradeNames.join(\", \")} } from \"${INTERNAL_UPGRADES_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 (chain.length > 1 && allUpgradeNames.length > 0) {\n const upgradeEntries = allUpgradeNames.map(n => ` ${n}: ${n}Upgrades,`).join(\"\\n\");\n upgradesBlock = ` upgrades: {\\n${upgradeEntries}\\n },\\n`;\n } else {\n upgradesBlock = \"\";\n }\n\n output += `export const DocumentModel = {\\n`;\n output += `${modelEntries.join(\",\\n\")},\\n`;\n output += ` [Metadata]: {\\n`;\n output += ` version: ${latestVersion},\\n`;\n if (minVersion !== latestVersion) {\n output += ` minSupportedVersion: ${minVersion},\\n`;\n }\n output += upgradesBlock;\n output += ` },\\n`;\n output += `} as const satisfies DocumentSchema;\\n\\n`;\n output += `export type DocumentModel = typeof DocumentModel;\\n`;\n\n return { modelsFile: output };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -15,8 +15,8 @@
15
15
  */
16
16
 
17
17
  import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
18
- import { resolveSchemaChain } from "./resolveSchemaChain.js";
19
- import { isRecordSchema, isUnionSchema, modelName, MODELS_PATH, typesFilePath, versionedTypeName, versionedWriteTypeName, writeTypesFilePath } from "./runtimeSchema.js";
18
+ import { resolveMinVersion } from "./resolveSchemaChain.js";
19
+ import { modelName, MODELS_PATH, typesFilePath, versionedTypeName, versionedWriteTypeName, writeTypesFilePath } from "./runtimeSchema.js";
20
20
 
21
21
  /**
22
22
  * Generate versionedDocRef.ts from a versioned schema chain.
@@ -28,22 +28,22 @@ import { isRecordSchema, isUnionSchema, modelName, MODELS_PATH, typesFilePath, v
28
28
  * Every model gets a version-specific overload on every version so that
29
29
  * write data is always typed to the exact version, not the latest.
30
30
  */
31
- export function generateScopeFromSchema(schema, minSupportedVersion) {
31
+ export function generateScopeFromChain(resolved, minSupportedVersion) {
32
+ const {
33
+ chain
34
+ } = resolved;
32
35
  const {
33
- chain,
34
36
  minVersion
35
- } = resolveSchemaChain(schema, minSupportedVersion);
37
+ } = resolveMinVersion(chain, minSupportedVersion);
36
38
 
37
39
  // Filter to supported versions
38
40
  const supportedVersions = chain.filter(v => v.version >= minVersion);
39
41
 
40
- // Collect all model names from the latest schema
41
- const latestSchema = chain[chain.length - 1].schema;
42
+ // Collect all model names from the latest IR
43
+ const latestIr = chain[chain.length - 1].ir;
42
44
  const allModelNames = [];
43
- for (const [exportName, item] of Object.entries(latestSchema)) {
44
- if (isRecordSchema(item) || isUnionSchema(item)) {
45
- allModelNames.push(exportName);
46
- }
45
+ for (const modelKey of Object.keys(latestIr.models)) {
46
+ allModelNames.push(modelKey);
47
47
  }
48
48
 
49
49
  // Build output
@@ -60,16 +60,16 @@ export function generateScopeFromSchema(schema, minSupportedVersion) {
60
60
  // Import per-version types
61
61
  for (const {
62
62
  version,
63
- schema: versionSchema
63
+ ir
64
64
  } of supportedVersions) {
65
65
  const readTypeImports = [];
66
66
  const writeTypeImports = [];
67
- for (const [exportName, item] of Object.entries(versionSchema)) {
68
- if (isRecordSchema(item)) {
69
- readTypeImports.push(versionedTypeName(exportName, version));
70
- writeTypeImports.push(versionedWriteTypeName(exportName, version));
71
- } else if (isUnionSchema(item)) {
72
- readTypeImports.push(versionedTypeName(exportName, version));
67
+ for (const [modelKey, modelDef] of Object.entries(ir.models)) {
68
+ if (modelDef.type === "record") {
69
+ readTypeImports.push(versionedTypeName(modelKey, version));
70
+ writeTypeImports.push(versionedWriteTypeName(modelKey, version));
71
+ } else if (modelDef.type === "union") {
72
+ readTypeImports.push(versionedTypeName(modelKey, version));
73
73
  }
74
74
  }
75
75
  if (readTypeImports.length > 0) {
@@ -82,32 +82,28 @@ export function generateScopeFromSchema(schema, minSupportedVersion) {
82
82
  output += "\n";
83
83
 
84
84
  // Generate per-version VersionedDocRef interfaces extending DocumentRef.
85
- // Every model gets a version-specific overload on every version so that
86
- // write data is always typed to the exact version, not the latest.
87
85
  for (const {
88
86
  version,
89
- schema: versionSchema
87
+ ir
90
88
  } of supportedVersions) {
91
89
  output += `export interface VersionedDocRef_v${version} extends DocumentRef<DocumentModel> {\n`;
92
90
  output += ` readonly version: ${version};\n`;
93
91
 
94
92
  // updateRecord overloads — record models get write types, union models get Partial<read>
95
- for (const [exportName, item] of Object.entries(versionSchema)) {
96
- if (isRecordSchema(item)) {
97
- const writeType = versionedWriteTypeName(exportName, version);
98
- output += ` updateRecord(ref: RecordRef<typeof ${modelName(exportName)}>, data: ${writeType}): Promise<void>;\n`;
99
- } else if (isUnionSchema(item)) {
100
- const readType = versionedTypeName(exportName, version);
101
- output += ` updateRecord(ref: RecordRef<typeof ${modelName(exportName)}>, data: Partial<${readType}>): Promise<void>;\n`;
93
+ for (const [modelKey, modelDef] of Object.entries(ir.models)) {
94
+ if (modelDef.type === "record") {
95
+ const writeType = versionedWriteTypeName(modelKey, version);
96
+ output += ` updateRecord(ref: RecordRef<typeof ${modelName(modelKey)}>, data: ${writeType}): Promise<void>;\n`;
97
+ } else if (modelDef.type === "union") {
98
+ const readType = versionedTypeName(modelKey, version);
99
+ output += ` updateRecord(ref: RecordRef<typeof ${modelName(modelKey)}>, data: Partial<${readType}>): Promise<void>;\n`;
102
100
  }
103
101
  }
104
102
 
105
103
  // setCollectionRecord overloads
106
- for (const [exportName, item] of Object.entries(versionSchema)) {
107
- if (isRecordSchema(item) || isUnionSchema(item)) {
108
- const readType = versionedTypeName(exportName, version);
109
- output += ` setCollectionRecord(model: typeof ${modelName(exportName)}, id: RecordId, data: ${readType}): Promise<void>;\n`;
110
- }
104
+ for (const [modelKey] of Object.entries(ir.models)) {
105
+ const readType = versionedTypeName(modelKey, version);
106
+ output += ` setCollectionRecord(model: typeof ${modelName(modelKey)}, id: RecordId, data: ${readType}): Promise<void>;\n`;
111
107
  }
112
108
  output += `}\n\n`;
113
109
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generateScopeFromSchema.js","names":["GENERATED_FILE_HEADER","resolveSchemaChain","isRecordSchema","isUnionSchema","modelName","MODELS_PATH","typesFilePath","versionedTypeName","versionedWriteTypeName","writeTypesFilePath","generateScopeFromSchema","schema","minSupportedVersion","chain","minVersion","supportedVersions","filter","v","version","latestSchema","length","allModelNames","exportName","item","Object","entries","push","output","modelImports","map","n","typeImportsFromModels","join","versionSchema","readTypeImports","writeTypeImports","sort","writeType","readType","unionMembers","handlerProps"],"sources":["generateScopeFromSchema.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 { SchemaDefinition } from \"@palantir/pack.schema\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport { resolveSchemaChain } from \"./resolveSchemaChain.js\";\nimport {\n isRecordSchema,\n isUnionSchema,\n modelName,\n MODELS_PATH,\n typesFilePath,\n versionedTypeName,\n versionedWriteTypeName,\n writeTypesFilePath,\n} from \"./runtimeSchema.js\";\n\n/**\n * Generate versionedDocRef.ts from a versioned schema chain.\n *\n * Produces:\n * - Per-version VersionedDocRef_vN interfaces extending DocumentRef<DocumentModel>\n * - Union type VersionedDocRef = VersionedDocRef_v1 | VersionedDocRef_v2\n *\n * Every model gets a version-specific overload on every version so that\n * write data is always typed to the exact version, not the latest.\n */\nexport function generateScopeFromSchema(\n schema: SchemaDefinition,\n minSupportedVersion?: number,\n): string {\n const { chain, minVersion } = resolveSchemaChain(schema, minSupportedVersion);\n\n // Filter to supported versions\n const supportedVersions = chain.filter(v => v.version >= minVersion);\n\n // Collect all model names from the latest schema\n const latestSchema = chain[chain.length - 1]!.schema;\n const allModelNames: string[] = [];\n for (const [exportName, item] of Object.entries(latestSchema)) {\n if (isRecordSchema(item) || isUnionSchema(item)) {\n allModelNames.push(exportName);\n }\n }\n\n // Build output\n let output = GENERATED_FILE_HEADER;\n\n // Import model-types\n output +=\n `import type { DocumentRef, RecordId, RecordRef } from \"@palantir/pack.document-schema.model-types\";\\n`;\n\n // Import model types from models.ts\n const modelImports = allModelNames.map(n => modelName(n));\n const typeImportsFromModels = [\"DocumentModel\", ...modelImports];\n output += `import type { ${typeImportsFromModels.join(\", \")} } from \"${MODELS_PATH}\";\\n`;\n\n // Import per-version types\n for (const { version, schema: versionSchema } of supportedVersions) {\n const readTypeImports: string[] = [];\n const writeTypeImports: string[] = [];\n\n for (const [exportName, item] of Object.entries(versionSchema)) {\n if (isRecordSchema(item)) {\n readTypeImports.push(versionedTypeName(exportName, version));\n writeTypeImports.push(versionedWriteTypeName(exportName, version));\n } else if (isUnionSchema(item)) {\n readTypeImports.push(versionedTypeName(exportName, version));\n }\n }\n\n if (readTypeImports.length > 0) {\n output += `import type { ${readTypeImports.sort().join(\", \")} } from \"${\n typesFilePath(version)\n }\";\\n`;\n }\n if (writeTypeImports.length > 0) {\n output += `import type { ${writeTypeImports.sort().join(\", \")} } from \"${\n writeTypesFilePath(version)\n }\";\\n`;\n }\n }\n\n output += \"\\n\";\n\n // Generate per-version VersionedDocRef interfaces extending DocumentRef.\n // Every model gets a version-specific overload on every version so that\n // write data is always typed to the exact version, not the latest.\n for (const { version, schema: versionSchema } of supportedVersions) {\n output += `export interface VersionedDocRef_v${version} extends DocumentRef<DocumentModel> {\\n`;\n output += ` readonly version: ${version};\\n`;\n\n // updateRecord overloads — record models get write types, union models get Partial<read>\n for (const [exportName, item] of Object.entries(versionSchema)) {\n if (isRecordSchema(item)) {\n const writeType = versionedWriteTypeName(exportName, version);\n output += ` updateRecord(ref: RecordRef<typeof ${\n modelName(exportName)\n }>, data: ${writeType}): Promise<void>;\\n`;\n } else if (isUnionSchema(item)) {\n const readType = versionedTypeName(exportName, version);\n output += ` updateRecord(ref: RecordRef<typeof ${\n modelName(exportName)\n }>, data: Partial<${readType}>): Promise<void>;\\n`;\n }\n }\n\n // setCollectionRecord overloads\n for (const [exportName, item] of Object.entries(versionSchema)) {\n if (isRecordSchema(item) || isUnionSchema(item)) {\n const readType = versionedTypeName(exportName, version);\n output += ` setCollectionRecord(model: typeof ${\n modelName(exportName)\n }, id: RecordId, data: ${readType}): Promise<void>;\\n`;\n }\n }\n\n output += `}\\n\\n`;\n }\n\n // Union type\n if (supportedVersions.length === 1) {\n output += `export type VersionedDocRef = VersionedDocRef_v${supportedVersions[0]!.version};\\n`;\n } else {\n const unionMembers = supportedVersions.map(v => `VersionedDocRef_v${v.version}`).join(\" | \");\n output += `export type VersionedDocRef = ${unionMembers};\\n`;\n }\n\n // asVersioned — identity cast to unlock version-specific write overloads\n output += `\\n/** Narrow a DocumentRef to a version-discriminated type for type-safe writes. */\\n`;\n output += `export function asVersioned(docRef: DocumentRef<DocumentModel>): VersionedDocRef {\\n`;\n output += ` return docRef as VersionedDocRef;\\n`;\n output += `}\\n`;\n\n // matchVersion — exhaustive version handler\n const handlerProps = supportedVersions.map(\n v => ` readonly ${v.version}: (doc: VersionedDocRef_v${v.version}) => R;`,\n ).join(\"\\n\");\n\n output += `\\n/**\\n`;\n output += ` * Exhaustive version handler. TypeScript enforces that every supported\\n`;\n output += ` * version has a corresponding handler -- adding a new schema version\\n`;\n output += ` * produces a compile error at every call site until handled.\\n`;\n output += ` */\\n`;\n output += `export function matchVersion<R>(\\n`;\n output += ` doc: VersionedDocRef,\\n`;\n output += ` handlers: {\\n`;\n output += handlerProps + \"\\n\";\n output += ` },\\n`;\n output += `): R {\\n`;\n output += ` switch (doc.version) {\\n`;\n for (const { version } of supportedVersions) {\n output += ` case ${version}:\\n`;\n output += ` return handlers[${version}](doc);\\n`;\n }\n output += ` default:\\n`;\n output += ` throw new Error(\\`Unexpected document version: \\${(doc as any).version}\\`);\\n`;\n output += ` }\\n`;\n output += `}\\n`;\n\n return output;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"generateScopeFromSchema.js","names":["GENERATED_FILE_HEADER","resolveMinVersion","modelName","MODELS_PATH","typesFilePath","versionedTypeName","versionedWriteTypeName","writeTypesFilePath","generateScopeFromChain","resolved","minSupportedVersion","chain","minVersion","supportedVersions","filter","v","version","latestIr","length","ir","allModelNames","modelKey","Object","keys","models","push","output","modelImports","map","n","typeImportsFromModels","join","readTypeImports","writeTypeImports","modelDef","entries","type","sort","writeType","readType","unionMembers","handlerProps"],"sources":["generateScopeFromSchema.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 { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n modelName,\n MODELS_PATH,\n typesFilePath,\n versionedTypeName,\n versionedWriteTypeName,\n writeTypesFilePath,\n} from \"./runtimeSchema.js\";\n\n/**\n * Generate versionedDocRef.ts from a versioned schema chain.\n *\n * Produces:\n * - Per-version VersionedDocRef_vN interfaces extending DocumentRef<DocumentModel>\n * - Union type VersionedDocRef = VersionedDocRef_v1 | VersionedDocRef_v2\n *\n * Every model gets a version-specific overload on every version so that\n * write data is always typed to the exact version, not the latest.\n */\nexport function generateScopeFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): string {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n // Filter to supported versions\n const supportedVersions = chain.filter(v => v.version >= minVersion);\n\n // Collect all model names from the latest IR\n const latestIr = chain[chain.length - 1]!.ir;\n const allModelNames: string[] = [];\n for (const modelKey of Object.keys(latestIr.models)) {\n allModelNames.push(modelKey);\n }\n\n // Build output\n let output = GENERATED_FILE_HEADER;\n\n // Import model-types\n output +=\n `import type { DocumentRef, RecordId, RecordRef } from \"@palantir/pack.document-schema.model-types\";\\n`;\n\n // Import model types from models.ts\n const modelImports = allModelNames.map(n => modelName(n));\n const typeImportsFromModels = [\"DocumentModel\", ...modelImports];\n output += `import type { ${typeImportsFromModels.join(\", \")} } from \"${MODELS_PATH}\";\\n`;\n\n // Import per-version types\n for (const { version, ir } of supportedVersions) {\n const readTypeImports: string[] = [];\n const writeTypeImports: string[] = [];\n\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n readTypeImports.push(versionedTypeName(modelKey, version));\n writeTypeImports.push(versionedWriteTypeName(modelKey, version));\n } else if (modelDef.type === \"union\") {\n readTypeImports.push(versionedTypeName(modelKey, version));\n }\n }\n\n if (readTypeImports.length > 0) {\n output += `import type { ${readTypeImports.sort().join(\", \")} } from \"${\n typesFilePath(version)\n }\";\\n`;\n }\n if (writeTypeImports.length > 0) {\n output += `import type { ${writeTypeImports.sort().join(\", \")} } from \"${\n writeTypesFilePath(version)\n }\";\\n`;\n }\n }\n\n output += \"\\n\";\n\n // Generate per-version VersionedDocRef interfaces extending DocumentRef.\n for (const { version, ir } of supportedVersions) {\n output += `export interface VersionedDocRef_v${version} extends DocumentRef<DocumentModel> {\\n`;\n output += ` readonly version: ${version};\\n`;\n\n // updateRecord overloads — record models get write types, union models get Partial<read>\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n const writeType = versionedWriteTypeName(modelKey, version);\n output += ` updateRecord(ref: RecordRef<typeof ${\n modelName(modelKey)\n }>, data: ${writeType}): Promise<void>;\\n`;\n } else if (modelDef.type === \"union\") {\n const readType = versionedTypeName(modelKey, version);\n output += ` updateRecord(ref: RecordRef<typeof ${\n modelName(modelKey)\n }>, data: Partial<${readType}>): Promise<void>;\\n`;\n }\n }\n\n // setCollectionRecord overloads\n for (const [modelKey] of Object.entries(ir.models)) {\n const readType = versionedTypeName(modelKey, version);\n output += ` setCollectionRecord(model: typeof ${\n modelName(modelKey)\n }, id: RecordId, data: ${readType}): Promise<void>;\\n`;\n }\n\n output += `}\\n\\n`;\n }\n\n // Union type\n if (supportedVersions.length === 1) {\n output += `export type VersionedDocRef = VersionedDocRef_v${supportedVersions[0]!.version};\\n`;\n } else {\n const unionMembers = supportedVersions.map(v => `VersionedDocRef_v${v.version}`).join(\" | \");\n output += `export type VersionedDocRef = ${unionMembers};\\n`;\n }\n\n // asVersioned — identity cast to unlock version-specific write overloads\n output += `\\n/** Narrow a DocumentRef to a version-discriminated type for type-safe writes. */\\n`;\n output += `export function asVersioned(docRef: DocumentRef<DocumentModel>): VersionedDocRef {\\n`;\n output += ` return docRef as VersionedDocRef;\\n`;\n output += `}\\n`;\n\n // matchVersion — exhaustive version handler\n const handlerProps = supportedVersions.map(\n v => ` readonly ${v.version}: (doc: VersionedDocRef_v${v.version}) => R;`,\n ).join(\"\\n\");\n\n output += `\\n/**\\n`;\n output += ` * Exhaustive version handler. TypeScript enforces that every supported\\n`;\n output += ` * version has a corresponding handler -- adding a new schema version\\n`;\n output += ` * produces a compile error at every call site until handled.\\n`;\n output += ` */\\n`;\n output += `export function matchVersion<R>(\\n`;\n output += ` doc: VersionedDocRef,\\n`;\n output += ` handlers: {\\n`;\n output += handlerProps + \"\\n\";\n output += ` },\\n`;\n output += `): R {\\n`;\n output += ` switch (doc.version) {\\n`;\n for (const { version } of supportedVersions) {\n output += ` case ${version}:\\n`;\n output += ` return handlers[${version}](doc);\\n`;\n }\n output += ` default:\\n`;\n output += ` throw new Error(\\`Unexpected document version: \\${(doc as any).version}\\`);\\n`;\n output += ` }\\n`;\n output += `}\\n`;\n\n return output;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -14,9 +14,17 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ import { TypeKind as SchemaTypeKind } from "@palantir/pack.schema";
17
18
  import { formatVariantName } from "../formatVariantName.js";
18
19
  import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
19
- import { SchemaDefKind, TypeKind } from "./runtimeSchema.js";
20
+ const TypeKind = {
21
+ ...SchemaTypeKind,
22
+ ANY: "any"
23
+ };
24
+ const SchemaDefKind = {
25
+ RECORD: "record",
26
+ UNION: "union"
27
+ };
20
28
 
21
29
  // Base type definition for schema fields
22
30
 
@@ -1 +1 @@
1
- {"version":3,"file":"generateTypesFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","SchemaDefKind","TypeKind","isRecordSchema","item","type","RECORD","isUnionSchema","UNION","isRefField","field","REF","isArrayField","ARRAY","isOptionalField","OPTIONAL","detectUsedRefTypes","schema","refTypes","Set","scanField","items","DOC_REF","add","MEDIA_REF","OBJECT_REF","USER_REF","Object","values","fields","variant","variants","generateTypesFromSchema","runtimeSchema","usedRefTypes","output","size","refTypesList","Array","from","sort","join","exportName","entries","generateRecordInterface","unionEntries","filter","_","forEach","i","unionOutput","generateUnionType","length","record","docs","fieldName","fieldType","tsType","convertTypeToTypeScript","optional","union","variantInterfaces","discriminantField","discriminant","variantName","variantType","interfaceName","push","name","discriminatorValue","refType","recordName","findRecordExportName","map","v","ANY","Error","DOUBLE","STRING"],"sources":["generateTypesFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { ReturnedSchema, Schema } from \"@palantir/pack.schema\";\nimport { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport { SchemaDefKind, TypeKind } from \"./runtimeSchema.js\";\n\n// Base type definition for schema fields\ninterface BaseSchemaField {\n readonly type: string;\n}\n\ninterface AnyField extends BaseSchemaField {\n readonly type: typeof TypeKind.ANY;\n}\n\ninterface ArrayField extends BaseSchemaField {\n readonly type: typeof TypeKind.ARRAY;\n readonly items: SchemaField;\n}\n\ninterface DocRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.DOC_REF;\n}\n\ninterface DoubleField extends BaseSchemaField {\n readonly type: typeof TypeKind.DOUBLE;\n}\n\ninterface MediaRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.MEDIA_REF;\n}\n\ninterface ObjectRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.OBJECT_REF;\n}\n\ninterface OptionalField extends BaseSchemaField {\n readonly type: typeof TypeKind.OPTIONAL;\n readonly item: SchemaField;\n}\n\ninterface RefField extends BaseSchemaField {\n readonly type: typeof TypeKind.REF;\n readonly refType: \"record\" | \"union\";\n readonly name: string;\n}\n\ninterface StringField extends BaseSchemaField {\n readonly type: typeof TypeKind.STRING;\n}\n\ninterface UserRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.USER_REF;\n}\n\ntype SchemaField =\n | AnyField\n | ArrayField\n | DocRefField\n | DoubleField\n | MediaRefField\n | ObjectRefField\n | OptionalField\n | RefField\n | StringField\n | UserRefField;\n\ninterface RuntimeSchemaRecord {\n readonly type: typeof SchemaDefKind.RECORD;\n readonly name: string;\n readonly docs?: string;\n readonly fields: Readonly<Record<string, SchemaField>>;\n readonly ref?: RefField & {\n readonly refType: \"record\";\n };\n}\n\ninterface RuntimeSchemaUnion {\n readonly type: typeof SchemaDefKind.UNION;\n readonly name?: string;\n readonly variants: Readonly<Record<string, SchemaField>>;\n readonly discriminant: string;\n readonly ref?: RefField & {\n readonly refType: \"union\";\n };\n}\n\ntype RuntimeSchemaItem = RuntimeSchemaRecord | RuntimeSchemaUnion;\ntype RuntimeSchema = Record<string, RuntimeSchemaItem>;\n\n// Type guards\nfunction isRecordSchema(item: RuntimeSchemaItem): item is RuntimeSchemaRecord {\n return item.type === SchemaDefKind.RECORD && \"name\" in item && \"fields\" in item;\n}\n\nfunction isUnionSchema(item: RuntimeSchemaItem): item is RuntimeSchemaUnion {\n return item.type === SchemaDefKind.UNION && \"variants\" in item && \"discriminant\" in item;\n}\n\nfunction isRefField(field: SchemaField): field is RefField {\n return field.type === TypeKind.REF && \"refType\" in field && \"name\" in field;\n}\n\nfunction isArrayField(field: SchemaField): field is ArrayField {\n return field.type === TypeKind.ARRAY && \"items\" in field;\n}\n\nfunction isOptionalField(field: SchemaField): field is OptionalField {\n return field.type === TypeKind.OPTIONAL && \"item\" in field;\n}\n\nfunction detectUsedRefTypes(schema: RuntimeSchema): Set<string> {\n const refTypes = new Set<string>();\n\n function scanField(field: SchemaField): void {\n switch (field.type) {\n case TypeKind.ARRAY:\n if (isArrayField(field)) {\n scanField(field.items);\n }\n break;\n case TypeKind.DOC_REF:\n refTypes.add(\"DocumentRef\");\n break;\n case TypeKind.MEDIA_REF:\n refTypes.add(\"MediaRef\");\n break;\n case TypeKind.OBJECT_REF:\n refTypes.add(\"ObjectRef\");\n break;\n case TypeKind.OPTIONAL:\n if (isOptionalField(field)) {\n scanField(field.item);\n }\n break;\n case TypeKind.USER_REF:\n refTypes.add(\"UserRef\");\n break;\n }\n }\n\n for (const item of Object.values(schema)) {\n if (isRecordSchema(item)) {\n for (const field of Object.values(item.fields)) {\n scanField(field);\n }\n } else if (isUnionSchema(item)) {\n for (const variant of Object.values(item.variants)) {\n scanField(variant);\n }\n }\n }\n\n return refTypes;\n}\n\nexport function generateTypesFromSchema<T extends ReturnedSchema>(\n schema: Schema<T>,\n): string {\n const runtimeSchema = schema as unknown as RuntimeSchema;\n\n // Detect which ref types are used in the schema\n const usedRefTypes = detectUsedRefTypes(runtimeSchema);\n\n let output = GENERATED_FILE_HEADER;\n\n // Add conditional imports based on which ref types are used\n if (usedRefTypes.size > 0) {\n const refTypesList = Array.from(usedRefTypes).sort().join(\", \");\n output +=\n `import type { ${refTypesList} } from \"@palantir/pack.document-schema.model-types\";\\n`;\n }\n\n output += \"\\n\";\n\n // First pass: generate record interfaces\n for (const [exportName, item] of Object.entries(runtimeSchema)) {\n if (item.type === SchemaDefKind.RECORD && isRecordSchema(item)) {\n output += generateRecordInterface(item, exportName, runtimeSchema);\n output += \"\\n\";\n }\n }\n\n // Second pass: generate union types\n const unionEntries = Object.entries(runtimeSchema).filter(\n ([_, item]) => item.type === SchemaDefKind.UNION && isUnionSchema(item),\n );\n\n unionEntries.forEach(([exportName, item], i) => {\n if (isUnionSchema(item)) {\n const unionOutput = generateUnionType(item, exportName, runtimeSchema);\n if (unionOutput) {\n output += unionOutput;\n // Only add newline if not the last union\n if (i < unionEntries.length - 1) {\n output += \"\\n\";\n }\n }\n }\n });\n\n return output;\n}\n\nfunction generateRecordInterface(\n record: RuntimeSchemaRecord,\n exportName: string,\n schema: RuntimeSchema,\n): string {\n let output = \"\";\n\n if (record.docs) {\n output += `/**\\n * ${record.docs}\\n */\\n`;\n }\n\n output += `export interface ${exportName} {\\n`;\n\n for (const [fieldName, fieldType] of Object.entries(record.fields)) {\n const tsType = convertTypeToTypeScript(fieldType, schema);\n const optional = fieldType.type === TypeKind.OPTIONAL ? \"?\" : \"\";\n output += ` readonly ${fieldName}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\";\n\n return output;\n}\n\nfunction generateUnionType(\n union: RuntimeSchemaUnion,\n exportName: string,\n schema: RuntimeSchema,\n): string {\n let output = \"\";\n const variantInterfaces: Array<{ name: string; discriminatorValue: string }> = [];\n const discriminantField = union.discriminant;\n\n // First pass: generate variant interfaces\n for (const [variantName, variantType] of Object.entries(union.variants)) {\n const interfaceName = `${exportName}${formatVariantName(variantName)}`;\n variantInterfaces.push({ name: interfaceName, discriminatorValue: variantName });\n\n if (variantType.type === TypeKind.REF && variantType.refType === \"record\") {\n // Find the corresponding record name in the schema\n const recordName = findRecordExportName(variantType.name, schema);\n if (recordName) {\n output += `export interface ${interfaceName} extends ${recordName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += \"}\\n\\n\";\n }\n } else {\n // Handle value types\n const tsType = convertTypeToTypeScript(variantType, schema);\n output += `export interface ${interfaceName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += ` readonly value: ${tsType};\\n`;\n output += \"}\\n\\n\";\n }\n }\n\n // Second pass: generate the union type\n output += `export type ${exportName} = ${variantInterfaces.map(v => v.name).join(\" | \")};\\n\\n`;\n\n // Third pass: generate type guards\n for (let i = 0; i < variantInterfaces.length; i++) {\n const variant = variantInterfaces[i]!;\n output +=\n `export function is${variant.name}(value: ${exportName}): value is ${variant.name} {\\n`;\n output += ` return value.${discriminantField} === \"${variant.discriminatorValue}\";\\n`;\n output += \"}\\n\\n\";\n }\n\n return output;\n}\n\nfunction findRecordExportName(\n recordName: string,\n schema: RuntimeSchema,\n): string | null {\n for (const [exportName, item] of Object.entries(schema)) {\n if (isRecordSchema(item) && item.name === recordName) {\n return exportName;\n }\n }\n return null;\n}\n\nfunction convertTypeToTypeScript(\n fieldType: SchemaField,\n schema?: RuntimeSchema,\n): string {\n switch (fieldType.type) {\n case TypeKind.ANY:\n return \"any\";\n case TypeKind.ARRAY:\n if (!isArrayField(fieldType)) {\n throw new Error(\"Array field is missing items type\");\n }\n return `readonly ${convertTypeToTypeScript(fieldType.items, schema)}[]`;\n case TypeKind.DOC_REF:\n return \"DocumentRef\";\n case TypeKind.DOUBLE:\n return \"number\";\n case TypeKind.MEDIA_REF:\n return \"MediaRef\";\n case TypeKind.OBJECT_REF:\n return \"ObjectRef\";\n case TypeKind.OPTIONAL:\n if (!isOptionalField(fieldType)) {\n throw new Error(\"Optional field is missing inner type\");\n }\n return convertTypeToTypeScript(fieldType.item, schema);\n case TypeKind.REF:\n if (!isRefField(fieldType)) {\n throw new Error(\"Ref field is missing name or refType\");\n }\n if (fieldType.refType === \"record\") {\n const exportName = schema ? findRecordExportName(fieldType.name, schema) : null;\n return exportName ?? fieldType.name;\n }\n return fieldType.name;\n case TypeKind.STRING:\n return \"string\";\n case TypeKind.USER_REF:\n return \"UserRef\";\n default: {\n const _exhaustive: never = fieldType;\n throw new Error(`Unknown schema field type: ${(_exhaustive as SchemaField).type}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"generateTypesFromSchema.js","names":["TypeKind","SchemaTypeKind","formatVariantName","GENERATED_FILE_HEADER","ANY","SchemaDefKind","RECORD","UNION","isRecordSchema","item","type","isUnionSchema","isRefField","field","REF","isArrayField","ARRAY","isOptionalField","OPTIONAL","detectUsedRefTypes","schema","refTypes","Set","scanField","items","DOC_REF","add","MEDIA_REF","OBJECT_REF","USER_REF","Object","values","fields","variant","variants","generateTypesFromSchema","runtimeSchema","usedRefTypes","output","size","refTypesList","Array","from","sort","join","exportName","entries","generateRecordInterface","unionEntries","filter","_","forEach","i","unionOutput","generateUnionType","length","record","docs","fieldName","fieldType","tsType","convertTypeToTypeScript","optional","union","variantInterfaces","discriminantField","discriminant","variantName","variantType","interfaceName","push","name","discriminatorValue","refType","recordName","findRecordExportName","map","v","Error","DOUBLE","STRING"],"sources":["generateTypesFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { ReturnedSchema, Schema } from \"@palantir/pack.schema\";\nimport { TypeKind as SchemaTypeKind } from \"@palantir/pack.schema\";\nimport { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\n\nconst TypeKind: typeof SchemaTypeKind & { readonly ANY: \"any\" } = {\n ...SchemaTypeKind,\n ANY: \"any\",\n};\n\nconst SchemaDefKind = {\n RECORD: \"record\",\n UNION: \"union\",\n} as const;\n\n// Base type definition for schema fields\ninterface BaseSchemaField {\n readonly type: string;\n}\n\ninterface AnyField extends BaseSchemaField {\n readonly type: typeof TypeKind.ANY;\n}\n\ninterface ArrayField extends BaseSchemaField {\n readonly type: typeof TypeKind.ARRAY;\n readonly items: SchemaField;\n}\n\ninterface DocRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.DOC_REF;\n}\n\ninterface DoubleField extends BaseSchemaField {\n readonly type: typeof TypeKind.DOUBLE;\n}\n\ninterface MediaRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.MEDIA_REF;\n}\n\ninterface ObjectRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.OBJECT_REF;\n}\n\ninterface OptionalField extends BaseSchemaField {\n readonly type: typeof TypeKind.OPTIONAL;\n readonly item: SchemaField;\n}\n\ninterface RefField extends BaseSchemaField {\n readonly type: typeof TypeKind.REF;\n readonly refType: \"record\" | \"union\";\n readonly name: string;\n}\n\ninterface StringField extends BaseSchemaField {\n readonly type: typeof TypeKind.STRING;\n}\n\ninterface UserRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.USER_REF;\n}\n\ntype SchemaField =\n | AnyField\n | ArrayField\n | DocRefField\n | DoubleField\n | MediaRefField\n | ObjectRefField\n | OptionalField\n | RefField\n | StringField\n | UserRefField;\n\ninterface RuntimeSchemaRecord {\n readonly type: typeof SchemaDefKind.RECORD;\n readonly name: string;\n readonly docs?: string;\n readonly fields: Readonly<Record<string, SchemaField>>;\n readonly ref?: RefField & {\n readonly refType: \"record\";\n };\n}\n\ninterface RuntimeSchemaUnion {\n readonly type: typeof SchemaDefKind.UNION;\n readonly name?: string;\n readonly variants: Readonly<Record<string, SchemaField>>;\n readonly discriminant: string;\n readonly ref?: RefField & {\n readonly refType: \"union\";\n };\n}\n\ntype RuntimeSchemaItem = RuntimeSchemaRecord | RuntimeSchemaUnion;\ntype RuntimeSchema = Record<string, RuntimeSchemaItem>;\n\n// Type guards\nfunction isRecordSchema(item: RuntimeSchemaItem): item is RuntimeSchemaRecord {\n return item.type === SchemaDefKind.RECORD && \"name\" in item && \"fields\" in item;\n}\n\nfunction isUnionSchema(item: RuntimeSchemaItem): item is RuntimeSchemaUnion {\n return item.type === SchemaDefKind.UNION && \"variants\" in item && \"discriminant\" in item;\n}\n\nfunction isRefField(field: SchemaField): field is RefField {\n return field.type === TypeKind.REF && \"refType\" in field && \"name\" in field;\n}\n\nfunction isArrayField(field: SchemaField): field is ArrayField {\n return field.type === TypeKind.ARRAY && \"items\" in field;\n}\n\nfunction isOptionalField(field: SchemaField): field is OptionalField {\n return field.type === TypeKind.OPTIONAL && \"item\" in field;\n}\n\nfunction detectUsedRefTypes(schema: RuntimeSchema): Set<string> {\n const refTypes = new Set<string>();\n\n function scanField(field: SchemaField): void {\n switch (field.type) {\n case TypeKind.ARRAY:\n if (isArrayField(field)) {\n scanField(field.items);\n }\n break;\n case TypeKind.DOC_REF:\n refTypes.add(\"DocumentRef\");\n break;\n case TypeKind.MEDIA_REF:\n refTypes.add(\"MediaRef\");\n break;\n case TypeKind.OBJECT_REF:\n refTypes.add(\"ObjectRef\");\n break;\n case TypeKind.OPTIONAL:\n if (isOptionalField(field)) {\n scanField(field.item);\n }\n break;\n case TypeKind.USER_REF:\n refTypes.add(\"UserRef\");\n break;\n }\n }\n\n for (const item of Object.values(schema)) {\n if (isRecordSchema(item)) {\n for (const field of Object.values(item.fields)) {\n scanField(field);\n }\n } else if (isUnionSchema(item)) {\n for (const variant of Object.values(item.variants)) {\n scanField(variant);\n }\n }\n }\n\n return refTypes;\n}\n\nexport function generateTypesFromSchema<T extends ReturnedSchema>(\n schema: Schema<T>,\n): string {\n const runtimeSchema = schema as unknown as RuntimeSchema;\n\n // Detect which ref types are used in the schema\n const usedRefTypes = detectUsedRefTypes(runtimeSchema);\n\n let output = GENERATED_FILE_HEADER;\n\n // Add conditional imports based on which ref types are used\n if (usedRefTypes.size > 0) {\n const refTypesList = Array.from(usedRefTypes).sort().join(\", \");\n output +=\n `import type { ${refTypesList} } from \"@palantir/pack.document-schema.model-types\";\\n`;\n }\n\n output += \"\\n\";\n\n // First pass: generate record interfaces\n for (const [exportName, item] of Object.entries(runtimeSchema)) {\n if (item.type === SchemaDefKind.RECORD && isRecordSchema(item)) {\n output += generateRecordInterface(item, exportName, runtimeSchema);\n output += \"\\n\";\n }\n }\n\n // Second pass: generate union types\n const unionEntries = Object.entries(runtimeSchema).filter(\n ([_, item]) => item.type === SchemaDefKind.UNION && isUnionSchema(item),\n );\n\n unionEntries.forEach(([exportName, item], i) => {\n if (isUnionSchema(item)) {\n const unionOutput = generateUnionType(item, exportName, runtimeSchema);\n if (unionOutput) {\n output += unionOutput;\n // Only add newline if not the last union\n if (i < unionEntries.length - 1) {\n output += \"\\n\";\n }\n }\n }\n });\n\n return output;\n}\n\nfunction generateRecordInterface(\n record: RuntimeSchemaRecord,\n exportName: string,\n schema: RuntimeSchema,\n): string {\n let output = \"\";\n\n if (record.docs) {\n output += `/**\\n * ${record.docs}\\n */\\n`;\n }\n\n output += `export interface ${exportName} {\\n`;\n\n for (const [fieldName, fieldType] of Object.entries(record.fields)) {\n const tsType = convertTypeToTypeScript(fieldType, schema);\n const optional = fieldType.type === TypeKind.OPTIONAL ? \"?\" : \"\";\n output += ` readonly ${fieldName}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\";\n\n return output;\n}\n\nfunction generateUnionType(\n union: RuntimeSchemaUnion,\n exportName: string,\n schema: RuntimeSchema,\n): string {\n let output = \"\";\n const variantInterfaces: Array<{ name: string; discriminatorValue: string }> = [];\n const discriminantField = union.discriminant;\n\n // First pass: generate variant interfaces\n for (const [variantName, variantType] of Object.entries(union.variants)) {\n const interfaceName = `${exportName}${formatVariantName(variantName)}`;\n variantInterfaces.push({ name: interfaceName, discriminatorValue: variantName });\n\n if (variantType.type === TypeKind.REF && variantType.refType === \"record\") {\n // Find the corresponding record name in the schema\n const recordName = findRecordExportName(variantType.name, schema);\n if (recordName) {\n output += `export interface ${interfaceName} extends ${recordName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += \"}\\n\\n\";\n }\n } else {\n // Handle value types\n const tsType = convertTypeToTypeScript(variantType, schema);\n output += `export interface ${interfaceName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += ` readonly value: ${tsType};\\n`;\n output += \"}\\n\\n\";\n }\n }\n\n // Second pass: generate the union type\n output += `export type ${exportName} = ${variantInterfaces.map(v => v.name).join(\" | \")};\\n\\n`;\n\n // Third pass: generate type guards\n for (let i = 0; i < variantInterfaces.length; i++) {\n const variant = variantInterfaces[i]!;\n output +=\n `export function is${variant.name}(value: ${exportName}): value is ${variant.name} {\\n`;\n output += ` return value.${discriminantField} === \"${variant.discriminatorValue}\";\\n`;\n output += \"}\\n\\n\";\n }\n\n return output;\n}\n\nfunction findRecordExportName(\n recordName: string,\n schema: RuntimeSchema,\n): string | null {\n for (const [exportName, item] of Object.entries(schema)) {\n if (isRecordSchema(item) && item.name === recordName) {\n return exportName;\n }\n }\n return null;\n}\n\nfunction convertTypeToTypeScript(\n fieldType: SchemaField,\n schema?: RuntimeSchema,\n): string {\n switch (fieldType.type) {\n case TypeKind.ANY:\n return \"any\";\n case TypeKind.ARRAY:\n if (!isArrayField(fieldType)) {\n throw new Error(\"Array field is missing items type\");\n }\n return `readonly ${convertTypeToTypeScript(fieldType.items, schema)}[]`;\n case TypeKind.DOC_REF:\n return \"DocumentRef\";\n case TypeKind.DOUBLE:\n return \"number\";\n case TypeKind.MEDIA_REF:\n return \"MediaRef\";\n case TypeKind.OBJECT_REF:\n return \"ObjectRef\";\n case TypeKind.OPTIONAL:\n if (!isOptionalField(fieldType)) {\n throw new Error(\"Optional field is missing inner type\");\n }\n return convertTypeToTypeScript(fieldType.item, schema);\n case TypeKind.REF:\n if (!isRefField(fieldType)) {\n throw new Error(\"Ref field is missing name or refType\");\n }\n if (fieldType.refType === \"record\") {\n const exportName = schema ? findRecordExportName(fieldType.name, schema) : null;\n return exportName ?? fieldType.name;\n }\n return fieldType.name;\n case TypeKind.STRING:\n return \"string\";\n case TypeKind.USER_REF:\n return \"UserRef\";\n default: {\n const _exhaustive: never = fieldType;\n throw new Error(`Unknown schema field type: ${(_exhaustive as SchemaField).type}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}