@palantir/pack.document-schema.type-gen 0.30.0 → 0.32.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.
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js.map +1 -1
- package/build/esm/utils/ir/generateModelsFromIr.js +1 -1
- package/build/esm/utils/ir/generateModelsFromIr.js.map +1 -1
- package/build/esm/utils/ir/generateZodSchemasFromIr.js +1 -1
- package/build/esm/utils/ir/generateZodSchemasFromIr.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateIndexFromSchema.test.js +2 -1
- package/build/esm/utils/schema/__tests__/generateIndexFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js +8 -0
- package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js +8 -0
- package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/generateIndexFromSchema.js +8 -5
- package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js +11 -5
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateTypesFromSchema.js +1 -2
- package/build/esm/utils/schema/generateTypesFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js +27 -5
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js +11 -2
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js.map +1 -1
- package/build/esm/utils/schema/runtimeSchema.js +10 -0
- package/build/esm/utils/schema/runtimeSchema.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
- package/build/esm/utils/{formatVariantName.js → unknownVariantSuffix.js} +7 -6
- package/build/esm/utils/unknownVariantSuffix.js.map +1 -0
- package/build/types/utils/ir/generateModelsFromIr.d.ts.map +1 -1
- package/build/types/utils/ir/generateZodSchemasFromIr.d.ts.map +1 -1
- package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateTypesFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/runtimeSchema.d.ts +4 -0
- package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -1
- package/build/types/utils/unknownVariantSuffix.d.ts +3 -0
- package/build/types/utils/unknownVariantSuffix.d.ts.map +1 -0
- package/package.json +5 -5
- package/build/esm/utils/formatVariantName.js.map +0 -1
- package/build/types/utils/formatVariantName.d.ts +0 -2
- package/build/types/utils/formatVariantName.d.ts.map +0 -1
|
@@ -57,4 +57,12 @@ describe("generateVersionedZodFromChain", () => {
|
|
|
57
57
|
expect(result.zodSchemas.has(1)).toBe(false);
|
|
58
58
|
});
|
|
59
59
|
});
|
|
60
|
+
describe("generateVersionedZodFromChain unknown union variants", () => {
|
|
61
|
+
it("accepts the Unknown case in every union schema", () => {
|
|
62
|
+
const zodSchemas = generateVersionedZodFromChain(resolveSchemaChain(unionTypesSchema)).zodSchemas.get(1);
|
|
63
|
+
expect(zodSchemas).toContain("export const ShapeSchema_v1Unknown = z.object({");
|
|
64
|
+
expect(zodSchemas).toContain("type: z.literal(\"unknown\"),");
|
|
65
|
+
expect(zodSchemas).toMatch(/z\.discriminatedUnion\("type", \[[^\]]*ShapeSchema_v1Unknown/);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
60
68
|
//# sourceMappingURL=generateVersionedZodFromSchema.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateVersionedZodFromSchema.test.js","names":["path","describe","expect","it","generateVersionedZodFromChain","resolveSchemaChain","nestedOptionalsSchema","nestedUnionSchema","refFieldsSchema","singleVersionSchema","twoVersionAdditiveSchema","twoVersionFieldRemovalSchema","unionTypesSchema","formatVersionedZodSnapshot","snapshotDir","join","__dirname","result","toMatchFileSnapshot","zodSchemas","size","toBe","has"],"sources":["generateVersionedZodFromSchema.test.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 path from \"path\";\nimport { describe, expect, it } from \"vitest\";\nimport { generateVersionedZodFromChain } from \"../generateVersionedZodFromSchema.js\";\nimport { resolveSchemaChain } from \"../resolveSchemaChain.js\";\nimport {\n nestedOptionalsSchema,\n nestedUnionSchema,\n refFieldsSchema,\n singleVersionSchema,\n twoVersionAdditiveSchema,\n twoVersionFieldRemovalSchema,\n unionTypesSchema,\n} from \"./fixtures.js\";\nimport { formatVersionedZodSnapshot } from \"./snapshotUtils.js\";\n\ndescribe(\"generateVersionedZodFromChain\", () => {\n const snapshotDir = path.join(__dirname, \"__snapshots__\", \"generateVersionedZodFromSchema\");\n\n it(\"single-version schema\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(singleVersionSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"single-version.snap\"),\n );\n });\n\n it(\"two-version additive change\", async () => {\n const result = generateVersionedZodFromChain(\n resolveSchemaChain(twoVersionAdditiveSchema, 1),\n 1,\n );\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-additive.snap\"),\n );\n });\n\n it(\"two-version field removal\", async () => {\n const result = generateVersionedZodFromChain(\n resolveSchemaChain(twoVersionFieldRemovalSchema, 1),\n 1,\n );\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-field-removal.snap\"),\n );\n });\n\n it(\"schema with union types\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(unionTypesSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"union-types.snap\"),\n );\n });\n\n it(\"schema with ref fields\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(refFieldsSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"ref-fields.snap\"),\n );\n });\n\n it(\"nested optionals inside arrays\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(nestedOptionalsSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"nested-optionals.snap\"),\n );\n });\n\n it(\"includes value field in Zod schema for union variants that reference another union\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(nestedUnionSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"union-reference-union.snap\"),\n );\n });\n\n it(\"respects minSupportedVersion default (latest only)\", () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(twoVersionAdditiveSchema));\n expect(result.zodSchemas.size).toBe(1);\n expect(result.zodSchemas.has(2)).toBe(true);\n expect(result.zodSchemas.has(1)).toBe(false);\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"generateVersionedZodFromSchema.test.js","names":["path","describe","expect","it","generateVersionedZodFromChain","resolveSchemaChain","nestedOptionalsSchema","nestedUnionSchema","refFieldsSchema","singleVersionSchema","twoVersionAdditiveSchema","twoVersionFieldRemovalSchema","unionTypesSchema","formatVersionedZodSnapshot","snapshotDir","join","__dirname","result","toMatchFileSnapshot","zodSchemas","size","toBe","has","get","toContain","toMatch"],"sources":["generateVersionedZodFromSchema.test.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 path from \"path\";\nimport { describe, expect, it } from \"vitest\";\nimport { generateVersionedZodFromChain } from \"../generateVersionedZodFromSchema.js\";\nimport { resolveSchemaChain } from \"../resolveSchemaChain.js\";\nimport {\n nestedOptionalsSchema,\n nestedUnionSchema,\n refFieldsSchema,\n singleVersionSchema,\n twoVersionAdditiveSchema,\n twoVersionFieldRemovalSchema,\n unionTypesSchema,\n} from \"./fixtures.js\";\nimport { formatVersionedZodSnapshot } from \"./snapshotUtils.js\";\n\ndescribe(\"generateVersionedZodFromChain\", () => {\n const snapshotDir = path.join(__dirname, \"__snapshots__\", \"generateVersionedZodFromSchema\");\n\n it(\"single-version schema\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(singleVersionSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"single-version.snap\"),\n );\n });\n\n it(\"two-version additive change\", async () => {\n const result = generateVersionedZodFromChain(\n resolveSchemaChain(twoVersionAdditiveSchema, 1),\n 1,\n );\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-additive.snap\"),\n );\n });\n\n it(\"two-version field removal\", async () => {\n const result = generateVersionedZodFromChain(\n resolveSchemaChain(twoVersionFieldRemovalSchema, 1),\n 1,\n );\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-field-removal.snap\"),\n );\n });\n\n it(\"schema with union types\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(unionTypesSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"union-types.snap\"),\n );\n });\n\n it(\"schema with ref fields\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(refFieldsSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"ref-fields.snap\"),\n );\n });\n\n it(\"nested optionals inside arrays\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(nestedOptionalsSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"nested-optionals.snap\"),\n );\n });\n\n it(\"includes value field in Zod schema for union variants that reference another union\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(nestedUnionSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"union-reference-union.snap\"),\n );\n });\n\n it(\"respects minSupportedVersion default (latest only)\", () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(twoVersionAdditiveSchema));\n expect(result.zodSchemas.size).toBe(1);\n expect(result.zodSchemas.has(2)).toBe(true);\n expect(result.zodSchemas.has(1)).toBe(false);\n });\n});\n\ndescribe(\"generateVersionedZodFromChain unknown union variants\", () => {\n it(\"accepts the Unknown case in every union schema\", () => {\n const zodSchemas = generateVersionedZodFromChain(resolveSchemaChain(unionTypesSchema))\n .zodSchemas.get(1)!;\n\n expect(zodSchemas).toContain(\"export const ShapeSchema_v1Unknown = z.object({\");\n expect(zodSchemas).toContain(\"type: z.literal(\\\"unknown\\\"),\");\n expect(zodSchemas).toMatch(/z\\.discriminatedUnion\\(\"type\", \\[[^\\]]*ShapeSchema_v1Unknown/);\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,10 +14,11 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
17
|
+
import { UNKNOWN_UNION_VARIANT } from "@palantir/pack.document-schema.model-types";
|
|
18
|
+
import { formatVariantName } from "@palantir/pack.schema";
|
|
18
19
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
19
20
|
import { resolveMinVersion } from "./resolveSchemaChain.js";
|
|
20
|
-
import { DOCUMENT_TYPE_PATH, INTERNAL_UPGRADE_FNS_PATH, MODELS_PATH, TYPES_REEXPORT_PATH, typesFilePath, VERSIONED_DOC_REF_PATH, versionedTypeName, VERSIONS_PATH } from "./runtimeSchema.js";
|
|
21
|
+
import { DOCUMENT_TYPE_PATH, INTERNAL_UPGRADE_FNS_PATH, knownTypeName, MODELS_PATH, narrowKnownFunctionName, TYPES_REEXPORT_PATH, typesFilePath, VERSIONED_DOC_REF_PATH, versionedTypeName, VERSIONS_PATH } from "./runtimeSchema.js";
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
* Generate the index.ts barrel export from a versioned schema.
|
|
@@ -68,10 +69,12 @@ export function generateIndexFromChain(resolved, minSupportedVersion) {
|
|
|
68
69
|
if (modelDef.type === "record") {
|
|
69
70
|
typeNames.push(versionedTypeName(modelKey, version));
|
|
70
71
|
} else if (modelDef.type === "union") {
|
|
71
|
-
|
|
72
|
+
const unionTypeName = versionedTypeName(modelKey, version);
|
|
73
|
+
typeNames.push(unionTypeName, knownTypeName(unionTypeName));
|
|
74
|
+
guardNames.push(narrowKnownFunctionName(unionTypeName));
|
|
72
75
|
|
|
73
|
-
// Union variant types and their generated `is<Variant>` guards.
|
|
74
|
-
for (const variantName of Object.keys(modelDef.union.variants)) {
|
|
76
|
+
// Union variant types and their generated `is<Variant>` guards, including the Unknown case.
|
|
77
|
+
for (const variantName of [...Object.keys(modelDef.union.variants), UNKNOWN_UNION_VARIANT]) {
|
|
75
78
|
const formattedVariant = formatVariantName(variantName);
|
|
76
79
|
const variantTypeName = `${versionedTypeName(modelKey, version)}${formattedVariant}`;
|
|
77
80
|
typeNames.push(variantTypeName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateIndexFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","resolveMinVersion","DOCUMENT_TYPE_PATH","INTERNAL_UPGRADE_FNS_PATH","MODELS_PATH","TYPES_REEXPORT_PATH","typesFilePath","VERSIONED_DOC_REF_PATH","versionedTypeName","VERSIONS_PATH","generateIndexFromChain","resolved","minSupportedVersion","chain","minVersion","output","version","ir","typeNames","guardNames","modelKey","modelDef","Object","entries","models","type","push","variantName","keys","union","variants","formattedVariant","variantTypeName","length","sort","join"],"sources":["generateIndexFromSchema.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 \"
|
|
1
|
+
{"version":3,"file":"generateIndexFromSchema.js","names":["UNKNOWN_UNION_VARIANT","formatVariantName","GENERATED_FILE_HEADER","resolveMinVersion","DOCUMENT_TYPE_PATH","INTERNAL_UPGRADE_FNS_PATH","knownTypeName","MODELS_PATH","narrowKnownFunctionName","TYPES_REEXPORT_PATH","typesFilePath","VERSIONED_DOC_REF_PATH","versionedTypeName","VERSIONS_PATH","generateIndexFromChain","resolved","minSupportedVersion","chain","minVersion","output","version","ir","typeNames","guardNames","modelKey","modelDef","Object","entries","models","type","push","unionTypeName","variantName","keys","union","variants","formattedVariant","variantTypeName","length","sort","join"],"sources":["generateIndexFromSchema.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 { UNKNOWN_UNION_VARIANT } from \"@palantir/pack.document-schema.model-types\";\nimport { formatVariantName } from \"@palantir/pack.schema\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n DOCUMENT_TYPE_PATH,\n INTERNAL_UPGRADE_FNS_PATH,\n knownTypeName,\n MODELS_PATH,\n narrowKnownFunctionName,\n TYPES_REEXPORT_PATH,\n typesFilePath,\n VERSIONED_DOC_REF_PATH,\n versionedTypeName,\n VERSIONS_PATH,\n} from \"./runtimeSchema.js\";\n\n/**\n * Generate the index.ts barrel export from a versioned schema.\n *\n * Exports:\n * - `models.js` (star export — model constants and `DocumentModel`; emitted\n * as a factory function when the schema has derived fields, otherwise a const)\n * - `types.js` (star export — latest-version type aliases)\n * - `versions.js` (star export — SupportedVersions, LatestVersion, MinSupportedVersion)\n * - `versionedDocRef.js` (star export — VersionedDocRef types and factory)\n * - `documentType.js` (star export — DOCUMENT_TYPE_NAME and DOCUMENT_TYPE_DESCRIPTION)\n * - `DocumentUpgradeFns` type (the typed shape the factory accepts)\n * - Per supported version: explicit named type exports from `types_vN.js`\n * (not star exports, to avoid polluting autocomplete for read-only consumers)\n * - Per supported version: the union variant type guard *functions* from\n * `types_vN.js` as values (e.g. `isFooBar_v1`), so consumers can narrow a\n * union without re-deriving the discriminant check\n */\nexport function generateIndexFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): string {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n let output = GENERATED_FILE_HEADER;\n\n // Star exports for core modules\n output += `export * from \"${MODELS_PATH}\";\\n`;\n output += `export * from \"${TYPES_REEXPORT_PATH}\";\\n`;\n output += `export * from \"${VERSIONS_PATH}\";\\n`;\n output += `export * from \"${VERSIONED_DOC_REF_PATH}\";\\n`;\n output += `export * from \"${DOCUMENT_TYPE_PATH}\";\\n`;\n // The typed upgrade-function table shape. Apps reference this type when\n // constructing the value passed to `DocumentModel(...)`.\n output += `export { type DocumentUpgradeFns } from \"${INTERNAL_UPGRADE_FNS_PATH}\";\\n`;\n\n // Per-version explicit named type exports\n for (const { version, ir } of chain) {\n if (version < minVersion) continue;\n\n const typeNames: string[] = [];\n // Union variant type guard functions (values, not types).\n const guardNames: string[] = [];\n\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n typeNames.push(versionedTypeName(modelKey, version));\n } else if (modelDef.type === \"union\") {\n const unionTypeName = versionedTypeName(modelKey, version);\n typeNames.push(unionTypeName, knownTypeName(unionTypeName));\n guardNames.push(narrowKnownFunctionName(unionTypeName));\n\n // Union variant types and their generated `is<Variant>` guards, including the Unknown case.\n for (\n const variantName of [...Object.keys(modelDef.union.variants), UNKNOWN_UNION_VARIANT]\n ) {\n const formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${versionedTypeName(modelKey, version)}${formattedVariant}`;\n typeNames.push(variantTypeName);\n guardNames.push(`is${variantTypeName}`);\n }\n }\n }\n\n if (typeNames.length > 0) {\n output += `export type { ${typeNames.sort().join(\", \")} } from \"${\n typesFilePath(version)\n }\";\\n`;\n }\n\n if (guardNames.length > 0) {\n output += `export { ${guardNames.sort().join(\", \")} } from \"${typesFilePath(version)}\";\\n`;\n }\n }\n\n return output;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { formatVariantName } from "
|
|
17
|
+
import { formatVariantName } from "@palantir/pack.schema";
|
|
18
18
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
19
19
|
import { findExternalRefType } from "../ir/irFieldHelpers.js";
|
|
20
20
|
import { chainNeedsUpgradeFns, resolveMinVersion } from "./resolveSchemaChain.js";
|
|
@@ -51,13 +51,17 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
|
|
|
51
51
|
const recordNames = [];
|
|
52
52
|
const unionNames = [];
|
|
53
53
|
const variantNames = [];
|
|
54
|
+
// Each variant model's union, e.g. NodeShapeBox -> NodeShape.
|
|
55
|
+
const unionByVariantName = new Map();
|
|
54
56
|
for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {
|
|
55
57
|
if (modelDef.type === "record") {
|
|
56
58
|
recordNames.push(modelKey);
|
|
57
59
|
} else if (modelDef.type === "union") {
|
|
58
60
|
unionNames.push(modelKey);
|
|
59
61
|
for (const variantName of Object.keys(modelDef.union.variants)) {
|
|
60
|
-
|
|
62
|
+
const variantModelName = `${modelKey}${formatVariantName(variantName)}`;
|
|
63
|
+
variantNames.push(variantModelName);
|
|
64
|
+
unionByVariantName.set(variantModelName, modelKey);
|
|
61
65
|
}
|
|
62
66
|
}
|
|
63
67
|
}
|
|
@@ -82,7 +86,8 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
|
|
|
82
86
|
|
|
83
87
|
// Upgrade imports (only if there are upgrades)
|
|
84
88
|
const upgradeNames = [...recordNames, ...unionNames].map(n => `${n}Upgrades`);
|
|
85
|
-
|
|
89
|
+
const needsUpgradeRegistry = chain.length > 1 || unionNames.length > 0;
|
|
90
|
+
if (needsUpgradeRegistry && upgradeNames.length > 0) {
|
|
86
91
|
output += `import { ${upgradeNames.join(", ")} } from "${INTERNAL_UPGRADES_PATH}";\n`;
|
|
87
92
|
}
|
|
88
93
|
|
|
@@ -155,8 +160,9 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
|
|
|
155
160
|
// Build upgrades map (includes both record and union entries)
|
|
156
161
|
let upgradesBlock;
|
|
157
162
|
const allUpgradeNames = [...recordNames, ...unionNames];
|
|
158
|
-
if (
|
|
159
|
-
|
|
163
|
+
if (needsUpgradeRegistry && allUpgradeNames.length > 0) {
|
|
164
|
+
// 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");
|
|
160
166
|
upgradesBlock = ` upgrades: {\n${upgradeEntries}\n },\n`;
|
|
161
167
|
} else {
|
|
162
168
|
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","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","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 { formatVariantName } from \"../formatVariantName.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\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 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 if (chain.length > 1 && 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 (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 // 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":["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":[]}
|
|
@@ -14,8 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { TypeKind as SchemaTypeKind } from "@palantir/pack.schema";
|
|
18
|
-
import { formatVariantName } from "../formatVariantName.js";
|
|
17
|
+
import { formatVariantName, TypeKind as SchemaTypeKind } from "@palantir/pack.schema";
|
|
19
18
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
20
19
|
const TypeKind = {
|
|
21
20
|
...SchemaTypeKind,
|
|
@@ -1 +1 @@
|
|
|
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","RESOURCE_REF","add","DOC_REF","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 ResourceRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.RESOURCE_REF;\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 | ResourceRefField\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.RESOURCE_REF:\n refTypes.add(\"ResourceRid\");\n break;\n case TypeKind.DOC_REF:\n refTypes.add(\"DocumentId\");\n break;\n case TypeKind.MEDIA_REF:\n refTypes.add(\"MediaId\");\n break;\n case TypeKind.OBJECT_REF:\n refTypes.add(\"ObjectId\");\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(\"UserId\");\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.RESOURCE_REF:\n return \"ResourceRid\";\n case TypeKind.DOC_REF:\n return \"DocumentId\";\n case TypeKind.DOUBLE:\n return \"number\";\n case TypeKind.MEDIA_REF:\n return \"MediaId\";\n case TypeKind.OBJECT_REF:\n return \"ObjectId\";\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 \"UserId\";\n default: {\n const _exhaustive: never = fieldType;\n throw new Error(`Unknown schema field type: ${(_exhaustive as SchemaField).type}`);\n }\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,QAAQ,IAAIC,cAAc,QAAQ,uBAAuB;AAClE,SAASC,iBAAiB,QAAQ,yBAAyB;AAC3D,SAASC,qBAAqB,QAAQ,2BAA2B;AAEjE,MAAMH,QAAyD,GAAG;EAChE,GAAGC,cAAc;EACjBG,GAAG,EAAE;AACP,CAAC;AAED,MAAMC,aAAa,GAAG;EACpBC,MAAM,EAAE,QAAQ;EAChBC,KAAK,EAAE;AACT,CAAU;;AAEV;;AAyFA;AACA,SAASC,cAAcA,CAACC,IAAuB,EAA+B;EAC5E,OAAOA,IAAI,CAACC,IAAI,KAAKL,aAAa,CAACC,MAAM,IAAI,MAAM,IAAIG,IAAI,IAAI,QAAQ,IAAIA,IAAI;AACjF;AAEA,SAASE,aAAaA,CAACF,IAAuB,EAA8B;EAC1E,OAAOA,IAAI,CAACC,IAAI,KAAKL,aAAa,CAACE,KAAK,IAAI,UAAU,IAAIE,IAAI,IAAI,cAAc,IAAIA,IAAI;AAC1F;AAEA,SAASG,UAAUA,CAACC,KAAkB,EAAqB;EACzD,OAAOA,KAAK,CAACH,IAAI,KAAKV,QAAQ,CAACc,GAAG,IAAI,SAAS,IAAID,KAAK,IAAI,MAAM,IAAIA,KAAK;AAC7E;AAEA,SAASE,YAAYA,CAACF,KAAkB,EAAuB;EAC7D,OAAOA,KAAK,CAACH,IAAI,KAAKV,QAAQ,CAACgB,KAAK,IAAI,OAAO,IAAIH,KAAK;AAC1D;AAEA,SAASI,eAAeA,CAACJ,KAAkB,EAA0B;EACnE,OAAOA,KAAK,CAACH,IAAI,KAAKV,QAAQ,CAACkB,QAAQ,IAAI,MAAM,IAAIL,KAAK;AAC5D;AAEA,SAASM,kBAAkBA,CAACC,MAAqB,EAAe;EAC9D,MAAMC,QAAQ,GAAG,IAAIC,GAAG,CAAS,CAAC;EAElC,SAASC,SAASA,CAACV,KAAkB,EAAQ;IAC3C,QAAQA,KAAK,CAACH,IAAI;MAChB,KAAKV,QAAQ,CAACgB,KAAK;QACjB,IAAID,YAAY,CAACF,KAAK,CAAC,EAAE;UACvBU,SAAS,CAACV,KAAK,CAACW,KAAK,CAAC;QACxB;QACA;MACF,KAAKxB,QAAQ,CAACyB,YAAY;QACxBJ,QAAQ,CAACK,GAAG,CAAC,aAAa,CAAC;QAC3B;MACF,KAAK1B,QAAQ,CAAC2B,OAAO;QACnBN,QAAQ,CAACK,GAAG,CAAC,YAAY,CAAC;QAC1B;MACF,KAAK1B,QAAQ,CAAC4B,SAAS;QACrBP,QAAQ,CAACK,GAAG,CAAC,SAAS,CAAC;QACvB;MACF,KAAK1B,QAAQ,CAAC6B,UAAU;QACtBR,QAAQ,CAACK,GAAG,CAAC,UAAU,CAAC;QACxB;MACF,KAAK1B,QAAQ,CAACkB,QAAQ;QACpB,IAAID,eAAe,CAACJ,KAAK,CAAC,EAAE;UAC1BU,SAAS,CAACV,KAAK,CAACJ,IAAI,CAAC;QACvB;QACA;MACF,KAAKT,QAAQ,CAAC8B,QAAQ;QACpBT,QAAQ,CAACK,GAAG,CAAC,QAAQ,CAAC;QACtB;IACJ;EACF;EAEA,KAAK,MAAMjB,IAAI,IAAIsB,MAAM,CAACC,MAAM,CAACZ,MAAM,CAAC,EAAE;IACxC,IAAIZ,cAAc,CAACC,IAAI,CAAC,EAAE;MACxB,KAAK,MAAMI,KAAK,IAAIkB,MAAM,CAACC,MAAM,CAACvB,IAAI,CAACwB,MAAM,CAAC,EAAE;QAC9CV,SAAS,CAACV,KAAK,CAAC;MAClB;IACF,CAAC,MAAM,IAAIF,aAAa,CAACF,IAAI,CAAC,EAAE;MAC9B,KAAK,MAAMyB,OAAO,IAAIH,MAAM,CAACC,MAAM,CAACvB,IAAI,CAAC0B,QAAQ,CAAC,EAAE;QAClDZ,SAAS,CAACW,OAAO,CAAC;MACpB;IACF;EACF;EAEA,OAAOb,QAAQ;AACjB;AAEA,OAAO,SAASe,uBAAuBA,CACrChB,MAAiB,EACT;EACR,MAAMiB,aAAa,GAAGjB,MAAkC;;EAExD;EACA,MAAMkB,YAAY,GAAGnB,kBAAkB,CAACkB,aAAa,CAAC;EAEtD,IAAIE,MAAM,GAAGpC,qBAAqB;;EAElC;EACA,IAAImC,YAAY,CAACE,IAAI,GAAG,CAAC,EAAE;IACzB,MAAMC,YAAY,GAAGC,KAAK,CAACC,IAAI,CAACL,YAAY,CAAC,CAACM,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;IAC/DN,MAAM,IACJ,iBAAiBE,YAAY,yDAAyD;EAC1F;EAEAF,MAAM,IAAI,IAAI;;EAEd;EACA,KAAK,MAAM,CAACO,UAAU,EAAErC,IAAI,CAAC,IAAIsB,MAAM,CAACgB,OAAO,CAACV,aAAa,CAAC,EAAE;IAC9D,IAAI5B,IAAI,CAACC,IAAI,KAAKL,aAAa,CAACC,MAAM,IAAIE,cAAc,CAACC,IAAI,CAAC,EAAE;MAC9D8B,MAAM,IAAIS,uBAAuB,CAACvC,IAAI,EAAEqC,UAAU,EAAET,aAAa,CAAC;MAClEE,MAAM,IAAI,IAAI;IAChB;EACF;;EAEA;EACA,MAAMU,YAAY,GAAGlB,MAAM,CAACgB,OAAO,CAACV,aAAa,CAAC,CAACa,MAAM,CACvD,CAAC,CAACC,CAAC,EAAE1C,IAAI,CAAC,KAAKA,IAAI,CAACC,IAAI,KAAKL,aAAa,CAACE,KAAK,IAAII,aAAa,CAACF,IAAI,CACxE,CAAC;EAEDwC,YAAY,CAACG,OAAO,CAAC,CAAC,CAACN,UAAU,EAAErC,IAAI,CAAC,EAAE4C,CAAC,KAAK;IAC9C,IAAI1C,aAAa,CAACF,IAAI,CAAC,EAAE;MACvB,MAAM6C,WAAW,GAAGC,iBAAiB,CAAC9C,IAAI,EAAEqC,UAAU,EAAET,aAAa,CAAC;MACtE,IAAIiB,WAAW,EAAE;QACff,MAAM,IAAIe,WAAW;QACrB;QACA,IAAID,CAAC,GAAGJ,YAAY,CAACO,MAAM,GAAG,CAAC,EAAE;UAC/BjB,MAAM,IAAI,IAAI;QAChB;MACF;IACF;EACF,CAAC,CAAC;EAEF,OAAOA,MAAM;AACf;AAEA,SAASS,uBAAuBA,CAC9BS,MAA2B,EAC3BX,UAAkB,EAClB1B,MAAqB,EACb;EACR,IAAImB,MAAM,GAAG,EAAE;EAEf,IAAIkB,MAAM,CAACC,IAAI,EAAE;IACfnB,MAAM,IAAI,WAAWkB,MAAM,CAACC,IAAI,SAAS;EAC3C;EAEAnB,MAAM,IAAI,oBAAoBO,UAAU,MAAM;EAE9C,KAAK,MAAM,CAACa,SAAS,EAAEC,SAAS,CAAC,IAAI7B,MAAM,CAACgB,OAAO,CAACU,MAAM,CAACxB,MAAM,CAAC,EAAE;IAClE,MAAM4B,MAAM,GAAGC,uBAAuB,CAACF,SAAS,EAAExC,MAAM,CAAC;IACzD,MAAM2C,QAAQ,GAAGH,SAAS,CAAClD,IAAI,KAAKV,QAAQ,CAACkB,QAAQ,GAAG,GAAG,GAAG,EAAE;IAChEqB,MAAM,IAAI,cAAcoB,SAAS,GAAGI,QAAQ,KAAKF,MAAM,KAAK;EAC9D;EAEAtB,MAAM,IAAI,KAAK;EAEf,OAAOA,MAAM;AACf;AAEA,SAASgB,iBAAiBA,CACxBS,KAAyB,EACzBlB,UAAkB,EAClB1B,MAAqB,EACb;EACR,IAAImB,MAAM,GAAG,EAAE;EACf,MAAM0B,iBAAsE,GAAG,EAAE;EACjF,MAAMC,iBAAiB,GAAGF,KAAK,CAACG,YAAY;;EAE5C;EACA,KAAK,MAAM,CAACC,WAAW,EAAEC,WAAW,CAAC,IAAItC,MAAM,CAACgB,OAAO,CAACiB,KAAK,CAAC7B,QAAQ,CAAC,EAAE;IACvE,MAAMmC,aAAa,GAAG,GAAGxB,UAAU,GAAG5C,iBAAiB,CAACkE,WAAW,CAAC,EAAE;IACtEH,iBAAiB,CAACM,IAAI,CAAC;MAAEC,IAAI,EAAEF,aAAa;MAAEG,kBAAkB,EAAEL;IAAY,CAAC,CAAC;IAEhF,IAAIC,WAAW,CAAC3D,IAAI,KAAKV,QAAQ,CAACc,GAAG,IAAIuD,WAAW,CAACK,OAAO,KAAK,QAAQ,EAAE;MACzE;MACA,MAAMC,UAAU,GAAGC,oBAAoB,CAACP,WAAW,CAACG,IAAI,EAAEpD,MAAM,CAAC;MACjE,IAAIuD,UAAU,EAAE;QACdpC,MAAM,IAAI,oBAAoB+B,aAAa,YAAYK,UAAU,MAAM;QACvEpC,MAAM,IAAI,cAAc2B,iBAAiB,MAAME,WAAW,MAAM;QAChE7B,MAAM,IAAI,OAAO;MACnB;IACF,CAAC,MAAM;MACL;MACA,MAAMsB,MAAM,GAAGC,uBAAuB,CAACO,WAAW,EAAEjD,MAAM,CAAC;MAC3DmB,MAAM,IAAI,oBAAoB+B,aAAa,MAAM;MACjD/B,MAAM,IAAI,cAAc2B,iBAAiB,MAAME,WAAW,MAAM;MAChE7B,MAAM,IAAI,qBAAqBsB,MAAM,KAAK;MAC1CtB,MAAM,IAAI,OAAO;IACnB;EACF;;EAEA;EACAA,MAAM,IAAI,eAAeO,UAAU,MAAMmB,iBAAiB,CAACY,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACN,IAAI,CAAC,CAAC3B,IAAI,CAAC,KAAK,CAAC,OAAO;;EAE9F;EACA,KAAK,IAAIQ,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGY,iBAAiB,CAACT,MAAM,EAAEH,CAAC,EAAE,EAAE;IACjD,MAAMnB,OAAO,GAAG+B,iBAAiB,CAACZ,CAAC,CAAE;IACrCd,MAAM,IACJ,qBAAqBL,OAAO,CAACsC,IAAI,WAAW1B,UAAU,eAAeZ,OAAO,CAACsC,IAAI,MAAM;IACzFjC,MAAM,IAAI,kBAAkB2B,iBAAiB,SAAShC,OAAO,CAACuC,kBAAkB,MAAM;IACtFlC,MAAM,IAAI,OAAO;EACnB;EAEA,OAAOA,MAAM;AACf;AAEA,SAASqC,oBAAoBA,CAC3BD,UAAkB,EAClBvD,MAAqB,EACN;EACf,KAAK,MAAM,CAAC0B,UAAU,EAAErC,IAAI,CAAC,IAAIsB,MAAM,CAACgB,OAAO,CAAC3B,MAAM,CAAC,EAAE;IACvD,IAAIZ,cAAc,CAACC,IAAI,CAAC,IAAIA,IAAI,CAAC+D,IAAI,KAAKG,UAAU,EAAE;MACpD,OAAO7B,UAAU;IACnB;EACF;EACA,OAAO,IAAI;AACb;AAEA,SAASgB,uBAAuBA,CAC9BF,SAAsB,EACtBxC,MAAsB,EACd;EACR,QAAQwC,SAAS,CAAClD,IAAI;IACpB,KAAKV,QAAQ,CAACI,GAAG;MACf,OAAO,KAAK;IACd,KAAKJ,QAAQ,CAACgB,KAAK;MACjB,IAAI,CAACD,YAAY,CAAC6C,SAAS,CAAC,EAAE;QAC5B,MAAM,IAAImB,KAAK,CAAC,mCAAmC,CAAC;MACtD;MACA,OAAO,YAAYjB,uBAAuB,CAACF,SAAS,CAACpC,KAAK,EAAEJ,MAAM,CAAC,IAAI;IACzE,KAAKpB,QAAQ,CAACyB,YAAY;MACxB,OAAO,aAAa;IACtB,KAAKzB,QAAQ,CAAC2B,OAAO;MACnB,OAAO,YAAY;IACrB,KAAK3B,QAAQ,CAACgF,MAAM;MAClB,OAAO,QAAQ;IACjB,KAAKhF,QAAQ,CAAC4B,SAAS;MACrB,OAAO,SAAS;IAClB,KAAK5B,QAAQ,CAAC6B,UAAU;MACtB,OAAO,UAAU;IACnB,KAAK7B,QAAQ,CAACkB,QAAQ;MACpB,IAAI,CAACD,eAAe,CAAC2C,SAAS,CAAC,EAAE;QAC/B,MAAM,IAAImB,KAAK,CAAC,sCAAsC,CAAC;MACzD;MACA,OAAOjB,uBAAuB,CAACF,SAAS,CAACnD,IAAI,EAAEW,MAAM,CAAC;IACxD,KAAKpB,QAAQ,CAACc,GAAG;MACf,IAAI,CAACF,UAAU,CAACgD,SAAS,CAAC,EAAE;QAC1B,MAAM,IAAImB,KAAK,CAAC,sCAAsC,CAAC;MACzD;MACA,IAAInB,SAAS,CAACc,OAAO,KAAK,QAAQ,EAAE;QAClC,MAAM5B,UAAU,GAAG1B,MAAM,GAAGwD,oBAAoB,CAAChB,SAAS,CAACY,IAAI,EAAEpD,MAAM,CAAC,GAAG,IAAI;QAC/E,OAAO0B,UAAU,IAAIc,SAAS,CAACY,IAAI;MACrC;MACA,OAAOZ,SAAS,CAACY,IAAI;IACvB,KAAKxE,QAAQ,CAACiF,MAAM;MAClB,OAAO,QAAQ;IACjB,KAAKjF,QAAQ,CAAC8B,QAAQ;MACpB,OAAO,QAAQ;IACjB;MAAS;QAEP,MAAM,IAAIiD,KAAK,CAAC,8BADWnB,SAAS,CACuClD,IAAI,EAAE,CAAC;MACpF;EACF;AACF","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"generateTypesFromSchema.js","names":["formatVariantName","TypeKind","SchemaTypeKind","GENERATED_FILE_HEADER","ANY","SchemaDefKind","RECORD","UNION","isRecordSchema","item","type","isUnionSchema","isRefField","field","REF","isArrayField","ARRAY","isOptionalField","OPTIONAL","detectUsedRefTypes","schema","refTypes","Set","scanField","items","RESOURCE_REF","add","DOC_REF","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 { formatVariantName, TypeKind as SchemaTypeKind } from \"@palantir/pack.schema\";\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 ResourceRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.RESOURCE_REF;\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 | ResourceRefField\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.RESOURCE_REF:\n refTypes.add(\"ResourceRid\");\n break;\n case TypeKind.DOC_REF:\n refTypes.add(\"DocumentId\");\n break;\n case TypeKind.MEDIA_REF:\n refTypes.add(\"MediaId\");\n break;\n case TypeKind.OBJECT_REF:\n refTypes.add(\"ObjectId\");\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(\"UserId\");\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.RESOURCE_REF:\n return \"ResourceRid\";\n case TypeKind.DOC_REF:\n return \"DocumentId\";\n case TypeKind.DOUBLE:\n return \"number\";\n case TypeKind.MEDIA_REF:\n return \"MediaId\";\n case TypeKind.OBJECT_REF:\n return \"ObjectId\";\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 \"UserId\";\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":[]}
|
|
@@ -14,16 +14,21 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
17
|
+
import { UNKNOWN_UNION_VARIANT } from "@palantir/pack.document-schema.model-types";
|
|
18
|
+
import { formatVariantName } from "@palantir/pack.schema";
|
|
18
19
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
19
20
|
import { collectReferencedTypes, convertFieldTypeToTypeScript, detectUsedRefTypes } from "../ir/irFieldHelpers.js";
|
|
21
|
+
import { UNKNOWN_VARIANT_SUFFIX } from "../unknownVariantSuffix.js";
|
|
20
22
|
import { resolveMinVersion } from "./resolveSchemaChain.js";
|
|
21
|
-
import { typesFilePath, versionedTypeName, versionedWriteTypeName } from "./runtimeSchema.js";
|
|
23
|
+
import { knownTypeName, narrowKnownFunctionName, typesFilePath, versionedTypeName, versionedWriteTypeName } from "./runtimeSchema.js";
|
|
22
24
|
/**
|
|
23
25
|
* Generate read types for a specific schema version.
|
|
24
26
|
*/
|
|
25
27
|
function generateReadTypesForVersion(version, ir) {
|
|
26
28
|
const usedRefTypes = detectUsedRefTypes(ir);
|
|
29
|
+
if (Object.values(ir.models).some(model => model.type === "union")) {
|
|
30
|
+
usedRefTypes.add("UnknownUnionVariant");
|
|
31
|
+
}
|
|
27
32
|
let output = GENERATED_FILE_HEADER;
|
|
28
33
|
if (usedRefTypes.size > 0) {
|
|
29
34
|
const refTypesList = Array.from(usedRefTypes).sort().join(", ");
|
|
@@ -78,7 +83,24 @@ function generateReadTypesForVersion(version, ir) {
|
|
|
78
83
|
output += "}\n\n";
|
|
79
84
|
}
|
|
80
85
|
}
|
|
86
|
+
const knownVariantNames = variantInterfaces.map(v => v.name);
|
|
87
|
+
const unknownName = `${typeName}${UNKNOWN_VARIANT_SUFFIX}`;
|
|
88
|
+
output += `export type ${unknownName} = UnknownUnionVariant<"${discriminantField}">;\n\n`;
|
|
89
|
+
variantInterfaces.push({
|
|
90
|
+
name: unknownName,
|
|
91
|
+
discriminatorValue: UNKNOWN_UNION_VARIANT
|
|
92
|
+
});
|
|
81
93
|
output += `export type ${typeName} = ${variantInterfaces.map(v => v.name).join(" | ")};\n\n`;
|
|
94
|
+
|
|
95
|
+
// The variants this SDK knows, and a helper to narrow to them before reading variant fields.
|
|
96
|
+
const knownName = knownTypeName(typeName);
|
|
97
|
+
output += `export type ${knownName} = ${knownVariantNames.length > 0 ? knownVariantNames.join(" | ") : "never"};\n\n`;
|
|
98
|
+
output += "/** Return the value if this SDK knows its variant, otherwise undefined. */\n";
|
|
99
|
+
output += `export function ${narrowKnownFunctionName(typeName)}(\n`;
|
|
100
|
+
output += ` value: ${typeName} | undefined,\n`;
|
|
101
|
+
output += `): ${knownName} | undefined {\n`;
|
|
102
|
+
output += ` return value == null || value.${discriminantField} === "${UNKNOWN_UNION_VARIANT}" ? undefined : value;\n`;
|
|
103
|
+
output += "}\n\n";
|
|
82
104
|
for (const variant of variantInterfaces) {
|
|
83
105
|
output += `export function is${variant.name}(value: ${typeName}): value is ${variant.name} {\n`;
|
|
84
106
|
output += ` return value.${discriminantField} === "${variant.discriminatorValue}";\n`;
|
|
@@ -144,9 +166,9 @@ function generateTypesReExport({
|
|
|
144
166
|
} else if (modelDef.type === "union") {
|
|
145
167
|
const versioned = versionedTypeName(modelKey, version);
|
|
146
168
|
reExports.push(`export type { ${versioned} as ${modelKey} } from "${typesFilePath(version)}";`);
|
|
147
|
-
|
|
148
|
-
// Also re-export union variant types
|
|
149
|
-
for (const variantName of Object.keys(modelDef.union.variants)) {
|
|
169
|
+
reExports.push(`export type { ${knownTypeName(versioned)} as ${knownTypeName(modelKey)} } from "${typesFilePath(version)}";`, `export { ${narrowKnownFunctionName(versioned)} as ${narrowKnownFunctionName(modelKey)} } from "${typesFilePath(version)}";`);
|
|
170
|
+
// Also re-export union variant types, including the Unknown case
|
|
171
|
+
for (const variantName of [...Object.keys(modelDef.union.variants), UNKNOWN_UNION_VARIANT]) {
|
|
150
172
|
const formattedVariant = formatVariantName(variantName);
|
|
151
173
|
const versionedVariant = `${versionedTypeName(modelKey, version)}${formattedVariant}`;
|
|
152
174
|
reExports.push(`export type { ${versionedVariant} as ${`${modelKey}${formattedVariant}`} } from "${typesFilePath(version)}";`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateVersionedTypesFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","collectReferencedTypes","convertFieldTypeToTypeScript","detectUsedRefTypes","resolveMinVersion","typesFilePath","versionedTypeName","versionedWriteTypeName","generateReadTypesForVersion","version","ir","usedRefTypes","output","size","refTypesList","Array","from","sort","join","modelKey","modelDef","Object","entries","models","type","record","typeName","description","field","fields","tsType","fieldType","optional","isOptional","key","union","discriminantField","discriminant","variantInterfaces","variantName","variantModelKey","variants","interfaceName","push","name","discriminatorValue","variantModel","recordTypeName","map","v","variant","generateWriteTypesForVersion","referencedLocalTypes","Set","values","localTypesList","generateTypesReExport","reExports","versioned","keys","formattedVariant","versionedVariant","generateVersionedTypesFromChain","resolved","minSupportedVersion","chain","minVersion","readTypes","Map","writeTypes","set","typesReExport","length"],"sources":["generateVersionedTypesFromSchema.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 { IRealTimeDocumentSchema } from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport {\n collectReferencedTypes,\n convertFieldTypeToTypeScript,\n detectUsedRefTypes,\n} from \"../ir/irFieldHelpers.js\";\nimport type { ResolvedIrChain, VersionedIrEntry } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport { typesFilePath, versionedTypeName, versionedWriteTypeName } from \"./runtimeSchema.js\";\n\nexport interface VersionedTypesOutput {\n /** types_vN.ts files keyed by version number */\n readTypes: Map<number, string>;\n /** writeTypes_vN.ts files keyed by version number */\n writeTypes: Map<number, string>;\n /** types.ts re-export of latest version types under unversioned names */\n typesReExport: string;\n}\n\n/**\n * Generate read types for a specific schema version.\n */\nfunction generateReadTypesForVersion(\n version: number,\n ir: IRealTimeDocumentSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(ir);\n\n let output = GENERATED_FILE_HEADER;\n\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 // Generate record interfaces\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n const record = modelDef.record;\n const typeName = versionedTypeName(modelKey, version);\n\n if (record.description) {\n output += `/**\\n * ${record.description}\\n */\\n`;\n }\n\n output += `export interface ${typeName} {\\n`;\n\n for (const field of record.fields) {\n const tsType = convertFieldTypeToTypeScript(field.fieldType, version);\n const optional = field.isOptional ? \"?\" : \"\";\n output += ` readonly ${field.key}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\\n\";\n }\n\n // Generate union types\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"union\") continue;\n\n const union = modelDef.union;\n const typeName = versionedTypeName(modelKey, version);\n const discriminantField = union.discriminant;\n const variantInterfaces: Array<{ name: string; discriminatorValue: string }> = [];\n\n for (const [variantName, variantModelKey] of Object.entries(union.variants)) {\n const interfaceName = `${typeName}${formatVariantName(variantName)}`;\n variantInterfaces.push({ name: interfaceName, discriminatorValue: variantName });\n\n // Look up the variant's model to check if it's a record\n const variantModel = ir.models[variantModelKey];\n if (variantModel != null && variantModel.type === \"record\") {\n const recordTypeName = versionedTypeName(variantModelKey, version);\n output += `export interface ${interfaceName} extends ${recordTypeName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += \"}\\n\\n\";\n } else {\n // Non-record variant (e.g. another union): emit a value field referencing the type\n const tsType = versionedTypeName(variantModelKey, version);\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 output += `export type ${typeName} = ${variantInterfaces.map(v => v.name).join(\" | \")};\\n\\n`;\n\n for (const variant of variantInterfaces) {\n output +=\n `export function is${variant.name}(value: ${typeName}): value is ${variant.name} {\\n`;\n output += ` return value.${discriminantField} === \"${variant.discriminatorValue}\";\\n`;\n output += \"}\\n\\n\";\n }\n }\n\n return output;\n}\n\n/**\n * Generate write types for a specific schema version.\n * All fields are optional in write types.\n */\nfunction generateWriteTypesForVersion(\n version: number,\n ir: IRealTimeDocumentSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(ir);\n\n // Collect referenced schema-local types (refs to other records/unions)\n const referencedLocalTypes = new Set<string>();\n for (const modelDef of Object.values(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n for (const field of modelDef.record.fields) {\n collectReferencedTypes(field.fieldType, version, referencedLocalTypes);\n }\n }\n\n let output = GENERATED_FILE_HEADER;\n\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 if (referencedLocalTypes.size > 0) {\n const localTypesList = Array.from(referencedLocalTypes).sort().join(\", \");\n output += `import type { ${localTypesList} } from \"${typesFilePath(version)}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate record write types\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n const typeName = versionedWriteTypeName(modelKey, version);\n\n output += `export type ${typeName} = {\\n`;\n\n for (const field of modelDef.record.fields) {\n // All fields are optional in write types\n const tsType = convertFieldTypeToTypeScript(field.fieldType, version);\n output += ` readonly ${field.key}?: ${tsType};\\n`;\n }\n\n output += \"};\\n\\n\";\n }\n\n return output;\n}\n\n/**\n * Generate the types.ts re-export file that maps unversioned names to the latest version.\n */\nfunction generateTypesReExport({ ir, version }: VersionedIrEntry): string {\n const reExports: string[] = [];\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n const versioned = versionedTypeName(modelKey, version);\n reExports.push(\n `export type { ${versioned} as ${modelKey} } from \"${typesFilePath(version)}\";`,\n );\n } else if (modelDef.type === \"union\") {\n const versioned = versionedTypeName(modelKey, version);\n reExports.push(\n `export type { ${versioned} as ${modelKey} } from \"${typesFilePath(version)}\";`,\n );\n\n // Also re-export union variant types\n for (const variantName of Object.keys(modelDef.union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const versionedVariant = `${versionedTypeName(modelKey, version)}${formattedVariant}`;\n const unversionedVariant = `${modelKey}${formattedVariant}`;\n reExports.push(\n `export type { ${versionedVariant} as ${unversionedVariant} } from \"${\n typesFilePath(version)\n }\";`,\n );\n }\n }\n }\n\n return GENERATED_FILE_HEADER + reExports.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Generate per-version public types and write types from an already-resolved\n * versioned IR chain.\n */\nexport function generateVersionedTypesFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): VersionedTypesOutput {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n const readTypes = new Map<number, string>();\n const writeTypes = new Map<number, string>();\n\n for (const { version, ir } of chain) {\n if (version < minVersion) continue;\n\n readTypes.set(version, generateReadTypesForVersion(version, ir));\n writeTypes.set(version, generateWriteTypesForVersion(version, ir));\n }\n\n const typesReExport = generateTypesReExport(chain[chain.length - 1]!);\n\n return { readTypes, writeTypes, typesReExport };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"generateVersionedTypesFromSchema.js","names":["UNKNOWN_UNION_VARIANT","formatVariantName","GENERATED_FILE_HEADER","collectReferencedTypes","convertFieldTypeToTypeScript","detectUsedRefTypes","UNKNOWN_VARIANT_SUFFIX","resolveMinVersion","knownTypeName","narrowKnownFunctionName","typesFilePath","versionedTypeName","versionedWriteTypeName","generateReadTypesForVersion","version","ir","usedRefTypes","Object","values","models","some","model","type","add","output","size","refTypesList","Array","from","sort","join","modelKey","modelDef","entries","record","typeName","description","field","fields","tsType","fieldType","optional","isOptional","key","union","discriminantField","discriminant","variantInterfaces","variantName","variantModelKey","variants","interfaceName","push","name","discriminatorValue","variantModel","recordTypeName","knownVariantNames","map","v","unknownName","knownName","length","variant","generateWriteTypesForVersion","referencedLocalTypes","Set","localTypesList","generateTypesReExport","reExports","versioned","keys","formattedVariant","versionedVariant","generateVersionedTypesFromChain","resolved","minSupportedVersion","chain","minVersion","readTypes","Map","writeTypes","set","typesReExport"],"sources":["generateVersionedTypesFromSchema.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 { UNKNOWN_UNION_VARIANT } from \"@palantir/pack.document-schema.model-types\";\nimport { formatVariantName } from \"@palantir/pack.schema\";\nimport type { IRealTimeDocumentSchema } from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport {\n collectReferencedTypes,\n convertFieldTypeToTypeScript,\n detectUsedRefTypes,\n} from \"../ir/irFieldHelpers.js\";\nimport { UNKNOWN_VARIANT_SUFFIX } from \"../unknownVariantSuffix.js\";\nimport type { ResolvedIrChain, VersionedIrEntry } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n knownTypeName,\n narrowKnownFunctionName,\n typesFilePath,\n versionedTypeName,\n versionedWriteTypeName,\n} from \"./runtimeSchema.js\";\n\nexport interface VersionedTypesOutput {\n /** types_vN.ts files keyed by version number */\n readTypes: Map<number, string>;\n /** writeTypes_vN.ts files keyed by version number */\n writeTypes: Map<number, string>;\n /** types.ts re-export of latest version types under unversioned names */\n typesReExport: string;\n}\n\n/**\n * Generate read types for a specific schema version.\n */\nfunction generateReadTypesForVersion(\n version: number,\n ir: IRealTimeDocumentSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(ir);\n if (Object.values(ir.models).some(model => model.type === \"union\")) {\n usedRefTypes.add(\"UnknownUnionVariant\");\n }\n\n let output = GENERATED_FILE_HEADER;\n\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 // Generate record interfaces\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n const record = modelDef.record;\n const typeName = versionedTypeName(modelKey, version);\n\n if (record.description) {\n output += `/**\\n * ${record.description}\\n */\\n`;\n }\n\n output += `export interface ${typeName} {\\n`;\n\n for (const field of record.fields) {\n const tsType = convertFieldTypeToTypeScript(field.fieldType, version);\n const optional = field.isOptional ? \"?\" : \"\";\n output += ` readonly ${field.key}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\\n\";\n }\n\n // Generate union types\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"union\") continue;\n\n const union = modelDef.union;\n const typeName = versionedTypeName(modelKey, version);\n const discriminantField = union.discriminant;\n const variantInterfaces: Array<{ name: string; discriminatorValue: string }> = [];\n\n for (const [variantName, variantModelKey] of Object.entries(union.variants)) {\n const interfaceName = `${typeName}${formatVariantName(variantName)}`;\n variantInterfaces.push({ name: interfaceName, discriminatorValue: variantName });\n\n // Look up the variant's model to check if it's a record\n const variantModel = ir.models[variantModelKey];\n if (variantModel != null && variantModel.type === \"record\") {\n const recordTypeName = versionedTypeName(variantModelKey, version);\n output += `export interface ${interfaceName} extends ${recordTypeName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += \"}\\n\\n\";\n } else {\n // Non-record variant (e.g. another union): emit a value field referencing the type\n const tsType = versionedTypeName(variantModelKey, version);\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 const knownVariantNames = variantInterfaces.map(v => v.name);\n const unknownName = `${typeName}${UNKNOWN_VARIANT_SUFFIX}`;\n output += `export type ${unknownName} = UnknownUnionVariant<\"${discriminantField}\">;\\n\\n`;\n variantInterfaces.push({ name: unknownName, discriminatorValue: UNKNOWN_UNION_VARIANT });\n\n output += `export type ${typeName} = ${variantInterfaces.map(v => v.name).join(\" | \")};\\n\\n`;\n\n // The variants this SDK knows, and a helper to narrow to them before reading variant fields.\n const knownName = knownTypeName(typeName);\n output += `export type ${knownName} = ${\n knownVariantNames.length > 0 ? knownVariantNames.join(\" | \") : \"never\"\n };\\n\\n`;\n output += \"/** Return the value if this SDK knows its variant, otherwise undefined. */\\n\";\n output += `export function ${narrowKnownFunctionName(typeName)}(\\n`;\n output += ` value: ${typeName} | undefined,\\n`;\n output += `): ${knownName} | undefined {\\n`;\n output +=\n ` return value == null || value.${discriminantField} === \"${UNKNOWN_UNION_VARIANT}\" ? undefined : value;\\n`;\n output += \"}\\n\\n\";\n\n for (const variant of variantInterfaces) {\n output +=\n `export function is${variant.name}(value: ${typeName}): value is ${variant.name} {\\n`;\n output += ` return value.${discriminantField} === \"${variant.discriminatorValue}\";\\n`;\n output += \"}\\n\\n\";\n }\n }\n\n return output;\n}\n\n/**\n * Generate write types for a specific schema version.\n * All fields are optional in write types.\n */\nfunction generateWriteTypesForVersion(\n version: number,\n ir: IRealTimeDocumentSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(ir);\n\n // Collect referenced schema-local types (refs to other records/unions)\n const referencedLocalTypes = new Set<string>();\n for (const modelDef of Object.values(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n for (const field of modelDef.record.fields) {\n collectReferencedTypes(field.fieldType, version, referencedLocalTypes);\n }\n }\n\n let output = GENERATED_FILE_HEADER;\n\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 if (referencedLocalTypes.size > 0) {\n const localTypesList = Array.from(referencedLocalTypes).sort().join(\", \");\n output += `import type { ${localTypesList} } from \"${typesFilePath(version)}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate record write types\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n const typeName = versionedWriteTypeName(modelKey, version);\n\n output += `export type ${typeName} = {\\n`;\n\n for (const field of modelDef.record.fields) {\n // All fields are optional in write types\n const tsType = convertFieldTypeToTypeScript(field.fieldType, version);\n output += ` readonly ${field.key}?: ${tsType};\\n`;\n }\n\n output += \"};\\n\\n\";\n }\n\n return output;\n}\n\n/**\n * Generate the types.ts re-export file that maps unversioned names to the latest version.\n */\nfunction generateTypesReExport({ ir, version }: VersionedIrEntry): string {\n const reExports: string[] = [];\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n const versioned = versionedTypeName(modelKey, version);\n reExports.push(\n `export type { ${versioned} as ${modelKey} } from \"${typesFilePath(version)}\";`,\n );\n } else if (modelDef.type === \"union\") {\n const versioned = versionedTypeName(modelKey, version);\n reExports.push(\n `export type { ${versioned} as ${modelKey} } from \"${typesFilePath(version)}\";`,\n );\n\n reExports.push(\n `export type { ${knownTypeName(versioned)} as ${knownTypeName(modelKey)} } from \"${\n typesFilePath(version)\n }\";`,\n `export { ${narrowKnownFunctionName(versioned)} as ${\n narrowKnownFunctionName(modelKey)\n } } from \"${typesFilePath(version)}\";`,\n );\n // Also re-export union variant types, including the Unknown case\n for (const variantName of [...Object.keys(modelDef.union.variants), UNKNOWN_UNION_VARIANT]) {\n const formattedVariant = formatVariantName(variantName);\n const versionedVariant = `${versionedTypeName(modelKey, version)}${formattedVariant}`;\n const unversionedVariant = `${modelKey}${formattedVariant}`;\n reExports.push(\n `export type { ${versionedVariant} as ${unversionedVariant} } from \"${\n typesFilePath(version)\n }\";`,\n );\n }\n }\n }\n\n return GENERATED_FILE_HEADER + reExports.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Generate per-version public types and write types from an already-resolved\n * versioned IR chain.\n */\nexport function generateVersionedTypesFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): VersionedTypesOutput {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n const readTypes = new Map<number, string>();\n const writeTypes = new Map<number, string>();\n\n for (const { version, ir } of chain) {\n if (version < minVersion) continue;\n\n readTypes.set(version, generateReadTypesForVersion(version, ir));\n writeTypes.set(version, generateWriteTypesForVersion(version, ir));\n }\n\n const typesReExport = generateTypesReExport(chain[chain.length - 1]!);\n\n return { readTypes, writeTypes, typesReExport };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,9 +14,11 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
17
|
+
import { UNKNOWN_UNION_VARIANT } from "@palantir/pack.document-schema.model-types";
|
|
18
|
+
import { formatVariantName } from "@palantir/pack.schema";
|
|
18
19
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
19
20
|
import { convertFieldTypeToZodSchema } from "../ir/irFieldHelpers.js";
|
|
21
|
+
import { UNKNOWN_VARIANT_SUFFIX } from "../unknownVariantSuffix.js";
|
|
20
22
|
import { resolveMinVersion } from "./resolveSchemaChain.js";
|
|
21
23
|
import { typesFilePath, versionedSchemaName, versionedTypeName } from "./runtimeSchema.js";
|
|
22
24
|
/**
|
|
@@ -33,7 +35,7 @@ function generateZodSchemasForVersion(version, ir) {
|
|
|
33
35
|
typeNames.push(versionedTypeName(modelKey, version));
|
|
34
36
|
} else if (modelDef.type === "union") {
|
|
35
37
|
typeNames.push(versionedTypeName(modelKey, version));
|
|
36
|
-
for (const variantName of Object.keys(modelDef.union.variants)) {
|
|
38
|
+
for (const variantName of [...Object.keys(modelDef.union.variants), UNKNOWN_UNION_VARIANT]) {
|
|
37
39
|
typeNames.push(`${versionedTypeName(modelKey, version)}${formatVariantName(variantName)}`);
|
|
38
40
|
}
|
|
39
41
|
}
|
|
@@ -90,6 +92,13 @@ function generateZodSchemasForVersion(version, ir) {
|
|
|
90
92
|
output += `}) satisfies ZodType<${variantTypeName}>;\n\n`;
|
|
91
93
|
}
|
|
92
94
|
}
|
|
95
|
+
const unknownSchemaName = `${versionedSchemaName(modelKey, version)}${UNKNOWN_VARIANT_SUFFIX}`;
|
|
96
|
+
const unknownTypeName = `${versionedTypeName(modelKey, version)}${UNKNOWN_VARIANT_SUFFIX}`;
|
|
97
|
+
output += `export const ${unknownSchemaName} = z.object({\n`;
|
|
98
|
+
output += ` ${discriminantField}: z.literal("${UNKNOWN_UNION_VARIANT}"),\n`;
|
|
99
|
+
output += ` rawValue: z.unknown()\n`;
|
|
100
|
+
output += `}) satisfies ZodType<${unknownTypeName}>;\n\n`;
|
|
101
|
+
variantSchemaNames.push(unknownSchemaName);
|
|
93
102
|
const unionZodSchemaName = versionedSchemaName(modelKey, version);
|
|
94
103
|
const typeName = versionedTypeName(modelKey, version);
|
|
95
104
|
output += `export const ${unionZodSchemaName} = z.discriminatedUnion("${discriminantField}", [\n ${variantSchemaNames.join(",\n ")}\n]) satisfies ZodType<${typeName}>;\n\n`;
|