@sanity/cli 6.0.0-alpha.16 → 6.0.0-alpha.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/README.md +592 -470
  2. package/dist/SanityHelp.js +74 -21
  3. package/dist/SanityHelp.js.map +1 -1
  4. package/dist/actions/build/buildApp.js +42 -15
  5. package/dist/actions/build/buildApp.js.map +1 -1
  6. package/dist/actions/build/buildStudio.js +64 -45
  7. package/dist/actions/build/buildStudio.js.map +1 -1
  8. package/dist/actions/build/buildVendorDependencies.js +3 -16
  9. package/dist/actions/build/buildVendorDependencies.js.map +1 -1
  10. package/dist/actions/build/checkStudioDependencyVersions.js +7 -7
  11. package/dist/actions/build/checkStudioDependencyVersions.js.map +1 -1
  12. package/dist/actions/build/createExternalFromImportMap.js +1 -1
  13. package/dist/actions/build/createExternalFromImportMap.js.map +1 -1
  14. package/dist/actions/build/determineBasePath.js +5 -2
  15. package/dist/actions/build/determineBasePath.js.map +1 -1
  16. package/dist/actions/build/handlePrereleaseVersions.js +44 -0
  17. package/dist/actions/build/handlePrereleaseVersions.js.map +1 -0
  18. package/dist/actions/build/types.js.map +1 -1
  19. package/dist/actions/dataset/create.js +7 -1
  20. package/dist/actions/dataset/create.js.map +1 -1
  21. package/dist/actions/dataset/resolveDataset.js +26 -0
  22. package/dist/actions/dataset/resolveDataset.js.map +1 -0
  23. package/dist/actions/deploy/deployApp.js +1 -8
  24. package/dist/actions/deploy/deployApp.js.map +1 -1
  25. package/dist/actions/deploy/deployStudio.js +1 -0
  26. package/dist/actions/deploy/deployStudio.js.map +1 -1
  27. package/dist/actions/dev/getDevServerConfig.js +5 -2
  28. package/dist/actions/dev/getDevServerConfig.js.map +1 -1
  29. package/dist/actions/dev/startStudioDevServer.js +8 -3
  30. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  31. package/dist/actions/documents/types.js.map +1 -1
  32. package/dist/actions/documents/validate.js +11 -2
  33. package/dist/actions/documents/validate.js.map +1 -1
  34. package/dist/actions/documents/validateDocuments.worker.js +2 -2
  35. package/dist/actions/documents/validateDocuments.worker.js.map +1 -1
  36. package/dist/actions/documents/validation/reporters/jsonReporter.js +1 -1
  37. package/dist/actions/documents/validation/reporters/jsonReporter.js.map +1 -1
  38. package/dist/actions/documents/validation/reporters/ndjsonReporter.js +1 -1
  39. package/dist/actions/documents/validation/reporters/ndjsonReporter.js.map +1 -1
  40. package/dist/actions/graphql/SchemaError.js +1 -1
  41. package/dist/actions/graphql/SchemaError.js.map +1 -1
  42. package/dist/actions/graphql/__tests__/fixtures/many-self-refs.js +540 -0
  43. package/dist/actions/graphql/__tests__/fixtures/many-self-refs.js.map +1 -0
  44. package/dist/actions/graphql/__tests__/fixtures/test-studio.js +1143 -0
  45. package/dist/actions/graphql/__tests__/fixtures/test-studio.js.map +1 -0
  46. package/dist/actions/graphql/__tests__/fixtures/union-refs.js +591 -0
  47. package/dist/actions/graphql/__tests__/fixtures/union-refs.js.map +1 -0
  48. package/dist/actions/graphql/__tests__/helpers.js +23 -0
  49. package/dist/actions/graphql/__tests__/helpers.js.map +1 -0
  50. package/dist/actions/graphql/extractFromSanitySchema.js +2 -1
  51. package/dist/actions/graphql/extractFromSanitySchema.js.map +1 -1
  52. package/dist/actions/graphql/gen1/generateTypeFilters.js +1 -1
  53. package/dist/actions/graphql/gen1/generateTypeFilters.js.map +1 -1
  54. package/dist/actions/graphql/gen1/generateTypeQueries.js +2 -1
  55. package/dist/actions/graphql/gen1/generateTypeQueries.js.map +1 -1
  56. package/dist/actions/graphql/gen2/generateTypeQueries.js +1 -1
  57. package/dist/actions/graphql/gen2/generateTypeQueries.js.map +1 -1
  58. package/dist/actions/graphql/gen3/generateTypeQueries.js +1 -1
  59. package/dist/actions/graphql/gen3/generateTypeQueries.js.map +1 -1
  60. package/dist/actions/graphql/getGraphQLAPIs.js +2 -10
  61. package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
  62. package/dist/actions/graphql/getGraphQLAPIs.worker.js +1 -1
  63. package/dist/actions/graphql/getGraphQLAPIs.worker.js.map +1 -1
  64. package/dist/actions/graphql/types.js.map +1 -1
  65. package/dist/actions/init/bootstrapLocalTemplate.js +1 -1
  66. package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
  67. package/dist/actions/manifest/extractAppManifest.js.map +1 -1
  68. package/dist/actions/manifest/extractManifest.js +3 -22
  69. package/dist/actions/manifest/extractManifest.js.map +1 -1
  70. package/dist/actions/manifest/extractManifest.worker.js +5 -1
  71. package/dist/actions/manifest/extractManifest.worker.js.map +1 -1
  72. package/dist/actions/manifest/types.js.map +1 -1
  73. package/dist/actions/schema/deploySchemas.js +57 -80
  74. package/dist/actions/schema/deploySchemas.js.map +1 -1
  75. package/dist/actions/schema/extractSanityWorkspace.worker.js +24 -0
  76. package/dist/actions/schema/extractSanityWorkspace.worker.js.map +1 -0
  77. package/dist/actions/schema/extractSchemaWatcher.js +1 -1
  78. package/dist/actions/schema/extractSchemaWatcher.js.map +1 -1
  79. package/dist/actions/schema/types.js +4 -0
  80. package/dist/actions/schema/types.js.map +1 -1
  81. package/dist/actions/schema/uniqueWorkspaces.worker.js +3 -1
  82. package/dist/actions/schema/uniqueWorkspaces.worker.js.map +1 -1
  83. package/dist/actions/schema/utils/schemaStoreValidation.js +1 -7
  84. package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
  85. package/dist/actions/schema/utils/uniqByProjectIdDataset.js +1 -1
  86. package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -1
  87. package/dist/actions/schema/watchExtractSchema.js +2 -1
  88. package/dist/actions/schema/watchExtractSchema.js.map +1 -1
  89. package/dist/actions/versions/getFormatters.js +1 -1
  90. package/dist/actions/versions/getFormatters.js.map +1 -1
  91. package/dist/commands/backup/list.js +4 -1
  92. package/dist/commands/backup/list.js.map +1 -1
  93. package/dist/commands/dataset/copy.js +3 -1
  94. package/dist/commands/dataset/copy.js.map +1 -1
  95. package/dist/commands/dataset/create.js +12 -0
  96. package/dist/commands/dataset/create.js.map +1 -1
  97. package/dist/commands/dataset/embeddings/disable.js +62 -0
  98. package/dist/commands/dataset/embeddings/disable.js.map +1 -0
  99. package/dist/commands/dataset/embeddings/enable.js +128 -0
  100. package/dist/commands/dataset/embeddings/enable.js.map +1 -0
  101. package/dist/commands/dataset/embeddings/status.js +61 -0
  102. package/dist/commands/dataset/embeddings/status.js.map +1 -0
  103. package/dist/commands/debug.js +2 -1
  104. package/dist/commands/debug.js.map +1 -1
  105. package/dist/commands/documents/create.js +2 -1
  106. package/dist/commands/documents/create.js.map +1 -1
  107. package/dist/commands/graphql/deploy.js +1 -1
  108. package/dist/commands/graphql/deploy.js.map +1 -1
  109. package/dist/commands/hook/logs.js +1 -1
  110. package/dist/commands/hook/logs.js.map +1 -1
  111. package/dist/commands/init.js +13 -7
  112. package/dist/commands/init.js.map +1 -1
  113. package/dist/commands/manage.js +0 -1
  114. package/dist/commands/manage.js.map +1 -1
  115. package/dist/commands/media/create-aspect.js +1 -1
  116. package/dist/commands/media/create-aspect.js.map +1 -1
  117. package/dist/commands/projects/list.js +2 -1
  118. package/dist/commands/projects/list.js.map +1 -1
  119. package/dist/commands/schema/deploy.js +11 -27
  120. package/dist/commands/schema/deploy.js.map +1 -1
  121. package/dist/commands/users/list.js +1 -1
  122. package/dist/commands/users/list.js.map +1 -1
  123. package/dist/commands/versions.js +1 -1
  124. package/dist/commands/versions.js.map +1 -1
  125. package/dist/exports/index.d.ts +62 -2
  126. package/dist/exports/index.js.map +1 -1
  127. package/dist/prompts/selectMediaLibrary.js +1 -1
  128. package/dist/prompts/selectMediaLibrary.js.map +1 -1
  129. package/dist/services/datasets.js +7 -5
  130. package/dist/services/datasets.js.map +1 -1
  131. package/dist/services/embeddings.js +25 -0
  132. package/dist/services/embeddings.js.map +1 -0
  133. package/dist/services/graphql.js.map +1 -1
  134. package/dist/services/schemas.js +1 -1
  135. package/dist/services/schemas.js.map +1 -1
  136. package/dist/types.js.map +1 -1
  137. package/dist/util/compareDependencyVersions.js +28 -7
  138. package/dist/util/compareDependencyVersions.js.map +1 -1
  139. package/dist/util/errorMessages.js +0 -1
  140. package/dist/util/errorMessages.js.map +1 -1
  141. package/dist/util/packageManager/getPeerDependencies.js +44 -0
  142. package/dist/util/packageManager/getPeerDependencies.js.map +1 -0
  143. package/oclif.manifest.json +325 -191
  144. package/package.json +19 -20
  145. package/dist/actions/schema/schemaStoreTypes.js +0 -19
  146. package/dist/actions/schema/schemaStoreTypes.js.map +0 -1
  147. package/dist/actions/schema/utils/manifestExtractor.js +0 -29
  148. package/dist/actions/schema/utils/manifestExtractor.js.map +0 -1
  149. package/dist/actions/schema/utils/manifestReader.js +0 -71
  150. package/dist/actions/schema/utils/manifestReader.js.map +0 -1
  151. package/dist/util/workerChannels.js +0 -172
  152. package/dist/util/workerChannels.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/graphql/getGraphQLAPIs.worker.ts"],"sourcesContent":["import {isMainThread, type MessagePort, parentPort, workerData} from 'node:worker_threads'\n\nimport {type Schema} from '@sanity/types'\nimport {isPlainObject} from 'lodash-es'\nimport {oneline} from 'oneline'\n\nimport {\n type GraphQLAPIConfig,\n type SchemaDefinitionish,\n type TypeResolvedGraphQLAPI,\n} from './types.js'\n\ninterface Source {\n dataset: string\n name: string\n projectId: string\n schema: Schema\n}\n\ninterface Workspace extends Source {\n unstable_sources: Source[]\n}\n\nasync function main() {\n if (isMainThread || !parentPort) {\n throw new Error('This module must be run as a worker thread')\n }\n\n await getGraphQLAPIsForked(parentPort)\n}\n\nawait main()\n\nasync function getGraphQLAPIsForked(parent: MessagePort): Promise<void> {\n const {cliConfig, workspaces} = workerData\n const resolved = await resolveGraphQLApis({cliConfig, workspaces})\n parent.postMessage(resolved)\n}\n\ninterface ResolveGraphQLApisOptions {\n workspaces: Workspace[]\n\n cliConfig?: {graphql?: GraphQLAPIConfig[]}\n}\n\nasync function resolveGraphQLApis({\n cliConfig,\n workspaces,\n}: ResolveGraphQLApisOptions): Promise<TypeResolvedGraphQLAPI[]> {\n const numSources = workspaces.reduce(\n (count, workspace) => count + workspace.unstable_sources.length,\n 0,\n )\n const multiSource = numSources > 1\n const multiWorkspace = workspaces.length > 1\n const hasGraphQLConfig = Boolean(cliConfig?.graphql)\n\n if (workspaces.length === 0) {\n throw new Error('No studio configuration found')\n }\n\n if (numSources === 0) {\n throw new Error('No sources (project ID / dataset) configured')\n }\n\n // We can only automatically configure if there is a single workspace + source in play\n if ((multiWorkspace || multiSource) && !hasGraphQLConfig) {\n throw new Error(oneline`\n Multiple workspaces/sources configured.\n You must define an array of GraphQL APIs in \\`sanity.cli.ts\\` or \\`sanity.cli.js\\`\n and specify which workspace/source to use.\n `)\n }\n\n // No config is defined, but we have a single workspace + source, so use that\n if (!hasGraphQLConfig) {\n const {dataset, projectId, schema} = workspaces[0].unstable_sources[0]\n return [{dataset, projectId, schemaTypes: getStrippedSchemaTypes(schema)}]\n }\n\n // Explicity defined config\n const apiDefs = validateCliConfig(cliConfig?.graphql || [])\n return resolveGraphQLAPIsFromConfig(apiDefs, workspaces)\n}\n\nfunction resolveGraphQLAPIsFromConfig(\n apiDefs: GraphQLAPIConfig[],\n workspaces: Workspace[],\n): TypeResolvedGraphQLAPI[] {\n const resolvedApis: TypeResolvedGraphQLAPI[] = []\n\n for (const apiDef of apiDefs) {\n const {source: sourceName, workspace: workspaceName} = apiDef\n if (!workspaceName && workspaces.length > 1) {\n throw new Error(\n 'Must define `workspace` name in GraphQL API config when multiple workspaces are defined',\n )\n }\n\n // If we only have a single workspace defined, we can assume that is the intended one,\n // even if no `workspace` is defined for the GraphQL API\n const workspace =\n !workspaceName && workspaces.length === 1\n ? workspaces[0]\n : workspaces.find((space) => space.name === (workspaceName || 'default'))\n\n if (!workspace) {\n throw new Error(`Workspace \"${workspaceName || 'default'}\" not found`)\n }\n\n // If we only have a single source defined, we can assume that is the intended one,\n // even if no `source` is defined for the GraphQL API\n const source =\n !sourceName && workspace.unstable_sources.length === 1\n ? workspace.unstable_sources[0]\n : workspace.unstable_sources.find((src) => src.name === (sourceName || 'default'))\n\n if (!source) {\n throw new Error(\n `Source \"${sourceName || 'default'}\" not found in workspace \"${\n workspaceName || 'default'\n }\"`,\n )\n }\n\n resolvedApis.push({\n ...apiDef,\n dataset: source.dataset,\n projectId: source.projectId,\n schemaTypes: getStrippedSchemaTypes(source.schema),\n })\n }\n\n return resolvedApis\n}\n\nfunction validateCliConfig(\n config: GraphQLAPIConfig[],\n configPath = 'sanity.cli.js',\n): GraphQLAPIConfig[] {\n if (!Array.isArray(config)) {\n throw new TypeError(`\"graphql\" key in \"${configPath}\" must be an array if defined`)\n }\n\n if (config.length === 0) {\n throw new Error(`No GraphQL APIs defined in \"${configPath}\"`)\n }\n\n return config\n}\n\nfunction getStrippedSchemaTypes(schema: Schema): SchemaDefinitionish[] {\n const schemaDef = schema._original || {types: []}\n return schemaDef.types.map((type) => stripType(type))\n}\n\nfunction stripType(input: unknown): SchemaDefinitionish {\n return strip(input) as SchemaDefinitionish\n}\n\nfunction strip(input: unknown): unknown {\n if (Array.isArray(input)) {\n return input.map((item) => strip(item)).filter((item) => item !== undefined)\n }\n\n if (isPlainishObject(input)) {\n const stripped: Record<string, unknown> = {}\n for (const key of Object.keys(input)) {\n stripped[key] = strip(input[key])\n }\n return stripped\n }\n\n return isBasicType(input) ? input : undefined\n}\n\nfunction isPlainishObject(input: unknown): input is Record<string, unknown> {\n return isPlainObject(input)\n}\n\nfunction isBasicType(input: unknown): boolean {\n const type = typeof input\n if (type === 'boolean' || type === 'number' || type === 'string') {\n return true\n }\n\n if (type !== 'object') {\n return false\n }\n\n return Array.isArray(input) || input === null || isPlainishObject(input)\n}\n"],"names":["isMainThread","parentPort","workerData","isPlainObject","oneline","main","Error","getGraphQLAPIsForked","parent","cliConfig","workspaces","resolved","resolveGraphQLApis","postMessage","numSources","reduce","count","workspace","unstable_sources","length","multiSource","multiWorkspace","hasGraphQLConfig","Boolean","graphql","dataset","projectId","schema","schemaTypes","getStrippedSchemaTypes","apiDefs","validateCliConfig","resolveGraphQLAPIsFromConfig","resolvedApis","apiDef","source","sourceName","workspaceName","find","space","name","src","push","config","configPath","Array","isArray","TypeError","schemaDef","_original","types","map","type","stripType","input","strip","item","filter","undefined","isPlainishObject","stripped","key","Object","keys","isBasicType"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/graphql/getGraphQLAPIs.worker.ts"],"sourcesContent":["import {isMainThread, type MessagePort, parentPort, workerData} from 'node:worker_threads'\n\nimport {type Schema} from '@sanity/types'\nimport isPlainObject from 'lodash-es/isPlainObject.js'\nimport {oneline} from 'oneline'\n\nimport {\n type GraphQLAPIConfig,\n type SchemaDefinitionish,\n type TypeResolvedGraphQLAPI,\n} from './types.js'\n\ninterface Source {\n dataset: string\n name: string\n projectId: string\n schema: Schema\n}\n\ninterface Workspace extends Source {\n unstable_sources: Source[]\n}\n\nasync function main() {\n if (isMainThread || !parentPort) {\n throw new Error('This module must be run as a worker thread')\n }\n\n await getGraphQLAPIsForked(parentPort)\n}\n\nawait main()\n\nasync function getGraphQLAPIsForked(parent: MessagePort): Promise<void> {\n const {cliConfig, workspaces} = workerData\n const resolved = await resolveGraphQLApis({cliConfig, workspaces})\n parent.postMessage(resolved)\n}\n\ninterface ResolveGraphQLApisOptions {\n workspaces: Workspace[]\n\n cliConfig?: {graphql?: GraphQLAPIConfig[]}\n}\n\nasync function resolveGraphQLApis({\n cliConfig,\n workspaces,\n}: ResolveGraphQLApisOptions): Promise<TypeResolvedGraphQLAPI[]> {\n const numSources = workspaces.reduce(\n (count, workspace) => count + workspace.unstable_sources.length,\n 0,\n )\n const multiSource = numSources > 1\n const multiWorkspace = workspaces.length > 1\n const hasGraphQLConfig = Boolean(cliConfig?.graphql)\n\n if (workspaces.length === 0) {\n throw new Error('No studio configuration found')\n }\n\n if (numSources === 0) {\n throw new Error('No sources (project ID / dataset) configured')\n }\n\n // We can only automatically configure if there is a single workspace + source in play\n if ((multiWorkspace || multiSource) && !hasGraphQLConfig) {\n throw new Error(oneline`\n Multiple workspaces/sources configured.\n You must define an array of GraphQL APIs in \\`sanity.cli.ts\\` or \\`sanity.cli.js\\`\n and specify which workspace/source to use.\n `)\n }\n\n // No config is defined, but we have a single workspace + source, so use that\n if (!hasGraphQLConfig) {\n const {dataset, projectId, schema} = workspaces[0].unstable_sources[0]\n return [{dataset, projectId, schemaTypes: getStrippedSchemaTypes(schema)}]\n }\n\n // Explicity defined config\n const apiDefs = validateCliConfig(cliConfig?.graphql || [])\n return resolveGraphQLAPIsFromConfig(apiDefs, workspaces)\n}\n\nfunction resolveGraphQLAPIsFromConfig(\n apiDefs: GraphQLAPIConfig[],\n workspaces: Workspace[],\n): TypeResolvedGraphQLAPI[] {\n const resolvedApis: TypeResolvedGraphQLAPI[] = []\n\n for (const apiDef of apiDefs) {\n const {source: sourceName, workspace: workspaceName} = apiDef\n if (!workspaceName && workspaces.length > 1) {\n throw new Error(\n 'Must define `workspace` name in GraphQL API config when multiple workspaces are defined',\n )\n }\n\n // If we only have a single workspace defined, we can assume that is the intended one,\n // even if no `workspace` is defined for the GraphQL API\n const workspace =\n !workspaceName && workspaces.length === 1\n ? workspaces[0]\n : workspaces.find((space) => space.name === (workspaceName || 'default'))\n\n if (!workspace) {\n throw new Error(`Workspace \"${workspaceName || 'default'}\" not found`)\n }\n\n // If we only have a single source defined, we can assume that is the intended one,\n // even if no `source` is defined for the GraphQL API\n const source =\n !sourceName && workspace.unstable_sources.length === 1\n ? workspace.unstable_sources[0]\n : workspace.unstable_sources.find((src) => src.name === (sourceName || 'default'))\n\n if (!source) {\n throw new Error(\n `Source \"${sourceName || 'default'}\" not found in workspace \"${\n workspaceName || 'default'\n }\"`,\n )\n }\n\n resolvedApis.push({\n ...apiDef,\n dataset: source.dataset,\n projectId: source.projectId,\n schemaTypes: getStrippedSchemaTypes(source.schema),\n })\n }\n\n return resolvedApis\n}\n\nfunction validateCliConfig(\n config: GraphQLAPIConfig[],\n configPath = 'sanity.cli.js',\n): GraphQLAPIConfig[] {\n if (!Array.isArray(config)) {\n throw new TypeError(`\"graphql\" key in \"${configPath}\" must be an array if defined`)\n }\n\n if (config.length === 0) {\n throw new Error(`No GraphQL APIs defined in \"${configPath}\"`)\n }\n\n return config\n}\n\nfunction getStrippedSchemaTypes(schema: Schema): SchemaDefinitionish[] {\n const schemaDef = schema._original || {types: []}\n return schemaDef.types.map((type) => stripType(type))\n}\n\nfunction stripType(input: unknown): SchemaDefinitionish {\n return strip(input) as SchemaDefinitionish\n}\n\nfunction strip(input: unknown): unknown {\n if (Array.isArray(input)) {\n return input.map((item) => strip(item)).filter((item) => item !== undefined)\n }\n\n if (isPlainishObject(input)) {\n const stripped: Record<string, unknown> = {}\n for (const key of Object.keys(input)) {\n stripped[key] = strip(input[key])\n }\n return stripped\n }\n\n return isBasicType(input) ? input : undefined\n}\n\nfunction isPlainishObject(input: unknown): input is Record<string, unknown> {\n return isPlainObject(input)\n}\n\nfunction isBasicType(input: unknown): boolean {\n const type = typeof input\n if (type === 'boolean' || type === 'number' || type === 'string') {\n return true\n }\n\n if (type !== 'object') {\n return false\n }\n\n return Array.isArray(input) || input === null || isPlainishObject(input)\n}\n"],"names":["isMainThread","parentPort","workerData","isPlainObject","oneline","main","Error","getGraphQLAPIsForked","parent","cliConfig","workspaces","resolved","resolveGraphQLApis","postMessage","numSources","reduce","count","workspace","unstable_sources","length","multiSource","multiWorkspace","hasGraphQLConfig","Boolean","graphql","dataset","projectId","schema","schemaTypes","getStrippedSchemaTypes","apiDefs","validateCliConfig","resolveGraphQLAPIsFromConfig","resolvedApis","apiDef","source","sourceName","workspaceName","find","space","name","src","push","config","configPath","Array","isArray","TypeError","schemaDef","_original","types","map","type","stripType","input","strip","item","filter","undefined","isPlainishObject","stripped","key","Object","keys","isBasicType"],"mappings":"AAAA,SAAQA,YAAY,EAAoBC,UAAU,EAAEC,UAAU,QAAO,sBAAqB;AAG1F,OAAOC,mBAAmB,6BAA4B;AACtD,SAAQC,OAAO,QAAO,UAAS;AAmB/B,eAAeC;IACb,IAAIL,gBAAgB,CAACC,YAAY;QAC/B,MAAM,IAAIK,MAAM;IAClB;IAEA,MAAMC,qBAAqBN;AAC7B;AAEA,MAAMI;AAEN,eAAeE,qBAAqBC,MAAmB;IACrD,MAAM,EAACC,SAAS,EAAEC,UAAU,EAAC,GAAGR;IAChC,MAAMS,WAAW,MAAMC,mBAAmB;QAACH;QAAWC;IAAU;IAChEF,OAAOK,WAAW,CAACF;AACrB;AAQA,eAAeC,mBAAmB,EAChCH,SAAS,EACTC,UAAU,EACgB;IAC1B,MAAMI,aAAaJ,WAAWK,MAAM,CAClC,CAACC,OAAOC,YAAcD,QAAQC,UAAUC,gBAAgB,CAACC,MAAM,EAC/D;IAEF,MAAMC,cAAcN,aAAa;IACjC,MAAMO,iBAAiBX,WAAWS,MAAM,GAAG;IAC3C,MAAMG,mBAAmBC,QAAQd,WAAWe;IAE5C,IAAId,WAAWS,MAAM,KAAK,GAAG;QAC3B,MAAM,IAAIb,MAAM;IAClB;IAEA,IAAIQ,eAAe,GAAG;QACpB,MAAM,IAAIR,MAAM;IAClB;IAEA,sFAAsF;IACtF,IAAI,AAACe,CAAAA,kBAAkBD,WAAU,KAAM,CAACE,kBAAkB;QACxD,MAAM,IAAIhB,MAAMF,OAAO,CAAC;;;;IAIxB,CAAC;IACH;IAEA,6EAA6E;IAC7E,IAAI,CAACkB,kBAAkB;QACrB,MAAM,EAACG,OAAO,EAAEC,SAAS,EAAEC,MAAM,EAAC,GAAGjB,UAAU,CAAC,EAAE,CAACQ,gBAAgB,CAAC,EAAE;QACtE,OAAO;YAAC;gBAACO;gBAASC;gBAAWE,aAAaC,uBAAuBF;YAAO;SAAE;IAC5E;IAEA,2BAA2B;IAC3B,MAAMG,UAAUC,kBAAkBtB,WAAWe,WAAW,EAAE;IAC1D,OAAOQ,6BAA6BF,SAASpB;AAC/C;AAEA,SAASsB,6BACPF,OAA2B,EAC3BpB,UAAuB;IAEvB,MAAMuB,eAAyC,EAAE;IAEjD,KAAK,MAAMC,UAAUJ,QAAS;QAC5B,MAAM,EAACK,QAAQC,UAAU,EAAEnB,WAAWoB,aAAa,EAAC,GAAGH;QACvD,IAAI,CAACG,iBAAiB3B,WAAWS,MAAM,GAAG,GAAG;YAC3C,MAAM,IAAIb,MACR;QAEJ;QAEA,sFAAsF;QACtF,wDAAwD;QACxD,MAAMW,YACJ,CAACoB,iBAAiB3B,WAAWS,MAAM,KAAK,IACpCT,UAAU,CAAC,EAAE,GACbA,WAAW4B,IAAI,CAAC,CAACC,QAAUA,MAAMC,IAAI,KAAMH,CAAAA,iBAAiB,SAAQ;QAE1E,IAAI,CAACpB,WAAW;YACd,MAAM,IAAIX,MAAM,CAAC,WAAW,EAAE+B,iBAAiB,UAAU,WAAW,CAAC;QACvE;QAEA,mFAAmF;QACnF,qDAAqD;QACrD,MAAMF,SACJ,CAACC,cAAcnB,UAAUC,gBAAgB,CAACC,MAAM,KAAK,IACjDF,UAAUC,gBAAgB,CAAC,EAAE,GAC7BD,UAAUC,gBAAgB,CAACoB,IAAI,CAAC,CAACG,MAAQA,IAAID,IAAI,KAAMJ,CAAAA,cAAc,SAAQ;QAEnF,IAAI,CAACD,QAAQ;YACX,MAAM,IAAI7B,MACR,CAAC,QAAQ,EAAE8B,cAAc,UAAU,0BAA0B,EAC3DC,iBAAiB,UAClB,CAAC,CAAC;QAEP;QAEAJ,aAAaS,IAAI,CAAC;YAChB,GAAGR,MAAM;YACTT,SAASU,OAAOV,OAAO;YACvBC,WAAWS,OAAOT,SAAS;YAC3BE,aAAaC,uBAAuBM,OAAOR,MAAM;QACnD;IACF;IAEA,OAAOM;AACT;AAEA,SAASF,kBACPY,MAA0B,EAC1BC,aAAa,eAAe;IAE5B,IAAI,CAACC,MAAMC,OAAO,CAACH,SAAS;QAC1B,MAAM,IAAII,UAAU,CAAC,kBAAkB,EAAEH,WAAW,6BAA6B,CAAC;IACpF;IAEA,IAAID,OAAOxB,MAAM,KAAK,GAAG;QACvB,MAAM,IAAIb,MAAM,CAAC,4BAA4B,EAAEsC,WAAW,CAAC,CAAC;IAC9D;IAEA,OAAOD;AACT;AAEA,SAASd,uBAAuBF,MAAc;IAC5C,MAAMqB,YAAYrB,OAAOsB,SAAS,IAAI;QAACC,OAAO,EAAE;IAAA;IAChD,OAAOF,UAAUE,KAAK,CAACC,GAAG,CAAC,CAACC,OAASC,UAAUD;AACjD;AAEA,SAASC,UAAUC,KAAc;IAC/B,OAAOC,MAAMD;AACf;AAEA,SAASC,MAAMD,KAAc;IAC3B,IAAIT,MAAMC,OAAO,CAACQ,QAAQ;QACxB,OAAOA,MAAMH,GAAG,CAAC,CAACK,OAASD,MAAMC,OAAOC,MAAM,CAAC,CAACD,OAASA,SAASE;IACpE;IAEA,IAAIC,iBAAiBL,QAAQ;QAC3B,MAAMM,WAAoC,CAAC;QAC3C,KAAK,MAAMC,OAAOC,OAAOC,IAAI,CAACT,OAAQ;YACpCM,QAAQ,CAACC,IAAI,GAAGN,MAAMD,KAAK,CAACO,IAAI;QAClC;QACA,OAAOD;IACT;IAEA,OAAOI,YAAYV,SAASA,QAAQI;AACtC;AAEA,SAASC,iBAAiBL,KAAc;IACtC,OAAOnD,cAAcmD;AACvB;AAEA,SAASU,YAAYV,KAAc;IACjC,MAAMF,OAAO,OAAOE;IACpB,IAAIF,SAAS,aAAaA,SAAS,YAAYA,SAAS,UAAU;QAChE,OAAO;IACT;IAEA,IAAIA,SAAS,UAAU;QACrB,OAAO;IACT;IAEA,OAAOP,MAAMC,OAAO,CAACQ,UAAUA,UAAU,QAAQK,iBAAiBL;AACpE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/graphql/types.ts"],"sourcesContent":["import {type Schema} from '@sanity/types'\n\nexport const internal = Symbol('internal')\n\nexport interface Deprecation {\n deprecationReason: string\n}\n\nexport interface ApiSpecification {\n interfaces: ConvertedInterface[]\n types: (ConvertedType | ConvertedUnion)[]\n}\n\nexport interface GraphQLAPIConfig {\n /**\n * Dataset name for this API\n */\n dataset?: string\n\n /**\n * Suffix to use for generated filter types.\n *\n * Optional, Defaults to `Filter`.\n *\n */\n filterSuffix?: string\n\n /**\n * Generation of API to deploy\n *\n * Optional, defaults to `gen3` (which is the only option, currently)\n */\n generation?: 'gen1' | 'gen2' | 'gen3'\n\n /**\n * ID of GraphQL API. Only (currently) required when using the `--api` flag\n * for `sanity graphql deploy`, in order to only deploy a specific API.\n */\n id?: string\n\n /**\n * Whether or not to enable the GraphQL v2021-10-21 query semantics\n */\n nonNullDocumentFields?: boolean\n\n /**\n * Whether or not to enable the GraphQL Playground for this API\n *\n * Optional, defaults to `true` in development mode, `false` otherwise\n */\n playground?: boolean\n\n /**\n * Project ID for this API\n */\n projectId?: string\n\n /**\n * Name of source containing the schema to deploy, within the configured workspace\n *\n * Optional, defaults to `default` (eg the one used if no `name` is defined)\n */\n source?: string\n\n /**\n * API tag for this API - allows deploying multiple different APIs to a single dataset\n *\n * Optional, defaults to `default`\n */\n tag?: string\n\n /**\n * Name of workspace containing the schema to deploy\n *\n * Optional, defaults to `default` (eg the one used if no `name` is defined)\n */\n workspace?: string\n}\n\nexport interface DeployResponse {\n location: string\n}\n\ninterface ApiChange {\n description: string\n type: string\n}\n\nexport interface ValidationResponse {\n breakingChanges: ApiChange[]\n dangerousChanges: ApiChange[]\n validationError: string\n}\n\nexport interface SchemaDefinitionish {\n name: string\n type: string\n\n fields?: SchemaDefinitionish[]\n}\n\ninterface ResolvedSerializableProperties {\n dataset: string\n projectId: string\n schemaTypes: SchemaDefinitionish[]\n}\n\nexport interface ResolvedSourceProperties {\n dataset: string\n projectId: string\n schema: Schema\n}\n\nexport type TypeResolvedGraphQLAPI = Omit<GraphQLAPIConfig, 'source' | 'workspace'> &\n ResolvedSerializableProperties\n\nexport type ResolvedGraphQLAPI = Omit<GraphQLAPIConfig, 'source' | 'workspace'> &\n ResolvedSourceProperties\n\ninterface ConvertedNode {\n description: string\n fields: ConvertedFieldDefinition[]\n kind: 'Interface' | 'List' | 'Type' | 'Union'\n name: string\n type: string\n}\n\ntype FieldArg =\n | {isFieldFilter?: boolean; name: string; type: string}\n | {name: string; type: ConvertedNode}\n\nexport interface ConvertedField extends Partial<Deprecation> {\n fieldName: string\n type: string\n\n args?: FieldArg[]\n description?: string\n filter?: string\n isNullable?: boolean\n isRawAlias?: boolean\n isReference?: boolean\n kind?: 'List'\n originalName?: string\n}\n\ninterface ConvertedListField extends ConvertedField {\n children: {\n inlineObjects?: string[]\n type: string\n }\n kind: 'List'\n}\n\nexport interface ApiCustomizationOptions {\n filterSuffix?: string\n}\n\nexport type InputFilterField =\n | ListDefinition\n | {\n constraint: {\n comparator: string\n field?: string\n }\n description?: string\n fieldName: string\n type: string\n }\n\nexport type ConvertedFieldDefinition = ConvertedField | ConvertedListField\n\ninterface ListDefinition {\n children: {isNullable?: boolean; type: string}\n kind: 'List'\n\n isNullable?: boolean\n}\n\nexport interface ConvertedEnum {\n kind: 'Enum'\n name: string\n values: {\n description?: string\n name: string\n value: unknown\n }[]\n}\n\nexport interface ConvertedInterface {\n fields: ConvertedFieldDefinition[]\n kind: 'Interface'\n name: string\n\n description?: string\n}\n\nexport interface ConvertedUnion {\n kind: 'Union'\n name: string\n types: string[]\n\n interfaces?: string[]\n}\n\nexport interface ConvertedDocumentType extends ConvertedType {\n interfaces: ['Document', ...string[]]\n}\n\nexport interface ConvertedType extends Partial<Deprecation> {\n fields: ConvertedFieldDefinition[]\n kind: 'Interface' | 'Type'\n name: string\n type: string\n\n crossDatasetReferenceMetadata?: {\n dataset: string\n typeNames: string[]\n }\n description?: string\n interfaces?: string[]\n [internal]?: Partial<Deprecation>\n isReference?: boolean\n originalName?: string\n}\n\nexport interface InputObjectType {\n fields: unknown[] // @todo\n kind: 'InputObject'\n name: string\n\n isConstraintFilter?: boolean\n}\n\nexport interface QueryDefinition extends Partial<Deprecation> {\n args: {\n description?: string\n isFieldFilter?: boolean\n isNullable?: boolean\n name: string\n type: ListDefinition | string\n }[]\n fieldName: string\n\n type: ListDefinition | string\n\n constraints?: {\n comparator: string\n field?: string\n value?: {argName: string; kind: 'argumentValue'}\n }[]\n\n filter?: string\n}\n\nexport interface GeneratedApiSpecification {\n generation: string\n interfaces: ConvertedInterface[]\n queries: QueryDefinition[]\n types: (ConvertedEnum | ConvertedType | ConvertedUnion | InputObjectType)[]\n}\n"],"names":["internal","Symbol"],"mappings":"AAEA,OAAO,MAAMA,WAAWC,OAAO,YAAW"}
1
+ {"version":3,"sources":["../../../src/actions/graphql/types.ts"],"sourcesContent":["import {type Schema} from '@sanity/types'\n\nexport const internal = Symbol('internal')\n\nexport interface Deprecation {\n deprecationReason: string\n}\n\nexport interface ApiSpecification {\n interfaces: ConvertedInterface[]\n types: (ConvertedType | ConvertedUnion)[]\n}\n\n/**\n * @public\n */\nexport interface GraphQLAPIConfig {\n /**\n * Suffix to use for generated filter types.\n *\n * Optional, Defaults to `Filter`.\n *\n */\n filterSuffix?: string\n\n /**\n * Generation of API to deploy\n *\n * Optional, defaults to `gen3` (which is the only option, currently)\n */\n generation?: 'gen1' | 'gen2' | 'gen3'\n\n /**\n * ID of GraphQL API. Only (currently) required when using the `--api` flag\n * for `sanity graphql deploy`, in order to only deploy a specific API.\n */\n id?: string\n\n /**\n * Whether or not to enable the GraphQL v2021-10-21 query semantics\n */\n nonNullDocumentFields?: boolean\n\n /**\n * Whether or not to enable the GraphQL Playground for this API\n *\n * Optional, defaults to `true` in development mode, `false` otherwise\n */\n playground?: boolean\n\n /**\n * Name of source containing the schema to deploy, within the configured workspace\n *\n * Optional, defaults to `default` (eg the one used if no `name` is defined)\n */\n source?: string\n\n /**\n * API tag for this API - allows deploying multiple different APIs to a single dataset\n *\n * Optional, defaults to `default`\n */\n tag?: string\n\n /**\n * Name of workspace containing the schema to deploy\n *\n * Optional, defaults to `default` (eg the one used if no `name` is defined)\n */\n workspace?: string\n}\n\nexport interface DeployResponse {\n location: string\n}\n\ninterface ApiChange {\n description: string\n type: string\n}\n\nexport interface ValidationResponse {\n breakingChanges: ApiChange[]\n dangerousChanges: ApiChange[]\n validationError: string\n}\n\nexport interface SchemaDefinitionish {\n name: string\n type: string\n\n fields?: SchemaDefinitionish[]\n}\n\ninterface ResolvedSerializableProperties {\n dataset: string\n projectId: string\n schemaTypes: SchemaDefinitionish[]\n}\n\nexport interface ResolvedSourceProperties {\n dataset: string\n projectId: string\n schema: Schema\n}\n\nexport type TypeResolvedGraphQLAPI = Omit<GraphQLAPIConfig, 'source' | 'workspace'> &\n ResolvedSerializableProperties\n\nexport type ResolvedGraphQLAPI = Omit<GraphQLAPIConfig, 'source' | 'workspace'> &\n ResolvedSourceProperties\n\ninterface ConvertedNode {\n description: string\n fields: ConvertedFieldDefinition[]\n kind: 'Interface' | 'List' | 'Type' | 'Union'\n name: string\n type: string\n}\n\ntype FieldArg =\n | {isFieldFilter?: boolean; name: string; type: string}\n | {name: string; type: ConvertedNode}\n\nexport interface ConvertedField extends Partial<Deprecation> {\n fieldName: string\n type: string\n\n args?: FieldArg[]\n description?: string\n filter?: string\n isNullable?: boolean\n isRawAlias?: boolean\n isReference?: boolean\n kind?: 'List'\n originalName?: string\n}\n\ninterface ConvertedListField extends ConvertedField {\n children: {\n inlineObjects?: string[]\n type: string\n }\n kind: 'List'\n}\n\nexport interface ApiCustomizationOptions {\n filterSuffix?: string\n}\n\nexport type InputFilterField =\n | ListDefinition\n | {\n constraint: {\n comparator: string\n field?: string\n }\n description?: string\n fieldName: string\n type: string\n }\n\nexport type ConvertedFieldDefinition = ConvertedField | ConvertedListField\n\ninterface ListDefinition {\n children: {isNullable?: boolean; type: string}\n kind: 'List'\n\n isNullable?: boolean\n}\n\nexport interface ConvertedEnum {\n kind: 'Enum'\n name: string\n values: {\n description?: string\n name: string\n value: unknown\n }[]\n}\n\nexport interface ConvertedInterface {\n fields: ConvertedFieldDefinition[]\n kind: 'Interface'\n name: string\n\n description?: string\n}\n\nexport interface ConvertedUnion {\n kind: 'Union'\n name: string\n types: string[]\n\n interfaces?: string[]\n}\n\nexport interface ConvertedDocumentType extends ConvertedType {\n interfaces: ['Document', ...string[]]\n}\n\nexport interface ConvertedType extends Partial<Deprecation> {\n fields: ConvertedFieldDefinition[]\n kind: 'Interface' | 'Type'\n name: string\n type: string\n\n crossDatasetReferenceMetadata?: {\n dataset: string\n typeNames: string[]\n }\n description?: string\n interfaces?: string[]\n [internal]?: Partial<Deprecation>\n isReference?: boolean\n originalName?: string\n}\n\nexport interface InputObjectType {\n fields: unknown[] // @todo\n kind: 'InputObject'\n name: string\n\n isConstraintFilter?: boolean\n}\n\nexport interface QueryDefinition extends Partial<Deprecation> {\n args: {\n description?: string\n isFieldFilter?: boolean\n isNullable?: boolean\n name: string\n type: ListDefinition | string\n }[]\n fieldName: string\n\n type: ListDefinition | string\n\n constraints?: {\n comparator: string\n field?: string\n value?: {argName: string; kind: 'argumentValue'}\n }[]\n\n filter?: string\n}\n\nexport interface GeneratedApiSpecification {\n generation: string\n interfaces: ConvertedInterface[]\n queries: QueryDefinition[]\n types: (ConvertedEnum | ConvertedType | ConvertedUnion | InputObjectType)[]\n}\n"],"names":["internal","Symbol"],"mappings":"AAEA,OAAO,MAAMA,WAAWC,OAAO,YAAW"}
@@ -3,7 +3,7 @@ import path from 'node:path';
3
3
  import { styleText } from 'node:util';
4
4
  import { subdebug } from '@sanity/cli-core';
5
5
  import { spinner } from '@sanity/cli-core/ux';
6
- import { deburr } from 'lodash-es';
6
+ import deburr from 'lodash-es/deburr.js';
7
7
  import { studioDependencies } from '../../studioDependencies.js';
8
8
  import { copy } from '../../util/copy.js';
9
9
  import { resolveLatestVersions } from '../../util/resolveLatestVersions.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/init/bootstrapLocalTemplate.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {Output, subdebug} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {deburr} from 'lodash-es'\n\nimport {studioDependencies} from '../../studioDependencies.js'\nimport {copy} from '../../util/copy.js'\nimport {resolveLatestVersions} from '../../util/resolveLatestVersions.js'\nimport {createAppCliConfig} from './createAppCliConfig.js'\nimport {createCliConfig} from './createCliConfig.js'\nimport {createPackageManifest} from './createPackageManifest.js'\nimport {createStudioConfig, type GenerateConfigOptions} from './createStudioConfig.js'\nimport {determineAppTemplate} from './determineAppTemplate.js'\nimport templates from './templates/index.js'\nimport {type ProjectTemplate} from './types.js'\nimport {updateInitialTemplateMetadata} from './updateInitialTemplateMetadata.js'\n\nconst debug = subdebug('init:bootstrapRemoteTemplate')\n\ninterface BootstrapLocalOptions {\n output: Output\n outputPath: string\n packageName: string\n templateName: string\n useTypeScript: boolean\n variables: GenerateConfigOptions['variables']\n\n overwriteFiles?: boolean\n}\n\nexport async function bootstrapLocalTemplate(\n opts: BootstrapLocalOptions,\n): Promise<ProjectTemplate> {\n const {output, outputPath, packageName, templateName, useTypeScript, variables} = opts\n // packages/@sanity/cli/src/actions/init/ -> packages/@sanity/cli/src/action -> packages/@sanity/cli/src/\n const cliRoot = path.resolve(import.meta.dirname, '../../..')\n const templatesDir = path.join(cliRoot, 'templates')\n const sourceDir = path.join(templatesDir, templateName)\n const sharedDir = path.join(templatesDir, 'shared')\n const isAppTemplate = determineAppTemplate(templateName)\n\n // Check that we have a template info file (dependencies, plugins etc)\n const template = templates[templateName]\n if (!template) {\n throw new Error(`Template \"${templateName}\" not defined`)\n }\n\n // Copy template files\n debug('Copying files from template \"%s\" to \"%s\"', templateName, outputPath)\n let spin = spinner('Bootstrapping files from template').start()\n\n debug(`Copying template from : ${sourceDir}`)\n await copy(sourceDir, outputPath, {\n rename: useTypeScript ? toTypeScriptPath : undefined,\n })\n debug(`Copying shared template code from : ${sharedDir}`)\n await copy(path.join(sharedDir, 'gitignore.txt'), outputPath, {rename: () => '.gitignore'})\n\n if (useTypeScript) {\n await fs.copyFile(path.join(sharedDir, 'tsconfig.json'), path.join(outputPath, 'tsconfig.json'))\n }\n\n spin.succeed()\n\n // Merge global and template-specific plugins and dependencies\n\n // Resolve latest versions of Sanity-dependencies\n spin = spinner('Resolving latest module versions').start()\n const dependencyVersions = await resolveLatestVersions({\n ...(isAppTemplate ? {} : studioDependencies.dependencies),\n ...(isAppTemplate ? {} : studioDependencies.devDependencies),\n ...template.dependencies,\n ...template.devDependencies,\n })\n spin.succeed()\n\n // Use the resolved version for the given dependency\n const dependencies: Record<string, string> = {}\n for (const dependency of Object.keys({\n ...(isAppTemplate ? {} : studioDependencies.dependencies),\n ...template.dependencies,\n })) {\n dependencies[dependency] = dependencyVersions[dependency]\n }\n\n const devDependencies: Record<string, string> = {}\n for (const dependency of Object.keys({\n ...(isAppTemplate ? {} : studioDependencies.devDependencies),\n ...template.devDependencies,\n })) {\n devDependencies[dependency] = dependencyVersions[dependency]\n }\n\n let packageJsonName: string = packageName\n\n /**\n * Currently app init doesn't ask for a name, so we use the last part of the path\n */\n if (isAppTemplate) {\n packageJsonName = deburr(path.basename(outputPath).toLowerCase())\n .replaceAll(/\\s+/g, '-')\n .replaceAll(/[^a-z0-9-]/g, '')\n }\n\n // Now create a package manifest (`package.json`) with the merged dependencies\n spin = spinner('Creating default project files').start()\n const packageManifest = createPackageManifest({\n dependencies,\n devDependencies,\n isAppTemplate,\n name: packageJsonName,\n scripts: template.scripts,\n })\n\n // ...and a studio config (`sanity.config.[ts|js]`)\n const studioConfig = createStudioConfig({\n template: template.configTemplate,\n variables,\n })\n\n // ...and a CLI config (`sanity.cli.[ts|js]`)\n const cliConfig = isAppTemplate\n ? createAppCliConfig({\n entry: template.entry!,\n organizationId: variables.organizationId,\n })\n : createCliConfig({\n autoUpdates: variables.autoUpdates,\n dataset: variables.dataset,\n projectId: variables.projectId,\n })\n\n // Write non-template files to disc\n const codeExt = useTypeScript ? 'ts' : 'js'\n await Promise.all(\n [\n isAppTemplate\n ? Promise.resolve(null)\n : writeFileIfNotExists(`sanity.config.${codeExt}`, studioConfig),\n writeFileIfNotExists(`sanity.cli.${codeExt}`, cliConfig),\n writeFileIfNotExists('package.json', packageManifest),\n\n isAppTemplate\n ? Promise.resolve(null)\n : writeFileIfNotExists(\n 'eslint.config.mjs',\n `import studio from '@sanity/eslint-config-studio'\\n\\nexport default [...studio]\\n`,\n ),\n ].filter(Boolean),\n )\n\n debug('Updating initial template metadata')\n await updateInitialTemplateMetadata(variables.projectId, `cli-${templateName}`)\n\n // Finish up by providing init process with template-specific info\n spin.succeed()\n return template\n\n async function writeFileIfNotExists(fileName: string, content: string): Promise<void> {\n const filePath = path.join(outputPath, fileName)\n\n if (opts.overwriteFiles) {\n // If overwrite is enabled, just write the file\n await fs.writeFile(filePath, content)\n return\n }\n\n try {\n await fs.writeFile(filePath, content, {flag: 'wx'})\n } catch (err) {\n if (err.code === 'EEXIST') {\n output.warn(`\\n${styleText('yellow', '⚠')} File \"${filePath}\" already exists, skipping`)\n } else {\n throw err\n }\n }\n }\n}\n\nfunction toTypeScriptPath(originalPath: string): string {\n return originalPath.replace(/\\.js$/, '.ts')\n}\n"],"names":["fs","path","styleText","subdebug","spinner","deburr","studioDependencies","copy","resolveLatestVersions","createAppCliConfig","createCliConfig","createPackageManifest","createStudioConfig","determineAppTemplate","templates","updateInitialTemplateMetadata","debug","bootstrapLocalTemplate","opts","output","outputPath","packageName","templateName","useTypeScript","variables","cliRoot","resolve","dirname","templatesDir","join","sourceDir","sharedDir","isAppTemplate","template","Error","spin","start","rename","toTypeScriptPath","undefined","copyFile","succeed","dependencyVersions","dependencies","devDependencies","dependency","Object","keys","packageJsonName","basename","toLowerCase","replaceAll","packageManifest","name","scripts","studioConfig","configTemplate","cliConfig","entry","organizationId","autoUpdates","dataset","projectId","codeExt","Promise","all","writeFileIfNotExists","filter","Boolean","fileName","content","filePath","overwriteFiles","writeFile","flag","err","code","warn","originalPath","replace"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/init/bootstrapLocalTemplate.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {Output, subdebug} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport deburr from 'lodash-es/deburr.js'\n\nimport {studioDependencies} from '../../studioDependencies.js'\nimport {copy} from '../../util/copy.js'\nimport {resolveLatestVersions} from '../../util/resolveLatestVersions.js'\nimport {createAppCliConfig} from './createAppCliConfig.js'\nimport {createCliConfig} from './createCliConfig.js'\nimport {createPackageManifest} from './createPackageManifest.js'\nimport {createStudioConfig, type GenerateConfigOptions} from './createStudioConfig.js'\nimport {determineAppTemplate} from './determineAppTemplate.js'\nimport templates from './templates/index.js'\nimport {type ProjectTemplate} from './types.js'\nimport {updateInitialTemplateMetadata} from './updateInitialTemplateMetadata.js'\n\nconst debug = subdebug('init:bootstrapRemoteTemplate')\n\ninterface BootstrapLocalOptions {\n output: Output\n outputPath: string\n packageName: string\n templateName: string\n useTypeScript: boolean\n variables: GenerateConfigOptions['variables']\n\n overwriteFiles?: boolean\n}\n\nexport async function bootstrapLocalTemplate(\n opts: BootstrapLocalOptions,\n): Promise<ProjectTemplate> {\n const {output, outputPath, packageName, templateName, useTypeScript, variables} = opts\n // packages/@sanity/cli/src/actions/init/ -> packages/@sanity/cli/src/action -> packages/@sanity/cli/src/\n const cliRoot = path.resolve(import.meta.dirname, '../../..')\n const templatesDir = path.join(cliRoot, 'templates')\n const sourceDir = path.join(templatesDir, templateName)\n const sharedDir = path.join(templatesDir, 'shared')\n const isAppTemplate = determineAppTemplate(templateName)\n\n // Check that we have a template info file (dependencies, plugins etc)\n const template = templates[templateName]\n if (!template) {\n throw new Error(`Template \"${templateName}\" not defined`)\n }\n\n // Copy template files\n debug('Copying files from template \"%s\" to \"%s\"', templateName, outputPath)\n let spin = spinner('Bootstrapping files from template').start()\n\n debug(`Copying template from : ${sourceDir}`)\n await copy(sourceDir, outputPath, {\n rename: useTypeScript ? toTypeScriptPath : undefined,\n })\n debug(`Copying shared template code from : ${sharedDir}`)\n await copy(path.join(sharedDir, 'gitignore.txt'), outputPath, {rename: () => '.gitignore'})\n\n if (useTypeScript) {\n await fs.copyFile(path.join(sharedDir, 'tsconfig.json'), path.join(outputPath, 'tsconfig.json'))\n }\n\n spin.succeed()\n\n // Merge global and template-specific plugins and dependencies\n\n // Resolve latest versions of Sanity-dependencies\n spin = spinner('Resolving latest module versions').start()\n const dependencyVersions = await resolveLatestVersions({\n ...(isAppTemplate ? {} : studioDependencies.dependencies),\n ...(isAppTemplate ? {} : studioDependencies.devDependencies),\n ...template.dependencies,\n ...template.devDependencies,\n })\n spin.succeed()\n\n // Use the resolved version for the given dependency\n const dependencies: Record<string, string> = {}\n for (const dependency of Object.keys({\n ...(isAppTemplate ? {} : studioDependencies.dependencies),\n ...template.dependencies,\n })) {\n dependencies[dependency] = dependencyVersions[dependency]\n }\n\n const devDependencies: Record<string, string> = {}\n for (const dependency of Object.keys({\n ...(isAppTemplate ? {} : studioDependencies.devDependencies),\n ...template.devDependencies,\n })) {\n devDependencies[dependency] = dependencyVersions[dependency]\n }\n\n let packageJsonName: string = packageName\n\n /**\n * Currently app init doesn't ask for a name, so we use the last part of the path\n */\n if (isAppTemplate) {\n packageJsonName = deburr(path.basename(outputPath).toLowerCase())\n .replaceAll(/\\s+/g, '-')\n .replaceAll(/[^a-z0-9-]/g, '')\n }\n\n // Now create a package manifest (`package.json`) with the merged dependencies\n spin = spinner('Creating default project files').start()\n const packageManifest = createPackageManifest({\n dependencies,\n devDependencies,\n isAppTemplate,\n name: packageJsonName,\n scripts: template.scripts,\n })\n\n // ...and a studio config (`sanity.config.[ts|js]`)\n const studioConfig = createStudioConfig({\n template: template.configTemplate,\n variables,\n })\n\n // ...and a CLI config (`sanity.cli.[ts|js]`)\n const cliConfig = isAppTemplate\n ? createAppCliConfig({\n entry: template.entry!,\n organizationId: variables.organizationId,\n })\n : createCliConfig({\n autoUpdates: variables.autoUpdates,\n dataset: variables.dataset,\n projectId: variables.projectId,\n })\n\n // Write non-template files to disc\n const codeExt = useTypeScript ? 'ts' : 'js'\n await Promise.all(\n [\n isAppTemplate\n ? Promise.resolve(null)\n : writeFileIfNotExists(`sanity.config.${codeExt}`, studioConfig),\n writeFileIfNotExists(`sanity.cli.${codeExt}`, cliConfig),\n writeFileIfNotExists('package.json', packageManifest),\n\n isAppTemplate\n ? Promise.resolve(null)\n : writeFileIfNotExists(\n 'eslint.config.mjs',\n `import studio from '@sanity/eslint-config-studio'\\n\\nexport default [...studio]\\n`,\n ),\n ].filter(Boolean),\n )\n\n debug('Updating initial template metadata')\n await updateInitialTemplateMetadata(variables.projectId, `cli-${templateName}`)\n\n // Finish up by providing init process with template-specific info\n spin.succeed()\n return template\n\n async function writeFileIfNotExists(fileName: string, content: string): Promise<void> {\n const filePath = path.join(outputPath, fileName)\n\n if (opts.overwriteFiles) {\n // If overwrite is enabled, just write the file\n await fs.writeFile(filePath, content)\n return\n }\n\n try {\n await fs.writeFile(filePath, content, {flag: 'wx'})\n } catch (err) {\n if (err.code === 'EEXIST') {\n output.warn(`\\n${styleText('yellow', '⚠')} File \"${filePath}\" already exists, skipping`)\n } else {\n throw err\n }\n }\n }\n}\n\nfunction toTypeScriptPath(originalPath: string): string {\n return originalPath.replace(/\\.js$/, '.ts')\n}\n"],"names":["fs","path","styleText","subdebug","spinner","deburr","studioDependencies","copy","resolveLatestVersions","createAppCliConfig","createCliConfig","createPackageManifest","createStudioConfig","determineAppTemplate","templates","updateInitialTemplateMetadata","debug","bootstrapLocalTemplate","opts","output","outputPath","packageName","templateName","useTypeScript","variables","cliRoot","resolve","dirname","templatesDir","join","sourceDir","sharedDir","isAppTemplate","template","Error","spin","start","rename","toTypeScriptPath","undefined","copyFile","succeed","dependencyVersions","dependencies","devDependencies","dependency","Object","keys","packageJsonName","basename","toLowerCase","replaceAll","packageManifest","name","scripts","studioConfig","configTemplate","cliConfig","entry","organizationId","autoUpdates","dataset","projectId","codeExt","Promise","all","writeFileIfNotExists","filter","Boolean","fileName","content","filePath","overwriteFiles","writeFile","flag","err","code","warn","originalPath","replace"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/manifest/extractAppManifest.ts"],"sourcesContent":["import {getCliConfig} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {getErrorMessage} from '../../util/getErrorMessage.js'\nimport {type DeployFlags} from '../deploy/types.js'\nimport {type AppManifest} from './types.js'\n\ninterface ExtractAppManifestOptions {\n flags: DeployFlags\n workDir: string\n}\n\n/**\n *\n * This functions slightly differently from the studio manifest extraction function.\n * We don't need to parse very complicated information like schemas and tools,\n * and we submit the manifest as a multipart form field instead of writing a file.\n */\nexport async function extractAppManifest(options: ExtractAppManifestOptions): Promise<AppManifest | undefined> {\n const {workDir} = options\n\n const spin = spinner('Extracting manifest').start()\n\n try {\n const {app} = await getCliConfig(workDir)\n if (!app) {\n // this is probably a problem for deployment, but not an issue for manifest extraction\n spin.succeed('No app configuration found')\n return undefined\n }\n const manifest: AppManifest = {\n version: '1',\n ...(app.icon ? {icon: app.icon} : {}),\n ...(app.title ? {title: app.title} : {}),\n }\n\n spin.succeed(`Extracted manifest`)\n\n return manifest\n } catch (err) {\n const message = getErrorMessage(err)\n spin.fail(message)\n throw err\n }\n}\n\n/**\n * App manifests aren't required right now.\n * This function just ensures we're not uploading empty manifests\n * (so we can reduce noise in user-applications)\n */\nexport function appManifestHasData(manifest?: AppManifest | null): boolean {\n if (!manifest || typeof manifest !== 'object' || Object.keys(manifest).length === 0) {\n return false\n }\n const validAppManifestKeys = ['icon', 'title']\n return validAppManifestKeys.some((key) => !!manifest[key as keyof AppManifest])\n}\n"],"names":["getCliConfig","spinner","getErrorMessage","extractAppManifest","options","workDir","spin","start","app","succeed","undefined","manifest","version","icon","title","err","message","fail","appManifestHasData","Object","keys","length","validAppManifestKeys","some","key"],"mappings":"AAAA,SAAQA,YAAY,QAAO,mBAAkB;AAC7C,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,eAAe,QAAO,gCAA+B;AAS7D;;;;;CAKC,GACD,OAAO,eAAeC,mBAAmBC,OAAkC;IACzE,MAAM,EAACC,OAAO,EAAC,GAAGD;IAElB,MAAME,OAAOL,QAAQ,uBAAuBM,KAAK;IAEjD,IAAI;QACF,MAAM,EAACC,GAAG,EAAC,GAAG,MAAMR,aAAaK;QACjC,IAAI,CAACG,KAAK;YACR,sFAAsF;YACtFF,KAAKG,OAAO,CAAC;YACb,OAAOC;QACT;QACA,MAAMC,WAAwB;YAC5BC,SAAS;YACT,GAAIJ,IAAIK,IAAI,GAAG;gBAACA,MAAML,IAAIK,IAAI;YAAA,IAAI,CAAC,CAAC;YACpC,GAAIL,IAAIM,KAAK,GAAG;gBAACA,OAAON,IAAIM,KAAK;YAAA,IAAI,CAAC,CAAC;QACzC;QAEAR,KAAKG,OAAO,CAAC,CAAC,kBAAkB,CAAC;QAEjC,OAAOE;IACT,EAAE,OAAOI,KAAK;QACZ,MAAMC,UAAUd,gBAAgBa;QAChCT,KAAKW,IAAI,CAACD;QACV,MAAMD;IACR;AACF;AAEA;;;;CAIC,GACD,OAAO,SAASG,mBAAmBP,QAA6B;IAC9D,IAAI,CAACA,YAAY,OAAOA,aAAa,YAAYQ,OAAOC,IAAI,CAACT,UAAUU,MAAM,KAAK,GAAG;QACnF,OAAO;IACT;IACA,MAAMC,uBAAuB;QAAC;QAAQ;KAAQ;IAC9C,OAAOA,qBAAqBC,IAAI,CAAC,CAACC,MAAQ,CAAC,CAACb,QAAQ,CAACa,IAAyB;AAChF"}
1
+ {"version":3,"sources":["../../../src/actions/manifest/extractAppManifest.ts"],"sourcesContent":["import {getCliConfig} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {getErrorMessage} from '../../util/getErrorMessage.js'\nimport {type DeployFlags} from '../deploy/types.js'\nimport {type AppManifest} from './types.js'\n\ninterface ExtractAppManifestOptions {\n flags: DeployFlags\n workDir: string\n}\n\n/**\n *\n * This functions slightly differently from the studio manifest extraction function.\n * We don't need to parse very complicated information like schemas and tools,\n * and we submit the manifest as a multipart form field instead of writing a file.\n */\nexport async function extractAppManifest(\n options: ExtractAppManifestOptions,\n): Promise<AppManifest | undefined> {\n const {workDir} = options\n\n const spin = spinner('Extracting manifest').start()\n\n try {\n const {app} = await getCliConfig(workDir)\n if (!app) {\n // this is probably a problem for deployment, but not an issue for manifest extraction\n spin.succeed('No app configuration found')\n return undefined\n }\n const manifest: AppManifest = {\n version: '1',\n ...(app.icon ? {icon: app.icon} : {}),\n ...(app.title ? {title: app.title} : {}),\n }\n\n spin.succeed(`Extracted manifest`)\n\n return manifest\n } catch (err) {\n const message = getErrorMessage(err)\n spin.fail(message)\n throw err\n }\n}\n\n/**\n * App manifests aren't required right now.\n * This function just ensures we're not uploading empty manifests\n * (so we can reduce noise in user-applications)\n */\nexport function appManifestHasData(manifest?: AppManifest | null): boolean {\n if (!manifest || typeof manifest !== 'object' || Object.keys(manifest).length === 0) {\n return false\n }\n const validAppManifestKeys = ['icon', 'title']\n return validAppManifestKeys.some((key) => !!manifest[key as keyof AppManifest])\n}\n"],"names":["getCliConfig","spinner","getErrorMessage","extractAppManifest","options","workDir","spin","start","app","succeed","undefined","manifest","version","icon","title","err","message","fail","appManifestHasData","Object","keys","length","validAppManifestKeys","some","key"],"mappings":"AAAA,SAAQA,YAAY,QAAO,mBAAkB;AAC7C,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,eAAe,QAAO,gCAA+B;AAS7D;;;;;CAKC,GACD,OAAO,eAAeC,mBACpBC,OAAkC;IAElC,MAAM,EAACC,OAAO,EAAC,GAAGD;IAElB,MAAME,OAAOL,QAAQ,uBAAuBM,KAAK;IAEjD,IAAI;QACF,MAAM,EAACC,GAAG,EAAC,GAAG,MAAMR,aAAaK;QACjC,IAAI,CAACG,KAAK;YACR,sFAAsF;YACtFF,KAAKG,OAAO,CAAC;YACb,OAAOC;QACT;QACA,MAAMC,WAAwB;YAC5BC,SAAS;YACT,GAAIJ,IAAIK,IAAI,GAAG;gBAACA,MAAML,IAAIK,IAAI;YAAA,IAAI,CAAC,CAAC;YACpC,GAAIL,IAAIM,KAAK,GAAG;gBAACA,OAAON,IAAIM,KAAK;YAAA,IAAI,CAAC,CAAC;QACzC;QAEAR,KAAKG,OAAO,CAAC,CAAC,kBAAkB,CAAC;QAEjC,OAAOE;IACT,EAAE,OAAOI,KAAK;QACZ,MAAMC,UAAUd,gBAAgBa;QAChCT,KAAKW,IAAI,CAACD;QACV,MAAMD;IACR;AACF;AAEA;;;;CAIC,GACD,OAAO,SAASG,mBAAmBP,QAA6B;IAC9D,IAAI,CAACA,YAAY,OAAOA,aAAa,YAAYQ,OAAOC,IAAI,CAACT,UAAUU,MAAM,KAAK,GAAG;QACnF,OAAO;IACT;IACA,MAAMC,uBAAuB;QAAC;QAAQ;KAAQ;IAC9C,OAAOA,qBAAqBC,IAAI,CAAC,CAACC,MAAQ,CAAC,CAACb,QAAQ,CAACa,IAAyB;AAChF"}
@@ -6,31 +6,11 @@ import { getLocalPackageVersion } from '../../util/getLocalPackageVersion.js';
6
6
  import { SchemaExtractionError } from '../schema/utils/SchemaExtractionError.js';
7
7
  import { manifestDebug } from './debug.js';
8
8
  import { writeWorkspaceFiles } from './writeWorkspaceFiles.js';
9
- export const MANIFEST_FILENAME = 'create-manifest.json';
10
- /** Escape-hatch env flags to change action behavior */ const FEATURE_ENABLED_ENV_NAME = 'SANITY_CLI_EXTRACT_MANIFEST_ENABLED';
11
- const EXTRACT_MANIFEST_ENABLED = process.env[FEATURE_ENABLED_ENV_NAME] !== 'false';
12
- const EXTRACT_MANIFEST_LOG_ERRORS = process.env.SANITY_CLI_EXTRACT_MANIFEST_LOG_ERRORS === 'true';
9
+ const MANIFEST_FILENAME = 'create-manifest.json';
13
10
  const CREATE_TIMER = 'create-manifest';
14
- /**
15
- * This function will never throw.
16
- * @returns `undefined` if extract succeeded - caught error if it failed
17
- */ export async function extractManifestSafe(options) {
18
- const { outPath, output } = options;
19
- if (!EXTRACT_MANIFEST_ENABLED) {
20
- return undefined;
21
- }
22
- try {
23
- await extractManifest(outPath);
24
- return undefined;
25
- } catch (err) {
26
- if (EXTRACT_MANIFEST_LOG_ERRORS) {
27
- output.error(err);
28
- }
29
- return err;
30
- }
31
- }
32
11
  export async function extractManifest(outPath) {
33
12
  const projectRoot = await findProjectRoot(process.cwd());
13
+ manifestDebug('Project root %o', projectRoot);
34
14
  const workDir = projectRoot.directory;
35
15
  const configPath = projectRoot.path;
36
16
  const staticPath = resolve(join(workDir, outPath));
@@ -47,6 +27,7 @@ export async function extractManifest(outPath) {
47
27
  workDir
48
28
  }
49
29
  });
30
+ manifestDebug('Result %o', result);
50
31
  if (result.type === 'error') {
51
32
  throw new SchemaExtractionError(result.error, result.validation);
52
33
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/manifest/extractManifest.ts"],"sourcesContent":["import {mkdir, writeFile} from 'node:fs/promises'\nimport {join, resolve} from 'node:path'\n\nimport {findProjectRoot, getTimer, Output, studioWorkerTask} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\nimport {type ExtractSchemaWorkerError} from '../schema/types.js'\nimport {SchemaExtractionError} from '../schema/utils/SchemaExtractionError.js'\nimport {manifestDebug} from './debug.js'\nimport {\n type CreateManifest,\n type CreateWorkspaceManifest,\n type ExtractManifestWorkerData,\n} from './types'\nimport {writeWorkspaceFiles} from './writeWorkspaceFiles.js'\n\nexport const MANIFEST_FILENAME = 'create-manifest.json'\n\n/** Escape-hatch env flags to change action behavior */\nconst FEATURE_ENABLED_ENV_NAME = 'SANITY_CLI_EXTRACT_MANIFEST_ENABLED'\nconst EXTRACT_MANIFEST_ENABLED = process.env[FEATURE_ENABLED_ENV_NAME] !== 'false'\nconst EXTRACT_MANIFEST_LOG_ERRORS = process.env.SANITY_CLI_EXTRACT_MANIFEST_LOG_ERRORS === 'true'\n\nconst CREATE_TIMER = 'create-manifest'\n\ninterface ExtractManifestOptions {\n outPath: string\n output: Output\n}\n\n/**\n * This function will never throw.\n * @returns `undefined` if extract succeeded - caught error if it failed\n */\nexport async function extractManifestSafe(\n options: ExtractManifestOptions,\n): Promise<Error | undefined> {\n const {outPath, output} = options\n if (!EXTRACT_MANIFEST_ENABLED) {\n return undefined\n }\n\n try {\n await extractManifest(outPath)\n return undefined\n } catch (err) {\n if (EXTRACT_MANIFEST_LOG_ERRORS) {\n output.error(err)\n }\n return err\n }\n}\n\ninterface ExtractManifestWorkerResult {\n type: 'success'\n workspaceManifests: CreateWorkspaceManifest[]\n}\n\ntype ExtractManifestWorkerMessage = ExtractManifestWorkerResult | ExtractSchemaWorkerError\n\nexport async function extractManifest(outPath: string): Promise<void> {\n const projectRoot = await findProjectRoot(process.cwd())\n\n const workDir = projectRoot.directory\n const configPath = projectRoot.path\n const staticPath = resolve(join(workDir, outPath))\n const path = join(staticPath, MANIFEST_FILENAME)\n\n const timer = getTimer()\n timer.start(CREATE_TIMER)\n const spin = spinner('Extracting manifest').start()\n\n try {\n const result = await studioWorkerTask<ExtractManifestWorkerMessage>(\n new URL('extractManifest.worker.js', import.meta.url),\n {\n name: 'extractManifest',\n studioRootPath: workDir,\n workerData: {configPath, workDir} satisfies ExtractManifestWorkerData,\n },\n )\n\n if (result.type === 'error') {\n throw new SchemaExtractionError(result.error, result.validation)\n }\n\n await mkdir(staticPath, {recursive: true})\n\n const workspaceFiles = await writeWorkspaceFiles(result.workspaceManifests, staticPath)\n\n const manifest: CreateManifest = {\n /**\n * Version history:\n * 1: Initial release.\n * 2: Added tools file.\n * 3. Added studioVersion field.\n */\n createdAt: new Date().toISOString(),\n studioVersion: await getLocalPackageVersion('sanity', workDir),\n version: 3,\n workspaces: workspaceFiles,\n }\n\n await writeFile(path, JSON.stringify(manifest, null, 2))\n const manifestDuration = timer.end(CREATE_TIMER)\n\n spin.succeed(`Extracted manifest (${manifestDuration.toFixed(0)}ms)`)\n } catch (err) {\n manifestDebug('Error extracting manifest', err)\n spin.fail()\n\n throw err\n }\n}\n"],"names":["mkdir","writeFile","join","resolve","findProjectRoot","getTimer","studioWorkerTask","spinner","getLocalPackageVersion","SchemaExtractionError","manifestDebug","writeWorkspaceFiles","MANIFEST_FILENAME","FEATURE_ENABLED_ENV_NAME","EXTRACT_MANIFEST_ENABLED","process","env","EXTRACT_MANIFEST_LOG_ERRORS","SANITY_CLI_EXTRACT_MANIFEST_LOG_ERRORS","CREATE_TIMER","extractManifestSafe","options","outPath","output","undefined","extractManifest","err","error","projectRoot","cwd","workDir","directory","configPath","path","staticPath","timer","start","spin","result","URL","url","name","studioRootPath","workerData","type","validation","recursive","workspaceFiles","workspaceManifests","manifest","createdAt","Date","toISOString","studioVersion","version","workspaces","JSON","stringify","manifestDuration","end","succeed","toFixed","fail"],"mappings":"AAAA,SAAQA,KAAK,EAAEC,SAAS,QAAO,mBAAkB;AACjD,SAAQC,IAAI,EAAEC,OAAO,QAAO,YAAW;AAEvC,SAAQC,eAAe,EAAEC,QAAQ,EAAUC,gBAAgB,QAAO,mBAAkB;AACpF,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,sBAAsB,QAAO,uCAAsC;AAE3E,SAAQC,qBAAqB,QAAO,2CAA0C;AAC9E,SAAQC,aAAa,QAAO,aAAY;AAMxC,SAAQC,mBAAmB,QAAO,2BAA0B;AAE5D,OAAO,MAAMC,oBAAoB,uBAAsB;AAEvD,qDAAqD,GACrD,MAAMC,2BAA2B;AACjC,MAAMC,2BAA2BC,QAAQC,GAAG,CAACH,yBAAyB,KAAK;AAC3E,MAAMI,8BAA8BF,QAAQC,GAAG,CAACE,sCAAsC,KAAK;AAE3F,MAAMC,eAAe;AAOrB;;;CAGC,GACD,OAAO,eAAeC,oBACpBC,OAA+B;IAE/B,MAAM,EAACC,OAAO,EAAEC,MAAM,EAAC,GAAGF;IAC1B,IAAI,CAACP,0BAA0B;QAC7B,OAAOU;IACT;IAEA,IAAI;QACF,MAAMC,gBAAgBH;QACtB,OAAOE;IACT,EAAE,OAAOE,KAAK;QACZ,IAAIT,6BAA6B;YAC/BM,OAAOI,KAAK,CAACD;QACf;QACA,OAAOA;IACT;AACF;AASA,OAAO,eAAeD,gBAAgBH,OAAe;IACnD,MAAMM,cAAc,MAAMxB,gBAAgBW,QAAQc,GAAG;IAErD,MAAMC,UAAUF,YAAYG,SAAS;IACrC,MAAMC,aAAaJ,YAAYK,IAAI;IACnC,MAAMC,aAAa/B,QAAQD,KAAK4B,SAASR;IACzC,MAAMW,OAAO/B,KAAKgC,YAAYtB;IAE9B,MAAMuB,QAAQ9B;IACd8B,MAAMC,KAAK,CAACjB;IACZ,MAAMkB,OAAO9B,QAAQ,uBAAuB6B,KAAK;IAEjD,IAAI;QACF,MAAME,SAAS,MAAMhC,iBACnB,IAAIiC,IAAI,6BAA6B,YAAYC,GAAG,GACpD;YACEC,MAAM;YACNC,gBAAgBZ;YAChBa,YAAY;gBAACX;gBAAYF;YAAO;QAClC;QAGF,IAAIQ,OAAOM,IAAI,KAAK,SAAS;YAC3B,MAAM,IAAInC,sBAAsB6B,OAAOX,KAAK,EAAEW,OAAOO,UAAU;QACjE;QAEA,MAAM7C,MAAMkC,YAAY;YAACY,WAAW;QAAI;QAExC,MAAMC,iBAAiB,MAAMpC,oBAAoB2B,OAAOU,kBAAkB,EAAEd;QAE5E,MAAMe,WAA2B;YAC/B;;;;;OAKC,GACDC,WAAW,IAAIC,OAAOC,WAAW;YACjCC,eAAe,MAAM7C,uBAAuB,UAAUsB;YACtDwB,SAAS;YACTC,YAAYR;QACd;QAEA,MAAM9C,UAAUgC,MAAMuB,KAAKC,SAAS,CAACR,UAAU,MAAM;QACrD,MAAMS,mBAAmBvB,MAAMwB,GAAG,CAACxC;QAEnCkB,KAAKuB,OAAO,CAAC,CAAC,oBAAoB,EAAEF,iBAAiBG,OAAO,CAAC,GAAG,GAAG,CAAC;IACtE,EAAE,OAAOnC,KAAK;QACZhB,cAAc,6BAA6BgB;QAC3CW,KAAKyB,IAAI;QAET,MAAMpC;IACR;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/manifest/extractManifest.ts"],"sourcesContent":["import {mkdir, writeFile} from 'node:fs/promises'\nimport {join, resolve} from 'node:path'\n\nimport {findProjectRoot, getTimer, studioWorkerTask} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\nimport {type ExtractSchemaWorkerError} from '../schema/types.js'\nimport {SchemaExtractionError} from '../schema/utils/SchemaExtractionError.js'\nimport {manifestDebug} from './debug.js'\nimport {\n type CreateManifest,\n type CreateWorkspaceManifest,\n type ExtractManifestWorkerData,\n} from './types'\nimport {writeWorkspaceFiles} from './writeWorkspaceFiles.js'\n\nconst MANIFEST_FILENAME = 'create-manifest.json'\nconst CREATE_TIMER = 'create-manifest'\n\ninterface ExtractManifestWorkerResult {\n type: 'success'\n workspaceManifests: CreateWorkspaceManifest[]\n}\n\ntype ExtractManifestWorkerMessage = ExtractManifestWorkerResult | ExtractSchemaWorkerError\n\nexport async function extractManifest(outPath: string): Promise<void> {\n const projectRoot = await findProjectRoot(process.cwd())\n\n manifestDebug('Project root %o', projectRoot)\n\n const workDir = projectRoot.directory\n const configPath = projectRoot.path\n const staticPath = resolve(join(workDir, outPath))\n const path = join(staticPath, MANIFEST_FILENAME)\n\n const timer = getTimer()\n timer.start(CREATE_TIMER)\n const spin = spinner('Extracting manifest').start()\n\n try {\n const result = await studioWorkerTask<ExtractManifestWorkerMessage>(\n new URL('extractManifest.worker.js', import.meta.url),\n {\n name: 'extractManifest',\n studioRootPath: workDir,\n workerData: {configPath, workDir} satisfies ExtractManifestWorkerData,\n },\n )\n\n manifestDebug('Result %o', result)\n\n if (result.type === 'error') {\n throw new SchemaExtractionError(result.error, result.validation)\n }\n\n await mkdir(staticPath, {recursive: true})\n\n const workspaceFiles = await writeWorkspaceFiles(result.workspaceManifests, staticPath)\n\n const manifest: CreateManifest = {\n /**\n * Version history:\n * 1: Initial release.\n * 2: Added tools file.\n * 3. Added studioVersion field.\n */\n createdAt: new Date().toISOString(),\n studioVersion: await getLocalPackageVersion('sanity', workDir),\n version: 3,\n workspaces: workspaceFiles,\n }\n\n await writeFile(path, JSON.stringify(manifest, null, 2))\n const manifestDuration = timer.end(CREATE_TIMER)\n\n spin.succeed(`Extracted manifest (${manifestDuration.toFixed(0)}ms)`)\n } catch (err) {\n manifestDebug('Error extracting manifest', err)\n spin.fail()\n\n throw err\n }\n}\n"],"names":["mkdir","writeFile","join","resolve","findProjectRoot","getTimer","studioWorkerTask","spinner","getLocalPackageVersion","SchemaExtractionError","manifestDebug","writeWorkspaceFiles","MANIFEST_FILENAME","CREATE_TIMER","extractManifest","outPath","projectRoot","process","cwd","workDir","directory","configPath","path","staticPath","timer","start","spin","result","URL","url","name","studioRootPath","workerData","type","error","validation","recursive","workspaceFiles","workspaceManifests","manifest","createdAt","Date","toISOString","studioVersion","version","workspaces","JSON","stringify","manifestDuration","end","succeed","toFixed","err","fail"],"mappings":"AAAA,SAAQA,KAAK,EAAEC,SAAS,QAAO,mBAAkB;AACjD,SAAQC,IAAI,EAAEC,OAAO,QAAO,YAAW;AAEvC,SAAQC,eAAe,EAAEC,QAAQ,EAAEC,gBAAgB,QAAO,mBAAkB;AAC5E,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,sBAAsB,QAAO,uCAAsC;AAE3E,SAAQC,qBAAqB,QAAO,2CAA0C;AAC9E,SAAQC,aAAa,QAAO,aAAY;AAMxC,SAAQC,mBAAmB,QAAO,2BAA0B;AAE5D,MAAMC,oBAAoB;AAC1B,MAAMC,eAAe;AASrB,OAAO,eAAeC,gBAAgBC,OAAe;IACnD,MAAMC,cAAc,MAAMZ,gBAAgBa,QAAQC,GAAG;IAErDR,cAAc,mBAAmBM;IAEjC,MAAMG,UAAUH,YAAYI,SAAS;IACrC,MAAMC,aAAaL,YAAYM,IAAI;IACnC,MAAMC,aAAapB,QAAQD,KAAKiB,SAASJ;IACzC,MAAMO,OAAOpB,KAAKqB,YAAYX;IAE9B,MAAMY,QAAQnB;IACdmB,MAAMC,KAAK,CAACZ;IACZ,MAAMa,OAAOnB,QAAQ,uBAAuBkB,KAAK;IAEjD,IAAI;QACF,MAAME,SAAS,MAAMrB,iBACnB,IAAIsB,IAAI,6BAA6B,YAAYC,GAAG,GACpD;YACEC,MAAM;YACNC,gBAAgBZ;YAChBa,YAAY;gBAACX;gBAAYF;YAAO;QAClC;QAGFT,cAAc,aAAaiB;QAE3B,IAAIA,OAAOM,IAAI,KAAK,SAAS;YAC3B,MAAM,IAAIxB,sBAAsBkB,OAAOO,KAAK,EAAEP,OAAOQ,UAAU;QACjE;QAEA,MAAMnC,MAAMuB,YAAY;YAACa,WAAW;QAAI;QAExC,MAAMC,iBAAiB,MAAM1B,oBAAoBgB,OAAOW,kBAAkB,EAAEf;QAE5E,MAAMgB,WAA2B;YAC/B;;;;;OAKC,GACDC,WAAW,IAAIC,OAAOC,WAAW;YACjCC,eAAe,MAAMnC,uBAAuB,UAAUW;YACtDyB,SAAS;YACTC,YAAYR;QACd;QAEA,MAAMpC,UAAUqB,MAAMwB,KAAKC,SAAS,CAACR,UAAU,MAAM;QACrD,MAAMS,mBAAmBxB,MAAMyB,GAAG,CAACpC;QAEnCa,KAAKwB,OAAO,CAAC,CAAC,oBAAoB,EAAEF,iBAAiBG,OAAO,CAAC,GAAG,GAAG,CAAC;IACtE,EAAE,OAAOC,KAAK;QACZ1C,cAAc,6BAA6B0C;QAC3C1B,KAAK2B,IAAI;QAET,MAAMD;IACR;AACF"}
@@ -1,20 +1,24 @@
1
1
  import { isMainThread, parentPort, workerData } from 'node:worker_threads';
2
- import { getStudioWorkspaces } from '@sanity/cli-core';
2
+ import { getStudioWorkspaces, subdebug } from '@sanity/cli-core';
3
3
  import { extractValidationFromSchemaError } from '../schema/utils/extractValidationFromSchemaError.js';
4
4
  import { extractWorkspaceManifest } from './extractWorkspaceManifest.js';
5
5
  import { extractManifestWorkerData } from './types.js';
6
6
  if (isMainThread || !parentPort) {
7
7
  throw new Error('Should only be run in a worker!');
8
8
  }
9
+ const debug = subdebug('extractManifest.worker');
9
10
  const { configPath, workDir } = extractManifestWorkerData.parse(workerData);
10
11
  try {
12
+ debug('Extracting workspace manifests from config path %s', configPath);
11
13
  const workspaces = await getStudioWorkspaces(configPath);
14
+ debug('Workspaces %o', workspaces);
12
15
  const workspaceManifests = await extractWorkspaceManifest(workspaces, workDir);
13
16
  parentPort.postMessage({
14
17
  type: 'success',
15
18
  workspaceManifests
16
19
  });
17
20
  } catch (error) {
21
+ debug('Error extracting workspace manifests', error);
18
22
  const validation = await extractValidationFromSchemaError(error, workDir);
19
23
  parentPort.postMessage({
20
24
  error: error instanceof Error ? error.message : String(error),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/manifest/extractManifest.worker.ts"],"sourcesContent":["import {isMainThread, parentPort, workerData} from 'node:worker_threads'\n\nimport {getStudioWorkspaces} from '@sanity/cli-core'\n\nimport {extractValidationFromSchemaError} from '../schema/utils/extractValidationFromSchemaError.js'\nimport {extractWorkspaceManifest} from './extractWorkspaceManifest.js'\nimport {extractManifestWorkerData} from './types.js'\n\nif (isMainThread || !parentPort) {\n throw new Error('Should only be run in a worker!')\n}\n\nconst {configPath, workDir} = extractManifestWorkerData.parse(workerData)\n\ntry {\n const workspaces = await getStudioWorkspaces(configPath)\n const workspaceManifests = await extractWorkspaceManifest(workspaces, workDir)\n\n parentPort.postMessage({\n type: 'success',\n workspaceManifests,\n })\n} catch (error) {\n const validation = await extractValidationFromSchemaError(error, workDir)\n parentPort.postMessage({\n error: error instanceof Error ? error.message : String(error),\n type: 'error',\n validation,\n })\n}\n"],"names":["isMainThread","parentPort","workerData","getStudioWorkspaces","extractValidationFromSchemaError","extractWorkspaceManifest","extractManifestWorkerData","Error","configPath","workDir","parse","workspaces","workspaceManifests","postMessage","type","error","validation","message","String"],"mappings":"AAAA,SAAQA,YAAY,EAAEC,UAAU,EAAEC,UAAU,QAAO,sBAAqB;AAExE,SAAQC,mBAAmB,QAAO,mBAAkB;AAEpD,SAAQC,gCAAgC,QAAO,sDAAqD;AACpG,SAAQC,wBAAwB,QAAO,gCAA+B;AACtE,SAAQC,yBAAyB,QAAO,aAAY;AAEpD,IAAIN,gBAAgB,CAACC,YAAY;IAC/B,MAAM,IAAIM,MAAM;AAClB;AAEA,MAAM,EAACC,UAAU,EAAEC,OAAO,EAAC,GAAGH,0BAA0BI,KAAK,CAACR;AAE9D,IAAI;IACF,MAAMS,aAAa,MAAMR,oBAAoBK;IAC7C,MAAMI,qBAAqB,MAAMP,yBAAyBM,YAAYF;IAEtER,WAAWY,WAAW,CAAC;QACrBC,MAAM;QACNF;IACF;AACF,EAAE,OAAOG,OAAO;IACd,MAAMC,aAAa,MAAMZ,iCAAiCW,OAAON;IACjER,WAAWY,WAAW,CAAC;QACrBE,OAAOA,iBAAiBR,QAAQQ,MAAME,OAAO,GAAGC,OAAOH;QACvDD,MAAM;QACNE;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/manifest/extractManifest.worker.ts"],"sourcesContent":["import {isMainThread, parentPort, workerData} from 'node:worker_threads'\n\nimport {getStudioWorkspaces, subdebug} from '@sanity/cli-core'\n\nimport {extractValidationFromSchemaError} from '../schema/utils/extractValidationFromSchemaError.js'\nimport {extractWorkspaceManifest} from './extractWorkspaceManifest.js'\nimport {extractManifestWorkerData} from './types.js'\n\nif (isMainThread || !parentPort) {\n throw new Error('Should only be run in a worker!')\n}\n\nconst debug = subdebug('extractManifest.worker')\n\nconst {configPath, workDir} = extractManifestWorkerData.parse(workerData)\n\ntry {\n debug('Extracting workspace manifests from config path %s', configPath)\n const workspaces = await getStudioWorkspaces(configPath)\n debug('Workspaces %o', workspaces)\n const workspaceManifests = await extractWorkspaceManifest(workspaces, workDir)\n\n parentPort.postMessage({\n type: 'success',\n workspaceManifests,\n })\n} catch (error) {\n debug('Error extracting workspace manifests', error)\n const validation = await extractValidationFromSchemaError(error, workDir)\n parentPort.postMessage({\n error: error instanceof Error ? error.message : String(error),\n type: 'error',\n validation,\n })\n}\n"],"names":["isMainThread","parentPort","workerData","getStudioWorkspaces","subdebug","extractValidationFromSchemaError","extractWorkspaceManifest","extractManifestWorkerData","Error","debug","configPath","workDir","parse","workspaces","workspaceManifests","postMessage","type","error","validation","message","String"],"mappings":"AAAA,SAAQA,YAAY,EAAEC,UAAU,EAAEC,UAAU,QAAO,sBAAqB;AAExE,SAAQC,mBAAmB,EAAEC,QAAQ,QAAO,mBAAkB;AAE9D,SAAQC,gCAAgC,QAAO,sDAAqD;AACpG,SAAQC,wBAAwB,QAAO,gCAA+B;AACtE,SAAQC,yBAAyB,QAAO,aAAY;AAEpD,IAAIP,gBAAgB,CAACC,YAAY;IAC/B,MAAM,IAAIO,MAAM;AAClB;AAEA,MAAMC,QAAQL,SAAS;AAEvB,MAAM,EAACM,UAAU,EAAEC,OAAO,EAAC,GAAGJ,0BAA0BK,KAAK,CAACV;AAE9D,IAAI;IACFO,MAAM,sDAAsDC;IAC5D,MAAMG,aAAa,MAAMV,oBAAoBO;IAC7CD,MAAM,iBAAiBI;IACvB,MAAMC,qBAAqB,MAAMR,yBAAyBO,YAAYF;IAEtEV,WAAWc,WAAW,CAAC;QACrBC,MAAM;QACNF;IACF;AACF,EAAE,OAAOG,OAAO;IACdR,MAAM,wCAAwCQ;IAC9C,MAAMC,aAAa,MAAMb,iCAAiCY,OAAON;IACjEV,WAAWc,WAAW,CAAC;QACrBE,OAAOA,iBAAiBT,QAAQS,MAAME,OAAO,GAAGC,OAAOH;QACvDD,MAAM;QACNE;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/manifest/types.ts"],"sourcesContent":["import {type SanityDocumentLike} from '@sanity/types'\nimport {type MediaLibraryConfig} from 'sanity'\nimport {z} from 'zod'\n\nexport const SANITY_WORKSPACE_SCHEMA_ID_PREFIX = '_.schemas'\nexport const SANITY_WORKSPACE_SCHEMA_TYPE = 'system.schema'\nexport const CURRENT_WORKSPACE_SCHEMA_VERSION = '2025-05-01'\n\nexport type ManifestSerializable =\n | boolean\n | ManifestSerializable[]\n | number\n | string\n | {[k: string]: ManifestSerializable}\n\nexport interface CreateManifest {\n createdAt: string\n studioVersion: string | null\n version: number\n workspaces: ManifestWorkspaceFile[]\n}\n\nexport interface AppManifest {\n version: '1'\n\n icon?: string\n title?: string\n}\n\nexport interface ManifestWorkspaceFile extends Omit<CreateWorkspaceManifest, 'schema' | 'tools'> {\n schema: string // filename\n tools: string // filename\n}\n\nexport interface CreateWorkspaceManifest {\n basePath: string\n dataset: string\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n name: string\n projectId: string\n schema: ManifestSchemaType[]\n tools: ManifestTool[]\n\n mediaLibrary?: MediaLibraryConfig\n subtitle?: string\n title?: string\n}\n\nexport interface ManifestSchemaType {\n name: string\n type: string\n\n deprecated?: {\n reason: string\n }\n fields?: ManifestField[]\n fieldsets?: ManifestFieldset[]\n hidden?: 'conditional' | boolean\n lists?: ManifestTitledValue[]\n //portable text\n marks?: {\n annotations?: ManifestArrayMember[]\n decorators?: ManifestTitledValue[]\n }\n of?: ManifestArrayMember[]\n options?: Record<string, ManifestSerializable>\n preview?: {\n select: Record<string, string>\n }\n readOnly?: 'conditional' | boolean\n styles?: ManifestTitledValue[]\n title?: string\n to?: ManifestReferenceMember[]\n validation?: ManifestValidationGroup[]\n\n // userland (assignable to ManifestSerializable | undefined)\n // not included to add some typesafty to extractManifest\n // [index: string]: unknown\n}\n\nexport interface ManifestFieldset {\n [index: string]: ManifestSerializable | undefined\n name: string\n\n title?: string\n}\n\nexport interface ManifestTitledValue {\n value: string\n\n title?: string\n}\n\ntype ManifestArrayMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\ntype ManifestReferenceMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\nexport type ManifestField = ManifestSchemaType & {fieldset?: string}\n\nexport interface ManifestValidationGroup {\n rules: ManifestValidationRule[]\n\n level?: 'error' | 'info' | 'warning'\n message?: string\n}\n\nexport type ManifestValidationRule = {\n [index: string]: ManifestSerializable | undefined\n constraint?: ManifestSerializable\n flag: string\n}\n\nexport interface ManifestTool {\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n name: string\n title: string\n type: string | null\n}\n\nexport type DefaultWorkspaceSchemaId = `${typeof SANITY_WORKSPACE_SCHEMA_ID_PREFIX}.${string}`\ntype PrefixedWorkspaceSchemaId = `${DefaultWorkspaceSchemaId}.${string}`\nexport type WorkspaceSchemaId = DefaultWorkspaceSchemaId | PrefixedWorkspaceSchemaId\n\nexport interface StoredWorkspaceSchema extends SanityDocumentLike {\n _id: WorkspaceSchemaId\n _type: typeof SANITY_WORKSPACE_SCHEMA_TYPE\n /**\n * The API expects JSON coming in, but will store a string to save on attribute paths.\n * Consumers must use JSON.parse on the value, put we deploy to the API using ManifestSchemaType[]\n */\n schema: ManifestSchemaType[] | string\n /* api-like version string: date at which the format had a meaningful change */\n version: typeof CURRENT_WORKSPACE_SCHEMA_VERSION | undefined\n workspace: {\n name: string\n title?: string\n }\n\n tag?: string\n}\n\nexport const extractManifestWorkerData = z.object({configPath: z.string(), workDir: z.string()})\n\nexport type ExtractManifestWorkerData = z.infer<typeof extractManifestWorkerData>\n"],"names":["z","SANITY_WORKSPACE_SCHEMA_ID_PREFIX","SANITY_WORKSPACE_SCHEMA_TYPE","CURRENT_WORKSPACE_SCHEMA_VERSION","extractManifestWorkerData","object","configPath","string","workDir"],"mappings":"AAEA,SAAQA,CAAC,QAAO,MAAK;AAErB,OAAO,MAAMC,oCAAoC,YAAW;AAC5D,OAAO,MAAMC,+BAA+B,gBAAe;AAC3D,OAAO,MAAMC,mCAAmC,aAAY;AA2I5D,OAAO,MAAMC,4BAA4BJ,EAAEK,MAAM,CAAC;IAACC,YAAYN,EAAEO,MAAM;IAAIC,SAASR,EAAEO,MAAM;AAAE,GAAE"}
1
+ {"version":3,"sources":["../../../src/actions/manifest/types.ts"],"sourcesContent":["import {type SanityDocumentLike} from '@sanity/types'\nimport {type MediaLibraryConfig, type Workspace} from 'sanity'\nimport {z} from 'zod'\n\nexport const SANITY_WORKSPACE_SCHEMA_ID_PREFIX = '_.schemas'\nexport const SANITY_WORKSPACE_SCHEMA_TYPE = 'system.schema'\nexport const CURRENT_WORKSPACE_SCHEMA_VERSION = '2025-05-01'\n\nexport type ManifestSerializable =\n | boolean\n | ManifestSerializable[]\n | number\n | string\n | {[k: string]: ManifestSerializable}\n\nexport interface CreateManifest {\n createdAt: string\n studioVersion: string | null\n version: number\n workspaces: ManifestWorkspaceFile[]\n}\n\nexport interface AppManifest {\n version: '1'\n\n icon?: string\n title?: string\n}\n\nexport interface ManifestWorkspaceFile extends Omit<CreateWorkspaceManifest, 'schema' | 'tools'> {\n schema: string // filename\n tools: string // filename\n}\n\nexport interface CreateWorkspaceManifest {\n basePath: string\n dataset: string\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n name: string\n projectId: string\n schema: ManifestSchemaType[]\n tools: ManifestTool[]\n\n mediaLibrary?: MediaLibraryConfig\n subtitle?: string\n title?: string\n}\n\nexport interface ManifestSchemaType {\n name: string\n type: string\n\n deprecated?: {\n reason: string\n }\n fields?: ManifestField[]\n fieldsets?: ManifestFieldset[]\n hidden?: 'conditional' | boolean\n lists?: ManifestTitledValue[]\n //portable text\n marks?: {\n annotations?: ManifestArrayMember[]\n decorators?: ManifestTitledValue[]\n }\n of?: ManifestArrayMember[]\n options?: Record<string, ManifestSerializable>\n preview?: {\n select: Record<string, string>\n }\n readOnly?: 'conditional' | boolean\n styles?: ManifestTitledValue[]\n title?: string\n to?: ManifestReferenceMember[]\n validation?: ManifestValidationGroup[]\n\n // userland (assignable to ManifestSerializable | undefined)\n // not included to add some typesafty to extractManifest\n // [index: string]: unknown\n}\n\nexport interface ManifestFieldset {\n [index: string]: ManifestSerializable | undefined\n name: string\n\n title?: string\n}\n\nexport interface ManifestTitledValue {\n value: string\n\n title?: string\n}\n\ntype ManifestArrayMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\ntype ManifestReferenceMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\nexport type ManifestField = ManifestSchemaType & {fieldset?: string}\n\nexport interface ManifestValidationGroup {\n rules: ManifestValidationRule[]\n\n level?: 'error' | 'info' | 'warning'\n message?: string\n}\n\nexport type ManifestValidationRule = {\n [index: string]: ManifestSerializable | undefined\n constraint?: ManifestSerializable\n flag: string\n}\n\nexport interface ManifestTool {\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n name: string\n title: string\n type: string | null\n}\n\nexport type DefaultWorkspaceSchemaId = `${typeof SANITY_WORKSPACE_SCHEMA_ID_PREFIX}.${string}`\ntype PrefixedWorkspaceSchemaId = `${DefaultWorkspaceSchemaId}.${string}`\nexport type WorkspaceSchemaId = DefaultWorkspaceSchemaId | PrefixedWorkspaceSchemaId\n\nexport interface StoredWorkspaceSchema extends SanityDocumentLike {\n _id: WorkspaceSchemaId\n _type: typeof SANITY_WORKSPACE_SCHEMA_TYPE\n /**\n * The API expects JSON coming in, but will store a string to save on attribute paths.\n * Consumers must use JSON.parse on the value, put we deploy to the API using ManifestSchemaType[]\n */\n schema: string | Workspace['schema']\n /* api-like version string: date at which the format had a meaningful change */\n version: typeof CURRENT_WORKSPACE_SCHEMA_VERSION | undefined\n workspace: {\n name: string\n title?: string\n }\n\n tag?: string\n}\n\nexport const extractManifestWorkerData = z.object({configPath: z.string(), workDir: z.string()})\n\nexport type ExtractManifestWorkerData = z.infer<typeof extractManifestWorkerData>\n"],"names":["z","SANITY_WORKSPACE_SCHEMA_ID_PREFIX","SANITY_WORKSPACE_SCHEMA_TYPE","CURRENT_WORKSPACE_SCHEMA_VERSION","extractManifestWorkerData","object","configPath","string","workDir"],"mappings":"AAEA,SAAQA,CAAC,QAAO,MAAK;AAErB,OAAO,MAAMC,oCAAoC,YAAW;AAC5D,OAAO,MAAMC,+BAA+B,gBAAe;AAC3D,OAAO,MAAMC,mCAAmC,aAAY;AA2I5D,OAAO,MAAMC,4BAA4BJ,EAAEK,MAAM,CAAC;IAACC,YAAYN,EAAEO,MAAM;IAAIC,SAASR,EAAEO,MAAM;AAAE,GAAE"}
@@ -1,98 +1,75 @@
1
1
  import { styleText } from 'node:util';
2
+ import { studioWorkerTask } from '@sanity/cli-core';
2
3
  import { updateSchemas } from '../../services/schemas.js';
3
4
  import { CURRENT_WORKSPACE_SCHEMA_VERSION } from '../manifest/types.js';
4
- import { schemasDeployDebug } from './utils/debug.js';
5
- import { ensureManifestExtractSatisfied } from './utils/manifestExtractor.js';
6
- import { createManifestReader } from './utils/manifestReader.js';
7
- import { FlagValidationError, SCHEMA_PERMISSION_HELP_TEXT } from './utils/schemaStoreValidation.js';
5
+ import { SchemaExtractionError } from './utils/SchemaExtractionError.js';
6
+ import { SCHEMA_PERMISSION_HELP_TEXT } from './utils/schemaStoreValidation.js';
8
7
  import { getWorkspaceSchemaId } from './utils/workspaceSchemaId.js';
9
8
  export async function deploySchemas(options) {
10
- const { extractManifest, manifestDir, manifestSafe, output, schemaRequired, tag, verbose, workDir, workspaceName } = options;
11
- if (!await ensureManifestExtractSatisfied({
12
- extractManifest,
13
- manifestDir,
14
- manifestSafe,
15
- output,
16
- schemaRequired,
17
- workDir
18
- })) {
19
- return 'failure';
20
- }
21
- try {
22
- const manifestReader = await createManifestReader({
23
- manifestDir,
24
- output,
9
+ const { output, tag, verbose, workDir, workspaceName } = options;
10
+ const result = await studioWorkerTask(new URL('extractSanityWorkspace.worker.js', import.meta.url), {
11
+ name: 'extractSanityWorkspace',
12
+ studioRootPath: workDir,
13
+ workerData: {
14
+ configPath: workDir,
25
15
  workDir
26
- });
27
- const manifest = await manifestReader.getManifest();
28
- const workspaces = manifest.workspaces.filter((workspace)=>!workspaceName || workspace.name === workspaceName);
29
- if (workspaces.length === 0) {
30
- const error = workspaceName ? new FlagValidationError(`Found no workspaces named "${workspaceName}"`) : new Error('Workspace array in manifest is empty.');
31
- throw error;
32
16
  }
33
- const updateSchema = getUpdateSchema({
34
- manifestReader,
17
+ });
18
+ if (result.type === 'error') {
19
+ throw new SchemaExtractionError(result.error, result.validation);
20
+ }
21
+ const workspaces = result.workspaces.filter((workspace)=>!workspaceName || workspace.name === workspaceName);
22
+ if (workspaces.length === 0) {
23
+ const error = workspaceName ? new Error(`Found no workspaces named "${workspaceName}"`) : new Error('No workspaces found');
24
+ throw error;
25
+ }
26
+ /* Known caveat: we _don't_ rollback failed operations or partial success */ const results = await Promise.allSettled(workspaces.map(async (workspace)=>{
27
+ await updateWorkspaceSchema({
35
28
  output,
36
29
  tag,
37
- verbose
30
+ verbose,
31
+ workspace
38
32
  });
39
- /* Known caveat: we _don't_ rollback failed operations or partial success */ const results = await Promise.allSettled(workspaces.map(async (workspace)=>{
40
- await updateSchema(workspace);
41
- }));
42
- const fulfilledUpdates = results.filter((result)=>result.status === 'fulfilled');
43
- const rejectedUpdates = results.filter((result)=>result.status === 'rejected');
44
- if (rejectedUpdates.length > 0) {
45
- throw new Error(`Failed to deploy ${rejectedUpdates.length}/${workspaces.length} schemas. Successfully deployed ${fulfilledUpdates.length}/${workspaces.length} schemas.`);
46
- }
47
- output.log(`Deployed ${fulfilledUpdates.length}/${workspaces.length} schemas`);
48
- return 'success';
49
- } catch (err) {
50
- if (schemaRequired || err instanceof FlagValidationError) {
51
- output.error(err.message);
52
- } else {
53
- output.error(`↳ Error when storing schemas:\n ${err.message}`);
54
- }
55
- schemasDeployDebug('Error updating schemas', err.message);
56
- return 'failure';
57
- } finally{
58
- output.log(`${styleText('gray', '↳ List deployed schemas with:')} ${styleText('cyan', 'sanity schema list')}`);
33
+ }));
34
+ const fulfilledUpdates = results.filter((result)=>result.status === 'fulfilled');
35
+ const rejectedUpdates = results.filter((result)=>result.status === 'rejected');
36
+ if (rejectedUpdates.length > 0) {
37
+ throw new Error(`Failed to deploy ${rejectedUpdates.length}/${workspaces.length} schemas. Successfully deployed ${fulfilledUpdates.length}/${workspaces.length} schemas.`);
59
38
  }
39
+ output.log(`Deployed ${fulfilledUpdates.length}/${workspaces.length} schemas`);
60
40
  }
61
- function getUpdateSchema(args) {
62
- const { manifestReader, output, tag, verbose } = args;
63
- return async (workspace)=>{
64
- const { dataset, projectId } = workspace;
65
- const { idWarning, safeBaseId: id } = getWorkspaceSchemaId({
66
- tag,
67
- workspaceName: workspace.name
68
- });
69
- if (idWarning) output.warn(idWarning);
70
- try {
71
- const schema = await manifestReader.getWorkspaceSchema(workspace.name);
72
- await updateSchemas(dataset, projectId, [
73
- {
74
- // the API will stringify the schema – we send as JSON
75
- schema,
76
- tag,
77
- version: CURRENT_WORKSPACE_SCHEMA_VERSION,
78
- workspace: {
79
- name: workspace.name,
80
- title: workspace.title
81
- }
41
+ async function updateWorkspaceSchema(args) {
42
+ const { output, tag, verbose, workspace } = args;
43
+ const { dataset, projectId } = workspace;
44
+ const { idWarning, safeBaseId: id } = getWorkspaceSchemaId({
45
+ tag,
46
+ workspaceName: workspace.name
47
+ });
48
+ if (idWarning) output.warn(idWarning);
49
+ try {
50
+ await updateSchemas(dataset, projectId, [
51
+ {
52
+ // the API will stringify the schema – we send as JSON
53
+ schema: workspace.schema,
54
+ tag,
55
+ version: CURRENT_WORKSPACE_SCHEMA_VERSION,
56
+ workspace: {
57
+ name: workspace.name,
58
+ title: workspace.title
82
59
  }
83
- ]);
84
- if (verbose) {
85
- output.log(styleText('gray', `↳ schemaId: ${id}, projectId: ${projectId}, dataset: ${dataset}`));
86
- }
87
- } catch (err) {
88
- if ('statusCode' in err && err?.statusCode === 401) {
89
- output.warn(`↳ No permissions to write schema for workspace "${workspace.name}" in dataset "${workspace.dataset}". ${SCHEMA_PERMISSION_HELP_TEXT}:\n ${styleText('red', `${err.message}`)}`);
90
- } else {
91
- output.error(`↳ Error deploying schema for workspace "${workspace.name}":\n ${styleText('red', `${err.message}`)}`);
92
60
  }
93
- throw err;
61
+ ]);
62
+ if (verbose) {
63
+ output.log(styleText('gray', `↳ schemaId: ${id}, projectId: ${projectId}, dataset: ${dataset}`));
94
64
  }
95
- };
65
+ } catch (err) {
66
+ if ('statusCode' in err && err?.statusCode === 401) {
67
+ output.warn(`↳ No permissions to write schema for workspace "${workspace.name}" in dataset "${workspace.dataset}". ${SCHEMA_PERMISSION_HELP_TEXT}:\n ${styleText('red', `${err.message}`)}`);
68
+ } else {
69
+ output.log(styleText('red', `↳ Error deploying schema for workspace "${workspace.name}":\n ${styleText('red', `${err.message}`)}`));
70
+ }
71
+ throw err;
72
+ }
96
73
  }
97
74
 
98
75
  //# sourceMappingURL=deploySchemas.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/schema/deploySchemas.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {type Output} from '@sanity/cli-core'\n\nimport {type DeploySchemaCommand} from '../../commands/schema/deploy'\nimport {updateSchemas} from '../../services/schemas.js'\nimport {\n CURRENT_WORKSPACE_SCHEMA_VERSION,\n type ManifestWorkspaceFile,\n type StoredWorkspaceSchema,\n} from '../manifest/types.js'\nimport {type SchemaStoreActionResult} from './schemaStoreTypes.js'\nimport {schemasDeployDebug} from './utils/debug.js'\nimport {ensureManifestExtractSatisfied} from './utils/manifestExtractor.js'\nimport {type CreateManifestReader, createManifestReader} from './utils/manifestReader.js'\nimport {FlagValidationError, SCHEMA_PERMISSION_HELP_TEXT} from './utils/schemaStoreValidation.js'\nimport {getWorkspaceSchemaId} from './utils/workspaceSchemaId.js'\n\ninterface DeploySchemasOptions {\n extractManifest: boolean\n manifestDir: string\n output: Output\n verbose: boolean\n workDir: string\n\n manifestSafe?: boolean\n schemaRequired?: boolean\n tag?: string\n workspaceName?: string\n}\n\nexport async function deploySchemas(\n options: DeploySchemasOptions,\n): Promise<SchemaStoreActionResult> {\n const {\n extractManifest,\n manifestDir,\n manifestSafe,\n output,\n schemaRequired,\n tag,\n verbose,\n workDir,\n workspaceName,\n } = options\n\n if (\n !(await ensureManifestExtractSatisfied({\n extractManifest,\n manifestDir,\n manifestSafe,\n output,\n schemaRequired,\n workDir,\n }))\n ) {\n return 'failure'\n }\n\n try {\n const manifestReader = await createManifestReader({\n manifestDir,\n output,\n workDir,\n })\n const manifest = await manifestReader.getManifest()\n const workspaces = manifest.workspaces.filter(\n (workspace) => !workspaceName || workspace.name === workspaceName,\n )\n\n if (workspaces.length === 0) {\n const error = workspaceName\n ? new FlagValidationError(`Found no workspaces named \"${workspaceName}\"`)\n : new Error('Workspace array in manifest is empty.')\n throw error\n }\n\n const updateSchema = getUpdateSchema({\n manifestReader,\n output,\n tag,\n verbose,\n })\n\n /* Known caveat: we _don't_ rollback failed operations or partial success */\n const results = await Promise.allSettled(\n workspaces.map(async (workspace: ManifestWorkspaceFile): Promise<void> => {\n await updateSchema(workspace)\n }),\n )\n\n const fulfilledUpdates = results.filter((result) => result.status === 'fulfilled')\n const rejectedUpdates = results.filter((result) => result.status === 'rejected')\n\n if (rejectedUpdates.length > 0) {\n throw new Error(\n `Failed to deploy ${rejectedUpdates.length}/${workspaces.length} schemas. Successfully deployed ${fulfilledUpdates.length}/${workspaces.length} schemas.`,\n )\n }\n\n output.log(`Deployed ${fulfilledUpdates.length}/${workspaces.length} schemas`)\n return 'success'\n } catch (err) {\n if (schemaRequired || err instanceof FlagValidationError) {\n output.error(err.message)\n } else {\n output.error(`↳ Error when storing schemas:\\n ${err.message}`)\n }\n schemasDeployDebug('Error updating schemas', err.message)\n return 'failure'\n } finally {\n output.log(\n `${styleText('gray', '↳ List deployed schemas with:')} ${styleText('cyan', 'sanity schema list')}`,\n )\n }\n}\n\nfunction getUpdateSchema(args: {\n manifestReader: CreateManifestReader\n output: DeploySchemaCommand['flags']['output']\n tag?: string\n verbose: boolean\n}): (workspace: ManifestWorkspaceFile) => Promise<void> {\n const {manifestReader, output, tag, verbose} = args\n\n return async (workspace) => {\n const {dataset, projectId} = workspace\n\n const {idWarning, safeBaseId: id} = getWorkspaceSchemaId({\n tag,\n workspaceName: workspace.name,\n })\n\n if (idWarning) output.warn(idWarning)\n\n try {\n const schema = await manifestReader.getWorkspaceSchema(workspace.name)\n\n await updateSchemas<Omit<StoredWorkspaceSchema, '_id' | '_type'>[]>(dataset, projectId, [\n {\n // the API will stringify the schema – we send as JSON\n schema,\n tag,\n version: CURRENT_WORKSPACE_SCHEMA_VERSION,\n workspace: {\n name: workspace.name,\n title: workspace.title,\n },\n },\n ])\n\n if (verbose) {\n output.log(\n styleText('gray', `↳ schemaId: ${id}, projectId: ${projectId}, dataset: ${dataset}`),\n )\n }\n } catch (err) {\n if ('statusCode' in err && err?.statusCode === 401) {\n output.warn(\n `↳ No permissions to write schema for workspace \"${workspace.name}\" in dataset \"${workspace.dataset}\". ${\n SCHEMA_PERMISSION_HELP_TEXT\n }:\\n ${styleText('red', `${err.message}`)}`,\n )\n } else {\n output.error(\n `↳ Error deploying schema for workspace \"${workspace.name}\":\\n ${styleText('red', `${err.message}`)}`,\n )\n }\n\n throw err\n }\n }\n}\n"],"names":["styleText","updateSchemas","CURRENT_WORKSPACE_SCHEMA_VERSION","schemasDeployDebug","ensureManifestExtractSatisfied","createManifestReader","FlagValidationError","SCHEMA_PERMISSION_HELP_TEXT","getWorkspaceSchemaId","deploySchemas","options","extractManifest","manifestDir","manifestSafe","output","schemaRequired","tag","verbose","workDir","workspaceName","manifestReader","manifest","getManifest","workspaces","filter","workspace","name","length","error","Error","updateSchema","getUpdateSchema","results","Promise","allSettled","map","fulfilledUpdates","result","status","rejectedUpdates","log","err","message","args","dataset","projectId","idWarning","safeBaseId","id","warn","schema","getWorkspaceSchema","version","title","statusCode"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAKnC,SAAQC,aAAa,QAAO,4BAA2B;AACvD,SACEC,gCAAgC,QAG3B,uBAAsB;AAE7B,SAAQC,kBAAkB,QAAO,mBAAkB;AACnD,SAAQC,8BAA8B,QAAO,+BAA8B;AAC3E,SAAmCC,oBAAoB,QAAO,4BAA2B;AACzF,SAAQC,mBAAmB,EAAEC,2BAA2B,QAAO,mCAAkC;AACjG,SAAQC,oBAAoB,QAAO,+BAA8B;AAejE,OAAO,eAAeC,cACpBC,OAA6B;IAE7B,MAAM,EACJC,eAAe,EACfC,WAAW,EACXC,YAAY,EACZC,MAAM,EACNC,cAAc,EACdC,GAAG,EACHC,OAAO,EACPC,OAAO,EACPC,aAAa,EACd,GAAGT;IAEJ,IACE,CAAE,MAAMN,+BAA+B;QACrCO;QACAC;QACAC;QACAC;QACAC;QACAG;IACF,IACA;QACA,OAAO;IACT;IAEA,IAAI;QACF,MAAME,iBAAiB,MAAMf,qBAAqB;YAChDO;YACAE;YACAI;QACF;QACA,MAAMG,WAAW,MAAMD,eAAeE,WAAW;QACjD,MAAMC,aAAaF,SAASE,UAAU,CAACC,MAAM,CAC3C,CAACC,YAAc,CAACN,iBAAiBM,UAAUC,IAAI,KAAKP;QAGtD,IAAII,WAAWI,MAAM,KAAK,GAAG;YAC3B,MAAMC,QAAQT,gBACV,IAAIb,oBAAoB,CAAC,2BAA2B,EAAEa,cAAc,CAAC,CAAC,IACtE,IAAIU,MAAM;YACd,MAAMD;QACR;QAEA,MAAME,eAAeC,gBAAgB;YACnCX;YACAN;YACAE;YACAC;QACF;QAEA,0EAA0E,GAC1E,MAAMe,UAAU,MAAMC,QAAQC,UAAU,CACtCX,WAAWY,GAAG,CAAC,OAAOV;YACpB,MAAMK,aAAaL;QACrB;QAGF,MAAMW,mBAAmBJ,QAAQR,MAAM,CAAC,CAACa,SAAWA,OAAOC,MAAM,KAAK;QACtE,MAAMC,kBAAkBP,QAAQR,MAAM,CAAC,CAACa,SAAWA,OAAOC,MAAM,KAAK;QAErE,IAAIC,gBAAgBZ,MAAM,GAAG,GAAG;YAC9B,MAAM,IAAIE,MACR,CAAC,iBAAiB,EAAEU,gBAAgBZ,MAAM,CAAC,CAAC,EAAEJ,WAAWI,MAAM,CAAC,gCAAgC,EAAES,iBAAiBT,MAAM,CAAC,CAAC,EAAEJ,WAAWI,MAAM,CAAC,SAAS,CAAC;QAE7J;QAEAb,OAAO0B,GAAG,CAAC,CAAC,SAAS,EAAEJ,iBAAiBT,MAAM,CAAC,CAAC,EAAEJ,WAAWI,MAAM,CAAC,QAAQ,CAAC;QAC7E,OAAO;IACT,EAAE,OAAOc,KAAK;QACZ,IAAI1B,kBAAkB0B,eAAenC,qBAAqB;YACxDQ,OAAOc,KAAK,CAACa,IAAIC,OAAO;QAC1B,OAAO;YACL5B,OAAOc,KAAK,CAAC,CAAC,iCAAiC,EAAEa,IAAIC,OAAO,EAAE;QAChE;QACAvC,mBAAmB,0BAA0BsC,IAAIC,OAAO;QACxD,OAAO;IACT,SAAU;QACR5B,OAAO0B,GAAG,CACR,GAAGxC,UAAU,QAAQ,iCAAiC,CAAC,EAAEA,UAAU,QAAQ,uBAAuB;IAEtG;AACF;AAEA,SAAS+B,gBAAgBY,IAKxB;IACC,MAAM,EAACvB,cAAc,EAAEN,MAAM,EAAEE,GAAG,EAAEC,OAAO,EAAC,GAAG0B;IAE/C,OAAO,OAAOlB;QACZ,MAAM,EAACmB,OAAO,EAAEC,SAAS,EAAC,GAAGpB;QAE7B,MAAM,EAACqB,SAAS,EAAEC,YAAYC,EAAE,EAAC,GAAGxC,qBAAqB;YACvDQ;YACAG,eAAeM,UAAUC,IAAI;QAC/B;QAEA,IAAIoB,WAAWhC,OAAOmC,IAAI,CAACH;QAE3B,IAAI;YACF,MAAMI,SAAS,MAAM9B,eAAe+B,kBAAkB,CAAC1B,UAAUC,IAAI;YAErE,MAAMzB,cAA8D2C,SAASC,WAAW;gBACtF;oBACE,sDAAsD;oBACtDK;oBACAlC;oBACAoC,SAASlD;oBACTuB,WAAW;wBACTC,MAAMD,UAAUC,IAAI;wBACpB2B,OAAO5B,UAAU4B,KAAK;oBACxB;gBACF;aACD;YAED,IAAIpC,SAAS;gBACXH,OAAO0B,GAAG,CACRxC,UAAU,QAAQ,CAAC,YAAY,EAAEgD,GAAG,aAAa,EAAEH,UAAU,WAAW,EAAED,SAAS;YAEvF;QACF,EAAE,OAAOH,KAAK;YACZ,IAAI,gBAAgBA,OAAOA,KAAKa,eAAe,KAAK;gBAClDxC,OAAOmC,IAAI,CACT,CAAC,gDAAgD,EAAExB,UAAUC,IAAI,CAAC,cAAc,EAAED,UAAUmB,OAAO,CAAC,GAAG,EACrGrC,4BACD,KAAK,EAAEP,UAAU,OAAO,GAAGyC,IAAIC,OAAO,EAAE,GAAG;YAEhD,OAAO;gBACL5B,OAAOc,KAAK,CACV,CAAC,wCAAwC,EAAEH,UAAUC,IAAI,CAAC,MAAM,EAAE1B,UAAU,OAAO,GAAGyC,IAAIC,OAAO,EAAE,GAAG;YAE1G;YAEA,MAAMD;QACR;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/schema/deploySchemas.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {type Output, studioWorkerTask} from '@sanity/cli-core'\nimport {type SchemaValidationProblemGroup} from '@sanity/types'\nimport {type Workspace} from 'sanity'\n\nimport {updateSchemas} from '../../services/schemas.js'\nimport {CURRENT_WORKSPACE_SCHEMA_VERSION, type StoredWorkspaceSchema} from '../manifest/types.js'\nimport {type ExtractWorkspaceWorkerData} from './types.js'\nimport {SchemaExtractionError} from './utils/SchemaExtractionError.js'\nimport {SCHEMA_PERMISSION_HELP_TEXT} from './utils/schemaStoreValidation.js'\nimport {getWorkspaceSchemaId} from './utils/workspaceSchemaId.js'\n\ninterface DeploySchemasOptions {\n output: Output\n verbose: boolean\n workDir: string\n\n tag?: string\n workspaceName?: string\n}\n\ntype ExtractWorkspaceWorkerMessage =\n | {\n error: string\n type: 'error'\n validation?: SchemaValidationProblemGroup[]\n }\n | {\n type: 'success'\n workspaces: Workspace[]\n }\n\nexport async function deploySchemas(options: DeploySchemasOptions): Promise<void> {\n const {output, tag, verbose, workDir, workspaceName} = options\n\n const result = await studioWorkerTask<ExtractWorkspaceWorkerMessage>(\n new URL('extractSanityWorkspace.worker.js', import.meta.url),\n {\n name: 'extractSanityWorkspace',\n studioRootPath: workDir,\n workerData: {\n configPath: workDir,\n workDir,\n } satisfies ExtractWorkspaceWorkerData,\n },\n )\n\n if (result.type === 'error') {\n throw new SchemaExtractionError(result.error, result.validation)\n }\n\n const workspaces = result.workspaces.filter(\n (workspace) => !workspaceName || workspace.name === workspaceName,\n )\n if (workspaces.length === 0) {\n const error = workspaceName\n ? new Error(`Found no workspaces named \"${workspaceName}\"`)\n : new Error('No workspaces found')\n throw error\n }\n\n /* Known caveat: we _don't_ rollback failed operations or partial success */\n const results = await Promise.allSettled(\n workspaces.map(async (workspace): Promise<void> => {\n await updateWorkspaceSchema({\n output,\n tag,\n verbose,\n workspace,\n })\n }),\n )\n\n const fulfilledUpdates = results.filter((result) => result.status === 'fulfilled')\n const rejectedUpdates = results.filter((result) => result.status === 'rejected')\n\n if (rejectedUpdates.length > 0) {\n throw new Error(\n `Failed to deploy ${rejectedUpdates.length}/${workspaces.length} schemas. Successfully deployed ${fulfilledUpdates.length}/${workspaces.length} schemas.`,\n )\n }\n\n output.log(`Deployed ${fulfilledUpdates.length}/${workspaces.length} schemas`)\n}\n\nasync function updateWorkspaceSchema(args: {\n output: Output\n tag?: string\n verbose: boolean\n workspace: Workspace\n}) {\n const {output, tag, verbose, workspace} = args\n\n const {dataset, projectId} = workspace\n\n const {idWarning, safeBaseId: id} = getWorkspaceSchemaId({\n tag,\n workspaceName: workspace.name,\n })\n\n if (idWarning) output.warn(idWarning)\n\n try {\n await updateSchemas<Omit<StoredWorkspaceSchema, '_id' | '_type'>[]>(dataset, projectId, [\n {\n // the API will stringify the schema – we send as JSON\n schema: workspace.schema,\n tag,\n version: CURRENT_WORKSPACE_SCHEMA_VERSION,\n workspace: {\n name: workspace.name,\n title: workspace.title,\n },\n },\n ])\n\n if (verbose) {\n output.log(\n styleText('gray', `↳ schemaId: ${id}, projectId: ${projectId}, dataset: ${dataset}`),\n )\n }\n } catch (err) {\n if ('statusCode' in err && err?.statusCode === 401) {\n output.warn(\n `↳ No permissions to write schema for workspace \"${workspace.name}\" in dataset \"${workspace.dataset}\". ${\n SCHEMA_PERMISSION_HELP_TEXT\n }:\\n ${styleText('red', `${err.message}`)}`,\n )\n } else {\n output.log(\n styleText(\n 'red',\n `↳ Error deploying schema for workspace \"${workspace.name}\":\\n ${styleText('red', `${err.message}`)}`,\n ),\n )\n }\n\n throw err\n }\n}\n"],"names":["styleText","studioWorkerTask","updateSchemas","CURRENT_WORKSPACE_SCHEMA_VERSION","SchemaExtractionError","SCHEMA_PERMISSION_HELP_TEXT","getWorkspaceSchemaId","deploySchemas","options","output","tag","verbose","workDir","workspaceName","result","URL","url","name","studioRootPath","workerData","configPath","type","error","validation","workspaces","filter","workspace","length","Error","results","Promise","allSettled","map","updateWorkspaceSchema","fulfilledUpdates","status","rejectedUpdates","log","args","dataset","projectId","idWarning","safeBaseId","id","warn","schema","version","title","err","statusCode","message"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { isMainThread, parentPort, workerData } from 'node:worker_threads';
2
+ import { getStudioWorkspaces, safeStructuredClone } from '@sanity/cli-core';
3
+ import { extractWorkspaceWorkerData } from './types.js';
4
+ import { extractValidationFromSchemaError } from './utils/extractValidationFromSchemaError.js';
5
+ if (isMainThread || !parentPort) {
6
+ throw new Error('Should only be run in a worker!');
7
+ }
8
+ const { configPath, workDir } = extractWorkspaceWorkerData.parse(workerData);
9
+ try {
10
+ const workspaces = await getStudioWorkspaces(configPath);
11
+ parentPort.postMessage({
12
+ type: 'success',
13
+ workspaces: safeStructuredClone(workspaces)
14
+ });
15
+ } catch (error) {
16
+ const validation = await extractValidationFromSchemaError(error, workDir);
17
+ parentPort.postMessage({
18
+ error: error instanceof Error ? error.message : String(error),
19
+ type: 'error',
20
+ validation
21
+ });
22
+ }
23
+
24
+ //# sourceMappingURL=extractSanityWorkspace.worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/schema/extractSanityWorkspace.worker.ts"],"sourcesContent":["import {isMainThread, parentPort, workerData} from 'node:worker_threads'\n\nimport {getStudioWorkspaces, safeStructuredClone} from '@sanity/cli-core'\n\nimport {extractWorkspaceWorkerData} from './types.js'\nimport {extractValidationFromSchemaError} from './utils/extractValidationFromSchemaError.js'\n\nif (isMainThread || !parentPort) {\n throw new Error('Should only be run in a worker!')\n}\n\nconst {configPath, workDir} = extractWorkspaceWorkerData.parse(workerData)\n\ntry {\n const workspaces = await getStudioWorkspaces(configPath)\n\n parentPort.postMessage({\n type: 'success',\n workspaces: safeStructuredClone(workspaces),\n })\n} catch (error) {\n const validation = await extractValidationFromSchemaError(error, workDir)\n parentPort.postMessage({\n error: error instanceof Error ? error.message : String(error),\n type: 'error',\n validation,\n })\n}\n"],"names":["isMainThread","parentPort","workerData","getStudioWorkspaces","safeStructuredClone","extractWorkspaceWorkerData","extractValidationFromSchemaError","Error","configPath","workDir","parse","workspaces","postMessage","type","error","validation","message","String"],"mappings":"AAAA,SAAQA,YAAY,EAAEC,UAAU,EAAEC,UAAU,QAAO,sBAAqB;AAExE,SAAQC,mBAAmB,EAAEC,mBAAmB,QAAO,mBAAkB;AAEzE,SAAQC,0BAA0B,QAAO,aAAY;AACrD,SAAQC,gCAAgC,QAAO,8CAA6C;AAE5F,IAAIN,gBAAgB,CAACC,YAAY;IAC/B,MAAM,IAAIM,MAAM;AAClB;AAEA,MAAM,EAACC,UAAU,EAAEC,OAAO,EAAC,GAAGJ,2BAA2BK,KAAK,CAACR;AAE/D,IAAI;IACF,MAAMS,aAAa,MAAMR,oBAAoBK;IAE7CP,WAAWW,WAAW,CAAC;QACrBC,MAAM;QACNF,YAAYP,oBAAoBO;IAClC;AACF,EAAE,OAAOG,OAAO;IACd,MAAMC,aAAa,MAAMT,iCAAiCQ,OAAOL;IACjER,WAAWW,WAAW,CAAC;QACrBE,OAAOA,iBAAiBP,QAAQO,MAAME,OAAO,GAAGC,OAAOH;QACvDD,MAAM;QACNE;IACF;AACF"}
@@ -1,7 +1,7 @@
1
1
  import { dirname, isAbsolute, relative } from 'node:path';
2
2
  import { spinner } from '@sanity/cli-core/ux';
3
3
  import { watch as chokidarWatch } from 'chokidar';
4
- import { debounce } from 'lodash-es';
4
+ import debounce from 'lodash-es/debounce.js';
5
5
  import { glob } from 'tinyglobby';
6
6
  import { formatSchemaValidation } from './formatSchemaValidation.js';
7
7
  import { runSchemaExtraction } from './runSchemaExtraction.js';