sanity 3.26.2-canary.52 → 3.26.2-canary.69

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 (112) hide show
  1. package/lib/_chunks/{_internal-2CJ5wSKF.js → _internal-6Pl2wJGj.js} +422 -201
  2. package/lib/_chunks/_internal-6Pl2wJGj.js.map +1 -0
  3. package/lib/_chunks/{_internal-79flWvL8.js → _internal-yQwMw2ht.js} +419 -203
  4. package/lib/_chunks/_internal-yQwMw2ht.js.map +1 -0
  5. package/lib/_chunks/{_internalBrowser-QAFz3SKp.js → _internalBrowser-HWvRXvlU.js} +22 -22
  6. package/lib/_chunks/_internalBrowser-HWvRXvlU.js.map +1 -0
  7. package/lib/_chunks/{_internalBrowser-Y0qKZ-GA.js → _internalBrowser-TWIhitgI.js} +22 -22
  8. package/lib/_chunks/_internalBrowser-TWIhitgI.js.map +1 -0
  9. package/lib/_chunks/{deployApiAction-SHteit1G.js → deployApiAction-TZcCtXan.js} +2 -2
  10. package/lib/_chunks/{deployApiAction-SHteit1G.js.map → deployApiAction-TZcCtXan.js.map} +1 -1
  11. package/lib/_chunks/{deployApiAction-bRyJpGOS.js → deployApiAction-rVL67VYW.js} +2 -2
  12. package/lib/_chunks/{deployApiAction-bRyJpGOS.js.map → deployApiAction-rVL67VYW.js.map} +1 -1
  13. package/lib/_chunks/{getStudioConfig-JSkc4GE0.js → getStudioWorkspaces-HX9o9-hl.js} +20 -4
  14. package/lib/_chunks/getStudioWorkspaces-HX9o9-hl.js.map +1 -0
  15. package/lib/_chunks/{index-EO9iRnDS.js → index-2kSxso3r.js} +2 -2
  16. package/lib/_chunks/{index-EO9iRnDS.js.map → index-2kSxso3r.js.map} +1 -1
  17. package/lib/_chunks/{index-FQCCBbuC.js → index-751ZLh3z.js} +6 -6
  18. package/lib/_chunks/{index-FQCCBbuC.js.map → index-751ZLh3z.js.map} +1 -1
  19. package/lib/_chunks/{index-VNSHvpZr.js → index-HcF369ru.js} +2 -2
  20. package/lib/_chunks/{index-VNSHvpZr.js.map → index-HcF369ru.js.map} +1 -1
  21. package/lib/_chunks/{index-Xs2xnLUV.js → index-MAAxgUnl.js} +6 -6
  22. package/lib/_chunks/{index-Xs2xnLUV.js.map → index-MAAxgUnl.js.map} +1 -1
  23. package/lib/_chunks/{index-AaK2CidU.js → index-NweJPfGb.js} +2 -2
  24. package/lib/_chunks/{index-AaK2CidU.js.map → index-NweJPfGb.js.map} +1 -1
  25. package/lib/_chunks/{index-R7R6AyHF.js → index-zobOqko7.js} +2 -2
  26. package/lib/_chunks/{index-R7R6AyHF.js.map → index-zobOqko7.js.map} +1 -1
  27. package/lib/_chunks/{listApisAction-6lGkFZrU.js → listApisAction-IvKV4iAd.js} +2 -2
  28. package/lib/_chunks/{listApisAction-6lGkFZrU.js.map → listApisAction-IvKV4iAd.js.map} +1 -1
  29. package/lib/_chunks/{listApisAction-CqCkBz-F.js → listApisAction-oca2uykY.js} +2 -2
  30. package/lib/_chunks/{listApisAction-CqCkBz-F.js.map → listApisAction-oca2uykY.js.map} +1 -1
  31. package/lib/_chunks/pane-9HEeITpx.js +5 -0
  32. package/lib/_chunks/pane-9HEeITpx.js.map +1 -0
  33. package/lib/_chunks/pane-QyVrOLqS.js +2 -0
  34. package/lib/_chunks/pane-QyVrOLqS.js.map +1 -0
  35. package/lib/_chunks/pane-TXXUUvdc.js +5 -0
  36. package/lib/_chunks/pane-TXXUUvdc.js.map +1 -0
  37. package/lib/_chunks/pane-cQxQtBcL.js +2 -0
  38. package/lib/_chunks/pane-cQxQtBcL.js.map +1 -0
  39. package/lib/_chunks/{structure-qJLnDJXq.js → structure-iqIDIH7-.js} +3 -3
  40. package/lib/_chunks/structure-iqIDIH7-.js.map +1 -0
  41. package/lib/_chunks/{structure-588eAwLd.js → structure-o_wMXC_G.js} +3 -3
  42. package/lib/_chunks/structure-o_wMXC_G.js.map +1 -0
  43. package/lib/_chunks/validateAction-4Jl_y_iB.js +154 -0
  44. package/lib/_chunks/validateAction-4Jl_y_iB.js.map +1 -0
  45. package/lib/_chunks/{validateAction-GUvMkXiN.js → validateAction-6q8Sqwaz.js} +25 -73
  46. package/lib/_chunks/validateAction-6q8Sqwaz.js.map +1 -0
  47. package/lib/_chunks/validateAction-Bz67ApRP.js +143 -0
  48. package/lib/_chunks/validateAction-Bz67ApRP.js.map +1 -0
  49. package/lib/_chunks/{validateAction-NIrqtyYJ.js → validateAction-shi462sq.js} +27 -75
  50. package/lib/_chunks/validateAction-shi462sq.js.map +1 -0
  51. package/lib/_internal/cli/threads/getGraphQLAPIs.js +2 -2
  52. package/lib/_internal/cli/threads/getGraphQLAPIs.js.map +1 -1
  53. package/lib/_internal/cli/threads/validateDocuments.js +5 -3
  54. package/lib/_internal/cli/threads/validateDocuments.js.map +1 -1
  55. package/lib/_internal/cli/threads/validateSchema.js +55 -0
  56. package/lib/_internal/cli/threads/validateSchema.js.map +1 -0
  57. package/lib/_internal.esm.js +1 -1
  58. package/lib/_internal.js +1 -1
  59. package/lib/_internalBrowser.esm.js +1 -1
  60. package/lib/_internalBrowser.js +1 -1
  61. package/lib/desk.esm.js +1 -1
  62. package/lib/desk.js +1 -1
  63. package/lib/exports/index.d.ts +25 -0
  64. package/lib/index.cjs.mjs +1 -0
  65. package/lib/index.esm.js +2 -2
  66. package/lib/index.js +2 -1
  67. package/lib/index.js.map +1 -1
  68. package/lib/structure.esm.js +1 -1
  69. package/lib/structure.js +1 -1
  70. package/package.json +15 -15
  71. package/src/_internal/cli/actions/schema/formatSchemaValidation.ts +96 -0
  72. package/src/_internal/cli/actions/schema/validateAction.ts +120 -0
  73. package/src/_internal/cli/actions/validation/reporters/prettyReporter/formatDocumentValidation.ts +17 -95
  74. package/src/_internal/cli/commands/index.ts +2 -0
  75. package/src/_internal/cli/commands/migration/createMigrationCommand.ts +18 -10
  76. package/src/_internal/cli/commands/migration/listMigrationsCommand.ts +34 -31
  77. package/src/_internal/cli/commands/migration/prettyMutationFormatter.ts +214 -0
  78. package/src/_internal/cli/commands/migration/runMigrationCommand.ts +102 -58
  79. package/src/_internal/cli/commands/migration/templates/minimalAdvanced.ts +1 -1
  80. package/src/_internal/cli/commands/migration/templates/minimalSimple.ts +1 -1
  81. package/src/_internal/cli/commands/migration/templates/renameField.ts +3 -3
  82. package/src/_internal/cli/commands/migration/templates/renameType.ts +1 -1
  83. package/src/_internal/cli/commands/migration/templates/stringToPTE.ts +1 -1
  84. package/src/_internal/cli/commands/migration/utils/mutationFormatter.ts +1 -1
  85. package/src/_internal/cli/commands/schema/validateSchemaCommand.ts +35 -0
  86. package/src/_internal/cli/threads/getGraphQLAPIs.ts +2 -2
  87. package/src/_internal/cli/threads/validateDocuments.ts +6 -3
  88. package/src/_internal/cli/threads/validateSchema.ts +73 -0
  89. package/src/_internal/cli/util/{getStudioConfig.ts → getStudioWorkspaces.ts} +30 -8
  90. package/src/_internal/cli/util/tree.ts +110 -0
  91. package/src/core/config/index.ts +1 -0
  92. package/src/core/config/prepareConfig.ts +2 -5
  93. package/src/core/config/resolveSchemaTypes.ts +29 -0
  94. package/src/core/studio/screens/schemaErrors/SchemaProblemGroups.tsx +4 -2
  95. package/src/structure/comments/src/components/pte/blocks/MentionInlineBlock.tsx +13 -6
  96. package/lib/_chunks/_internal-2CJ5wSKF.js.map +0 -1
  97. package/lib/_chunks/_internal-79flWvL8.js.map +0 -1
  98. package/lib/_chunks/_internalBrowser-QAFz3SKp.js.map +0 -1
  99. package/lib/_chunks/_internalBrowser-Y0qKZ-GA.js.map +0 -1
  100. package/lib/_chunks/getStudioConfig-JSkc4GE0.js.map +0 -1
  101. package/lib/_chunks/pane-QmJb9ZTN.js +0 -2
  102. package/lib/_chunks/pane-QmJb9ZTN.js.map +0 -1
  103. package/lib/_chunks/pane-SK7FWNTJ.js +0 -2
  104. package/lib/_chunks/pane-SK7FWNTJ.js.map +0 -1
  105. package/lib/_chunks/pane-y4hpcKe1.js +0 -5
  106. package/lib/_chunks/pane-y4hpcKe1.js.map +0 -1
  107. package/lib/_chunks/pane-yQXBQyyI.js +0 -5
  108. package/lib/_chunks/pane-yQXBQyyI.js.map +0 -1
  109. package/lib/_chunks/structure-588eAwLd.js.map +0 -1
  110. package/lib/_chunks/structure-qJLnDJXq.js.map +0 -1
  111. package/lib/_chunks/validateAction-GUvMkXiN.js.map +0 -1
  112. package/lib/_chunks/validateAction-NIrqtyYJ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateAction-Bz67ApRP.js","sources":["../../src/_internal/cli/actions/schema/formatSchemaValidation.ts","../../src/_internal/cli/actions/schema/validateAction.ts"],"sourcesContent":["import {isatty} from 'tty'\nimport chalk from 'chalk'\nimport {SchemaValidationProblemGroup, SchemaValidationProblemPath} from '@sanity/types'\nimport logSymbols from 'log-symbols'\n\nconst isTty = isatty(1)\n\nconst headers = {\n error: isTty ? chalk.bold(chalk.bgRed(chalk.black(' ERROR '))) : chalk.red('[ERROR]'),\n warning: isTty ? chalk.bold(chalk.bgYellow(chalk.black(' WARN '))) : chalk.yellow('[WARN]'),\n}\n\nconst severityValues = {error: 0, warning: 1}\n\nfunction formatPath(pathSegments: SchemaValidationProblemPath) {\n const format = (\n [curr, ...next]: SchemaValidationProblemPath,\n mode: 'object' | 'array' = 'object',\n ): string => {\n if (!curr) return ''\n if (curr.kind === 'property') return format(next, curr.name === 'of' ? 'array' : 'object')\n\n const name = curr.name ? curr.name : `<anonymous_${curr.type}>`\n return `${mode === 'array' ? `[${name}]` : `.${name}`}${format(next)}`\n }\n\n return format(pathSegments.slice(1)).substring(1) // removes the top-level type and leading `.`\n}\n\nexport function getAggregatedSeverity(\n groupOrGroups: SchemaValidationProblemGroup | SchemaValidationProblemGroup[],\n): 'error' | 'warning' {\n const groups = Array.isArray(groupOrGroups) ? groupOrGroups : [groupOrGroups]\n return groups\n .flatMap((group) => group.problems.map((problem) => problem.severity))\n .find((severity) => severity === 'error')\n ? 'error'\n : 'warning'\n}\n\nexport function formatSchemaValidation(validation: SchemaValidationProblemGroup[]): string {\n let unnamedTopLevelTypeCount = 0\n const validationByType = Object.entries(\n validation.reduce<Record<string, SchemaValidationProblemGroup[]>>((acc, next) => {\n const [firstSegment] = next.path\n if (!firstSegment) return acc\n if (firstSegment.kind !== 'type') return acc\n\n const topLevelType =\n firstSegment.name || `<unnamed_${firstSegment.type}_type_${unnamedTopLevelTypeCount++}>`\n const problems = acc[topLevelType] ?? []\n\n problems.push(next)\n\n acc[topLevelType] = problems\n return acc\n }, {}),\n )\n\n const formatted = validationByType\n .sort((a, b) => {\n const [aType, aGroups] = a\n const [bType, bGroups] = b\n const aValue = severityValues[getAggregatedSeverity(aGroups)]\n const bValue = severityValues[getAggregatedSeverity(bGroups)]\n if (aValue === bValue) return aType.localeCompare(bType, 'en-US')\n return aValue - bValue\n })\n .map(([topLevelType, groups]) => {\n const formattedTopLevelType = isTty\n ? chalk.bgWhite(chalk.black(` ${topLevelType} `))\n : `[${topLevelType}]`\n\n const header = `${headers[getAggregatedSeverity(groups)]} ${formattedTopLevelType}`\n const body = groups\n .sort(\n (a, b) =>\n severityValues[getAggregatedSeverity(a)] - severityValues[getAggregatedSeverity(b)],\n )\n .map((group) => {\n const formattedPath = ` ${chalk.bold(formatPath(group.path) || '(root)')}`\n const formattedMessages = group.problems\n .sort((a, b) => severityValues[a.severity] - severityValues[b.severity])\n .map(({severity, message}) => ` ${logSymbols[severity]} ${message}`)\n .join('\\n')\n\n return `${formattedPath}\\n${formattedMessages}`\n })\n .join('\\n')\n\n return `${header}\\n${body}`\n })\n .join('\\n\\n')\n\n return formatted\n}\n","import path from 'path'\nimport {Worker} from 'worker_threads'\nimport {type CliCommandArguments, type CliCommandContext} from '@sanity/cli'\nimport readPkgUp from 'read-pkg-up'\nimport logSymbols from 'log-symbols'\nimport {\n type ValidateSchemaWorkerData,\n type ValidateSchemaWorkerResult,\n} from '../../threads/validateSchema'\nimport {formatSchemaValidation, getAggregatedSeverity} from './formatSchemaValidation'\n\ninterface ValidateFlags {\n workspace?: string\n format?: string\n level?: 'error' | 'warning'\n}\n\nexport type SchemaValidationFormatter = (result: ValidateSchemaWorkerResult) => string\n\nexport default async function validateAction(\n args: CliCommandArguments<ValidateFlags>,\n {workDir, output}: CliCommandContext,\n): Promise<void> {\n const flags = args.extOptions\n\n const rootPkgPath = readPkgUp.sync({cwd: __dirname})?.path\n if (!rootPkgPath) {\n throw new Error('Could not find root directory for `sanity` package')\n }\n\n const workerPath = path.join(\n path.dirname(rootPkgPath),\n 'lib',\n '_internal',\n 'cli',\n 'threads',\n 'validateSchema.js',\n )\n\n const level = flags.level || 'warning'\n\n if (level !== 'error' && level !== 'warning') {\n throw new Error(`Invalid level. Available levels are 'error' and 'warning'.`)\n }\n\n const format = flags.format || 'pretty'\n\n if (!['pretty', 'ndjson', 'json'].includes(format)) {\n throw new Error(\n `Did not recognize format '${flags.format}'. Available formats are 'pretty', 'ndjson', and 'json'.`,\n )\n }\n\n let spinner\n\n if (format === 'pretty') {\n spinner = output\n .spinner(\n flags.workspace\n ? `Validating schema from workspace '${flags.workspace}'…`\n : 'Validating schema…',\n )\n .start()\n }\n\n const worker = new Worker(workerPath, {\n workerData: {\n workDir,\n level,\n workspace: flags.workspace,\n } satisfies ValidateSchemaWorkerData,\n // eslint-disable-next-line no-process-env\n env: process.env,\n })\n\n const {validation} = await new Promise<ValidateSchemaWorkerResult>((resolve, reject) => {\n worker.addListener('message', resolve)\n worker.addListener('error', reject)\n })\n\n const problems = validation.flatMap((group) => group.problems)\n const errorCount = problems.filter((problem) => problem.severity === 'error').length\n const warningCount = problems.filter((problem) => problem.severity === 'warning').length\n\n const overallSeverity = getAggregatedSeverity(validation)\n\n switch (format) {\n case 'ndjson': {\n for (const group of validation) {\n output.print(JSON.stringify(group))\n }\n break\n }\n case 'json': {\n output.print(JSON.stringify(validation))\n break\n }\n default: {\n spinner?.succeed('Validated schema')\n output.print(`\\nValidation results:`)\n output.print(\n `${logSymbols.error} Errors: ${errorCount.toLocaleString('en-US')} error${\n errorCount === 1 ? '' : 's'\n }`,\n )\n if (level !== 'error') {\n output.print(\n `${logSymbols.warning} Warnings: ${warningCount.toLocaleString('en-US')} warning${\n warningCount === 1 ? '' : 's'\n }`,\n )\n }\n output.print()\n\n output.print(formatSchemaValidation(validation))\n }\n }\n\n process.exitCode = overallSeverity === 'error' ? 1 : 0\n}\n"],"names":["isTty","isatty","headers","error","chalk","bold","bgRed","black","red","warning","bgYellow","yellow","severityValues","formatPath","pathSegments","format","_ref","curr","next","mode","kind","name","concat","type","slice","substring","getAggregatedSeverity","groupOrGroups","groups","Array","isArray","flatMap","group","problems","map","problem","severity","find","formatSchemaValidation","validation","unnamedTopLevelTypeCount","validationByType","Object","entries","reduce","acc","_a","firstSegment","path","topLevelType","push","formatted","sort","a","b","aType","aGroups","bType","bGroups","aValue","bValue","localeCompare","_ref2","formattedTopLevelType","bgWhite","header","body","formattedPath","formattedMessages","_ref3","message","logSymbols","join","validateAction","args","_ref4","workDir","output","flags","extOptions","rootPkgPath","sync","cwd","__dirname","Error","workerPath","dirname","level","includes","spinner","workspace","start","worker","Worker","workerData","env","process","Promise","resolve","reject","addListener","errorCount","filter","length","warningCount","overallSeverity","print","JSON","stringify","succeed","toLocaleString","exitCode"],"mappings":"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"}
@@ -7,8 +7,8 @@ var chalk = require('chalk');
7
7
  var worker_threads = require('worker_threads');
8
8
  var readPkgUp = require('read-pkg-up');
9
9
  var workerChannels = require('./workerChannels-ZUUNsU1E.js');
10
+ var _internal = require('./_internal-6Pl2wJGj.js');
10
11
  var tty = require('tty');
11
- var sanity = require('sanity');
12
12
  function _interopDefaultCompat(e) {
13
13
  return e && typeof e === 'object' && 'default' in e ? e : {
14
14
  default: e
@@ -123,44 +123,10 @@ const levelHeaders = {
123
123
  info: isTty ? chalk__default.default.bold(chalk__default.default.cyan(chalk__default.default.black(" INFO "))) : chalk__default.default.cyan("[INFO]")
124
124
  };
125
125
  const link = (text, url) => isTty ? "\x1B]8;;".concat(url, "\x07").concat(text, "\x1B]8;;\x07") : chalk__default.default.underline(text);
126
- const maxKeyLength = function () {
127
- let children = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
128
- let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
129
- return Object.entries(children).map(_ref3 => {
130
- let [key, child] = _ref3;
131
- return Math.max(key.length + depth * 2, maxKeyLength(child.children, depth + 1));
132
- }).reduce((max, next) => next > max ? next : max, 0);
133
- };
134
126
  const compareLevels = (a, b) => levelValues[a.level] - levelValues[b.level];
135
- const formatTree = function () {
136
- let node = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
137
- let paddingLength = arguments.length > 1 ? arguments[1] : undefined;
138
- let indent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
139
- const entries = Object.entries(node);
140
- return entries.map((_ref4, index) => {
141
- let [key, child] = _ref4;
142
- var _a;
143
- const isLast = index === entries.length - 1;
144
- const nextIndent = "".concat(indent).concat(isLast ? " " : "\u2502 ");
145
- const nested = formatTree(child.children, paddingLength, nextIndent);
146
- if (!((_a = child.markers) == null ? void 0 : _a.length)) {
147
- const current2 = "".concat(indent).concat(isLast ? "\u2514" : "\u251C", "\u2500 ").concat(key);
148
- return [current2, nested].filter(Boolean).join("\n");
149
- }
150
- const [first, ...rest] = child.markers.slice().sort(compareLevels);
151
- const firstPadding = ".".repeat(paddingLength - indent.length - key.length);
152
- const elbow = isLast ? "\u2514" : "\u251C";
153
- const firstBullet = logSymbols__default.default[first.level];
154
- const subsequentPadding = " ".repeat(paddingLength - indent.length + 2);
155
- const firstMessage = "".concat(indent).concat(elbow, "\u2500 ").concat(key, " ").concat(firstPadding, " ").concat(firstBullet, " ").concat(first.message);
156
- const subsequentMessages = rest.map(marker => "".concat(nextIndent).concat(subsequentPadding, " ").concat(logSymbols__default.default[marker.level], " ").concat(marker.message)).join("\n");
157
- const current = [firstMessage, subsequentMessages].filter(Boolean).join("\n");
158
- return [current, nested].filter(Boolean).join("\n");
159
- }).join("\n");
160
- };
161
127
  const formatRootErrors = (root, hasChildren, paddingLength) => {
162
- if (!root.markers) return "";
163
- const [first, ...rest] = root.markers.slice().sort(compareLevels);
128
+ if (!root.nodes) return "";
129
+ const [first, ...rest] = root.nodes.slice().sort(compareLevels);
164
130
  if (!first) return "";
165
131
  const firstElbow = hasChildren ? "\u2502 " : "\u2514\u2500";
166
132
  const firstPadding = ".".repeat(paddingLength - 6);
@@ -170,31 +136,7 @@ const formatRootErrors = (root, hasChildren, paddingLength) => {
170
136
  const restOfLines = rest.map(marker => "".concat(subsequentElbow).concat(subsequentPadding, " ").concat(logSymbols__default.default[marker.level], " ").concat(marker.message)).join("\n");
171
137
  return [firstLine, restOfLines].filter(Boolean).join("\n");
172
138
  };
173
- function convertToTree(markers) {
174
- const root = {};
175
- function addMarker(marker) {
176
- let node = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : root;
177
- if (!marker.path.length) {
178
- if (!node.markers) node.markers = [];
179
- node.markers.push({
180
- level: marker.level,
181
- message: marker.message
182
- });
183
- return;
184
- }
185
- const [current, ...rest] = marker.path;
186
- const key = sanity.pathToString([current]);
187
- if (!node.children) node.children = {};
188
- if (!(key in node.children)) node.children[key] = {};
189
- addMarker({
190
- ...marker,
191
- path: rest
192
- }, node.children[key]);
193
- }
194
- for (const marker of markers) addMarker(marker);
195
- return root;
196
- }
197
- function formatDocumentValidation(_ref5) {
139
+ function formatDocumentValidation(_ref3) {
198
140
  let {
199
141
  basePath,
200
142
  documentId,
@@ -202,22 +144,32 @@ function formatDocumentValidation(_ref5) {
202
144
  level,
203
145
  studioHost,
204
146
  markers
205
- } = _ref5;
206
- const tree = convertToTree(markers);
147
+ } = _ref3;
148
+ const tree = _internal.convertToTree(markers);
207
149
  const editLink = studioHost && "".concat(studioHost).concat(basePath, "/intent/edit/id=").concat(encodeURIComponent(documentId), ";type=").concat(encodeURIComponent(documentType));
208
150
  const documentTypeHeader = isTty ? chalk__default.default.bgWhite(chalk__default.default.black(" ".concat(documentType, " "))) : "[".concat(documentType, "]");
209
151
  const header = "".concat(levelHeaders[level], " ").concat(documentTypeHeader, " ").concat(editLink ? link(documentId, editLink) : chalk__default.default.underline(documentId));
210
- const paddingLength = Math.max(maxKeyLength(tree.children) + 2, 30);
211
- const childErrors = formatTree(tree.children, paddingLength);
152
+ const paddingLength = Math.max(_internal.maxKeyLength(tree.children) + 2, 30);
153
+ const childErrors = _internal.formatTree({
154
+ node: tree.children,
155
+ paddingLength,
156
+ getNodes: _ref4 => {
157
+ let {
158
+ nodes
159
+ } = _ref4;
160
+ return (nodes != null ? nodes : []).slice().sort(compareLevels);
161
+ },
162
+ getMessage: marker => [logSymbols__default.default[marker.level], marker.message].join(" ")
163
+ });
212
164
  const rootErrors = formatRootErrors(tree, childErrors.length > 0, paddingLength);
213
165
  return [header, rootErrors, childErrors].filter(Boolean).join("\n");
214
166
  }
215
- const pretty = async _ref6 => {
167
+ const pretty = async _ref5 => {
216
168
  let {
217
169
  output,
218
170
  worker,
219
171
  flags
220
- } = _ref6;
172
+ } = _ref5;
221
173
  const workspaceLoadStart = Date.now();
222
174
  const spinner = output.spinner(flags.workspace ? "Loading workspace '".concat(flags.workspace, "'\u2026") : "Loading workspace\u2026").start();
223
175
  const workspace = await worker.event.loadedWorkspace();
@@ -313,11 +265,11 @@ const pretty = async _ref6 => {
313
265
  await worker.dispose();
314
266
  return overallLevel;
315
267
  };
316
- const ndjson = async _ref7 => {
268
+ const ndjson = async _ref6 => {
317
269
  let {
318
270
  output,
319
271
  worker
320
- } = _ref7;
272
+ } = _ref6;
321
273
  let overallLevel = "info";
322
274
  for await (const {
323
275
  documentId,
@@ -341,11 +293,11 @@ const ndjson = async _ref7 => {
341
293
  await worker.dispose();
342
294
  return overallLevel;
343
295
  };
344
- const json = async _ref8 => {
296
+ const json = async _ref7 => {
345
297
  let {
346
298
  output,
347
299
  worker
348
- } = _ref8;
300
+ } = _ref7;
349
301
  let overallLevel = "info";
350
302
  const results = [];
351
303
  for await (const {
@@ -374,13 +326,13 @@ const reporters = {
374
326
  ndjson,
375
327
  json
376
328
  };
377
- async function validateAction(args, _ref9) {
329
+ async function validateAction(args, _ref8) {
378
330
  let {
379
331
  apiClient,
380
332
  workDir,
381
333
  output,
382
334
  prompt
383
- } = _ref9;
335
+ } = _ref8;
384
336
  const flags = args.extOptions;
385
337
  const unattendedMode = Boolean(flags.yes || flags.y);
386
338
  if (!unattendedMode) {
@@ -466,4 +418,4 @@ async function validateAction(args, _ref9) {
466
418
  process.exitCode = overallLevel === "error" ? 1 : 0;
467
419
  }
468
420
  exports.default = validateAction;
469
- //# sourceMappingURL=validateAction-NIrqtyYJ.js.map
421
+ //# sourceMappingURL=validateAction-shi462sq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateAction-shi462sq.js","sources":["../../src/_internal/cli/actions/validation/validateDocuments.ts","../../src/_internal/cli/actions/validation/reporters/prettyReporter/util.ts","../../src/_internal/cli/actions/validation/reporters/prettyReporter/formatDocumentValidation.ts","../../src/_internal/cli/actions/validation/reporters/prettyReporter/prettyReporter.ts","../../src/_internal/cli/actions/validation/reporters/ndjsonReporter.ts","../../src/_internal/cli/actions/validation/reporters/jsonReporter.ts","../../src/_internal/cli/actions/validation/reporters/index.ts","../../src/_internal/cli/actions/validation/validateAction.ts"],"sourcesContent":["import path from 'path'\nimport {Worker} from 'worker_threads'\nimport readPkgUp from 'read-pkg-up'\nimport {ClientConfig} from '@sanity/client'\nimport {ValidationMarker} from '@sanity/types'\nimport type {\n ValidateDocumentsWorkerData,\n ValidationWorkerChannel,\n} from '../../threads/validateDocuments'\nimport {createReceiver, WorkerChannelReceiver} from '../../util/workerChannels'\n\nconst DEFAULT_MAX_CUSTOM_VALIDATION_CONCURRENCY = 5\n\nexport interface ValidateDocumentsOptions<TReturn = unknown> {\n level?: 'error' | 'warning' | 'info'\n workspace?: string\n workDir?: string\n configPath?: string\n clientConfig?: Partial<ClientConfig>\n projectId?: string // override\n dataset?: string // override\n ndjsonFilePath?: string\n maxCustomValidationConcurrency?: number\n reporter?: (worker: WorkerChannelReceiver<ValidationWorkerChannel>) => TReturn\n}\n\nexport interface DocumentValidationResult {\n documentId: string\n documentType: string\n revision: string\n level: ValidationMarker['level']\n markers: ValidationMarker[]\n}\n\nconst defaultReporter = ({stream, dispose}: WorkerChannelReceiver<ValidationWorkerChannel>) => {\n async function* createValidationGenerator() {\n for await (const {documentId, documentType, markers, revision, level} of stream.validation()) {\n const result: DocumentValidationResult = {\n documentId,\n documentType,\n revision,\n level,\n markers,\n }\n\n yield result\n }\n\n await dispose()\n }\n\n return createValidationGenerator()\n}\n\nexport function validateDocuments<TReturn>(\n options: ValidateDocumentsOptions<TReturn> &\n Required<Pick<ValidateDocumentsOptions<TReturn>, 'reporter'>>,\n): TReturn\nexport function validateDocuments(\n options: ValidateDocumentsOptions,\n): AsyncIterable<DocumentValidationResult>\nexport function validateDocuments(options: ValidateDocumentsOptions): unknown {\n const {\n workspace,\n clientConfig,\n configPath,\n dataset,\n projectId,\n workDir = process.cwd(),\n reporter = defaultReporter,\n level,\n maxCustomValidationConcurrency,\n ndjsonFilePath,\n } = options\n\n const rootPkgPath = readPkgUp.sync({cwd: __dirname})?.path\n if (!rootPkgPath) {\n throw new Error('Could not find root directory for `sanity` package')\n }\n\n const workerPath = path.join(\n path.dirname(rootPkgPath),\n 'lib',\n '_internal',\n 'cli',\n 'threads',\n 'validateDocuments.js',\n )\n\n const worker = new Worker(workerPath, {\n workerData: {\n workDir,\n // removes props in the config that make this object fail to serialize\n clientConfig: JSON.parse(JSON.stringify(clientConfig)),\n configPath,\n workspace,\n dataset,\n projectId,\n level,\n ndjsonFilePath,\n maxCustomValidationConcurrency:\n maxCustomValidationConcurrency ?? DEFAULT_MAX_CUSTOM_VALIDATION_CONCURRENCY,\n } satisfies ValidateDocumentsWorkerData,\n // eslint-disable-next-line no-process-env\n env: process.env,\n })\n\n return reporter(createReceiver<ValidationWorkerChannel>(worker))\n}\n","import {isatty} from 'tty'\nimport logSymbols from 'log-symbols'\nimport type {ValidationMarker} from '@sanity/types'\n\nexport type Level = ValidationMarker['level']\n\nexport interface DocumentValidationResult {\n revision: string\n documentId: string\n documentType: string\n level: ValidationMarker['level']\n markers: ValidationMarker[]\n}\n\nexport const isTty = isatty(1)\nexport const levelValues = {error: 0, warning: 1, info: 2} as const\n\n/**\n * Generates a formatted string that includes a numerical amount and a subject\n * in plural or singular form. Note: the subject must end in `s`\n */\nexport const count = (amount: number, subject: string): string =>\n `${amount.toLocaleString('en-US')} ${\n amount === 1 ? subject.substring(0, subject.length - 1) : subject\n }`\n\nconst percentageFormatter = new Intl.NumberFormat('en-US', {\n style: 'percent',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n})\n\n/**\n * Given a decimal, this will return that number formatted as a percentage\n */\nexport const percent = (value: number): string => percentageFormatter.format(Math.min(value, 1))\n\nconst secondFormatter = new Intl.NumberFormat('en-US', {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n})\n\n/**\n * Given a start time in milliseconds, this will output the time elapsed\n * formatted in seconds\n */\nexport const seconds = (startTime: number): string => {\n const endTime = Date.now()\n return `(${secondFormatter.format((endTime - startTime) / 1000)}s)`\n}\n\ninterface ValidationTotals {\n valid: {documents: number}\n errors: {documents: number; markers: number}\n warnings: {documents: number; markers: number}\n infos: {documents: number; markers: number}\n}\n\n/**\n * Outputs summary text given an object of totals. Omits totals depending on the\n * desired validation `level`\n */\nexport const summary = (\n {errors, infos, valid, warnings}: ValidationTotals,\n level: Level = 'warning',\n): string => {\n const levelValue = levelValues[level]\n\n return [\n `${logSymbols.success} Valid: ${count(valid.documents, 'documents')}`,\n `${logSymbols.error} Errors: ${count(errors.documents, 'documents')}, ${count(\n errors.markers,\n 'errors',\n )}`,\n levelValue >= levelValues.warning &&\n `${logSymbols.warning} Warnings: ${count(warnings.documents, 'documents')}, ${count(\n warnings.markers,\n 'warnings',\n )}`,\n levelValue >= levelValues.info &&\n `${logSymbols.info} Info: ${count(infos.documents, 'documents')}, ${count(\n infos.documents,\n 'markers',\n )}`,\n ]\n .filter(Boolean)\n .join('\\n')\n}\n","import chalk from 'chalk'\nimport {ValidationMarker, Path} from '@sanity/types'\nimport logSymbols from 'log-symbols'\nimport {Tree, convertToTree, formatTree, maxKeyLength} from '../../../../util/tree'\nimport {DocumentValidationResult, Level, isTty, levelValues} from './util'\n\nexport interface FormatDocumentValidationOptions extends DocumentValidationResult {\n studioHost: string | null\n basePath: string\n}\n\ninterface Marker extends Pick<ValidationMarker, 'level' | 'message'> {\n path: Path\n}\n\ntype ValidationTree = Tree<Marker>\n\nconst levelHeaders = {\n error: isTty ? chalk.bold(chalk.bgRed(chalk.black(' ERROR '))) : chalk.red('[ERROR]'),\n warning: isTty ? chalk.bold(chalk.bgYellow(chalk.black(' WARN '))) : chalk.yellow('[WARN]'),\n info: isTty ? chalk.bold(chalk.cyan(chalk.black(' INFO '))) : chalk.cyan('[INFO]'),\n}\n/**\n * Creates a terminal hyperlink. Only outputs a hyperlink if the output is\n * determined to be a TTY\n */\nconst link = (text: string, url: string) =>\n isTty ? `\\u001b]8;;${url}\\u0007${text}\\u001b]8;;\\u0007` : chalk.underline(text)\n\n/**\n * For sorting markers\n */\nconst compareLevels = <T extends {level: Level; message: string}>(a: T, b: T) =>\n levelValues[a.level] - levelValues[b.level]\n\n/**\n * Formats the markers at the root of the validation tree\n */\nconst formatRootErrors = (root: ValidationTree, hasChildren: boolean, paddingLength: number) => {\n if (!root.nodes) return ''\n\n const [first, ...rest] = root.nodes.slice().sort(compareLevels)\n if (!first) return ''\n\n const firstElbow = hasChildren ? '│ ' : '└─'\n const firstPadding = '.'.repeat(paddingLength - 6)\n const firstLine = `${firstElbow} (root) ${firstPadding} ${logSymbols[first.level]} ${\n first.message\n }`\n const subsequentPadding = ' '.repeat(paddingLength + 2)\n const subsequentElbow = hasChildren ? '│ ' : ' '\n\n const restOfLines = rest\n .map(\n (marker) =>\n `${subsequentElbow}${subsequentPadding} ${logSymbols[marker.level]} ${marker.message}`,\n )\n .join('\\n')\n return [firstLine, restOfLines].filter(Boolean).join('\\n')\n}\n\n/**\n * Formats document validation results into a user-friendly tree structure\n */\nexport function formatDocumentValidation({\n basePath,\n documentId,\n documentType,\n level,\n studioHost,\n markers,\n}: FormatDocumentValidationOptions): string {\n const tree = convertToTree<Marker>(markers)\n const editLink =\n studioHost &&\n `${studioHost}${basePath}/intent/edit/id=${encodeURIComponent(\n documentId,\n )};type=${encodeURIComponent(documentType)}`\n\n const documentTypeHeader = isTty\n ? chalk.bgWhite(chalk.black(` ${documentType} `))\n : `[${documentType}]`\n\n const header = `${levelHeaders[level]} ${documentTypeHeader} ${\n editLink ? link(documentId, editLink) : chalk.underline(documentId)\n }`\n\n const paddingLength = Math.max(maxKeyLength(tree.children) + 2, 30)\n\n const childErrors = formatTree<Marker>({\n node: tree.children,\n paddingLength,\n getNodes: ({nodes}) => (nodes ?? []).slice().sort(compareLevels),\n getMessage: (marker) => [logSymbols[marker.level], marker.message].join(' '),\n })\n\n const rootErrors = formatRootErrors(tree, childErrors.length > 0, paddingLength)\n\n return [header, rootErrors, childErrors].filter(Boolean).join('\\n')\n}\n","import type {BuiltInValidationReporter} from '../../validateAction'\nimport {formatDocumentValidation} from './formatDocumentValidation'\nimport {\n DocumentValidationResult,\n Level,\n count,\n levelValues,\n percent,\n seconds,\n summary,\n} from './util'\n\n/**\n * Represents the default stylish/pretty reporter\n */\n// eslint-disable-next-line max-statements\nexport const pretty: BuiltInValidationReporter = async ({output, worker, flags}) => {\n const workspaceLoadStart = Date.now()\n // Report workspace loaded\n const spinner = output\n .spinner(flags.workspace ? `Loading workspace '${flags.workspace}'…` : 'Loading workspace…')\n .start()\n\n const workspace = await worker.event.loadedWorkspace()\n spinner.succeed(\n `Loaded workspace '${workspace.name}' using project '${workspace.projectId}' and dataset '${\n flags.dataset || workspace.dataset\n }' ${seconds(workspaceLoadStart)}`,\n )\n\n if (!flags.file) {\n // Report document count\n spinner.start('Calculating documents to be validated…')\n const {documentCount} = await worker.event.loadedDocumentCount()\n\n // Report export progress\n const downloadStart = Date.now()\n spinner.text = `Downloading ${count(documentCount, 'documents')}…`\n for await (const {downloadedCount} of worker.stream.exportProgress()) {\n const percentage = percent(downloadedCount / documentCount)\n spinner.text = `Downloading ${count(documentCount, 'documents')}… ${percentage}`\n }\n spinner.succeed(`Downloaded ${count(documentCount, 'documents')} ${seconds(downloadStart)}`)\n }\n\n const {totalDocumentsToValidate} = await worker.event.exportFinished()\n\n const referenceIntegrityStart = Date.now()\n spinner.start(`Checking reference existence…`)\n await worker.event.loadedReferenceIntegrity()\n spinner.succeed(`Checked all references ${seconds(referenceIntegrityStart)}`)\n\n // Report validation progress\n const validationStart = Date.now()\n spinner.start(`Validating ${count(totalDocumentsToValidate, 'documents')}…`)\n\n const results: DocumentValidationResult[] = []\n\n const totals = {\n valid: {documents: 0},\n errors: {documents: 0, markers: 0},\n warnings: {documents: 0, markers: 0},\n infos: {documents: 0, markers: 0},\n }\n\n for await (const {validatedCount, ...result} of worker.stream.validation()) {\n const {markers} = result\n\n if (markers.length) {\n results.push(result)\n }\n\n const errors = markers.filter((marker) => marker.level === 'error')\n const warnings = markers.filter((marker) => marker.level === 'warning')\n const infos = markers.filter((marker) => marker.level === 'info')\n\n if (!markers.length) {\n totals.valid.documents += 1\n }\n\n if (errors.length) {\n totals.errors.documents += 1\n totals.errors.markers += errors.length\n }\n\n if (warnings.length) {\n totals.warnings.documents += 1\n totals.warnings.markers += warnings.length\n }\n\n if (infos.length) {\n totals.infos.documents += 1\n totals.infos.markers += infos.length\n }\n\n spinner.text =\n `Validating ${count(totalDocumentsToValidate, 'documents')}…\\n\\n` +\n `Processed ${count(validatedCount, 'documents')} (${percent(\n validatedCount / totalDocumentsToValidate,\n )}):\\n${summary(totals, flags.level)}`\n }\n\n spinner.succeed(\n `Validated ${count(totalDocumentsToValidate, 'documents')} ${seconds(validationStart)}`,\n )\n output.print(`\\nValidation results:\\n${summary(totals, flags.level)}`)\n\n results.sort((a, b) => {\n if (a.level === b.level) return a.documentType.localeCompare(b.documentType)\n return levelValues[a.level] - levelValues[b.level]\n })\n\n let overallLevel: Level = 'info'\n\n for (const result of results) {\n if (result.level === 'error') overallLevel = 'error'\n if (result.level === 'warning' && overallLevel !== 'error') overallLevel = 'warning'\n\n output.print(\n `${formatDocumentValidation({\n basePath: workspace.basePath,\n studioHost: workspace.studioHost,\n ...result,\n })}\\n`,\n )\n }\n\n await worker.dispose()\n\n return overallLevel\n}\n","import type {BuiltInValidationReporter} from '../validateAction'\n\nexport const ndjson: BuiltInValidationReporter = async ({output, worker}) => {\n let overallLevel: 'error' | 'warning' | 'info' = 'info'\n\n for await (const {\n documentId,\n documentType,\n markers,\n revision,\n level,\n } of worker.stream.validation()) {\n if (level === 'error') overallLevel = 'error'\n if (level === 'warning' && overallLevel !== 'error') overallLevel = 'warning'\n\n if (markers.length) {\n output.print(JSON.stringify({documentId, documentType, revision, level, markers}))\n }\n }\n\n await worker.dispose()\n\n return overallLevel\n}\n","import type {ValidationMarker} from '@sanity/types'\nimport type {BuiltInValidationReporter} from '../validateAction'\n\nexport const json: BuiltInValidationReporter = async ({output, worker}) => {\n let overallLevel: 'error' | 'warning' | 'info' = 'info'\n\n const results: Array<{\n documentId: string\n documentType: string\n revision: string\n level: 'error' | 'warning' | 'info'\n markers: ValidationMarker[]\n }> = []\n\n for await (const {\n documentId,\n documentType,\n markers,\n revision,\n level,\n } of worker.stream.validation()) {\n if (level === 'error') overallLevel = 'error'\n if (level === 'warning' && overallLevel !== 'error') overallLevel = 'warning'\n\n results.push({\n documentId,\n documentType,\n revision,\n level,\n markers,\n })\n }\n\n await worker.dispose()\n\n output.print(JSON.stringify(results))\n\n return overallLevel\n}\n","import {pretty} from './prettyReporter'\nimport {ndjson} from './ndjsonReporter'\nimport {json} from './jsonReporter'\n\nexport const reporters = {pretty, ndjson, json}\n","import path from 'path'\nimport fs from 'fs'\nimport type {CliCommandArguments, CliCommandContext, CliOutputter} from '@sanity/cli'\nimport logSymbols from 'log-symbols'\nimport chalk from 'chalk'\nimport {ClientConfig} from '@sanity/client'\nimport type {WorkerChannelReceiver} from '../../util/workerChannels'\nimport type {ValidationWorkerChannel} from '../../threads/validateDocuments'\nimport {validateDocuments} from './validateDocuments'\nimport {reporters} from './reporters'\n\ninterface ValidateFlags {\n workspace?: string\n format?: string\n dataset?: string\n file?: string\n level?: 'error' | 'warning' | 'info'\n 'max-custom-validation-concurrency'?: number\n yes?: boolean\n y?: boolean\n}\n\nexport type BuiltInValidationReporter = (options: {\n output: CliOutputter\n worker: WorkerChannelReceiver<ValidationWorkerChannel>\n flags: ValidateFlags\n}) => Promise<'error' | 'warning' | 'info'>\n\nexport default async function validateAction(\n args: CliCommandArguments<ValidateFlags>,\n {apiClient, workDir, output, prompt}: CliCommandContext,\n): Promise<void> {\n const flags = args.extOptions\n const unattendedMode = Boolean(flags.yes || flags.y)\n\n if (!unattendedMode) {\n output.print(\n `${chalk.yellow(`${logSymbols.warning} Warning:`)} This command ${\n flags.file\n ? 'reads all documents from your input file'\n : 'downloads all documents from your dataset'\n } and processes them through your local schema within a ` +\n `simulated browser environment.\\n`,\n )\n output.print(`Potential pitfalls:\\n`)\n output.print(\n `- Processes all documents locally (excluding assets). Large datasets may require more resources.`,\n )\n output.print(\n `- Executes all custom validation functions. Some functions may need to be refactored for compatibility.`,\n )\n output.print(\n `- Not all standard browser features are available and may cause issues while loading your Studio.`,\n )\n output.print(\n `- Adheres to document permissions. Ensure this account can see all desired documents.`,\n )\n if (flags.file) {\n output.print(\n `- Checks for missing document references against the live dataset if not found in your file.`,\n )\n }\n\n const confirmed = await prompt.single<boolean>({\n type: 'confirm',\n message: `Are you sure you want to continue?`,\n default: true,\n })\n\n if (!confirmed) {\n output.print('User aborted')\n process.exitCode = 1\n return\n }\n }\n\n if (flags.format && !(flags.format in reporters)) {\n const formatter = new Intl.ListFormat('en-US', {\n style: 'long',\n type: 'conjunction',\n })\n throw new Error(\n `Did not recognize format '${flags.format}'. Available formats are ${formatter.format(\n Object.keys(reporters).map((key) => `'${key}'`),\n )}`,\n )\n }\n\n const level = flags.level || 'warning'\n\n if (level !== 'error' && level !== 'warning' && level !== 'info') {\n throw new Error(`Invalid level. Available levels are 'error', 'warning', and 'info'.`)\n }\n\n const maxCustomValidationConcurrency = flags['max-custom-validation-concurrency']\n if (\n maxCustomValidationConcurrency &&\n typeof maxCustomValidationConcurrency !== 'number' &&\n !Number.isInteger(maxCustomValidationConcurrency)\n ) {\n throw new Error(`'--max-custom-validation-concurrency' must be an integer.`)\n }\n\n const clientConfig: Partial<ClientConfig> = {\n ...apiClient({\n requireUser: true,\n requireProject: false, // we'll get this from the workspace\n }).config(),\n // we set this explictly to true because the default client configuration\n // from the CLI comes configured with `useProjectHostname: false` when\n // `requireProject` is set to false\n useProjectHostname: true,\n // we set this explictly to true because we pass in a token via the\n // `clientConfiguration` object and also mock a browser environment in\n // this worker which triggers the browser warning\n ignoreBrowserTokenWarning: true,\n }\n\n let ndjsonFilePath\n if (flags.file) {\n if (typeof flags.file !== 'string') {\n throw new Error(`'--file' must be a string`)\n }\n const filePath = path.resolve(workDir, flags.file)\n\n const stat = await fs.promises.stat(filePath)\n if (!stat.isFile()) {\n throw new Error(`'--file' must point to a valid ndjson file or tarball`)\n }\n\n ndjsonFilePath = filePath\n }\n\n const overallLevel = await validateDocuments({\n workspace: flags.workspace,\n dataset: flags.dataset,\n clientConfig,\n workDir,\n level,\n maxCustomValidationConcurrency,\n ndjsonFilePath,\n reporter: (worker) => {\n const reporter =\n flags.format && flags.format in reporters\n ? reporters[flags.format as keyof typeof reporters]\n : reporters.pretty\n\n return reporter({output, worker, flags})\n },\n })\n\n process.exitCode = overallLevel === 'error' ? 1 : 0\n}\n"],"names":["DEFAULT_MAX_CUSTOM_VALIDATION_CONCURRENCY","defaultReporter","_ref","stream","dispose","createValidationGenerator","documentId","documentType","markers","revision","level","validation","result","validateDocuments","options","_a","workspace","clientConfig","configPath","dataset","projectId","workDir","process","cwd","reporter","maxCustomValidationConcurrency","ndjsonFilePath","rootPkgPath","sync","__dirname","path","Error","workerPath","join","default","dirname","worker","Worker","workerData","JSON","parse","stringify","env","createReceiver","isTty","isatty","levelValues","error","warning","info","count","amount","subject","concat","toLocaleString","substring","length","percentageFormatter","Intl","NumberFormat","style","minimumFractionDigits","maximumFractionDigits","percent","value","format","Math","min","secondFormatter","seconds","startTime","endTime","Date","now","summary","_ref2","errors","infos","valid","warnings","arguments","undefined","levelValue","logSymbols","success","documents","filter","Boolean","levelHeaders","chalk","bold","bgRed","black","red","bgYellow","yellow","cyan","link","text","url","underline","compareLevels","a","b","formatRootErrors","root","hasChildren","paddingLength","nodes","first","rest","slice","sort","firstElbow","firstPadding","repeat","firstLine","message","subsequentPadding","subsequentElbow","restOfLines","map","marker","formatDocumentValidation","_ref3","basePath","studioHost","tree","convertToTree","editLink","encodeURIComponent","documentTypeHeader","bgWhite","header","max","maxKeyLength","children","childErrors","formatTree","node","getNodes","_ref4","getMessage","rootErrors","pretty","_ref5","output","flags","workspaceLoadStart","spinner","start","event","loadedWorkspace","succeed","name","file","documentCount","loadedDocumentCount","downloadStart","downloadedCount","exportProgress","percentage","totalDocumentsToValidate","exportFinished","referenceIntegrityStart","loadedReferenceIntegrity","validationStart","results","totals","validatedCount","push","print","localeCompare","overallLevel","ndjson","_ref6","json","_ref7","reporters","validateAction","args","_ref8","apiClient","prompt","extOptions","unattendedMode","yes","y","confirmed","single","type","exitCode","formatter","ListFormat","Object","keys","key","Number","isInteger","requireUser","requireProject","config","useProjectHostname","ignoreBrowserTokenWarning","filePath","resolve","stat","fs","promises","isFile"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  var worker_threads = require('worker_threads');
4
4
  var oneline = require('oneline');
5
5
  var isPlainObject = require('lodash/isPlainObject.js');
6
- var getStudioConfig = require('../../../_chunks/getStudioConfig-JSkc4GE0.js');
6
+ var getStudioWorkspaces = require('../../../_chunks/getStudioWorkspaces-HX9o9-hl.js');
7
7
  function _interopDefaultCompat(e) {
8
8
  return e && typeof e === 'object' && 'default' in e ? e : {
9
9
  default: e
@@ -40,7 +40,7 @@ async function resolveGraphQLApis(_ref) {
40
40
  cliConfigPath,
41
41
  workDir
42
42
  } = _ref;
43
- const workspaces = await getStudioConfig.getStudioConfig({
43
+ const workspaces = await getStudioWorkspaces.getStudioWorkspaces({
44
44
  basePath: workDir
45
45
  });
46
46
  const numSources = workspaces.reduce((count, workspace) => count + workspace.unstable_sources.length, 0);
@@ -1 +1 @@
1
- {"version":3,"file":"getGraphQLAPIs.js","sources":["../../../../src/_internal/cli/threads/getGraphQLAPIs.ts"],"sourcesContent":["import {isMainThread, parentPort, workerData, MessagePort} from 'worker_threads'\nimport oneline from 'oneline'\nimport {isPlainObject} from 'lodash'\nimport type {Schema} from '@sanity/types'\nimport type {CliV3CommandContext, GraphQLAPIConfig} from '@sanity/cli'\nimport type {SchemaDefinitionish, TypeResolvedGraphQLAPI} from '../actions/graphql/types'\nimport {getStudioConfig} from '../util/getStudioConfig'\nimport {Workspace} from 'sanity'\n\nif (isMainThread || !parentPort) {\n throw new Error('This module must be run as a worker thread')\n}\n\ngetGraphQLAPIsForked(parentPort)\n\nasync function getGraphQLAPIsForked(parent: MessagePort): Promise<void> {\n const {cliConfig, cliConfigPath, workDir} = workerData\n const resolved = await resolveGraphQLApis({cliConfig, cliConfigPath, workDir})\n parent.postMessage(resolved)\n}\n\nasync function resolveGraphQLApis({\n cliConfig,\n cliConfigPath,\n workDir,\n}: Pick<CliV3CommandContext, 'cliConfig' | 'cliConfigPath' | 'workDir'>): Promise<\n TypeResolvedGraphQLAPI[]\n> {\n const workspaces = await getStudioConfig({basePath: workDir})\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 ${cliConfigPath || '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 {projectId, dataset, schema} = workspaces[0].unstable_sources[0]\n return [{schemaTypes: getStrippedSchemaTypes(schema), projectId, dataset}]\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 {workspace: workspaceName, source: sourceName} = 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 Error(`\"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) => typeof item !== 'undefined')\n }\n\n if (isPlainishObject(input)) {\n return Object.keys(input).reduce(\n (stripped, key) => {\n stripped[key] = strip(input[key])\n return stripped\n },\n {} as Record<string, unknown>,\n )\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":["_a","isMainThread","parentPort","Error","getGraphQLAPIsForked","parent","cliConfig","cliConfigPath","workDir","workerData","resolved","resolveGraphQLApis","postMessage","_ref","workspaces","getStudioConfig","basePath","numSources","reduce","count","workspace","unstable_sources","length","multiSource","multiWorkspace","hasGraphQLConfig","Boolean","graphql","oneline","__template","projectId","dataset","schema","schemaTypes","getStrippedSchemaTypes","apiDefs","validateCliConfig","resolveGraphQLAPIsFromConfig","resolvedApis","apiDef","workspaceName","source","sourceName","find","space","name","concat","src","push","config","configPath","arguments","undefined","Array","isArray","schemaDef","_original","types","map","type","stripType","input","strip","item","filter","isPlainishObject","Object","keys","stripped","key","isBasicType","isPlainObject"],"mappings":"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"}
1
+ {"version":3,"file":"getGraphQLAPIs.js","sources":["../../../../src/_internal/cli/threads/getGraphQLAPIs.ts"],"sourcesContent":["import {isMainThread, parentPort, workerData, MessagePort} from 'worker_threads'\nimport oneline from 'oneline'\nimport {isPlainObject} from 'lodash'\nimport type {Schema} from '@sanity/types'\nimport type {CliV3CommandContext, GraphQLAPIConfig} from '@sanity/cli'\nimport type {SchemaDefinitionish, TypeResolvedGraphQLAPI} from '../actions/graphql/types'\nimport {getStudioWorkspaces} from '../util/getStudioWorkspaces'\nimport {Workspace} from 'sanity'\n\nif (isMainThread || !parentPort) {\n throw new Error('This module must be run as a worker thread')\n}\n\ngetGraphQLAPIsForked(parentPort)\n\nasync function getGraphQLAPIsForked(parent: MessagePort): Promise<void> {\n const {cliConfig, cliConfigPath, workDir} = workerData\n const resolved = await resolveGraphQLApis({cliConfig, cliConfigPath, workDir})\n parent.postMessage(resolved)\n}\n\nasync function resolveGraphQLApis({\n cliConfig,\n cliConfigPath,\n workDir,\n}: Pick<CliV3CommandContext, 'cliConfig' | 'cliConfigPath' | 'workDir'>): Promise<\n TypeResolvedGraphQLAPI[]\n> {\n const workspaces = await getStudioWorkspaces({basePath: workDir})\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 ${cliConfigPath || '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 {projectId, dataset, schema} = workspaces[0].unstable_sources[0]\n return [{schemaTypes: getStrippedSchemaTypes(schema), projectId, dataset}]\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 {workspace: workspaceName, source: sourceName} = 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 Error(`\"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) => typeof item !== 'undefined')\n }\n\n if (isPlainishObject(input)) {\n return Object.keys(input).reduce(\n (stripped, key) => {\n stripped[key] = strip(input[key])\n return stripped\n },\n {} as Record<string, unknown>,\n )\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":["_a","isMainThread","parentPort","Error","getGraphQLAPIsForked","parent","cliConfig","cliConfigPath","workDir","workerData","resolved","resolveGraphQLApis","postMessage","_ref","workspaces","getStudioWorkspaces","basePath","numSources","reduce","count","workspace","unstable_sources","length","multiSource","multiWorkspace","hasGraphQLConfig","Boolean","graphql","oneline","__template","projectId","dataset","schema","schemaTypes","getStrippedSchemaTypes","apiDefs","validateCliConfig","resolveGraphQLAPIsFromConfig","resolvedApis","apiDef","workspaceName","source","sourceName","find","space","name","concat","src","push","config","configPath","arguments","undefined","Array","isArray","schemaDef","_original","types","map","type","stripType","input","strip","item","filter","isPlainishObject","Object","keys","stripped","key","isBasicType","isPlainObject"],"mappings":"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"}
@@ -8,7 +8,7 @@ var fs = require('fs');
8
8
  var path = require('path');
9
9
  var client = require('@sanity/client');
10
10
  var types = require('@sanity/types');
11
- var getStudioConfig = require('../../../_chunks/getStudioConfig-JSkc4GE0.js');
11
+ var getStudioWorkspaces = require('../../../_chunks/getStudioWorkspaces-HX9o9-hl.js');
12
12
  var mockBrowserEnvironment = require('../../../_chunks/mockBrowserEnvironment-1iCrZBr6.js');
13
13
  var workerChannels = require('../../../_chunks/workerChannels-ZUUNsU1E.js');
14
14
  var zlib = require('zlib');
@@ -124,7 +124,9 @@ const getReferenceIds = value => {
124
124
  };
125
125
  const idRegex = /^[^-][A-Z0-9._-]*$/i;
126
126
  const isValidId = id => typeof id === "string" && idRegex.test(id);
127
- const shouldIncludeDocument = document => !document._id.startsWith("system.");
127
+ const shouldIncludeDocument = document => {
128
+ return !document._type.startsWith("system.");
129
+ };
128
130
  async function* readerToGenerator(reader) {
129
131
  while (true) {
130
132
  const {
@@ -137,7 +139,7 @@ async function* readerToGenerator(reader) {
137
139
  }
138
140
  validateDocuments();
139
141
  async function loadWorkspace() {
140
- const workspaces = await getStudioConfig.getStudioConfig({
142
+ const workspaces = await getStudioWorkspaces.getStudioWorkspaces({
141
143
  basePath: workDir,
142
144
  configPath
143
145
  });
@@ -1 +1 @@
1
- {"version":3,"file":"validateDocuments.js","sources":["../../../../src/_internal/cli/util/extractDocumentsFromNdjsonOrTarball.ts","../../../../src/_internal/cli/threads/validateDocuments.ts"],"sourcesContent":["import {Readable, Writable} from 'stream'\nimport path from 'path'\nimport zlib from 'zlib'\nimport readline from 'readline'\nimport tar from 'tar-stream'\nimport {type SanityDocument} from '@sanity/types'\n\nconst HEADER_SIZE = 300\n\n// https://github.com/kevva/is-gzip/blob/13dab7c877787bd5cff9de5482b1736f00df99c6/index.js\nconst isGzip = (buf: Buffer) =>\n buf.length >= 3 && buf[0] === 0x1f && buf[1] === 0x8b && buf[2] === 0x08\n\n// https://github.com/watson/is-deflate/blob/f9e8f0c7814eed715e13e29e97c69acee319686a/index.js\nconst isDeflate = (buf: Buffer) =>\n buf.length >= 2 && buf[0] === 0x78 && (buf[1] === 1 || buf[1] === 0x9c || buf[1] === 0xda)\n\n// https://github.com/kevva/is-tar/blob/d295ffa2002a5d415946fc3d49f024ace8c28bd3/index.js\nconst isTar = (buf: Buffer) =>\n buf.length >= 262 &&\n buf[257] === 0x75 &&\n buf[258] === 0x73 &&\n buf[259] === 0x74 &&\n buf[260] === 0x61 &&\n buf[261] === 0x72\n\nasync function* extract<TReturn>(\n stream: AsyncIterable<Buffer>,\n extractor: Writable & AsyncIterable<TReturn>,\n) {\n // set up a task to drain the input iterable into the extractor asynchronously\n // before this function delegates to the extractor's iterable (containing the\n // result of the extraction)\n const drained = new Promise<void>((resolve, reject) => {\n // setTimeout is used here to ensure draining occurs after delegation\n setTimeout(async () => {\n try {\n for await (const chunk of stream) extractor.write(chunk)\n extractor.end()\n resolve()\n } catch (err) {\n reject(err)\n }\n })\n })\n\n // have this function delegate the results of the extractor\n yield* extractor\n await drained\n extractor.destroy()\n}\n\n/**\n * Given a async iterable of buffers, looks at the header of the file in the\n * first few bytes to see the file type then extracts the contents tries again.\n * If the given iterable of buffers is a tarball then it looks for an ndjson\n * files and returns another iterable of buffers with the contents of the\n * ndjson file\n */\nasync function* maybeExtractNdjson(stream: AsyncIterable<Buffer>): AsyncIterable<Buffer> {\n let buffer = Buffer.alloc(0)\n\n for await (const chunk of stream) {\n buffer = Buffer.concat([buffer, chunk])\n if (buffer.length < HEADER_SIZE) continue\n\n const fileHeader = buffer\n const restOfStream = async function* restOfStream() {\n yield fileHeader\n yield* stream\n }\n\n if (isGzip(fileHeader)) {\n yield* maybeExtractNdjson(extract(restOfStream(), zlib.createGunzip()))\n return\n }\n\n if (isDeflate(fileHeader)) {\n yield* maybeExtractNdjson(extract(restOfStream(), zlib.createDeflate()))\n return\n }\n\n if (isTar(fileHeader)) {\n for await (const entry of extract(restOfStream(), tar.extract())) {\n const filename = path.basename(entry.header.name)\n const extname = path.extname(filename).toLowerCase()\n // ignore hidden and non-ndjson files\n if (extname !== '.ndjson' || filename.startsWith('.')) continue\n\n for await (const ndjsonChunk of entry) yield ndjsonChunk\n return\n }\n }\n\n yield* restOfStream()\n }\n}\n\n/**\n * Takes in an async iterable of buffers from an ndjson file or tarball and\n * returns an async iterable of sanity documents.\n */\nexport async function* extractDocumentsFromNdjsonOrTarball(\n file: AsyncIterable<Buffer>,\n): AsyncIterable<SanityDocument> {\n const lines = readline.createInterface({\n input: Readable.from(maybeExtractNdjson(file)),\n })\n\n for await (const line of lines) {\n const trimmed = line.trim()\n if (trimmed) yield JSON.parse(trimmed) as SanityDocument\n }\n lines.close()\n}\n","import {isMainThread, parentPort, workerData as _workerData} from 'worker_threads'\nimport readline from 'readline'\nimport {Readable} from 'stream'\nimport os from 'os'\nimport fs from 'fs'\nimport path from 'path'\nimport {\n type ClientConfig,\n type SanityClient,\n type SanityDocument,\n createClient,\n} from '@sanity/client'\nimport {type ValidationContext, type ValidationMarker, isReference} from '@sanity/types'\nimport {getStudioConfig} from '../util/getStudioConfig'\nimport {mockBrowserEnvironment} from '../util/mockBrowserEnvironment'\nimport {\n createReporter,\n type WorkerChannel,\n type WorkerChannelEvent,\n type WorkerChannelStream,\n} from '../util/workerChannels'\nimport {extractDocumentsFromNdjsonOrTarball} from '../util/extractDocumentsFromNdjsonOrTarball'\nimport {isRecord, validateDocument} from 'sanity'\n\nconst MAX_VALIDATION_CONCURRENCY = 100\nconst DOCUMENT_VALIDATION_TIMEOUT = 30000\nconst REFERENCE_INTEGRITY_BATCH_SIZE = 100\n\ninterface AvailabilityResponse {\n omitted: {id: string; reason: 'existence' | 'permission'}[]\n}\n\nexport interface ValidateDocumentsWorkerData {\n workDir: string\n configPath?: string\n workspace?: string\n clientConfig?: Partial<ClientConfig>\n projectId?: string\n dataset?: string\n ndjsonFilePath?: string\n level?: ValidationMarker['level']\n maxCustomValidationConcurrency?: number\n}\n\nexport type ValidationWorkerChannel = WorkerChannel<{\n loadedWorkspace: WorkerChannelEvent<{\n name: string\n projectId: string\n dataset: string\n studioHost: string | null\n basePath: string\n }>\n loadedDocumentCount: WorkerChannelEvent<{documentCount: number}>\n exportProgress: WorkerChannelStream<{downloadedCount: number; documentCount: number}>\n exportFinished: WorkerChannelEvent<{totalDocumentsToValidate: number}>\n loadedReferenceIntegrity: WorkerChannelEvent\n validation: WorkerChannelStream<{\n validatedCount: number\n documentId: string\n documentType: string\n revision: string\n level: ValidationMarker['level']\n markers: ValidationMarker[]\n }>\n}>\n\nconst {\n clientConfig,\n workDir,\n workspace: workspaceName,\n configPath,\n dataset,\n ndjsonFilePath,\n projectId,\n level,\n maxCustomValidationConcurrency,\n} = _workerData as ValidateDocumentsWorkerData\n\nif (isMainThread || !parentPort) {\n throw new Error('This module must be run as a worker thread')\n}\n\nconst levelValues = {error: 0, warning: 1, info: 2} as const\n\nconst report = createReporter<ValidationWorkerChannel>(parentPort)\n\nconst getReferenceIds = (value: unknown) => {\n const ids = new Set<string>()\n\n function traverse(node: unknown) {\n if (isReference(node)) {\n ids.add(node._ref)\n return\n }\n\n if (typeof node === 'object' && node) {\n // Note: this works for arrays too\n for (const item of Object.values(node)) traverse(item)\n }\n }\n\n traverse(value)\n\n return ids\n}\n\nconst idRegex = /^[^-][A-Z0-9._-]*$/i\n\n// during testing, the `doc` endpoint 502'ed if given an invalid ID\nconst isValidId = (id: unknown) => typeof id === 'string' && idRegex.test(id)\nconst shouldIncludeDocument = (document: SanityDocument) => !document._id.startsWith('system.')\n\nasync function* readerToGenerator(reader: ReadableStreamDefaultReader<Uint8Array>) {\n while (true) {\n const {value, done} = await reader.read()\n if (value) yield value\n if (done) return\n }\n}\n\nvalidateDocuments()\n\nasync function loadWorkspace() {\n const workspaces = await getStudioConfig({basePath: workDir, configPath})\n\n if (!workspaces.length) {\n throw new Error(`Configuration did not return any workspaces.`)\n }\n\n let _workspace\n if (workspaceName) {\n _workspace = workspaces.find((w) => w.name === workspaceName)\n if (!_workspace) {\n throw new Error(`Could not find any workspaces with name \\`${workspaceName}\\``)\n }\n } else {\n if (workspaces.length !== 1) {\n throw new Error(\n \"Multiple workspaces found. Please specify which workspace to use with '--workspace'.\",\n )\n }\n _workspace = workspaces[0]\n }\n const workspace = _workspace\n\n const client = createClient({\n ...clientConfig,\n dataset: dataset || workspace.dataset,\n projectId: projectId || workspace.projectId,\n requestTagPrefix: 'sanity.cli.validate',\n }).config({apiVersion: 'v2021-03-25'})\n\n let studioHost\n try {\n const project = await client.projects.getById(projectId || workspace.projectId)\n studioHost = project.metadata.externalStudioHost || project.studioHost\n } catch {\n // no big deal if we fail to get the studio host\n studioHost = null\n }\n\n report.event.loadedWorkspace({\n projectId: workspace.projectId,\n dataset: workspace.dataset,\n name: workspace.name,\n studioHost,\n basePath: workspace.basePath,\n })\n\n return {workspace, client}\n}\n\nasync function downloadFromExport(client: SanityClient) {\n const exportUrl = new URL(client.getUrl(`/data/export/${client.config().dataset}`, false))\n\n const documentCount = await client.fetch('length(*)')\n report.event.loadedDocumentCount({documentCount})\n\n const {token} = client.config()\n const response = await fetch(exportUrl, {\n headers: new Headers({...(token && {Authorization: `Bearer ${token}`})}),\n })\n\n const reader = response.body?.getReader()\n if (!reader) throw new Error('Could not get reader from response body.')\n\n let downloadedCount = 0\n const referencedIds = new Set<string>()\n const documentIds = new Set<string>()\n const lines = readline.createInterface({input: Readable.from(readerToGenerator(reader))})\n\n // Note: we stream the export to a file and then re-read from that file to\n // make this less memory intensive.\n // this is a similar pattern to the import/export CLI commands\n const slugDate = new Date()\n .toISOString()\n .replace(/[^a-z0-9]/gi, '-')\n .toLowerCase()\n const tempOutputFile = path.join(os.tmpdir(), `sanity-validate-${slugDate}.ndjson`)\n const outputStream = fs.createWriteStream(tempOutputFile)\n\n for await (const line of lines) {\n const document = JSON.parse(line) as SanityDocument\n\n if (shouldIncludeDocument(document)) {\n documentIds.add(document._id)\n for (const referenceId of getReferenceIds(document)) {\n referencedIds.add(referenceId)\n }\n\n outputStream.write(`${line}\\n`)\n }\n\n downloadedCount++\n report.stream.exportProgress.emit({downloadedCount, documentCount})\n }\n\n await new Promise<void>((resolve, reject) =>\n outputStream.close((err) => (err ? reject(err) : resolve())),\n )\n\n report.stream.exportProgress.end()\n report.event.exportFinished({totalDocumentsToValidate: documentIds.size})\n\n const getDocuments = () =>\n extractDocumentsFromNdjsonOrTarball(fs.createReadStream(tempOutputFile))\n\n return {documentIds, referencedIds, getDocuments, cleanup: () => fs.promises.rm(tempOutputFile)}\n}\n\nasync function downloadFromFile(filePath: string) {\n const referencedIds = new Set<string>()\n const documentIds = new Set<string>()\n const getDocuments = () => extractDocumentsFromNdjsonOrTarball(fs.createReadStream(filePath))\n\n for await (const document of getDocuments()) {\n if (shouldIncludeDocument(document)) {\n documentIds.add(document._id)\n for (const referenceId of getReferenceIds(document)) {\n referencedIds.add(referenceId)\n }\n }\n }\n\n report.event.exportFinished({totalDocumentsToValidate: documentIds.size})\n\n return {documentIds, referencedIds, getDocuments, cleanup: undefined}\n}\n\ninterface CheckReferenceExistenceOptions {\n client: SanityClient\n referencedIds: Set<string>\n documentIds: Set<string>\n}\n\nasync function checkReferenceExistence({\n client,\n documentIds,\n referencedIds: _referencedIds,\n}: CheckReferenceExistenceOptions) {\n const existingIds = new Set(documentIds)\n const idsToCheck = Array.from(_referencedIds)\n .filter((id) => !existingIds.has(id) && isValidId(id))\n .sort()\n\n const batches = idsToCheck.reduce<string[][]>(\n (acc, next, index) => {\n const batchIndex = Math.floor(index / REFERENCE_INTEGRITY_BATCH_SIZE)\n const batch = acc[batchIndex]\n batch.push(next)\n return acc\n },\n Array.from<string[]>({\n length: Math.ceil(idsToCheck.length / REFERENCE_INTEGRITY_BATCH_SIZE),\n }).map(() => []),\n )\n\n for (const batch of batches) {\n const {omitted} = await client.request<AvailabilityResponse>({\n uri: client.getDataUrl('doc', batch.join(',')),\n json: true,\n query: {excludeContent: 'true'},\n tag: 'documents-availability',\n })\n\n const omittedIds = omitted.reduce<Record<string, 'existence' | 'permission'>>((acc, next) => {\n acc[next.id] = next.reason\n return acc\n }, {})\n\n for (const id of batch) {\n // unless the document ID is in the `omitted` object explictly due to\n // the reason `'existence'`, then it should exist\n if (omittedIds[id] !== 'existence') {\n existingIds.add(id)\n }\n }\n }\n report.event.loadedReferenceIntegrity()\n\n return {existingIds}\n}\n\nasync function validateDocuments() {\n // note: this is dynamically imported because this module is ESM only and this\n // file gets compiled to CJS at this time\n const {default: pMap} = await import('p-map')\n\n const cleanupBrowserEnvironment = mockBrowserEnvironment(workDir)\n\n let cleanupDownloadedDocuments: (() => Promise<void>) | undefined\n\n try {\n const {client, workspace} = await loadWorkspace()\n const {documentIds, referencedIds, getDocuments, cleanup} = ndjsonFilePath\n ? await downloadFromFile(ndjsonFilePath)\n : await downloadFromExport(client)\n cleanupDownloadedDocuments = cleanup\n const {existingIds} = await checkReferenceExistence({client, referencedIds, documentIds})\n\n const getClient = <TOptions extends Partial<ClientConfig>>(options: TOptions) =>\n client.withConfig(options)\n\n const getDocumentExists: ValidationContext['getDocumentExists'] = ({id}) =>\n Promise.resolve(existingIds.has(id))\n\n const getLevel = (markers: ValidationMarker[]) => {\n let foundWarning = false\n for (const marker of markers) {\n if (marker.level === 'error') return 'error'\n if (marker.level === 'warning') foundWarning = true\n }\n\n if (foundWarning) return 'warning'\n return 'info'\n }\n\n let validatedCount = 0\n\n const validate = async (document: SanityDocument) => {\n let markers: ValidationMarker[]\n\n try {\n const timeout = Symbol('timeout')\n\n const result = await Promise.race([\n validateDocument({\n document,\n workspace,\n getClient,\n getDocumentExists,\n environment: 'cli',\n maxCustomValidationConcurrency,\n }),\n new Promise<typeof timeout>((resolve) =>\n setTimeout(() => resolve(timeout), DOCUMENT_VALIDATION_TIMEOUT),\n ),\n ])\n\n if (result === timeout) {\n throw new Error(\n `Document '${document._id}' failed to validate within ${DOCUMENT_VALIDATION_TIMEOUT}ms.`,\n )\n }\n\n markers = result\n // remove deprecated `item` from the marker\n .map(({item, ...marker}) => marker)\n // filter out unwanted levels\n .filter((marker) => {\n const markerValue = levelValues[marker.level]\n const flagLevelValue =\n levelValues[level as keyof typeof levelValues] ?? levelValues.info\n return markerValue <= flagLevelValue\n })\n } catch (err) {\n const errorMessage =\n isRecord(err) && typeof err.message === 'string' ? err.message : 'Unknown error'\n\n const message = `Exception occurred while validating value: ${errorMessage}`\n\n markers = [\n {\n message,\n level: 'error',\n path: [],\n },\n ]\n }\n\n validatedCount++\n\n report.stream.validation.emit({\n documentId: document._id,\n documentType: document._type,\n revision: document._rev,\n markers,\n validatedCount,\n level: getLevel(markers),\n })\n }\n\n await pMap(getDocuments(), validate, {concurrency: MAX_VALIDATION_CONCURRENCY})\n\n report.stream.validation.end()\n } finally {\n await cleanupDownloadedDocuments?.()\n cleanupBrowserEnvironment()\n }\n}\n"],"names":["HEADER_SIZE","isGzip","buf","length","isDeflate","isTar","extract","stream","extractor","drained","Promise","resolve","reject","setTimeout","chunk","write","end","err","destroy","maybeExtractNdjson","buffer","Buffer","alloc","concat","fileHeader","restOfStream","restOfStream2","zlib","createGunzip","createDeflate","entry","tar","default","filename","path","basename","header","name","extname","toLowerCase","startsWith","ndjsonChunk","extractDocumentsFromNdjsonOrTarball","file","lines","readline","createInterface","input","Readable","from","line","trimmed","trim","JSON","parse","close","MAX_VALIDATION_CONCURRENCY","DOCUMENT_VALIDATION_TIMEOUT","REFERENCE_INTEGRITY_BATCH_SIZE","clientConfig","workDir","workspace","workspaceName","configPath","dataset","ndjsonFilePath","projectId","level","maxCustomValidationConcurrency","_workerData","isMainThread","parentPort","Error","levelValues","error","warning","info","report","createReporter","getReferenceIds","value","ids","Set","traverse","node","isReference","add","_ref","item","Object","values","idRegex","isValidId","id","test","shouldIncludeDocument","document","_id","readerToGenerator","reader","done","read","validateDocuments","loadWorkspace","workspaces","getStudioConfig","basePath","_workspace","find","w","client","createClient","requestTagPrefix","config","apiVersion","studioHost","project","projects","getById","metadata","externalStudioHost","event","loadedWorkspace","downloadFromExport","_a","exportUrl","URL","getUrl","documentCount","fetch","loadedDocumentCount","token","response","headers","Headers","Authorization","body","getReader","downloadedCount","referencedIds","documentIds","slugDate","Date","toISOString","replace","tempOutputFile","join","os","tmpdir","outputStream","fs","createWriteStream","referenceId","exportProgress","emit","exportFinished","totalDocumentsToValidate","size","getDocuments","createReadStream","cleanup","promises","rm","downloadFromFile","filePath","checkReferenceExistence","_referencedIds","existingIds","idsToCheck","Array","filter","has","sort","batches","reduce","acc","next","index","batchIndex","Math","floor","batch","push","ceil","map","omitted","request","uri","getDataUrl","json","query","excludeContent","tag","omittedIds","reason","loadedReferenceIntegrity","pMap","cleanupBrowserEnvironment","mockBrowserEnvironment","cleanupDownloadedDocuments","getClient","options","withConfig","getDocumentExists","_ref2","getLevel","markers","foundWarning","marker","validatedCount","validate","timeout","Symbol","result","race","validateDocument","environment","_ref3","markerValue","flagLevelValue","errorMessage","isRecord","message","validation","documentId","documentType","_type","revision","_rev","concurrency"],"mappings":"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"}
1
+ {"version":3,"file":"validateDocuments.js","sources":["../../../../src/_internal/cli/util/extractDocumentsFromNdjsonOrTarball.ts","../../../../src/_internal/cli/threads/validateDocuments.ts"],"sourcesContent":["import {Readable, Writable} from 'stream'\nimport path from 'path'\nimport zlib from 'zlib'\nimport readline from 'readline'\nimport tar from 'tar-stream'\nimport {type SanityDocument} from '@sanity/types'\n\nconst HEADER_SIZE = 300\n\n// https://github.com/kevva/is-gzip/blob/13dab7c877787bd5cff9de5482b1736f00df99c6/index.js\nconst isGzip = (buf: Buffer) =>\n buf.length >= 3 && buf[0] === 0x1f && buf[1] === 0x8b && buf[2] === 0x08\n\n// https://github.com/watson/is-deflate/blob/f9e8f0c7814eed715e13e29e97c69acee319686a/index.js\nconst isDeflate = (buf: Buffer) =>\n buf.length >= 2 && buf[0] === 0x78 && (buf[1] === 1 || buf[1] === 0x9c || buf[1] === 0xda)\n\n// https://github.com/kevva/is-tar/blob/d295ffa2002a5d415946fc3d49f024ace8c28bd3/index.js\nconst isTar = (buf: Buffer) =>\n buf.length >= 262 &&\n buf[257] === 0x75 &&\n buf[258] === 0x73 &&\n buf[259] === 0x74 &&\n buf[260] === 0x61 &&\n buf[261] === 0x72\n\nasync function* extract<TReturn>(\n stream: AsyncIterable<Buffer>,\n extractor: Writable & AsyncIterable<TReturn>,\n) {\n // set up a task to drain the input iterable into the extractor asynchronously\n // before this function delegates to the extractor's iterable (containing the\n // result of the extraction)\n const drained = new Promise<void>((resolve, reject) => {\n // setTimeout is used here to ensure draining occurs after delegation\n setTimeout(async () => {\n try {\n for await (const chunk of stream) extractor.write(chunk)\n extractor.end()\n resolve()\n } catch (err) {\n reject(err)\n }\n })\n })\n\n // have this function delegate the results of the extractor\n yield* extractor\n await drained\n extractor.destroy()\n}\n\n/**\n * Given a async iterable of buffers, looks at the header of the file in the\n * first few bytes to see the file type then extracts the contents tries again.\n * If the given iterable of buffers is a tarball then it looks for an ndjson\n * files and returns another iterable of buffers with the contents of the\n * ndjson file\n */\nasync function* maybeExtractNdjson(stream: AsyncIterable<Buffer>): AsyncIterable<Buffer> {\n let buffer = Buffer.alloc(0)\n\n for await (const chunk of stream) {\n buffer = Buffer.concat([buffer, chunk])\n if (buffer.length < HEADER_SIZE) continue\n\n const fileHeader = buffer\n const restOfStream = async function* restOfStream() {\n yield fileHeader\n yield* stream\n }\n\n if (isGzip(fileHeader)) {\n yield* maybeExtractNdjson(extract(restOfStream(), zlib.createGunzip()))\n return\n }\n\n if (isDeflate(fileHeader)) {\n yield* maybeExtractNdjson(extract(restOfStream(), zlib.createDeflate()))\n return\n }\n\n if (isTar(fileHeader)) {\n for await (const entry of extract(restOfStream(), tar.extract())) {\n const filename = path.basename(entry.header.name)\n const extname = path.extname(filename).toLowerCase()\n // ignore hidden and non-ndjson files\n if (extname !== '.ndjson' || filename.startsWith('.')) continue\n\n for await (const ndjsonChunk of entry) yield ndjsonChunk\n return\n }\n }\n\n yield* restOfStream()\n }\n}\n\n/**\n * Takes in an async iterable of buffers from an ndjson file or tarball and\n * returns an async iterable of sanity documents.\n */\nexport async function* extractDocumentsFromNdjsonOrTarball(\n file: AsyncIterable<Buffer>,\n): AsyncIterable<SanityDocument> {\n const lines = readline.createInterface({\n input: Readable.from(maybeExtractNdjson(file)),\n })\n\n for await (const line of lines) {\n const trimmed = line.trim()\n if (trimmed) yield JSON.parse(trimmed) as SanityDocument\n }\n lines.close()\n}\n","import {isMainThread, parentPort, workerData as _workerData} from 'worker_threads'\nimport readline from 'readline'\nimport {Readable} from 'stream'\nimport os from 'os'\nimport fs from 'fs'\nimport path from 'path'\nimport {\n type ClientConfig,\n type SanityClient,\n type SanityDocument,\n createClient,\n} from '@sanity/client'\nimport {type ValidationContext, type ValidationMarker, isReference} from '@sanity/types'\nimport {getStudioWorkspaces} from '../util/getStudioWorkspaces'\nimport {mockBrowserEnvironment} from '../util/mockBrowserEnvironment'\nimport {\n createReporter,\n type WorkerChannel,\n type WorkerChannelEvent,\n type WorkerChannelStream,\n} from '../util/workerChannels'\nimport {extractDocumentsFromNdjsonOrTarball} from '../util/extractDocumentsFromNdjsonOrTarball'\nimport {isRecord, validateDocument} from 'sanity'\n\nconst MAX_VALIDATION_CONCURRENCY = 100\nconst DOCUMENT_VALIDATION_TIMEOUT = 30000\nconst REFERENCE_INTEGRITY_BATCH_SIZE = 100\n\ninterface AvailabilityResponse {\n omitted: {id: string; reason: 'existence' | 'permission'}[]\n}\n\nexport interface ValidateDocumentsWorkerData {\n workDir: string\n configPath?: string\n workspace?: string\n clientConfig?: Partial<ClientConfig>\n projectId?: string\n dataset?: string\n ndjsonFilePath?: string\n level?: ValidationMarker['level']\n maxCustomValidationConcurrency?: number\n}\n\nexport type ValidationWorkerChannel = WorkerChannel<{\n loadedWorkspace: WorkerChannelEvent<{\n name: string\n projectId: string\n dataset: string\n studioHost: string | null\n basePath: string\n }>\n loadedDocumentCount: WorkerChannelEvent<{documentCount: number}>\n exportProgress: WorkerChannelStream<{downloadedCount: number; documentCount: number}>\n exportFinished: WorkerChannelEvent<{totalDocumentsToValidate: number}>\n loadedReferenceIntegrity: WorkerChannelEvent\n validation: WorkerChannelStream<{\n validatedCount: number\n documentId: string\n documentType: string\n revision: string\n level: ValidationMarker['level']\n markers: ValidationMarker[]\n }>\n}>\n\nconst {\n clientConfig,\n workDir,\n workspace: workspaceName,\n configPath,\n dataset,\n ndjsonFilePath,\n projectId,\n level,\n maxCustomValidationConcurrency,\n} = _workerData as ValidateDocumentsWorkerData\n\nif (isMainThread || !parentPort) {\n throw new Error('This module must be run as a worker thread')\n}\n\nconst levelValues = {error: 0, warning: 1, info: 2} as const\n\nconst report = createReporter<ValidationWorkerChannel>(parentPort)\n\nconst getReferenceIds = (value: unknown) => {\n const ids = new Set<string>()\n\n function traverse(node: unknown) {\n if (isReference(node)) {\n ids.add(node._ref)\n return\n }\n\n if (typeof node === 'object' && node) {\n // Note: this works for arrays too\n for (const item of Object.values(node)) traverse(item)\n }\n }\n\n traverse(value)\n\n return ids\n}\n\nconst idRegex = /^[^-][A-Z0-9._-]*$/i\n\n// during testing, the `doc` endpoint 502'ed if given an invalid ID\nconst isValidId = (id: unknown) => typeof id === 'string' && idRegex.test(id)\nconst shouldIncludeDocument = (document: SanityDocument) => {\n // Filter out system documents\n return !document._type.startsWith('system.')\n}\n\nasync function* readerToGenerator(reader: ReadableStreamDefaultReader<Uint8Array>) {\n while (true) {\n const {value, done} = await reader.read()\n if (value) yield value\n if (done) return\n }\n}\n\nvalidateDocuments()\n\nasync function loadWorkspace() {\n const workspaces = await getStudioWorkspaces({basePath: workDir, configPath})\n\n if (!workspaces.length) {\n throw new Error(`Configuration did not return any workspaces.`)\n }\n\n let _workspace\n if (workspaceName) {\n _workspace = workspaces.find((w) => w.name === workspaceName)\n if (!_workspace) {\n throw new Error(`Could not find any workspaces with name \\`${workspaceName}\\``)\n }\n } else {\n if (workspaces.length !== 1) {\n throw new Error(\n \"Multiple workspaces found. Please specify which workspace to use with '--workspace'.\",\n )\n }\n _workspace = workspaces[0]\n }\n const workspace = _workspace\n\n const client = createClient({\n ...clientConfig,\n dataset: dataset || workspace.dataset,\n projectId: projectId || workspace.projectId,\n requestTagPrefix: 'sanity.cli.validate',\n }).config({apiVersion: 'v2021-03-25'})\n\n let studioHost\n try {\n const project = await client.projects.getById(projectId || workspace.projectId)\n studioHost = project.metadata.externalStudioHost || project.studioHost\n } catch {\n // no big deal if we fail to get the studio host\n studioHost = null\n }\n\n report.event.loadedWorkspace({\n projectId: workspace.projectId,\n dataset: workspace.dataset,\n name: workspace.name,\n studioHost,\n basePath: workspace.basePath,\n })\n\n return {workspace, client}\n}\n\nasync function downloadFromExport(client: SanityClient) {\n const exportUrl = new URL(client.getUrl(`/data/export/${client.config().dataset}`, false))\n\n const documentCount = await client.fetch('length(*)')\n report.event.loadedDocumentCount({documentCount})\n\n const {token} = client.config()\n const response = await fetch(exportUrl, {\n headers: new Headers({...(token && {Authorization: `Bearer ${token}`})}),\n })\n\n const reader = response.body?.getReader()\n if (!reader) throw new Error('Could not get reader from response body.')\n\n let downloadedCount = 0\n const referencedIds = new Set<string>()\n const documentIds = new Set<string>()\n const lines = readline.createInterface({input: Readable.from(readerToGenerator(reader))})\n\n // Note: we stream the export to a file and then re-read from that file to\n // make this less memory intensive.\n // this is a similar pattern to the import/export CLI commands\n const slugDate = new Date()\n .toISOString()\n .replace(/[^a-z0-9]/gi, '-')\n .toLowerCase()\n const tempOutputFile = path.join(os.tmpdir(), `sanity-validate-${slugDate}.ndjson`)\n const outputStream = fs.createWriteStream(tempOutputFile)\n\n for await (const line of lines) {\n const document = JSON.parse(line) as SanityDocument\n\n if (shouldIncludeDocument(document)) {\n documentIds.add(document._id)\n for (const referenceId of getReferenceIds(document)) {\n referencedIds.add(referenceId)\n }\n\n outputStream.write(`${line}\\n`)\n }\n\n downloadedCount++\n report.stream.exportProgress.emit({downloadedCount, documentCount})\n }\n\n await new Promise<void>((resolve, reject) =>\n outputStream.close((err) => (err ? reject(err) : resolve())),\n )\n\n report.stream.exportProgress.end()\n report.event.exportFinished({totalDocumentsToValidate: documentIds.size})\n\n const getDocuments = () =>\n extractDocumentsFromNdjsonOrTarball(fs.createReadStream(tempOutputFile))\n\n return {documentIds, referencedIds, getDocuments, cleanup: () => fs.promises.rm(tempOutputFile)}\n}\n\nasync function downloadFromFile(filePath: string) {\n const referencedIds = new Set<string>()\n const documentIds = new Set<string>()\n const getDocuments = () => extractDocumentsFromNdjsonOrTarball(fs.createReadStream(filePath))\n\n for await (const document of getDocuments()) {\n if (shouldIncludeDocument(document)) {\n documentIds.add(document._id)\n for (const referenceId of getReferenceIds(document)) {\n referencedIds.add(referenceId)\n }\n }\n }\n\n report.event.exportFinished({totalDocumentsToValidate: documentIds.size})\n\n return {documentIds, referencedIds, getDocuments, cleanup: undefined}\n}\n\ninterface CheckReferenceExistenceOptions {\n client: SanityClient\n referencedIds: Set<string>\n documentIds: Set<string>\n}\n\nasync function checkReferenceExistence({\n client,\n documentIds,\n referencedIds: _referencedIds,\n}: CheckReferenceExistenceOptions) {\n const existingIds = new Set(documentIds)\n const idsToCheck = Array.from(_referencedIds)\n .filter((id) => !existingIds.has(id) && isValidId(id))\n .sort()\n\n const batches = idsToCheck.reduce<string[][]>(\n (acc, next, index) => {\n const batchIndex = Math.floor(index / REFERENCE_INTEGRITY_BATCH_SIZE)\n const batch = acc[batchIndex]\n batch.push(next)\n return acc\n },\n Array.from<string[]>({\n length: Math.ceil(idsToCheck.length / REFERENCE_INTEGRITY_BATCH_SIZE),\n }).map(() => []),\n )\n\n for (const batch of batches) {\n const {omitted} = await client.request<AvailabilityResponse>({\n uri: client.getDataUrl('doc', batch.join(',')),\n json: true,\n query: {excludeContent: 'true'},\n tag: 'documents-availability',\n })\n\n const omittedIds = omitted.reduce<Record<string, 'existence' | 'permission'>>((acc, next) => {\n acc[next.id] = next.reason\n return acc\n }, {})\n\n for (const id of batch) {\n // unless the document ID is in the `omitted` object explictly due to\n // the reason `'existence'`, then it should exist\n if (omittedIds[id] !== 'existence') {\n existingIds.add(id)\n }\n }\n }\n report.event.loadedReferenceIntegrity()\n\n return {existingIds}\n}\n\nasync function validateDocuments() {\n // note: this is dynamically imported because this module is ESM only and this\n // file gets compiled to CJS at this time\n const {default: pMap} = await import('p-map')\n\n const cleanupBrowserEnvironment = mockBrowserEnvironment(workDir)\n\n let cleanupDownloadedDocuments: (() => Promise<void>) | undefined\n\n try {\n const {client, workspace} = await loadWorkspace()\n const {documentIds, referencedIds, getDocuments, cleanup} = ndjsonFilePath\n ? await downloadFromFile(ndjsonFilePath)\n : await downloadFromExport(client)\n cleanupDownloadedDocuments = cleanup\n const {existingIds} = await checkReferenceExistence({client, referencedIds, documentIds})\n\n const getClient = <TOptions extends Partial<ClientConfig>>(options: TOptions) =>\n client.withConfig(options)\n\n const getDocumentExists: ValidationContext['getDocumentExists'] = ({id}) =>\n Promise.resolve(existingIds.has(id))\n\n const getLevel = (markers: ValidationMarker[]) => {\n let foundWarning = false\n for (const marker of markers) {\n if (marker.level === 'error') return 'error'\n if (marker.level === 'warning') foundWarning = true\n }\n\n if (foundWarning) return 'warning'\n return 'info'\n }\n\n let validatedCount = 0\n\n const validate = async (document: SanityDocument) => {\n let markers: ValidationMarker[]\n\n try {\n const timeout = Symbol('timeout')\n\n const result = await Promise.race([\n validateDocument({\n document,\n workspace,\n getClient,\n getDocumentExists,\n environment: 'cli',\n maxCustomValidationConcurrency,\n }),\n new Promise<typeof timeout>((resolve) =>\n setTimeout(() => resolve(timeout), DOCUMENT_VALIDATION_TIMEOUT),\n ),\n ])\n\n if (result === timeout) {\n throw new Error(\n `Document '${document._id}' failed to validate within ${DOCUMENT_VALIDATION_TIMEOUT}ms.`,\n )\n }\n\n markers = result\n // remove deprecated `item` from the marker\n .map(({item, ...marker}) => marker)\n // filter out unwanted levels\n .filter((marker) => {\n const markerValue = levelValues[marker.level]\n const flagLevelValue =\n levelValues[level as keyof typeof levelValues] ?? levelValues.info\n return markerValue <= flagLevelValue\n })\n } catch (err) {\n const errorMessage =\n isRecord(err) && typeof err.message === 'string' ? err.message : 'Unknown error'\n\n const message = `Exception occurred while validating value: ${errorMessage}`\n\n markers = [\n {\n message,\n level: 'error',\n path: [],\n },\n ]\n }\n\n validatedCount++\n\n report.stream.validation.emit({\n documentId: document._id,\n documentType: document._type,\n revision: document._rev,\n markers,\n validatedCount,\n level: getLevel(markers),\n })\n }\n\n await pMap(getDocuments(), validate, {concurrency: MAX_VALIDATION_CONCURRENCY})\n\n report.stream.validation.end()\n } finally {\n await cleanupDownloadedDocuments?.()\n cleanupBrowserEnvironment()\n }\n}\n"],"names":["HEADER_SIZE","isGzip","buf","length","isDeflate","isTar","extract","stream","extractor","drained","Promise","resolve","reject","setTimeout","chunk","write","end","err","destroy","maybeExtractNdjson","buffer","Buffer","alloc","concat","fileHeader","restOfStream","restOfStream2","zlib","createGunzip","createDeflate","entry","tar","default","filename","path","basename","header","name","extname","toLowerCase","startsWith","ndjsonChunk","extractDocumentsFromNdjsonOrTarball","file","lines","readline","createInterface","input","Readable","from","line","trimmed","trim","JSON","parse","close","MAX_VALIDATION_CONCURRENCY","DOCUMENT_VALIDATION_TIMEOUT","REFERENCE_INTEGRITY_BATCH_SIZE","clientConfig","workDir","workspace","workspaceName","configPath","dataset","ndjsonFilePath","projectId","level","maxCustomValidationConcurrency","_workerData","isMainThread","parentPort","Error","levelValues","error","warning","info","report","createReporter","getReferenceIds","value","ids","Set","traverse","node","isReference","add","_ref","item","Object","values","idRegex","isValidId","id","test","shouldIncludeDocument","document","_type","readerToGenerator","reader","done","read","validateDocuments","loadWorkspace","workspaces","getStudioWorkspaces","basePath","_workspace","find","w","client","createClient","requestTagPrefix","config","apiVersion","studioHost","project","projects","getById","metadata","externalStudioHost","event","loadedWorkspace","downloadFromExport","_a","exportUrl","URL","getUrl","documentCount","fetch","loadedDocumentCount","token","response","headers","Headers","Authorization","body","getReader","downloadedCount","referencedIds","documentIds","slugDate","Date","toISOString","replace","tempOutputFile","join","os","tmpdir","outputStream","fs","createWriteStream","_id","referenceId","exportProgress","emit","exportFinished","totalDocumentsToValidate","size","getDocuments","createReadStream","cleanup","promises","rm","downloadFromFile","filePath","checkReferenceExistence","_referencedIds","existingIds","idsToCheck","Array","filter","has","sort","batches","reduce","acc","next","index","batchIndex","Math","floor","batch","push","ceil","map","omitted","request","uri","getDataUrl","json","query","excludeContent","tag","omittedIds","reason","loadedReferenceIntegrity","pMap","cleanupBrowserEnvironment","mockBrowserEnvironment","cleanupDownloadedDocuments","getClient","options","withConfig","getDocumentExists","_ref2","getLevel","markers","foundWarning","marker","validatedCount","validate","timeout","Symbol","result","race","validateDocument","environment","_ref3","markerValue","flagLevelValue","errorMessage","isRecord","message","validation","documentId","documentType","revision","_rev","concurrency"],"mappings":"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"}