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.
- package/lib/_chunks/{_internal-2CJ5wSKF.js → _internal-6Pl2wJGj.js} +422 -201
- package/lib/_chunks/_internal-6Pl2wJGj.js.map +1 -0
- package/lib/_chunks/{_internal-79flWvL8.js → _internal-yQwMw2ht.js} +419 -203
- package/lib/_chunks/_internal-yQwMw2ht.js.map +1 -0
- package/lib/_chunks/{_internalBrowser-QAFz3SKp.js → _internalBrowser-HWvRXvlU.js} +22 -22
- package/lib/_chunks/_internalBrowser-HWvRXvlU.js.map +1 -0
- package/lib/_chunks/{_internalBrowser-Y0qKZ-GA.js → _internalBrowser-TWIhitgI.js} +22 -22
- package/lib/_chunks/_internalBrowser-TWIhitgI.js.map +1 -0
- package/lib/_chunks/{deployApiAction-SHteit1G.js → deployApiAction-TZcCtXan.js} +2 -2
- package/lib/_chunks/{deployApiAction-SHteit1G.js.map → deployApiAction-TZcCtXan.js.map} +1 -1
- package/lib/_chunks/{deployApiAction-bRyJpGOS.js → deployApiAction-rVL67VYW.js} +2 -2
- package/lib/_chunks/{deployApiAction-bRyJpGOS.js.map → deployApiAction-rVL67VYW.js.map} +1 -1
- package/lib/_chunks/{getStudioConfig-JSkc4GE0.js → getStudioWorkspaces-HX9o9-hl.js} +20 -4
- package/lib/_chunks/getStudioWorkspaces-HX9o9-hl.js.map +1 -0
- package/lib/_chunks/{index-EO9iRnDS.js → index-2kSxso3r.js} +2 -2
- package/lib/_chunks/{index-EO9iRnDS.js.map → index-2kSxso3r.js.map} +1 -1
- package/lib/_chunks/{index-FQCCBbuC.js → index-751ZLh3z.js} +6 -6
- package/lib/_chunks/{index-FQCCBbuC.js.map → index-751ZLh3z.js.map} +1 -1
- package/lib/_chunks/{index-VNSHvpZr.js → index-HcF369ru.js} +2 -2
- package/lib/_chunks/{index-VNSHvpZr.js.map → index-HcF369ru.js.map} +1 -1
- package/lib/_chunks/{index-Xs2xnLUV.js → index-MAAxgUnl.js} +6 -6
- package/lib/_chunks/{index-Xs2xnLUV.js.map → index-MAAxgUnl.js.map} +1 -1
- package/lib/_chunks/{index-AaK2CidU.js → index-NweJPfGb.js} +2 -2
- package/lib/_chunks/{index-AaK2CidU.js.map → index-NweJPfGb.js.map} +1 -1
- package/lib/_chunks/{index-R7R6AyHF.js → index-zobOqko7.js} +2 -2
- package/lib/_chunks/{index-R7R6AyHF.js.map → index-zobOqko7.js.map} +1 -1
- package/lib/_chunks/{listApisAction-6lGkFZrU.js → listApisAction-IvKV4iAd.js} +2 -2
- package/lib/_chunks/{listApisAction-6lGkFZrU.js.map → listApisAction-IvKV4iAd.js.map} +1 -1
- package/lib/_chunks/{listApisAction-CqCkBz-F.js → listApisAction-oca2uykY.js} +2 -2
- package/lib/_chunks/{listApisAction-CqCkBz-F.js.map → listApisAction-oca2uykY.js.map} +1 -1
- package/lib/_chunks/pane-9HEeITpx.js +5 -0
- package/lib/_chunks/pane-9HEeITpx.js.map +1 -0
- package/lib/_chunks/pane-QyVrOLqS.js +2 -0
- package/lib/_chunks/pane-QyVrOLqS.js.map +1 -0
- package/lib/_chunks/pane-TXXUUvdc.js +5 -0
- package/lib/_chunks/pane-TXXUUvdc.js.map +1 -0
- package/lib/_chunks/pane-cQxQtBcL.js +2 -0
- package/lib/_chunks/pane-cQxQtBcL.js.map +1 -0
- package/lib/_chunks/{structure-qJLnDJXq.js → structure-iqIDIH7-.js} +3 -3
- package/lib/_chunks/structure-iqIDIH7-.js.map +1 -0
- package/lib/_chunks/{structure-588eAwLd.js → structure-o_wMXC_G.js} +3 -3
- package/lib/_chunks/structure-o_wMXC_G.js.map +1 -0
- package/lib/_chunks/validateAction-4Jl_y_iB.js +154 -0
- package/lib/_chunks/validateAction-4Jl_y_iB.js.map +1 -0
- package/lib/_chunks/{validateAction-GUvMkXiN.js → validateAction-6q8Sqwaz.js} +25 -73
- package/lib/_chunks/validateAction-6q8Sqwaz.js.map +1 -0
- package/lib/_chunks/validateAction-Bz67ApRP.js +143 -0
- package/lib/_chunks/validateAction-Bz67ApRP.js.map +1 -0
- package/lib/_chunks/{validateAction-NIrqtyYJ.js → validateAction-shi462sq.js} +27 -75
- package/lib/_chunks/validateAction-shi462sq.js.map +1 -0
- package/lib/_internal/cli/threads/getGraphQLAPIs.js +2 -2
- package/lib/_internal/cli/threads/getGraphQLAPIs.js.map +1 -1
- package/lib/_internal/cli/threads/validateDocuments.js +5 -3
- package/lib/_internal/cli/threads/validateDocuments.js.map +1 -1
- package/lib/_internal/cli/threads/validateSchema.js +55 -0
- package/lib/_internal/cli/threads/validateSchema.js.map +1 -0
- package/lib/_internal.esm.js +1 -1
- package/lib/_internal.js +1 -1
- package/lib/_internalBrowser.esm.js +1 -1
- package/lib/_internalBrowser.js +1 -1
- package/lib/desk.esm.js +1 -1
- package/lib/desk.js +1 -1
- package/lib/exports/index.d.ts +25 -0
- package/lib/index.cjs.mjs +1 -0
- package/lib/index.esm.js +2 -2
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/lib/structure.esm.js +1 -1
- package/lib/structure.js +1 -1
- package/package.json +15 -15
- package/src/_internal/cli/actions/schema/formatSchemaValidation.ts +96 -0
- package/src/_internal/cli/actions/schema/validateAction.ts +120 -0
- package/src/_internal/cli/actions/validation/reporters/prettyReporter/formatDocumentValidation.ts +17 -95
- package/src/_internal/cli/commands/index.ts +2 -0
- package/src/_internal/cli/commands/migration/createMigrationCommand.ts +18 -10
- package/src/_internal/cli/commands/migration/listMigrationsCommand.ts +34 -31
- package/src/_internal/cli/commands/migration/prettyMutationFormatter.ts +214 -0
- package/src/_internal/cli/commands/migration/runMigrationCommand.ts +102 -58
- package/src/_internal/cli/commands/migration/templates/minimalAdvanced.ts +1 -1
- package/src/_internal/cli/commands/migration/templates/minimalSimple.ts +1 -1
- package/src/_internal/cli/commands/migration/templates/renameField.ts +3 -3
- package/src/_internal/cli/commands/migration/templates/renameType.ts +1 -1
- package/src/_internal/cli/commands/migration/templates/stringToPTE.ts +1 -1
- package/src/_internal/cli/commands/migration/utils/mutationFormatter.ts +1 -1
- package/src/_internal/cli/commands/schema/validateSchemaCommand.ts +35 -0
- package/src/_internal/cli/threads/getGraphQLAPIs.ts +2 -2
- package/src/_internal/cli/threads/validateDocuments.ts +6 -3
- package/src/_internal/cli/threads/validateSchema.ts +73 -0
- package/src/_internal/cli/util/{getStudioConfig.ts → getStudioWorkspaces.ts} +30 -8
- package/src/_internal/cli/util/tree.ts +110 -0
- package/src/core/config/index.ts +1 -0
- package/src/core/config/prepareConfig.ts +2 -5
- package/src/core/config/resolveSchemaTypes.ts +29 -0
- package/src/core/studio/screens/schemaErrors/SchemaProblemGroups.tsx +4 -2
- package/src/structure/comments/src/components/pte/blocks/MentionInlineBlock.tsx +13 -6
- package/lib/_chunks/_internal-2CJ5wSKF.js.map +0 -1
- package/lib/_chunks/_internal-79flWvL8.js.map +0 -1
- package/lib/_chunks/_internalBrowser-QAFz3SKp.js.map +0 -1
- package/lib/_chunks/_internalBrowser-Y0qKZ-GA.js.map +0 -1
- package/lib/_chunks/getStudioConfig-JSkc4GE0.js.map +0 -1
- package/lib/_chunks/pane-QmJb9ZTN.js +0 -2
- package/lib/_chunks/pane-QmJb9ZTN.js.map +0 -1
- package/lib/_chunks/pane-SK7FWNTJ.js +0 -2
- package/lib/_chunks/pane-SK7FWNTJ.js.map +0 -1
- package/lib/_chunks/pane-y4hpcKe1.js +0 -5
- package/lib/_chunks/pane-y4hpcKe1.js.map +0 -1
- package/lib/_chunks/pane-yQXBQyyI.js +0 -5
- package/lib/_chunks/pane-yQXBQyyI.js.map +0 -1
- package/lib/_chunks/structure-588eAwLd.js.map +0 -1
- package/lib/_chunks/structure-qJLnDJXq.js.map +0 -1
- package/lib/_chunks/validateAction-GUvMkXiN.js.map +0 -1
- 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.
|
163
|
-
const [first, ...rest] = root.
|
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
|
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
|
-
} =
|
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(
|
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
|
167
|
+
const pretty = async _ref5 => {
|
216
168
|
let {
|
217
169
|
output,
|
218
170
|
worker,
|
219
171
|
flags
|
220
|
-
} =
|
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
|
268
|
+
const ndjson = async _ref6 => {
|
317
269
|
let {
|
318
270
|
output,
|
319
271
|
worker
|
320
|
-
} =
|
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
|
296
|
+
const json = async _ref7 => {
|
345
297
|
let {
|
346
298
|
output,
|
347
299
|
worker
|
348
|
-
} =
|
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,
|
329
|
+
async function validateAction(args, _ref8) {
|
378
330
|
let {
|
379
331
|
apiClient,
|
380
332
|
workDir,
|
381
333
|
output,
|
382
334
|
prompt
|
383
|
-
} =
|
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-
|
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
|
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
|
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":";;;;;;;;;;;;;;;;;;AAAA,IAAAA,EAAA;AASA,IAAIC,cAAA,CAAAA,YAAA,IAAgB,CAACC,cAAAA,CAAAA,UAAY,EAAA;EACzB,MAAA,IAAIC,MAAM,4CAA4C,CAAA;AAC9D;AAEAC,oBAAA,CAAqBF,cAAU,CAAAA,UAAA,CAAA;AAE/B,eAAeE,qBAAqBC,MAAoC,EAAA;EACtE,MAAM;IAACC,SAAA;IAAWC,aAAe;IAAAC;EAAA,CAAW,GAAAC,cAAAA,CAAAA,UAAA;EAC5C,MAAMC,WAAW,MAAMC,kBAAA,CAAmB;IAACL,SAAW;IAAAC,aAAA;IAAeC;GAAQ,CAAA;EAC7EH,MAAA,CAAOO,YAAYF,QAAQ,CAAA;AAC7B;AAEA,eAAeC,kBAAmBA,CAAAE,IAAA,EAMhC;EAAA,IANgC;IAChCP,SAAA;IACAC,aAAA;IACAC;EACF,CAEE,GAAAK,IAAA;EACA,MAAMC,aAAa,MAAMC,eAAA,CAAAA,eAAA,CAAgB;IAACC,QAAA,EAAUR;EAAQ,CAAA,CAAA;EAC5D,MAAMS,aAAaH,UAAW,CAAAI,MAAA,CAC5B,CAACC,KAAA,EAAOC,SAAc,KAAAD,KAAA,GAAQC,UAAUC,gBAAiB,CAAAC,MAAA,EACzD,CAAA,CACF;EACA,MAAMC,cAAcN,UAAa,GAAA,CAAA;EAC3B,MAAAO,cAAA,GAAiBV,WAAWQ,MAAS,GAAA,CAAA;EACrC,MAAAG,gBAAA,GAAmBC,OAAQ,CAAApB,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,SAAA,CAAWqB,OAAO,CAAA;EAE/C,IAAAb,UAAA,CAAWQ,WAAW,CAAG,EAAA;IACrB,MAAA,IAAInB,MAAM,+BAA+B,CAAA;EACjD;EAEA,IAAIc,eAAe,CAAG,EAAA;IACd,MAAA,IAAId,MAAM,8CAA8C,CAAA;EAChE;EAGK,IAAA,CAAAqB,cAAA,IAAkBD,WAAgB,KAAA,CAACE,gBAAkB,EAAA;IACxD,MAAM,IAAItB,KAAM,CAAAyB,gBAAAA,CAAAA,OAAA,CAAA5B,EAAA,KAAAA,EAAA,GAAO6B,UAEyD,CAAA,CAAA,qGAAA,EAAA,0DAAA,CAAA,CAAA,CAAA,EAAhCtB,iBAAiB,eAEhE,CAAA,CAAA;EACH;EAGA,IAAI,CAACkB,gBAAkB,EAAA;IACf,MAAA;MAACK;MAAWC,OAAS;MAAAC;QAAUlB,UAAW,CAAA,CAAC,CAAE,CAAAO,gBAAA,CAAiB,CAAC,CAAA;IAC9D,OAAA,CAAC;MAACY,WAAa,EAAAC,sBAAA,CAAuBF,MAAM,CAAG;MAAAF,SAAA;MAAWC;KAAQ,CAAA;EAC3E;EAGA,MAAMI,OAAU,GAAAC,iBAAA,CAAA,CAAkB9B,SAAW,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,SAAA,CAAAqB,OAAA,KAAW,EAAE,CAAA;EACnD,OAAAU,4BAAA,CAA6BF,SAASrB,UAAU,CAAA;AACzD;AAEA,SAASuB,4BAAAA,CACPF,SACArB,UAC0B,EAAA;EAC1B,MAAMwB,eAAyC,EAAC;EAEhD,KAAA,MAAWC,UAAUJ,OAAS,EAAA;IAC5B,MAAM;MAACf,SAAA,EAAWoB,aAAe;MAAAC,MAAA,EAAQC;KAAc,GAAAH,MAAA;IACvD,IAAI,CAACC,aAAA,IAAiB1B,UAAW,CAAAQ,MAAA,GAAS,CAAG,EAAA;MAC3C,MAAM,IAAInB,KAAA,CACR,yFAAA,CACF;IACF;IAIA,MAAMiB,YACJ,CAACoB,aAAA,IAAiB1B,UAAW,CAAAQ,MAAA,KAAW,IACpCR,UAAW,CAAA,CAAC,CACZ,GAAAA,UAAA,CAAW6B,KAAMC,KAAA,IAAUA,KAAM,CAAAC,IAAA,MAAUL,iBAAiB,SAAU,CAAA,CAAA;IAE5E,IAAI,CAACpB,SAAW,EAAA;MACd,MAAM,IAAIjB,KAAA,CAAM,aAAc,CAAA2C,MAAA,CAAAN,aAAA,IAAiB,WAAS,aAAa,CAAA,CAAA;IACvE;IAIA,MAAMC,SACJ,CAACC,UAAA,IAActB,UAAUC,gBAAiB,CAAAC,MAAA,KAAW,IACjDF,SAAU,CAAAC,gBAAA,CAAiB,CAAC,CAC5B,GAAAD,SAAA,CAAUC,iBAAiBsB,IAAK,CAACI,OAAQA,GAAI,CAAAF,IAAA,MAAUH,cAAc,SAAU,CAAA,CAAA;IAErF,IAAI,CAACD,MAAQ,EAAA;MACX,MAAM,IAAItC,KAAA,CACR,UAAW,CAAA2C,MAAA,CAAAJ,UAAA,IAAc,SAAS,EAAA,4BAAA,CAAA,CAChCI,wBAAiB,SACnB,EAAA,GAAA,CAAA,CACF;IACF;IAEAR,YAAA,CAAaU,IAAK,CAAA;MAChB,GAAGT,MAAA;MACHR,SAASU,MAAO,CAAAV,OAAA;MAChBD,WAAWW,MAAO,CAAAX,SAAA;MAClBG,WAAA,EAAaC,sBAAuB,CAAAO,MAAA,CAAOT,MAAM;IAAA,CAClD,CAAA;EACH;EAEO,OAAAM,YAAA;AACT;AAEA,SAASF,iBAAAA,CACPa,MACA,EACoB;EAAA,IADpBC,UAAA,GAAAC,SAAA,CAAA7B,MAAA,QAAA6B,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAa,eACO;EACpB,IAAI,CAACE,KAAA,CAAMC,OAAQ,CAAAL,MAAM,CAAG,EAAA;IAC1B,MAAM,IAAI9C,KAAA,CAAM,oBAAqB,CAAA2C,MAAA,CAAAI,UAAA,EAAU,+BAA+B,CAAA,CAAA;EAChF;EAEI,IAAAD,MAAA,CAAO3B,WAAW,CAAG,EAAA;IACvB,MAAM,IAAInB,KAAA,CAAM,8BAA+B,CAAA2C,MAAA,CAAAI,UAAA,EAAU,GAAG,CAAA,CAAA;EAC9D;EAEO,OAAAD,MAAA;AACT;AAEA,SAASf,uBAAuBF,MAAuC,EAAA;EACrE,MAAMuB,YAAYvB,MAAO,CAAAwB,SAAA,IAAa;IAACC,KAAA,EAAO;EAAE,CAAA;EAChD,OAAOF,UAAUE,KAAM,CAAAC,GAAA,CAAKC,IAAS,IAAAC,SAAA,CAAUD,IAAI,CAAC,CAAA;AACtD;AAEA,SAASC,UAAUC,KAAqC,EAAA;EACtD,OAAOC,MAAMD,KAAK,CAAA;AACpB;AAEA,SAASC,MAAMD,KAAyB,EAAA;EAClC,IAAAR,KAAA,CAAMC,OAAQ,CAAAO,KAAK,CAAG,EAAA;IACxB,OAAOA,KAAM,CAAAH,GAAA,CAAKK,IAAA,IAASD,KAAM,CAAAC,IAAI,CAAC,CAAA,CAAEC,MAAO,CAACD,IAAS,IAAA,OAAOA,SAAS,WAAW,CAAA;EACtF;EAEI,IAAAE,gBAAA,CAAiBJ,KAAK,CAAG,EAAA;IACpB,OAAAK,MAAA,CAAOC,IAAK,CAAAN,KAAK,CAAE,CAAA3C,MAAA,CACxB,CAACkD,UAAUC,GAAQ,KAAA;MACjBD,QAAA,CAASC,GAAG,CAAA,GAAIP,KAAM,CAAAD,KAAA,CAAMQ,GAAG,CAAC,CAAA;MACzB,OAAAD,QAAA;IACT,CAAA,EACA,CAAC,CAAA,CACH;EACF;EAEO,OAAAE,WAAA,CAAYT,KAAK,CAAA,GAAIA,KAAQ,GAAA,KAAA,CAAA;AACtC;AAEA,SAASI,iBAAiBJ,KAAkD,EAAA;EAC1E,OAAOU,sBAAAA,CAAAA,QAAcV,KAAK,CAAA;AAC5B;AAEA,SAASS,YAAYT,KAAyB,EAAA;EAC5C,MAAMF,OAAO,OAAOE,KAAA;EACpB,IAAIF,IAAS,KAAA,SAAA,IAAaA,IAAS,KAAA,QAAA,IAAYA,SAAS,QAAU,EAAA;IACzD,OAAA,IAAA;EACT;EAEA,IAAIA,SAAS,QAAU,EAAA;IACd,OAAA,KAAA;EACT;EAEA,OAAON,MAAMC,OAAQ,CAAAO,KAAK,KAAKA,KAAU,KAAA,IAAA,IAAQI,iBAAiBJ,KAAK,CAAA;AACzE"}
|
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
|
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 =>
|
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
|
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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"}
|