@osdk/maker-experimental 0.6.0-beta.8 → 0.6.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.
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","names":["consola","createJiti","fs","path","invariant","yargs","hideBin","defineOntologyV2","ReadableIdGenerator","generateBackingDatasetBlockResult","getNonEditOnlyProperties","apiNamespaceRegex","uuidRegex","main","args","process","argv","log","commandLineOpts","version","wrap","Math","min","terminalWidth","strict","help","options","input","alias","describe","type","default","coerce","resolve","output","apiNamespace","buildDir","randomnessKey","parseAsync","length","slice","env","NODE_ENV","test","info","undefined","ontologyIr","shapes","backingDatasourceApiNames","loadOntology","blockDataDir","join","existsSync","promises","mkdir","recursive","ontologyJsonPath","ontologyJson","JSON","stringify","ontology","writeFile","ontologyInputMappingEntries","apiName","objectTypeBlockData","findObjectTypeByApiName","objectTypes","nonEditOnlyProps","inputDatasetReadableId","getForDataset","outputDatasetReadableId","getForDatasetOutput","inputShapes","has","push","prop","colInputReadableId","getForDatasetColumn","getForDatasetColumnOutput","backingDsGeneratorResults","Promise","all","filter","map","blockGeneratorResult","block_identifier","block_data_directory","oci_block_data_metadata","maven_block_data_metadata","inputs","Object","fromEntries","outputs","outputShapes","input_mapping_entries","external_recommendations","add_on_override","input_shape_metadata","inputShapeMetadata","block_type","blockGeneratorResultJson","success","result","jiti","import","meta","filename","moduleCache","debug","importMeta","values","find","objectType"],"sources":["main.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 { ObjectTypeBlockDataV2 } from \"@osdk/client.unstable\";\nimport { consola } from \"consola\";\nimport { createJiti } from \"jiti\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport invariant from \"tiny-invariant\";\nimport yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { defineOntologyV2 } from \"../api/defineOntologyV2.js\";\nimport { ReadableIdGenerator } from \"../util/generateRid.js\";\nimport {\n generateBackingDatasetBlockResult,\n getNonEditOnlyProperties,\n} from \"./generateBackingDataset.js\";\nimport type { BlockGeneratorResult } from \"./marketplaceSerialization/BlockGeneratorResult.js\";\nimport type { InputMappingEntry } from \"./marketplaceSerialization/supportingTypes.js\";\n\nconst apiNamespaceRegex = /^[a-z0-9-]+(\\.[a-z0-9-]+)*\\.$/;\nconst uuidRegex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\n\nexport default async function main(\n args: string[] = process.argv,\n): Promise<void> {\n consola.log(\"Generating BlockGeneratorResult for ontology...\");\n\n const commandLineOpts: {\n input: string;\n output: string;\n apiNamespace: string;\n buildDir: string;\n randomnessKey?: string;\n } = await yargs(hideBin(args))\n .version(process.env.PACKAGE_VERSION ?? \"\")\n .wrap(Math.min(150, yargs().terminalWidth()))\n .strict()\n .help()\n .options({\n input: {\n alias: \"i\",\n describe: \"Input file\",\n type: \"string\",\n default: \".ontology/ontology.ts\",\n coerce: path.resolve,\n },\n output: {\n alias: \"o\",\n describe: \"Output file for BlockGeneratorResult JSON\",\n type: \"string\",\n default: \"build/block_generator_result.json\",\n coerce: path.resolve,\n },\n apiNamespace: {\n describe: \"Api name prefix for namespaced ontology types\",\n type: \"string\",\n default: \"\",\n },\n buildDir: {\n alias: \"b\",\n describe: \"Directory for build files\",\n type: \"string\",\n default: \"build/\",\n coerce: path.resolve,\n },\n randomnessKey: {\n describe: \"Value used to assure uniqueness of entities\",\n type: \"string\",\n },\n })\n .parseAsync();\n\n let apiNamespace = \"\";\n if (commandLineOpts.apiNamespace.length !== 0) {\n apiNamespace = (commandLineOpts.apiNamespace.slice(-1) !== \".\")\n ? commandLineOpts.apiNamespace + \".\"\n : commandLineOpts.apiNamespace;\n invariant(apiNamespace.length < 1024, \"API namespace is too long.\");\n invariant(\n apiNamespaceRegex.test(apiNamespace),\n \"API namespace is invalid! It is expected to conform to ^[a-z0-9-]+(\\.[a-z0-9-]+)*\\.$\",\n );\n }\n consola.info(`Loading ontology from ${commandLineOpts.input}`);\n\n if (commandLineOpts.randomnessKey !== undefined) {\n invariant(\n uuidRegex.test(commandLineOpts.randomnessKey),\n \"Supplied randomness key is not a uuid and shouldn't be used as a uniqueness guarantee\",\n );\n }\n\n const { ontologyIr, shapes, backingDatasourceApiNames } = await loadOntology(\n commandLineOpts.input,\n apiNamespace,\n commandLineOpts.randomnessKey,\n );\n\n // Create temp directory for block data\n const blockDataDir = path.join(commandLineOpts.buildDir, \"temp_block_data\");\n if (!fs.existsSync(blockDataDir)) {\n await fs.promises.mkdir(blockDataDir, { recursive: true });\n }\n\n // Write ontology.json to the block data directory\n const ontologyJsonPath = path.join(blockDataDir, \"ontology.json\");\n const ontologyJson = JSON.stringify(ontologyIr.ontology, null, 2);\n await fs.promises.writeFile(ontologyJsonPath, ontologyJson);\n consola.info(`Wrote ontology.json to ${ontologyJsonPath}`);\n\n // Collect input_mapping_entries for the ontology block\n // These map ontology inputs to datasource block outputs for objects with includeEmptyBackingDatasource\n const ontologyInputMappingEntries: InputMappingEntry[] = [];\n\n for (const apiName of backingDatasourceApiNames) {\n const objectTypeBlockData = findObjectTypeByApiName(\n ontologyIr.ontology.objectTypes,\n apiName,\n );\n if (!objectTypeBlockData) continue;\n\n const nonEditOnlyProps = getNonEditOnlyProperties(objectTypeBlockData);\n\n // The ontology block has inputs with these readable IDs (from shape extraction)\n // Map them to the datasource block's outputs (which use the same readable IDs)\n const inputDatasetReadableId = ReadableIdGenerator.getForDataset(apiName);\n const outputDatasetReadableId = ReadableIdGenerator.getForDatasetOutput(\n apiName,\n );\n if (shapes.inputShapes.has(inputDatasetReadableId)) {\n ontologyInputMappingEntries.push({\n input: inputDatasetReadableId,\n output: outputDatasetReadableId,\n });\n }\n\n for (const prop of nonEditOnlyProps) {\n const colInputReadableId = ReadableIdGenerator.getForDatasetColumn(\n apiName,\n prop.apiName!,\n );\n const getForDatasetColumnOutput = ReadableIdGenerator\n .getForDatasetColumnOutput(apiName, prop.apiName!);\n if (shapes.inputShapes.has(colInputReadableId)) {\n ontologyInputMappingEntries.push({\n input: colInputReadableId,\n output: getForDatasetColumnOutput,\n });\n }\n }\n }\n\n // Generate backing datasource BlockGeneratorResults for objects with includeEmptyBackingDatasource\n const backingDsGeneratorResults = await Promise.all(\n backingDatasourceApiNames.filter(apiName => {\n const objectTypeBlockData = findObjectTypeByApiName(\n ontologyIr.ontology.objectTypes,\n apiName,\n );\n return objectTypeBlockData !== undefined;\n }).map(async apiName => {\n const objectTypeBlockData = findObjectTypeByApiName(\n ontologyIr.ontology.objectTypes,\n apiName,\n );\n consola.info(\n `Generating backing datasource BlockGeneratorResult for ${apiName}...`,\n );\n\n return await generateBackingDatasetBlockResult(\n objectTypeBlockData!,\n commandLineOpts.buildDir,\n commandLineOpts.randomnessKey,\n );\n }),\n );\n\n // Create BlockGeneratorResult\n const blockGeneratorResult: BlockGeneratorResult = {\n block_identifier: \"ontology\",\n block_data_directory: blockDataDir,\n oci_block_data_metadata: undefined,\n maven_block_data_metadata: undefined,\n inputs: Object.fromEntries(shapes.inputShapes),\n outputs: Object.fromEntries(shapes.outputShapes),\n input_mapping_entries: ontologyInputMappingEntries,\n external_recommendations: [],\n add_on_override: undefined,\n input_shape_metadata: Object.fromEntries(shapes.inputShapeMetadata),\n block_type: \"ONTOLOGY\",\n };\n\n // Write BlockGeneratorResult to output file\n const blockGeneratorResultJson = JSON.stringify(\n [blockGeneratorResult, ...backingDsGeneratorResults],\n null,\n 2,\n );\n await fs.promises.writeFile(\n commandLineOpts.output,\n blockGeneratorResultJson,\n );\n consola.success(\n `BlockGeneratorResult written to ${commandLineOpts.output}`,\n );\n consola.info(\n `Block data directory: ${blockDataDir}`,\n );\n}\n\nasync function loadOntology(\n input: string,\n apiNamespace: string,\n randomnessKey?: string,\n) {\n const result = await defineOntologyV2(\n apiNamespace,\n async () => {\n const jiti = createJiti(import.meta.filename, {\n moduleCache: true,\n debug: false,\n importMeta: import.meta,\n });\n const module = await jiti.import(input);\n },\n randomnessKey,\n );\n return result;\n}\n\n/**\n * Find an ObjectTypeBlockDataV2 by apiName within the ontology block data.\n */\nfunction findObjectTypeByApiName(\n objectTypes: Record<string, ObjectTypeBlockDataV2>,\n apiName: string,\n): ObjectTypeBlockDataV2 | undefined {\n return Object.values(objectTypes).find(\n (objectTypeBlockData) => objectTypeBlockData.objectType.apiName === apiName,\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"main.js","names":["cleanAndValidateLinkTypeId","consola","createJiti","fs","path","invariant","yargs","hideBin","defineOntologyV2","ReadableIdGenerator","generateBackingDatasetBlockResult","generateBackingDatasetBlockResultForLink","getNonEditOnlyProperties","apiNamespaceRegex","uuidRegex","main","args","process","argv","log","commandLineOpts","version","wrap","Math","min","terminalWidth","strict","help","options","input","alias","describe","type","default","coerce","resolve","output","apiNamespace","buildDir","randomnessKey","parseAsync","length","slice","env","NODE_ENV","test","info","undefined","ontologyIr","shapes","backingDatasourceApiNames","backingDatasourceLinkApiNames","loadOntology","blockDataDir","join","existsSync","promises","mkdir","recursive","ontologyJsonPath","ontologyJson","JSON","stringify","ontology","writeFile","ontologyInputMappingEntries","apiName","objectTypeBlockData","findObjectTypeByApiName","objectTypes","nonEditOnlyProps","inputDatasetReadableId","getForDataset","outputDatasetReadableId","getForDatasetOutput","inputShapes","has","push","prop","colInputReadableId","getForDatasetColumn","getForDatasetColumnOutput","linkApiName","linkTypeBlockData","findLinkTypeByApiName","linkTypes","datasetName","inputDsId","outputDsId","ds","datasources","datasource","columnNames","Object","values","dataset","objectTypeAPrimaryKeyMapping","map","String","objectTypeBPrimaryKeyMapping","colName","colInputId","colOutputId","backingDsGeneratorResults","Promise","all","filter","backingDsLinkGeneratorResults","p","blockGeneratorResult","block_identifier","block_data_directory","oci_block_data_metadata","maven_block_data_metadata","inputs","fromEntries","outputs","outputShapes","input_mapping_entries","external_recommendations","add_on_override","input_shape_metadata","inputShapeMetadata","block_type","blockGeneratorResultJson","success","result","jiti","import","meta","filename","moduleCache","debug","importMeta","find","objectType","linkTypeId","lt","linkType","id"],"sources":["main.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 {\n LinkTypeBlockDataV2,\n ObjectTypeBlockDataV2,\n} from \"@osdk/client.unstable\";\nimport { cleanAndValidateLinkTypeId } from \"@osdk/maker\";\nimport { consola } from \"consola\";\nimport { createJiti } from \"jiti\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport invariant from \"tiny-invariant\";\nimport yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { defineOntologyV2 } from \"../api/defineOntologyV2.js\";\nimport { ReadableIdGenerator } from \"../util/generateRid.js\";\nimport {\n generateBackingDatasetBlockResult,\n generateBackingDatasetBlockResultForLink,\n getNonEditOnlyProperties,\n} from \"./generateBackingDataset.js\";\nimport type { BlockGeneratorResult } from \"./marketplaceSerialization/BlockGeneratorResult.js\";\nimport type { InputMappingEntry } from \"./marketplaceSerialization/supportingTypes.js\";\n\nconst apiNamespaceRegex = /^[a-z0-9-]+(\\.[a-z0-9-]+)*\\.$/;\nconst uuidRegex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\n\nexport default async function main(\n args: string[] = process.argv,\n): Promise<void> {\n consola.log(\"Generating BlockGeneratorResult for ontology...\");\n\n const commandLineOpts: {\n input: string;\n output: string;\n apiNamespace: string;\n buildDir: string;\n randomnessKey?: string;\n } = await yargs(hideBin(args))\n .version(process.env.PACKAGE_VERSION ?? \"\")\n .wrap(Math.min(150, yargs().terminalWidth()))\n .strict()\n .help()\n .options({\n input: {\n alias: \"i\",\n describe: \"Input file\",\n type: \"string\",\n default: \".ontology/ontology.ts\",\n coerce: path.resolve,\n },\n output: {\n alias: \"o\",\n describe: \"Output file for BlockGeneratorResult JSON\",\n type: \"string\",\n default: \"build/block_generator_result.json\",\n coerce: path.resolve,\n },\n apiNamespace: {\n describe: \"Api name prefix for namespaced ontology types\",\n type: \"string\",\n default: \"\",\n },\n buildDir: {\n alias: \"b\",\n describe: \"Directory for build files\",\n type: \"string\",\n default: \"build/\",\n coerce: path.resolve,\n },\n randomnessKey: {\n describe: \"Value used to assure uniqueness of entities\",\n type: \"string\",\n },\n })\n .parseAsync();\n\n let apiNamespace = \"\";\n if (commandLineOpts.apiNamespace.length !== 0) {\n apiNamespace = (commandLineOpts.apiNamespace.slice(-1) !== \".\")\n ? commandLineOpts.apiNamespace + \".\"\n : commandLineOpts.apiNamespace;\n invariant(apiNamespace.length < 1024, \"API namespace is too long.\");\n invariant(\n apiNamespaceRegex.test(apiNamespace),\n \"API namespace is invalid! It is expected to conform to ^[a-z0-9-]+(\\.[a-z0-9-]+)*\\.$\",\n );\n }\n consola.info(`Loading ontology from ${commandLineOpts.input}`);\n\n if (commandLineOpts.randomnessKey !== undefined) {\n invariant(\n uuidRegex.test(commandLineOpts.randomnessKey),\n \"Supplied randomness key is not a uuid and shouldn't be used as a uniqueness guarantee\",\n );\n }\n\n const {\n ontologyIr,\n shapes,\n backingDatasourceApiNames,\n backingDatasourceLinkApiNames,\n } = await loadOntology(\n commandLineOpts.input,\n apiNamespace,\n commandLineOpts.randomnessKey,\n );\n\n // Create temp directory for block data\n const blockDataDir = path.join(commandLineOpts.buildDir, \"temp_block_data\");\n if (!fs.existsSync(blockDataDir)) {\n await fs.promises.mkdir(blockDataDir, { recursive: true });\n }\n\n // Write ontology.json to the block data directory\n const ontologyJsonPath = path.join(blockDataDir, \"ontology.json\");\n const ontologyJson = JSON.stringify(ontologyIr.ontology, null, 2);\n await fs.promises.writeFile(ontologyJsonPath, ontologyJson);\n consola.info(`Wrote ontology.json to ${ontologyJsonPath}`);\n\n // Collect input_mapping_entries for the ontology block\n // These map ontology inputs to datasource block outputs for objects with includeEmptyBackingDatasource\n const ontologyInputMappingEntries: InputMappingEntry[] = [];\n\n for (const apiName of backingDatasourceApiNames) {\n const objectTypeBlockData = findObjectTypeByApiName(\n ontologyIr.ontology.objectTypes,\n apiName,\n );\n if (!objectTypeBlockData) continue;\n\n const nonEditOnlyProps = getNonEditOnlyProperties(objectTypeBlockData);\n\n // The ontology block has inputs with these readable IDs (from shape extraction)\n // Map them to the datasource block's outputs (which use the same readable IDs)\n const inputDatasetReadableId = ReadableIdGenerator.getForDataset(apiName);\n const outputDatasetReadableId = ReadableIdGenerator.getForDatasetOutput(\n apiName,\n );\n if (shapes.inputShapes.has(inputDatasetReadableId)) {\n ontologyInputMappingEntries.push({\n input: inputDatasetReadableId,\n output: outputDatasetReadableId,\n });\n }\n\n for (const prop of nonEditOnlyProps) {\n const colInputReadableId = ReadableIdGenerator.getForDatasetColumn(\n apiName,\n prop.apiName!,\n );\n const getForDatasetColumnOutput = ReadableIdGenerator\n .getForDatasetColumnOutput(apiName, prop.apiName!);\n if (shapes.inputShapes.has(colInputReadableId)) {\n ontologyInputMappingEntries.push({\n input: colInputReadableId,\n output: getForDatasetColumnOutput,\n });\n }\n }\n }\n\n // Collect input_mapping_entries for link types with includeEmptyBackingDatasource\n for (const linkApiName of backingDatasourceLinkApiNames) {\n const linkTypeBlockData = findLinkTypeByApiName(\n ontologyIr.ontology.linkTypes,\n linkApiName,\n );\n if (!linkTypeBlockData) continue;\n\n const datasetName = `link.${linkApiName}`;\n\n // Map tabularDatasource\n const inputDsId = ReadableIdGenerator.getForDataset(datasetName);\n const outputDsId = ReadableIdGenerator.getForDatasetOutput(datasetName);\n if (shapes.inputShapes.has(inputDsId)) {\n ontologyInputMappingEntries.push({\n input: inputDsId,\n output: outputDsId,\n });\n }\n\n // Map columns from the datasource\n const ds = linkTypeBlockData.datasources[0]?.datasource;\n if (ds?.type === \"dataset\") {\n const columnNames = [\n ...Object.values(ds.dataset.objectTypeAPrimaryKeyMapping).map(String),\n ...Object.values(ds.dataset.objectTypeBPrimaryKeyMapping).map(String),\n ];\n for (const colName of columnNames) {\n const colInputId = ReadableIdGenerator.getForDatasetColumn(\n datasetName,\n colName,\n );\n const colOutputId = ReadableIdGenerator.getForDatasetColumnOutput(\n datasetName,\n colName,\n );\n if (shapes.inputShapes.has(colInputId)) {\n ontologyInputMappingEntries.push({\n input: colInputId,\n output: colOutputId,\n });\n }\n }\n }\n }\n\n // Generate backing datasource BlockGeneratorResults for objects with includeEmptyBackingDatasource\n const backingDsGeneratorResults = await Promise.all(\n backingDatasourceApiNames.filter(apiName => {\n const objectTypeBlockData = findObjectTypeByApiName(\n ontologyIr.ontology.objectTypes,\n apiName,\n );\n return objectTypeBlockData !== undefined;\n }).map(async apiName => {\n const objectTypeBlockData = findObjectTypeByApiName(\n ontologyIr.ontology.objectTypes,\n apiName,\n );\n consola.info(\n `Generating backing datasource BlockGeneratorResult for ${apiName}...`,\n );\n\n return await generateBackingDatasetBlockResult(\n objectTypeBlockData!,\n commandLineOpts.buildDir,\n commandLineOpts.randomnessKey,\n );\n }),\n );\n\n // Generate backing datasource BlockGeneratorResults for link types with includeEmptyBackingDatasource\n const backingDsLinkGeneratorResults = await Promise.all(\n backingDatasourceLinkApiNames\n .map(linkApiName => {\n const linkTypeBlockData = findLinkTypeByApiName(\n ontologyIr.ontology.linkTypes,\n linkApiName,\n );\n if (!linkTypeBlockData) return undefined;\n consola.info(\n `Generating backing datasource BlockGeneratorResult for link ${linkApiName}...`,\n );\n return generateBackingDatasetBlockResultForLink(\n linkTypeBlockData,\n linkApiName,\n ontologyIr.ontology.objectTypes,\n commandLineOpts.buildDir,\n commandLineOpts.randomnessKey,\n );\n })\n .filter(\n (p): p is Promise<BlockGeneratorResult> => p !== undefined,\n ),\n );\n\n // Create BlockGeneratorResult\n const blockGeneratorResult: BlockGeneratorResult = {\n block_identifier: \"ontology\",\n block_data_directory: blockDataDir,\n oci_block_data_metadata: undefined,\n maven_block_data_metadata: undefined,\n inputs: Object.fromEntries(shapes.inputShapes),\n outputs: Object.fromEntries(shapes.outputShapes),\n input_mapping_entries: ontologyInputMappingEntries,\n external_recommendations: [],\n add_on_override: undefined,\n input_shape_metadata: Object.fromEntries(shapes.inputShapeMetadata),\n block_type: \"ONTOLOGY\",\n };\n\n // Write BlockGeneratorResult to output file\n const blockGeneratorResultJson = JSON.stringify(\n [\n blockGeneratorResult,\n ...backingDsGeneratorResults,\n ...backingDsLinkGeneratorResults,\n ],\n null,\n 2,\n );\n await fs.promises.writeFile(\n commandLineOpts.output,\n blockGeneratorResultJson,\n );\n consola.success(\n `BlockGeneratorResult written to ${commandLineOpts.output}`,\n );\n consola.info(\n `Block data directory: ${blockDataDir}`,\n );\n}\n\nasync function loadOntology(\n input: string,\n apiNamespace: string,\n randomnessKey?: string,\n) {\n const result = await defineOntologyV2(\n apiNamespace,\n async () => {\n const jiti = createJiti(import.meta.filename, {\n moduleCache: true,\n debug: false,\n importMeta: import.meta,\n });\n const module = await jiti.import(input);\n },\n randomnessKey,\n );\n return result;\n}\n\n/**\n * Find an ObjectTypeBlockDataV2 by apiName within the ontology block data.\n */\nfunction findObjectTypeByApiName(\n objectTypes: Record<string, ObjectTypeBlockDataV2>,\n apiName: string,\n): ObjectTypeBlockDataV2 | undefined {\n return Object.values(objectTypes).find(\n (objectTypeBlockData) => objectTypeBlockData.objectType.apiName === apiName,\n );\n}\n\n/**\n * Find a LinkTypeBlockDataV2 by apiName within the ontology block data.\n */\nfunction findLinkTypeByApiName(\n linkTypes: Record<string, LinkTypeBlockDataV2>,\n apiName: string,\n): LinkTypeBlockDataV2 | undefined {\n const linkTypeId = cleanAndValidateLinkTypeId(apiName);\n return Object.values(linkTypes).find(\n (lt) => lt.linkType.id === linkTypeId,\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -207,7 +207,7 @@ export class LinkTypeShapeExtractor {
207
207
  for (const column of columns) {
208
208
  for (const [id, shape] of ridGenerator.getColumnShapes().entries()) {
209
209
  if (this.datasourceLocatorsMatch(shape.datasource, datasourceLocator) && shape.name === column) {
210
- columnReferences.push(id);
210
+ columnReferences.push(ridGenerator.toBlockInternalId(id));
211
211
  break;
212
212
  }
213
213
  }
@@ -240,7 +240,7 @@ export class LinkTypeShapeExtractor {
240
240
  any: {}
241
241
  }
242
242
  },
243
- datasource: datasourceReadableId,
243
+ datasource: ridGenerator.toBlockInternalId(datasourceReadableId),
244
244
  typeclasses: []
245
245
  };
246
246
  columnShapes.set(id, {
@@ -1 +1 @@
1
- {"version":3,"file":"LinkTypeShapeExtractor.js","names":["createLocalizedAbout","fallbackTitle","fallbackDescription","localizedTitle","localizedDescription","LinkTypeShapeExtractor","extract","linkReadableId","link","ridGenerator","editsEnabled","entityMetadata","arePatchesEnabled","definition","linkType","type","extractIntermediary","intermediary","extractManyToMany","manyToMany","datasources","extractOneToMany","oneToMany","Error","linkDefinition","outputShape","about","oneToManyLinkMetadata","displayMetadata","displayName","objectTypeShapeIdOneSide","getObjectTypeShapeId","objectTypeRidOneSide","objectTypeShapeIdManySide","objectTypeRidManySide","manyToOneLinkMetadata","cardinalityHint","inputShapes","Map","outputShapes","inputShapeMetadata","dataSources","linkTypeName","objectTypeAToBLinkMetadata","objectTypeBToALinkMetadata","objectTypeShapeIdA","objectTypeRidA","objectTypeShapeIdB","objectTypeRidB","editsSupport","objectsBackendVersion","datasetShapes","datasource","datasourceDefinition","datasourceLocator","columns","datasourceType","dataset","rid","datasetRid","branch","branchId","Set","Object","values","objectTypeAPrimaryKeyMapping","map","String","objectTypeBPrimaryKeyMapping","stream","streamLocator","streamLocatorRid","datasourceReadableId","id","loc","getDatasourceLocators","entries","datasourceLocatorsMatch","columnShapes","getColumnInputShapesForManyToManyDatasets","shape","set","datasourceShape","getInputShapeForManyToManyDatasource","objectTypeAShapeId","objectTypeBShapeId","intermediaryObjectTypeShapeId","intermediaryObjectTypeRid","aToIntermediaryLinkTypeShapeId","getLinkTypeShapeId","aToIntermediaryLinkTypeRid","intermediaryToBLinkTypeShapeId","intermediaryToBLinkTypeRid","objectTypeRid","readableId","getObjectTypeRids","inverse","get","toBlockInternalId","linkTypeRid","getLinkTypeRids","columnReferences","column","getColumnShapes","name","push","schema","supportedTypes","tabularDatasource","columnShape","generic","any","typeclasses","datasourceColumn","a","b","restrictedView"],"sources":["LinkTypeShapeExtractor.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 {\n IntermediaryLinkDefinition,\n LinkTypeBlockDataV2,\n LinkTypeRid,\n ManyToManyLinkDefinition,\n ObjectTypeRid,\n} from \"@osdk/client.unstable\";\nimport type {\n DatasourceColumnShape,\n DatasourceLocator,\n InputShape,\n LinkTypeIntermediaryShape,\n LinkTypeManyToManyOutputShape,\n LinkTypeOneToManyShape,\n LinkTypeOutputShape,\n LocalizedTitleAndDescription,\n TabularDatasourceInputShape,\n TabularDatasourceType,\n Void,\n} from \"@osdk/client.unstable/api\";\nimport type {\n BlockShapes,\n OntologyRidGenerator,\n ReadableId,\n} from \"../../../util/generateRid.js\";\n\n/**\n * Helper to create LocalizedTitleAndDescription with empty localizations\n */\nfunction createLocalizedAbout(\n fallbackTitle: string,\n fallbackDescription: string = \"\",\n): LocalizedTitleAndDescription {\n return {\n fallbackTitle,\n fallbackDescription,\n localizedTitle: {},\n localizedDescription: {},\n };\n}\n\n/**\n * TypeScript port of Java's LinkTypeShapeExtractor class\n */\nexport class LinkTypeShapeExtractor {\n /**\n * Extract shapes from a LinkType\n */\n extract(\n linkReadableId: ReadableId,\n link: LinkTypeBlockDataV2,\n ridGenerator: OntologyRidGenerator,\n ): BlockShapes {\n const editsEnabled = link.entityMetadata?.arePatchesEnabled ?? false;\n\n const definition = link.linkType.definition;\n\n switch (definition.type) {\n case \"intermediary\":\n return this.extractIntermediary(\n linkReadableId,\n definition.intermediary,\n ridGenerator,\n );\n case \"manyToMany\":\n return this.extractManyToMany(\n linkReadableId,\n definition.manyToMany,\n ridGenerator,\n link.datasources,\n editsEnabled,\n );\n case \"oneToMany\":\n return this.extractOneToMany(\n linkReadableId,\n definition.oneToMany,\n ridGenerator,\n );\n default:\n throw new Error(\n `Unknown link definition type: ${(definition as any).type}`,\n );\n }\n }\n\n /**\n * Extract one-to-many link shape\n */\n private extractOneToMany(\n linkReadableId: ReadableId,\n linkDefinition: any,\n ridGenerator: OntologyRidGenerator,\n ): BlockShapes {\n const outputShape: LinkTypeOneToManyShape = {\n about: createLocalizedAbout(\n linkDefinition.oneToManyLinkMetadata.displayMetadata.displayName,\n ),\n objectTypeShapeIdOneSide: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.objectTypeRidOneSide,\n ),\n objectTypeShapeIdManySide: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.objectTypeRidManySide,\n ),\n manyToOneLinkMetadata: createLocalizedAbout(\n linkDefinition.manyToOneLinkMetadata.displayMetadata.displayName,\n ),\n oneToManyLinkMetadata: createLocalizedAbout(\n linkDefinition.oneToManyLinkMetadata.displayMetadata.displayName,\n ),\n cardinalityHint: linkDefinition.cardinalityHint === \"ONE_TO_ONE\"\n ? \"ONE_TO_ONE\"\n : \"ONE_TO_MANY\",\n };\n\n return {\n inputShapes: new Map(),\n outputShapes: new Map([[linkReadableId, {\n type: \"linkType\",\n linkType: {\n type: \"oneToMany\",\n oneToMany: outputShape,\n } as LinkTypeOutputShape,\n }]]),\n inputShapeMetadata: new Map(),\n };\n }\n\n /**\n * Extract many-to-many link shape\n */\n private extractManyToMany(\n linkReadableId: ReadableId,\n linkDefinition: ManyToManyLinkDefinition,\n ridGenerator: OntologyRidGenerator,\n dataSources: any[],\n editsEnabled: boolean,\n ): BlockShapes {\n const linkTypeName =\n linkDefinition.objectTypeAToBLinkMetadata.displayMetadata.displayName;\n\n const outputShape: LinkTypeManyToManyOutputShape = {\n about: createLocalizedAbout(linkTypeName),\n objectTypeAToBLinkMetadata: createLocalizedAbout(\n linkDefinition.objectTypeAToBLinkMetadata.displayMetadata.displayName,\n ),\n objectTypeBToALinkMetadata: createLocalizedAbout(\n linkDefinition.objectTypeBToALinkMetadata.displayMetadata.displayName,\n ),\n objectTypeShapeIdA: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.objectTypeRidA,\n ),\n objectTypeShapeIdB: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.objectTypeRidB,\n ),\n editsSupport: editsEnabled ? \"EDITS_ENABLED\" : \"EDITS_DISABLED\",\n objectsBackendVersion: \"V2\",\n };\n\n const datasetShapes = new Map<ReadableId, InputShape>();\n\n for (const datasource of dataSources) {\n const datasourceDefinition = datasource.datasource;\n let datasourceLocator: DatasourceLocator;\n let columns: Set<string>;\n let datasourceType: TabularDatasourceType;\n\n if (datasourceDefinition.type === \"dataset\") {\n datasourceLocator = {\n type: \"dataset\",\n dataset: {\n rid: datasourceDefinition.dataset.datasetRid,\n branch: datasourceDefinition.dataset.branchId,\n },\n };\n columns = new Set([\n ...Object.values(\n datasourceDefinition.dataset.objectTypeAPrimaryKeyMapping,\n ).map(String),\n ...Object.values(\n datasourceDefinition.dataset.objectTypeBPrimaryKeyMapping,\n ).map(String),\n ]);\n datasourceType = \"DATASET\";\n } else if (datasourceDefinition.type === \"stream\") {\n datasourceLocator = {\n type: \"stream\",\n stream: {\n rid: datasourceDefinition.stream.streamLocator.streamLocatorRid,\n branch: datasourceDefinition.stream.streamLocator.branchId,\n },\n };\n columns = new Set([\n ...Object.values(\n datasourceDefinition.stream.objectTypeAPrimaryKeyMapping,\n ).map(String),\n ...Object.values(\n datasourceDefinition.stream.objectTypeBPrimaryKeyMapping,\n ).map(String),\n ]);\n datasourceType = \"STREAM\";\n } else {\n continue;\n }\n\n // Find datasource readable ID\n let datasourceReadableId: ReadableId | undefined;\n for (\n const [id, loc] of ridGenerator.getDatasourceLocators()\n .entries()\n ) {\n if (this.datasourceLocatorsMatch(loc, datasourceLocator)) {\n datasourceReadableId = id;\n break;\n }\n }\n\n if (!datasourceReadableId) continue;\n\n // Create column shapes\n const columnShapes = this.getColumnInputShapesForManyToManyDatasets(\n ridGenerator,\n columns,\n datasourceLocator,\n datasourceReadableId,\n );\n\n for (const [id, shape] of columnShapes.entries()) {\n datasetShapes.set(id, shape);\n }\n\n // Create datasource shape\n const datasourceShape = this.getInputShapeForManyToManyDatasource(\n ridGenerator,\n linkTypeName,\n columns,\n datasourceLocator,\n datasourceType,\n );\n\n datasetShapes.set(datasourceReadableId, datasourceShape);\n }\n\n return {\n inputShapes: datasetShapes,\n outputShapes: new Map([[linkReadableId, {\n type: \"linkType\",\n linkType: {\n type: \"manyToMany\",\n manyToMany: outputShape,\n } as LinkTypeOutputShape,\n }]]),\n inputShapeMetadata: new Map(),\n };\n }\n\n /**\n * Extract intermediary link shape\n */\n private extractIntermediary(\n linkReadableId: ReadableId,\n linkDefinition: IntermediaryLinkDefinition,\n ridGenerator: OntologyRidGenerator,\n ): BlockShapes {\n const outputShape: LinkTypeIntermediaryShape = {\n about: createLocalizedAbout(\n linkDefinition.objectTypeAToBLinkMetadata.displayMetadata.displayName,\n ),\n objectTypeAToBLinkMetadata: createLocalizedAbout(\n linkDefinition.objectTypeAToBLinkMetadata.displayMetadata.displayName,\n ),\n objectTypeBToALinkMetadata: createLocalizedAbout(\n linkDefinition.objectTypeBToALinkMetadata.displayMetadata.displayName,\n ),\n objectTypeAShapeId: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.objectTypeRidA,\n ),\n objectTypeBShapeId: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.objectTypeRidB,\n ),\n intermediaryObjectTypeShapeId: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.intermediaryObjectTypeRid,\n ),\n aToIntermediaryLinkTypeShapeId: this.getLinkTypeShapeId(\n ridGenerator,\n linkDefinition.aToIntermediaryLinkTypeRid,\n ),\n intermediaryToBLinkTypeShapeId: this.getLinkTypeShapeId(\n ridGenerator,\n linkDefinition.intermediaryToBLinkTypeRid,\n ),\n };\n\n return {\n inputShapes: new Map(),\n outputShapes: new Map([[linkReadableId, {\n type: \"linkType\",\n linkType: {\n type: \"intermediary\",\n intermediary: outputShape,\n } as LinkTypeOutputShape,\n }]]),\n inputShapeMetadata: new Map(),\n };\n }\n\n /**\n * Get object type shape ID reference\n */\n private getObjectTypeShapeId(\n ridGenerator: OntologyRidGenerator,\n objectTypeRid: ObjectTypeRid,\n ): string {\n const readableId = ridGenerator.getObjectTypeRids().inverse().get(\n objectTypeRid,\n );\n if (!readableId) {\n throw new Error(`Object type RID not found: ${objectTypeRid}`);\n }\n return ridGenerator.toBlockInternalId(readableId);\n }\n\n /**\n * Get link type shape ID reference\n */\n private getLinkTypeShapeId(\n ridGenerator: OntologyRidGenerator,\n linkTypeRid: LinkTypeRid,\n ): string {\n const readableId = ridGenerator.getLinkTypeRids().inverse().get(\n linkTypeRid,\n );\n if (!readableId) {\n throw new Error(`Object type RID not found: ${linkTypeRid}`);\n }\n return ridGenerator.toBlockInternalId(readableId);\n }\n\n /**\n * Get input shape for many-to-many datasource\n */\n private getInputShapeForManyToManyDatasource(\n ridGenerator: OntologyRidGenerator,\n linkTypeName: string,\n columns: Set<string>,\n datasourceLocator: DatasourceLocator,\n datasourceType: TabularDatasourceType,\n ): InputShape {\n const columnReferences: string[] = [];\n\n for (const column of columns) {\n for (\n const [id, shape] of ridGenerator.getColumnShapes().entries()\n ) {\n if (\n this.datasourceLocatorsMatch(shape.datasource, datasourceLocator)\n && shape.name === column\n ) {\n columnReferences.push(id);\n break;\n }\n }\n }\n\n const shape: TabularDatasourceInputShape = {\n about: createLocalizedAbout(linkTypeName),\n schema: columnReferences,\n supportedTypes: [datasourceType],\n };\n\n return {\n type: \"tabularDatasource\",\n tabularDatasource: shape,\n };\n }\n\n /**\n * Get column input shapes for many-to-many datasets\n */\n private getColumnInputShapesForManyToManyDatasets(\n ridGenerator: OntologyRidGenerator,\n columns: Set<string>,\n datasourceLocator: DatasourceLocator,\n datasourceReadableId: ReadableId,\n ): Map<ReadableId, InputShape> {\n const columnShapes = new Map<ReadableId, InputShape>();\n\n for (const column of columns) {\n for (\n const [id, shape] of ridGenerator.getColumnShapes().entries()\n ) {\n if (\n this.datasourceLocatorsMatch(shape.datasource, datasourceLocator)\n && shape.name === column\n ) {\n const columnShape: DatasourceColumnShape = {\n about: createLocalizedAbout(column),\n type: {\n type: \"generic\",\n generic: { type: \"any\", any: {} as Void },\n },\n datasource: datasourceReadableId,\n typeclasses: [],\n };\n\n columnShapes.set(id, {\n type: \"datasourceColumn\",\n datasourceColumn: columnShape,\n });\n break;\n }\n }\n }\n\n return columnShapes;\n }\n\n /**\n * Helper to compare datasource locators\n */\n private datasourceLocatorsMatch(\n a: DatasourceLocator,\n b: DatasourceLocator,\n ): boolean {\n if (a.type !== b.type) return false;\n\n if (a.type === \"dataset\" && b.type === \"dataset\") {\n return a.dataset.rid === b.dataset.rid\n && a.dataset.branch === b.dataset.branch;\n }\n\n if (a.type === \"stream\" && b.type === \"stream\") {\n return a.stream.rid === b.stream.rid\n && a.stream.branch === b.stream.branch;\n }\n\n if (a.type === \"restrictedView\" && b.type === \"restrictedView\") {\n return a.restrictedView.rid === b.restrictedView.rid;\n }\n\n return false;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"LinkTypeShapeExtractor.js","names":["createLocalizedAbout","fallbackTitle","fallbackDescription","localizedTitle","localizedDescription","LinkTypeShapeExtractor","extract","linkReadableId","link","ridGenerator","editsEnabled","entityMetadata","arePatchesEnabled","definition","linkType","type","extractIntermediary","intermediary","extractManyToMany","manyToMany","datasources","extractOneToMany","oneToMany","Error","linkDefinition","outputShape","about","oneToManyLinkMetadata","displayMetadata","displayName","objectTypeShapeIdOneSide","getObjectTypeShapeId","objectTypeRidOneSide","objectTypeShapeIdManySide","objectTypeRidManySide","manyToOneLinkMetadata","cardinalityHint","inputShapes","Map","outputShapes","inputShapeMetadata","dataSources","linkTypeName","objectTypeAToBLinkMetadata","objectTypeBToALinkMetadata","objectTypeShapeIdA","objectTypeRidA","objectTypeShapeIdB","objectTypeRidB","editsSupport","objectsBackendVersion","datasetShapes","datasource","datasourceDefinition","datasourceLocator","columns","datasourceType","dataset","rid","datasetRid","branch","branchId","Set","Object","values","objectTypeAPrimaryKeyMapping","map","String","objectTypeBPrimaryKeyMapping","stream","streamLocator","streamLocatorRid","datasourceReadableId","id","loc","getDatasourceLocators","entries","datasourceLocatorsMatch","columnShapes","getColumnInputShapesForManyToManyDatasets","shape","set","datasourceShape","getInputShapeForManyToManyDatasource","objectTypeAShapeId","objectTypeBShapeId","intermediaryObjectTypeShapeId","intermediaryObjectTypeRid","aToIntermediaryLinkTypeShapeId","getLinkTypeShapeId","aToIntermediaryLinkTypeRid","intermediaryToBLinkTypeShapeId","intermediaryToBLinkTypeRid","objectTypeRid","readableId","getObjectTypeRids","inverse","get","toBlockInternalId","linkTypeRid","getLinkTypeRids","columnReferences","column","getColumnShapes","name","push","schema","supportedTypes","tabularDatasource","columnShape","generic","any","typeclasses","datasourceColumn","a","b","restrictedView"],"sources":["LinkTypeShapeExtractor.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 {\n IntermediaryLinkDefinition,\n LinkTypeBlockDataV2,\n LinkTypeRid,\n ManyToManyLinkDefinition,\n ObjectTypeRid,\n} from \"@osdk/client.unstable\";\nimport type {\n DatasourceColumnShape,\n DatasourceLocator,\n InputShape,\n LinkTypeIntermediaryShape,\n LinkTypeManyToManyOutputShape,\n LinkTypeOneToManyShape,\n LinkTypeOutputShape,\n LocalizedTitleAndDescription,\n TabularDatasourceInputShape,\n TabularDatasourceType,\n Void,\n} from \"@osdk/client.unstable/api\";\nimport type {\n BlockShapes,\n OntologyRidGenerator,\n ReadableId,\n} from \"../../../util/generateRid.js\";\n\n/**\n * Helper to create LocalizedTitleAndDescription with empty localizations\n */\nfunction createLocalizedAbout(\n fallbackTitle: string,\n fallbackDescription: string = \"\",\n): LocalizedTitleAndDescription {\n return {\n fallbackTitle,\n fallbackDescription,\n localizedTitle: {},\n localizedDescription: {},\n };\n}\n\n/**\n * TypeScript port of Java's LinkTypeShapeExtractor class\n */\nexport class LinkTypeShapeExtractor {\n /**\n * Extract shapes from a LinkType\n */\n extract(\n linkReadableId: ReadableId,\n link: LinkTypeBlockDataV2,\n ridGenerator: OntologyRidGenerator,\n ): BlockShapes {\n const editsEnabled = link.entityMetadata?.arePatchesEnabled ?? false;\n\n const definition = link.linkType.definition;\n\n switch (definition.type) {\n case \"intermediary\":\n return this.extractIntermediary(\n linkReadableId,\n definition.intermediary,\n ridGenerator,\n );\n case \"manyToMany\":\n return this.extractManyToMany(\n linkReadableId,\n definition.manyToMany,\n ridGenerator,\n link.datasources,\n editsEnabled,\n );\n case \"oneToMany\":\n return this.extractOneToMany(\n linkReadableId,\n definition.oneToMany,\n ridGenerator,\n );\n default:\n throw new Error(\n `Unknown link definition type: ${(definition as any).type}`,\n );\n }\n }\n\n /**\n * Extract one-to-many link shape\n */\n private extractOneToMany(\n linkReadableId: ReadableId,\n linkDefinition: any,\n ridGenerator: OntologyRidGenerator,\n ): BlockShapes {\n const outputShape: LinkTypeOneToManyShape = {\n about: createLocalizedAbout(\n linkDefinition.oneToManyLinkMetadata.displayMetadata.displayName,\n ),\n objectTypeShapeIdOneSide: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.objectTypeRidOneSide,\n ),\n objectTypeShapeIdManySide: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.objectTypeRidManySide,\n ),\n manyToOneLinkMetadata: createLocalizedAbout(\n linkDefinition.manyToOneLinkMetadata.displayMetadata.displayName,\n ),\n oneToManyLinkMetadata: createLocalizedAbout(\n linkDefinition.oneToManyLinkMetadata.displayMetadata.displayName,\n ),\n cardinalityHint: linkDefinition.cardinalityHint === \"ONE_TO_ONE\"\n ? \"ONE_TO_ONE\"\n : \"ONE_TO_MANY\",\n };\n\n return {\n inputShapes: new Map(),\n outputShapes: new Map([[linkReadableId, {\n type: \"linkType\",\n linkType: {\n type: \"oneToMany\",\n oneToMany: outputShape,\n } as LinkTypeOutputShape,\n }]]),\n inputShapeMetadata: new Map(),\n };\n }\n\n /**\n * Extract many-to-many link shape\n */\n private extractManyToMany(\n linkReadableId: ReadableId,\n linkDefinition: ManyToManyLinkDefinition,\n ridGenerator: OntologyRidGenerator,\n dataSources: any[],\n editsEnabled: boolean,\n ): BlockShapes {\n const linkTypeName =\n linkDefinition.objectTypeAToBLinkMetadata.displayMetadata.displayName;\n\n const outputShape: LinkTypeManyToManyOutputShape = {\n about: createLocalizedAbout(linkTypeName),\n objectTypeAToBLinkMetadata: createLocalizedAbout(\n linkDefinition.objectTypeAToBLinkMetadata.displayMetadata.displayName,\n ),\n objectTypeBToALinkMetadata: createLocalizedAbout(\n linkDefinition.objectTypeBToALinkMetadata.displayMetadata.displayName,\n ),\n objectTypeShapeIdA: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.objectTypeRidA,\n ),\n objectTypeShapeIdB: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.objectTypeRidB,\n ),\n editsSupport: editsEnabled ? \"EDITS_ENABLED\" : \"EDITS_DISABLED\",\n objectsBackendVersion: \"V2\",\n };\n\n const datasetShapes = new Map<ReadableId, InputShape>();\n\n for (const datasource of dataSources) {\n const datasourceDefinition = datasource.datasource;\n let datasourceLocator: DatasourceLocator;\n let columns: Set<string>;\n let datasourceType: TabularDatasourceType;\n\n if (datasourceDefinition.type === \"dataset\") {\n datasourceLocator = {\n type: \"dataset\",\n dataset: {\n rid: datasourceDefinition.dataset.datasetRid,\n branch: datasourceDefinition.dataset.branchId,\n },\n };\n columns = new Set([\n ...Object.values(\n datasourceDefinition.dataset.objectTypeAPrimaryKeyMapping,\n ).map(String),\n ...Object.values(\n datasourceDefinition.dataset.objectTypeBPrimaryKeyMapping,\n ).map(String),\n ]);\n datasourceType = \"DATASET\";\n } else if (datasourceDefinition.type === \"stream\") {\n datasourceLocator = {\n type: \"stream\",\n stream: {\n rid: datasourceDefinition.stream.streamLocator.streamLocatorRid,\n branch: datasourceDefinition.stream.streamLocator.branchId,\n },\n };\n columns = new Set([\n ...Object.values(\n datasourceDefinition.stream.objectTypeAPrimaryKeyMapping,\n ).map(String),\n ...Object.values(\n datasourceDefinition.stream.objectTypeBPrimaryKeyMapping,\n ).map(String),\n ]);\n datasourceType = \"STREAM\";\n } else {\n continue;\n }\n\n // Find datasource readable ID\n let datasourceReadableId: ReadableId | undefined;\n for (\n const [id, loc] of ridGenerator.getDatasourceLocators()\n .entries()\n ) {\n if (this.datasourceLocatorsMatch(loc, datasourceLocator)) {\n datasourceReadableId = id;\n break;\n }\n }\n\n if (!datasourceReadableId) continue;\n\n // Create column shapes\n const columnShapes = this.getColumnInputShapesForManyToManyDatasets(\n ridGenerator,\n columns,\n datasourceLocator,\n datasourceReadableId,\n );\n\n for (const [id, shape] of columnShapes.entries()) {\n datasetShapes.set(id, shape);\n }\n\n // Create datasource shape\n const datasourceShape = this.getInputShapeForManyToManyDatasource(\n ridGenerator,\n linkTypeName,\n columns,\n datasourceLocator,\n datasourceType,\n );\n\n datasetShapes.set(datasourceReadableId, datasourceShape);\n }\n\n return {\n inputShapes: datasetShapes,\n outputShapes: new Map([[linkReadableId, {\n type: \"linkType\",\n linkType: {\n type: \"manyToMany\",\n manyToMany: outputShape,\n } as LinkTypeOutputShape,\n }]]),\n inputShapeMetadata: new Map(),\n };\n }\n\n /**\n * Extract intermediary link shape\n */\n private extractIntermediary(\n linkReadableId: ReadableId,\n linkDefinition: IntermediaryLinkDefinition,\n ridGenerator: OntologyRidGenerator,\n ): BlockShapes {\n const outputShape: LinkTypeIntermediaryShape = {\n about: createLocalizedAbout(\n linkDefinition.objectTypeAToBLinkMetadata.displayMetadata.displayName,\n ),\n objectTypeAToBLinkMetadata: createLocalizedAbout(\n linkDefinition.objectTypeAToBLinkMetadata.displayMetadata.displayName,\n ),\n objectTypeBToALinkMetadata: createLocalizedAbout(\n linkDefinition.objectTypeBToALinkMetadata.displayMetadata.displayName,\n ),\n objectTypeAShapeId: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.objectTypeRidA,\n ),\n objectTypeBShapeId: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.objectTypeRidB,\n ),\n intermediaryObjectTypeShapeId: this.getObjectTypeShapeId(\n ridGenerator,\n linkDefinition.intermediaryObjectTypeRid,\n ),\n aToIntermediaryLinkTypeShapeId: this.getLinkTypeShapeId(\n ridGenerator,\n linkDefinition.aToIntermediaryLinkTypeRid,\n ),\n intermediaryToBLinkTypeShapeId: this.getLinkTypeShapeId(\n ridGenerator,\n linkDefinition.intermediaryToBLinkTypeRid,\n ),\n };\n\n return {\n inputShapes: new Map(),\n outputShapes: new Map([[linkReadableId, {\n type: \"linkType\",\n linkType: {\n type: \"intermediary\",\n intermediary: outputShape,\n } as LinkTypeOutputShape,\n }]]),\n inputShapeMetadata: new Map(),\n };\n }\n\n /**\n * Get object type shape ID reference\n */\n private getObjectTypeShapeId(\n ridGenerator: OntologyRidGenerator,\n objectTypeRid: ObjectTypeRid,\n ): string {\n const readableId = ridGenerator.getObjectTypeRids().inverse().get(\n objectTypeRid,\n );\n if (!readableId) {\n throw new Error(`Object type RID not found: ${objectTypeRid}`);\n }\n return ridGenerator.toBlockInternalId(readableId);\n }\n\n /**\n * Get link type shape ID reference\n */\n private getLinkTypeShapeId(\n ridGenerator: OntologyRidGenerator,\n linkTypeRid: LinkTypeRid,\n ): string {\n const readableId = ridGenerator.getLinkTypeRids().inverse().get(\n linkTypeRid,\n );\n if (!readableId) {\n throw new Error(`Object type RID not found: ${linkTypeRid}`);\n }\n return ridGenerator.toBlockInternalId(readableId);\n }\n\n /**\n * Get input shape for many-to-many datasource\n */\n private getInputShapeForManyToManyDatasource(\n ridGenerator: OntologyRidGenerator,\n linkTypeName: string,\n columns: Set<string>,\n datasourceLocator: DatasourceLocator,\n datasourceType: TabularDatasourceType,\n ): InputShape {\n const columnReferences: string[] = [];\n\n for (const column of columns) {\n for (\n const [id, shape] of ridGenerator.getColumnShapes().entries()\n ) {\n if (\n this.datasourceLocatorsMatch(shape.datasource, datasourceLocator)\n && shape.name === column\n ) {\n columnReferences.push(ridGenerator.toBlockInternalId(id));\n break;\n }\n }\n }\n\n const shape: TabularDatasourceInputShape = {\n about: createLocalizedAbout(linkTypeName),\n schema: columnReferences,\n supportedTypes: [datasourceType],\n };\n\n return {\n type: \"tabularDatasource\",\n tabularDatasource: shape,\n };\n }\n\n /**\n * Get column input shapes for many-to-many datasets\n */\n private getColumnInputShapesForManyToManyDatasets(\n ridGenerator: OntologyRidGenerator,\n columns: Set<string>,\n datasourceLocator: DatasourceLocator,\n datasourceReadableId: ReadableId,\n ): Map<ReadableId, InputShape> {\n const columnShapes = new Map<ReadableId, InputShape>();\n\n for (const column of columns) {\n for (\n const [id, shape] of ridGenerator.getColumnShapes().entries()\n ) {\n if (\n this.datasourceLocatorsMatch(shape.datasource, datasourceLocator)\n && shape.name === column\n ) {\n const columnShape: DatasourceColumnShape = {\n about: createLocalizedAbout(column),\n type: {\n type: \"generic\",\n generic: { type: \"any\", any: {} as Void },\n },\n datasource: ridGenerator.toBlockInternalId(datasourceReadableId),\n typeclasses: [],\n };\n\n columnShapes.set(id, {\n type: \"datasourceColumn\",\n datasourceColumn: columnShape,\n });\n break;\n }\n }\n }\n\n return columnShapes;\n }\n\n /**\n * Helper to compare datasource locators\n */\n private datasourceLocatorsMatch(\n a: DatasourceLocator,\n b: DatasourceLocator,\n ): boolean {\n if (a.type !== b.type) return false;\n\n if (a.type === \"dataset\" && b.type === \"dataset\") {\n return a.dataset.rid === b.dataset.rid\n && a.dataset.branch === b.dataset.branch;\n }\n\n if (a.type === \"stream\" && b.type === \"stream\") {\n return a.stream.rid === b.stream.rid\n && a.stream.branch === b.stream.branch;\n }\n\n if (a.type === \"restrictedView\" && b.type === \"restrictedView\") {\n return a.restrictedView.rid === b.restrictedView.rid;\n }\n\n return false;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var chunkXMO5RRJG_cjs = require('./chunk-XMO5RRJG.cjs');
6
+ var maker = require('@osdk/maker');
6
7
  var consola = require('consola');
7
8
  var jiti = require('jiti');
8
9
  var fs = require('fs');
@@ -10,7 +11,6 @@ var path = require('path');
10
11
  var invariant5 = require('tiny-invariant');
11
12
  var yargs = require('yargs');
12
13
  var helpers = require('yargs/helpers');
13
- var maker = require('@osdk/maker');
14
14
 
15
15
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
16
16
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -2989,7 +2989,7 @@ var LinkTypeShapeExtractor = class {
2989
2989
  for (const column of columns) {
2990
2990
  for (const [id, shape2] of ridGenerator.getColumnShapes().entries()) {
2991
2991
  if (this.datasourceLocatorsMatch(shape2.datasource, datasourceLocator) && shape2.name === column) {
2992
- columnReferences.push(id);
2992
+ columnReferences.push(ridGenerator.toBlockInternalId(id));
2993
2993
  break;
2994
2994
  }
2995
2995
  }
@@ -3021,7 +3021,7 @@ var LinkTypeShapeExtractor = class {
3021
3021
  any: {}
3022
3022
  }
3023
3023
  },
3024
- datasource: datasourceReadableId,
3024
+ datasource: ridGenerator.toBlockInternalId(datasourceReadableId),
3025
3025
  typeclasses: []
3026
3026
  };
3027
3027
  columnShapes.set(id, {
@@ -4052,10 +4052,15 @@ async function defineOntologyV2(ns, body, randomnessKey) {
4052
4052
  const ontDef = convertOntologyDefinition(ontologyDefinition, ridGenerator, randomnessKey);
4053
4053
  const shapes = await getShapes(ontDef.ontology, ridGenerator, randomnessKey);
4054
4054
  const backingDatasourceApiNames = Object.entries(ontologyDefinition[maker.OntologyEntityTypeEnum.OBJECT_TYPE]).filter(([_, obj]) => obj.includeEmptyBackingDatasource === true).map(([apiName]) => apiName);
4055
+ const backingDatasourceLinkApiNames = Object.entries(ontologyDefinition[maker.OntologyEntityTypeEnum.LINK_TYPE]).filter(([_, link]) => {
4056
+ const lt = link;
4057
+ return "many" in lt && !("intermediaryObjectType" in lt) && lt.includeEmptyBackingDatasource === true;
4058
+ }).map(([apiName]) => apiName);
4055
4059
  return {
4056
4060
  ontologyIr: ontDef,
4057
4061
  shapes,
4058
- backingDatasourceApiNames
4062
+ backingDatasourceApiNames,
4063
+ backingDatasourceLinkApiNames
4059
4064
  };
4060
4065
  }
4061
4066
  function propertyTypeToSchemaType(propType) {
@@ -4109,23 +4114,16 @@ function getNonEditOnlyProperties(objectTypeBlockData) {
4109
4114
  const editOnlyRids = getEditOnlyPropertyRids(objectTypeBlockData.datasources);
4110
4115
  return Object.entries(objectTypeBlockData.objectType.propertyTypes).filter(([rid]) => !editOnlyRids.has(rid)).map(([_, prop]) => prop);
4111
4116
  }
4112
- async function generateBackingDatasetBlockResult(objectTypeBlockData, buildDir, randomnessKey) {
4113
- const apiName = objectTypeBlockData.objectType.apiName;
4114
- const nonEditOnlyProps = getNonEditOnlyProperties(objectTypeBlockData);
4115
- const dsName = `${apiName}-backing-ds`;
4117
+ async function generateBackingDatasetBlock(datasetName, blockIdentifier, dirSuffix, columns, buildDir, randomnessKey) {
4116
4118
  const outputs = {};
4117
- const datasourceReadableId = chunkXMO5RRJG_cjs.ReadableIdGenerator.getForDatasetOutput(apiName);
4118
- const columnReadableIds = [];
4119
- for (const prop of nonEditOnlyProps) {
4120
- const colReadableId = chunkXMO5RRJG_cjs.ReadableIdGenerator.getForDatasetColumnOutput(apiName, prop.apiName);
4121
- columnReadableIds.push(colReadableId);
4122
- }
4119
+ const datasourceReadableId = chunkXMO5RRJG_cjs.ReadableIdGenerator.getForDatasetOutput(datasetName);
4120
+ const columnReadableIds = columns.map((col) => chunkXMO5RRJG_cjs.ReadableIdGenerator.getForDatasetColumnOutput(datasetName, col.name));
4123
4121
  const datasourceBlockInternalId = chunkXMO5RRJG_cjs.toBlockShapeId(datasourceReadableId, randomnessKey);
4124
4122
  outputs[datasourceReadableId] = {
4125
4123
  type: "tabularDatasource",
4126
4124
  tabularDatasource: {
4127
4125
  about: {
4128
- fallbackTitle: dsName,
4126
+ fallbackTitle: blockIdentifier,
4129
4127
  fallbackDescription: "",
4130
4128
  localizedTitle: {},
4131
4129
  localizedDescription: {}
@@ -4137,32 +4135,32 @@ async function generateBackingDatasetBlockResult(objectTypeBlockData, buildDir,
4137
4135
  }
4138
4136
  }
4139
4137
  };
4140
- for (let i = 0; i < nonEditOnlyProps.length; i++) {
4141
- const prop = nonEditOnlyProps[i];
4138
+ for (let i = 0; i < columns.length; i++) {
4139
+ const col = columns[i];
4142
4140
  const colReadableId = columnReadableIds[i];
4143
4141
  outputs[colReadableId] = {
4144
4142
  type: "datasourceColumn",
4145
4143
  datasourceColumn: {
4146
4144
  about: {
4147
- fallbackTitle: prop.apiName,
4145
+ fallbackTitle: col.name,
4148
4146
  fallbackDescription: "",
4149
4147
  localizedTitle: {},
4150
4148
  localizedDescription: {}
4151
4149
  },
4152
4150
  type: {
4153
4151
  type: "concrete",
4154
- concrete: typeToConcreteDataType(prop.type)
4152
+ concrete: typeToConcreteDataType(col.type)
4155
4153
  },
4156
4154
  datasource: datasourceBlockInternalId,
4157
4155
  typeclasses: []
4158
4156
  }
4159
4157
  };
4160
4158
  }
4161
- const columnInternalIds = nonEditOnlyProps.map((prop) => chunkXMO5RRJG_cjs.toBlockShapeId(`column-internal-${apiName}-${prop.apiName}`, randomnessKey));
4162
- const compassReadableId = `${dsName}-compass-resource`;
4159
+ const columnInternalIds = columns.map((col) => chunkXMO5RRJG_cjs.toBlockShapeId(`column-internal-${datasetName}-${col.name}`, randomnessKey));
4160
+ const compassReadableId = `${blockIdentifier}-compass-resource`;
4163
4161
  const compassBlockShapeId = chunkXMO5RRJG_cjs.toBlockShapeId(compassReadableId, randomnessKey);
4164
- const datasourceInternalId = chunkXMO5RRJG_cjs.toBlockShapeId(`datasource-internal-${apiName}`, randomnessKey);
4165
- const locationInternalId = chunkXMO5RRJG_cjs.toBlockShapeId(`location-internal-${apiName}`, randomnessKey);
4162
+ const datasourceInternalId = chunkXMO5RRJG_cjs.toBlockShapeId(`datasource-internal-${datasetName}`, randomnessKey);
4163
+ const locationInternalId = chunkXMO5RRJG_cjs.toBlockShapeId(`location-internal-${datasetName}`, randomnessKey);
4166
4164
  const addOnOverride = {
4167
4165
  idToBlockShapeId: {
4168
4166
  "dataset-internal-shape-id": datasourceBlockInternalId,
@@ -4175,14 +4173,14 @@ async function generateBackingDatasetBlockResult(objectTypeBlockData, buildDir,
4175
4173
  [datasourceBlockInternalId]: compassBlockShapeId
4176
4174
  }
4177
4175
  };
4178
- const dsBlockDataDir = path__namespace.join(buildDir, `temp_block_data_${apiName}_backing_ds`);
4176
+ const dsBlockDataDir = path__namespace.join(buildDir, `temp_block_data_${dirSuffix}`);
4179
4177
  await fs__namespace.promises.mkdir(dsBlockDataDir, {
4180
4178
  recursive: true
4181
4179
  });
4182
4180
  const schemaJson = {
4183
- fieldSchemaList: nonEditOnlyProps.map((prop) => ({
4184
- type: propertyTypeToSchemaType(prop.type),
4185
- name: prop.apiName,
4181
+ fieldSchemaList: columns.map((col) => ({
4182
+ type: propertyTypeToSchemaType(col.type),
4183
+ name: col.name,
4186
4184
  nullable: null,
4187
4185
  userDefinedTypeClass: null,
4188
4186
  customMetadata: {},
@@ -4204,7 +4202,7 @@ async function generateBackingDatasetBlockResult(objectTypeBlockData, buildDir,
4204
4202
  const blockDataJson = {
4205
4203
  type: "v1",
4206
4204
  v1: {
4207
- columns: Object.fromEntries(nonEditOnlyProps.map((prop, i) => [columnInternalIds[i], prop.apiName])),
4205
+ columns: Object.fromEntries(columns.map((col, i) => [columnInternalIds[i], col.name])),
4208
4206
  hasSchema: true
4209
4207
  }
4210
4208
  };
@@ -4217,7 +4215,7 @@ async function generateBackingDatasetBlockResult(objectTypeBlockData, buildDir,
4217
4215
  type: "compassResource",
4218
4216
  compassResource: {
4219
4217
  about: {
4220
- fallbackTitle: dsName,
4218
+ fallbackTitle: blockIdentifier,
4221
4219
  fallbackDescription: "",
4222
4220
  localizedTitle: {},
4223
4221
  localizedDescription: {}
@@ -4232,7 +4230,7 @@ async function generateBackingDatasetBlockResult(objectTypeBlockData, buildDir,
4232
4230
  }
4233
4231
  };
4234
4232
  return {
4235
- block_identifier: dsName,
4233
+ block_identifier: blockIdentifier,
4236
4234
  block_data_directory: dsBlockDataDir,
4237
4235
  oci_block_data_metadata: void 0,
4238
4236
  maven_block_data_metadata: void 0,
@@ -4245,13 +4243,55 @@ async function generateBackingDatasetBlockResult(objectTypeBlockData, buildDir,
4245
4243
  block_type: "STATIC_DATASET"
4246
4244
  };
4247
4245
  }
4246
+ async function generateBackingDatasetBlockResult(objectTypeBlockData, buildDir, randomnessKey) {
4247
+ const apiName = objectTypeBlockData.objectType.apiName;
4248
+ const nonEditOnlyProps = getNonEditOnlyProperties(objectTypeBlockData);
4249
+ const columns = nonEditOnlyProps.map((prop) => ({
4250
+ name: prop.apiName,
4251
+ type: prop.type
4252
+ }));
4253
+ return generateBackingDatasetBlock(apiName, `${apiName}-backing-ds`, `${apiName}_backing_ds`, columns, buildDir, randomnessKey);
4254
+ }
4255
+ async function generateBackingDatasetBlockResultForLink(linkTypeBlockData, linkApiName, objectTypes, buildDir, randomnessKey) {
4256
+ const definition = linkTypeBlockData.linkType.definition;
4257
+ if (definition.type !== "manyToMany") {
4258
+ throw new Error(`Link type "${linkApiName}" is not a many-to-many link type`);
4259
+ }
4260
+ const m2m = definition.manyToMany;
4261
+ const datasource = linkTypeBlockData.datasources[0]?.datasource;
4262
+ if (!datasource || datasource.type !== "dataset") {
4263
+ throw new Error(`Link type "${linkApiName}" does not have a dataset datasource`);
4264
+ }
4265
+ const ds = datasource.dataset;
4266
+ const pkRidA = Object.keys(ds.objectTypeAPrimaryKeyMapping)[0];
4267
+ const columnA = Object.values(ds.objectTypeAPrimaryKeyMapping)[0];
4268
+ const pkRidB = Object.keys(ds.objectTypeBPrimaryKeyMapping)[0];
4269
+ const columnB = Object.values(ds.objectTypeBPrimaryKeyMapping)[0];
4270
+ const objectTypeA = objectTypes[m2m.objectTypeRidA];
4271
+ const objectTypeB = objectTypes[m2m.objectTypeRidB];
4272
+ if (!objectTypeA || !objectTypeB) {
4273
+ throw new Error(`Could not find object types for link "${linkApiName}"`);
4274
+ }
4275
+ const propTypeA = objectTypeA.objectType.propertyTypes[pkRidA]?.type;
4276
+ const propTypeB = objectTypeB.objectType.propertyTypes[pkRidB]?.type;
4277
+ if (!propTypeA || !propTypeB) {
4278
+ throw new Error(`Could not find primary key property types for link "${linkApiName}"`);
4279
+ }
4280
+ return generateBackingDatasetBlock(`link.${linkApiName}`, `${linkApiName}-link-backing-ds`, `${linkApiName}_link_backing_ds`, [{
4281
+ name: columnA,
4282
+ type: propTypeA
4283
+ }, {
4284
+ name: columnB,
4285
+ type: propTypeB
4286
+ }], buildDir, randomnessKey);
4287
+ }
4248
4288
 
4249
4289
  // src/cli/main.ts
4250
4290
  var apiNamespaceRegex = /^[a-z0-9-]+(\.[a-z0-9-]+)*\.$/;
4251
4291
  var uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
4252
4292
  async function main(args = process.argv) {
4253
4293
  consola.consola.log("Generating BlockGeneratorResult for ontology...");
4254
- const commandLineOpts = await yargs__default.default(helpers.hideBin(args)).version("0.6.0-beta.8").wrap(Math.min(150, yargs__default.default().terminalWidth())).strict().help().options({
4294
+ const commandLineOpts = await yargs__default.default(helpers.hideBin(args)).version("0.6.0").wrap(Math.min(150, yargs__default.default().terminalWidth())).strict().help().options({
4255
4295
  input: {
4256
4296
  alias: "i",
4257
4297
  describe: "Input file",
@@ -4296,7 +4336,8 @@ async function main(args = process.argv) {
4296
4336
  const {
4297
4337
  ontologyIr,
4298
4338
  shapes,
4299
- backingDatasourceApiNames
4339
+ backingDatasourceApiNames,
4340
+ backingDatasourceLinkApiNames
4300
4341
  } = await loadOntology(commandLineOpts.input, apiNamespace, commandLineOpts.randomnessKey);
4301
4342
  const blockDataDir = path__namespace.join(commandLineOpts.buildDir, "temp_block_data");
4302
4343
  if (!fs__namespace.existsSync(blockDataDir)) {
@@ -4332,6 +4373,33 @@ async function main(args = process.argv) {
4332
4373
  }
4333
4374
  }
4334
4375
  }
4376
+ for (const linkApiName of backingDatasourceLinkApiNames) {
4377
+ const linkTypeBlockData = findLinkTypeByApiName(ontologyIr.ontology.linkTypes, linkApiName);
4378
+ if (!linkTypeBlockData) continue;
4379
+ const datasetName = `link.${linkApiName}`;
4380
+ const inputDsId = chunkXMO5RRJG_cjs.ReadableIdGenerator.getForDataset(datasetName);
4381
+ const outputDsId = chunkXMO5RRJG_cjs.ReadableIdGenerator.getForDatasetOutput(datasetName);
4382
+ if (shapes.inputShapes.has(inputDsId)) {
4383
+ ontologyInputMappingEntries.push({
4384
+ input: inputDsId,
4385
+ output: outputDsId
4386
+ });
4387
+ }
4388
+ const ds = linkTypeBlockData.datasources[0]?.datasource;
4389
+ if (ds?.type === "dataset") {
4390
+ const columnNames = [...Object.values(ds.dataset.objectTypeAPrimaryKeyMapping).map(String), ...Object.values(ds.dataset.objectTypeBPrimaryKeyMapping).map(String)];
4391
+ for (const colName of columnNames) {
4392
+ const colInputId = chunkXMO5RRJG_cjs.ReadableIdGenerator.getForDatasetColumn(datasetName, colName);
4393
+ const colOutputId = chunkXMO5RRJG_cjs.ReadableIdGenerator.getForDatasetColumnOutput(datasetName, colName);
4394
+ if (shapes.inputShapes.has(colInputId)) {
4395
+ ontologyInputMappingEntries.push({
4396
+ input: colInputId,
4397
+ output: colOutputId
4398
+ });
4399
+ }
4400
+ }
4401
+ }
4402
+ }
4335
4403
  const backingDsGeneratorResults = await Promise.all(backingDatasourceApiNames.filter((apiName) => {
4336
4404
  const objectTypeBlockData = findObjectTypeByApiName(ontologyIr.ontology.objectTypes, apiName);
4337
4405
  return objectTypeBlockData !== void 0;
@@ -4340,6 +4408,12 @@ async function main(args = process.argv) {
4340
4408
  consola.consola.info(`Generating backing datasource BlockGeneratorResult for ${apiName}...`);
4341
4409
  return await generateBackingDatasetBlockResult(objectTypeBlockData, commandLineOpts.buildDir, commandLineOpts.randomnessKey);
4342
4410
  }));
4411
+ const backingDsLinkGeneratorResults = await Promise.all(backingDatasourceLinkApiNames.map((linkApiName) => {
4412
+ const linkTypeBlockData = findLinkTypeByApiName(ontologyIr.ontology.linkTypes, linkApiName);
4413
+ if (!linkTypeBlockData) return void 0;
4414
+ consola.consola.info(`Generating backing datasource BlockGeneratorResult for link ${linkApiName}...`);
4415
+ return generateBackingDatasetBlockResultForLink(linkTypeBlockData, linkApiName, ontologyIr.ontology.objectTypes, commandLineOpts.buildDir, commandLineOpts.randomnessKey);
4416
+ }).filter((p) => p !== void 0));
4343
4417
  const blockGeneratorResult = {
4344
4418
  block_identifier: "ontology",
4345
4419
  block_data_directory: blockDataDir,
@@ -4353,7 +4427,7 @@ async function main(args = process.argv) {
4353
4427
  input_shape_metadata: Object.fromEntries(shapes.inputShapeMetadata),
4354
4428
  block_type: "ONTOLOGY"
4355
4429
  };
4356
- const blockGeneratorResultJson = JSON.stringify([blockGeneratorResult, ...backingDsGeneratorResults], null, 2);
4430
+ const blockGeneratorResultJson = JSON.stringify([blockGeneratorResult, ...backingDsGeneratorResults, ...backingDsLinkGeneratorResults], null, 2);
4357
4431
  await fs__namespace.promises.writeFile(commandLineOpts.output, blockGeneratorResultJson);
4358
4432
  consola.consola.success(`BlockGeneratorResult written to ${commandLineOpts.output}`);
4359
4433
  consola.consola.info(`Block data directory: ${blockDataDir}`);
@@ -4372,6 +4446,10 @@ async function loadOntology(input, apiNamespace, randomnessKey) {
4372
4446
  function findObjectTypeByApiName(objectTypes, apiName) {
4373
4447
  return Object.values(objectTypes).find((objectTypeBlockData) => objectTypeBlockData.objectType.apiName === apiName);
4374
4448
  }
4449
+ function findLinkTypeByApiName(linkTypes, apiName) {
4450
+ const linkTypeId = maker.cleanAndValidateLinkTypeId(apiName);
4451
+ return Object.values(linkTypes).find((lt) => lt.linkType.id === linkTypeId);
4452
+ }
4375
4453
  function defineImportObject(objectDef) {
4376
4454
  const properties = Object.entries(objectDef.properties ?? {}).map(([apiName, type]) => ({
4377
4455
  apiName,