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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/lib/_chunks/{_internal-2CJ5wSKF.js → _internal-6Pl2wJGj.js} +422 -201
  2. package/lib/_chunks/_internal-6Pl2wJGj.js.map +1 -0
  3. package/lib/_chunks/{_internal-79flWvL8.js → _internal-yQwMw2ht.js} +419 -203
  4. package/lib/_chunks/_internal-yQwMw2ht.js.map +1 -0
  5. package/lib/_chunks/{_internalBrowser-QAFz3SKp.js → _internalBrowser-HWvRXvlU.js} +22 -22
  6. package/lib/_chunks/_internalBrowser-HWvRXvlU.js.map +1 -0
  7. package/lib/_chunks/{_internalBrowser-Y0qKZ-GA.js → _internalBrowser-TWIhitgI.js} +22 -22
  8. package/lib/_chunks/_internalBrowser-TWIhitgI.js.map +1 -0
  9. package/lib/_chunks/{deployApiAction-SHteit1G.js → deployApiAction-TZcCtXan.js} +2 -2
  10. package/lib/_chunks/{deployApiAction-SHteit1G.js.map → deployApiAction-TZcCtXan.js.map} +1 -1
  11. package/lib/_chunks/{deployApiAction-bRyJpGOS.js → deployApiAction-rVL67VYW.js} +2 -2
  12. package/lib/_chunks/{deployApiAction-bRyJpGOS.js.map → deployApiAction-rVL67VYW.js.map} +1 -1
  13. package/lib/_chunks/{getStudioConfig-JSkc4GE0.js → getStudioWorkspaces-HX9o9-hl.js} +20 -4
  14. package/lib/_chunks/getStudioWorkspaces-HX9o9-hl.js.map +1 -0
  15. package/lib/_chunks/{index-EO9iRnDS.js → index-2kSxso3r.js} +2 -2
  16. package/lib/_chunks/{index-EO9iRnDS.js.map → index-2kSxso3r.js.map} +1 -1
  17. package/lib/_chunks/{index-FQCCBbuC.js → index-751ZLh3z.js} +6 -6
  18. package/lib/_chunks/{index-FQCCBbuC.js.map → index-751ZLh3z.js.map} +1 -1
  19. package/lib/_chunks/{index-VNSHvpZr.js → index-HcF369ru.js} +2 -2
  20. package/lib/_chunks/{index-VNSHvpZr.js.map → index-HcF369ru.js.map} +1 -1
  21. package/lib/_chunks/{index-Xs2xnLUV.js → index-MAAxgUnl.js} +6 -6
  22. package/lib/_chunks/{index-Xs2xnLUV.js.map → index-MAAxgUnl.js.map} +1 -1
  23. package/lib/_chunks/{index-AaK2CidU.js → index-NweJPfGb.js} +2 -2
  24. package/lib/_chunks/{index-AaK2CidU.js.map → index-NweJPfGb.js.map} +1 -1
  25. package/lib/_chunks/{index-R7R6AyHF.js → index-zobOqko7.js} +2 -2
  26. package/lib/_chunks/{index-R7R6AyHF.js.map → index-zobOqko7.js.map} +1 -1
  27. package/lib/_chunks/{listApisAction-6lGkFZrU.js → listApisAction-IvKV4iAd.js} +2 -2
  28. package/lib/_chunks/{listApisAction-6lGkFZrU.js.map → listApisAction-IvKV4iAd.js.map} +1 -1
  29. package/lib/_chunks/{listApisAction-CqCkBz-F.js → listApisAction-oca2uykY.js} +2 -2
  30. package/lib/_chunks/{listApisAction-CqCkBz-F.js.map → listApisAction-oca2uykY.js.map} +1 -1
  31. package/lib/_chunks/pane-9HEeITpx.js +5 -0
  32. package/lib/_chunks/pane-9HEeITpx.js.map +1 -0
  33. package/lib/_chunks/pane-QyVrOLqS.js +2 -0
  34. package/lib/_chunks/pane-QyVrOLqS.js.map +1 -0
  35. package/lib/_chunks/pane-TXXUUvdc.js +5 -0
  36. package/lib/_chunks/pane-TXXUUvdc.js.map +1 -0
  37. package/lib/_chunks/pane-cQxQtBcL.js +2 -0
  38. package/lib/_chunks/pane-cQxQtBcL.js.map +1 -0
  39. package/lib/_chunks/{structure-qJLnDJXq.js → structure-iqIDIH7-.js} +3 -3
  40. package/lib/_chunks/structure-iqIDIH7-.js.map +1 -0
  41. package/lib/_chunks/{structure-588eAwLd.js → structure-o_wMXC_G.js} +3 -3
  42. package/lib/_chunks/structure-o_wMXC_G.js.map +1 -0
  43. package/lib/_chunks/validateAction-4Jl_y_iB.js +154 -0
  44. package/lib/_chunks/validateAction-4Jl_y_iB.js.map +1 -0
  45. package/lib/_chunks/{validateAction-GUvMkXiN.js → validateAction-6q8Sqwaz.js} +25 -73
  46. package/lib/_chunks/validateAction-6q8Sqwaz.js.map +1 -0
  47. package/lib/_chunks/validateAction-Bz67ApRP.js +143 -0
  48. package/lib/_chunks/validateAction-Bz67ApRP.js.map +1 -0
  49. package/lib/_chunks/{validateAction-NIrqtyYJ.js → validateAction-shi462sq.js} +27 -75
  50. package/lib/_chunks/validateAction-shi462sq.js.map +1 -0
  51. package/lib/_internal/cli/threads/getGraphQLAPIs.js +2 -2
  52. package/lib/_internal/cli/threads/getGraphQLAPIs.js.map +1 -1
  53. package/lib/_internal/cli/threads/validateDocuments.js +5 -3
  54. package/lib/_internal/cli/threads/validateDocuments.js.map +1 -1
  55. package/lib/_internal/cli/threads/validateSchema.js +55 -0
  56. package/lib/_internal/cli/threads/validateSchema.js.map +1 -0
  57. package/lib/_internal.esm.js +1 -1
  58. package/lib/_internal.js +1 -1
  59. package/lib/_internalBrowser.esm.js +1 -1
  60. package/lib/_internalBrowser.js +1 -1
  61. package/lib/desk.esm.js +1 -1
  62. package/lib/desk.js +1 -1
  63. package/lib/exports/index.d.ts +25 -0
  64. package/lib/index.cjs.mjs +1 -0
  65. package/lib/index.esm.js +2 -2
  66. package/lib/index.js +2 -1
  67. package/lib/index.js.map +1 -1
  68. package/lib/structure.esm.js +1 -1
  69. package/lib/structure.js +1 -1
  70. package/package.json +15 -15
  71. package/src/_internal/cli/actions/schema/formatSchemaValidation.ts +96 -0
  72. package/src/_internal/cli/actions/schema/validateAction.ts +120 -0
  73. package/src/_internal/cli/actions/validation/reporters/prettyReporter/formatDocumentValidation.ts +17 -95
  74. package/src/_internal/cli/commands/index.ts +2 -0
  75. package/src/_internal/cli/commands/migration/createMigrationCommand.ts +18 -10
  76. package/src/_internal/cli/commands/migration/listMigrationsCommand.ts +34 -31
  77. package/src/_internal/cli/commands/migration/prettyMutationFormatter.ts +214 -0
  78. package/src/_internal/cli/commands/migration/runMigrationCommand.ts +102 -58
  79. package/src/_internal/cli/commands/migration/templates/minimalAdvanced.ts +1 -1
  80. package/src/_internal/cli/commands/migration/templates/minimalSimple.ts +1 -1
  81. package/src/_internal/cli/commands/migration/templates/renameField.ts +3 -3
  82. package/src/_internal/cli/commands/migration/templates/renameType.ts +1 -1
  83. package/src/_internal/cli/commands/migration/templates/stringToPTE.ts +1 -1
  84. package/src/_internal/cli/commands/migration/utils/mutationFormatter.ts +1 -1
  85. package/src/_internal/cli/commands/schema/validateSchemaCommand.ts +35 -0
  86. package/src/_internal/cli/threads/getGraphQLAPIs.ts +2 -2
  87. package/src/_internal/cli/threads/validateDocuments.ts +6 -3
  88. package/src/_internal/cli/threads/validateSchema.ts +73 -0
  89. package/src/_internal/cli/util/{getStudioConfig.ts → getStudioWorkspaces.ts} +30 -8
  90. package/src/_internal/cli/util/tree.ts +110 -0
  91. package/src/core/config/index.ts +1 -0
  92. package/src/core/config/prepareConfig.ts +2 -5
  93. package/src/core/config/resolveSchemaTypes.ts +29 -0
  94. package/src/core/studio/screens/schemaErrors/SchemaProblemGroups.tsx +4 -2
  95. package/src/structure/comments/src/components/pte/blocks/MentionInlineBlock.tsx +13 -6
  96. package/lib/_chunks/_internal-2CJ5wSKF.js.map +0 -1
  97. package/lib/_chunks/_internal-79flWvL8.js.map +0 -1
  98. package/lib/_chunks/_internalBrowser-QAFz3SKp.js.map +0 -1
  99. package/lib/_chunks/_internalBrowser-Y0qKZ-GA.js.map +0 -1
  100. package/lib/_chunks/getStudioConfig-JSkc4GE0.js.map +0 -1
  101. package/lib/_chunks/pane-QmJb9ZTN.js +0 -2
  102. package/lib/_chunks/pane-QmJb9ZTN.js.map +0 -1
  103. package/lib/_chunks/pane-SK7FWNTJ.js +0 -2
  104. package/lib/_chunks/pane-SK7FWNTJ.js.map +0 -1
  105. package/lib/_chunks/pane-y4hpcKe1.js +0 -5
  106. package/lib/_chunks/pane-y4hpcKe1.js.map +0 -1
  107. package/lib/_chunks/pane-yQXBQyyI.js +0 -5
  108. package/lib/_chunks/pane-yQXBQyyI.js.map +0 -1
  109. package/lib/_chunks/structure-588eAwLd.js.map +0 -1
  110. package/lib/_chunks/structure-qJLnDJXq.js.map +0 -1
  111. package/lib/_chunks/validateAction-GUvMkXiN.js.map +0 -1
  112. package/lib/_chunks/validateAction-NIrqtyYJ.js.map +0 -1
@@ -0,0 +1,154 @@
1
+ 'use strict';
2
+
3
+ var path = require('path');
4
+ var worker_threads = require('worker_threads');
5
+ var readPkgUp = require('read-pkg-up');
6
+ var logSymbols = require('log-symbols');
7
+ var tty = require('tty');
8
+ var chalk = require('chalk');
9
+ function _interopDefaultCompat(e) {
10
+ return e && typeof e === 'object' && 'default' in e ? e : {
11
+ default: e
12
+ };
13
+ }
14
+ var path__default = /*#__PURE__*/_interopDefaultCompat(path);
15
+ var readPkgUp__default = /*#__PURE__*/_interopDefaultCompat(readPkgUp);
16
+ var logSymbols__default = /*#__PURE__*/_interopDefaultCompat(logSymbols);
17
+ var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
18
+ const isTty = tty.isatty(1);
19
+ const headers = {
20
+ error: isTty ? chalk__default.default.bold(chalk__default.default.bgRed(chalk__default.default.black(" ERROR "))) : chalk__default.default.red("[ERROR]"),
21
+ warning: isTty ? chalk__default.default.bold(chalk__default.default.bgYellow(chalk__default.default.black(" WARN "))) : chalk__default.default.yellow("[WARN]")
22
+ };
23
+ const severityValues = {
24
+ error: 0,
25
+ warning: 1
26
+ };
27
+ function formatPath(pathSegments) {
28
+ const format = function (_ref) {
29
+ let [curr, ...next] = _ref;
30
+ let mode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "object";
31
+ if (!curr) return "";
32
+ if (curr.kind === "property") return format(next, curr.name === "of" ? "array" : "object");
33
+ const name = curr.name ? curr.name : "<anonymous_".concat(curr.type, ">");
34
+ return "".concat(mode === "array" ? "[".concat(name, "]") : ".".concat(name)).concat(format(next));
35
+ };
36
+ return format(pathSegments.slice(1)).substring(1);
37
+ }
38
+ function getAggregatedSeverity(groupOrGroups) {
39
+ const groups = Array.isArray(groupOrGroups) ? groupOrGroups : [groupOrGroups];
40
+ return groups.flatMap(group => group.problems.map(problem => problem.severity)).find(severity => severity === "error") ? "error" : "warning";
41
+ }
42
+ function formatSchemaValidation(validation) {
43
+ let unnamedTopLevelTypeCount = 0;
44
+ const validationByType = Object.entries(validation.reduce((acc, next) => {
45
+ var _a;
46
+ const [firstSegment] = next.path;
47
+ if (!firstSegment) return acc;
48
+ if (firstSegment.kind !== "type") return acc;
49
+ const topLevelType = firstSegment.name || "<unnamed_".concat(firstSegment.type, "_type_").concat(unnamedTopLevelTypeCount++, ">");
50
+ const problems = (_a = acc[topLevelType]) != null ? _a : [];
51
+ problems.push(next);
52
+ acc[topLevelType] = problems;
53
+ return acc;
54
+ }, {}));
55
+ const formatted = validationByType.sort((a, b) => {
56
+ const [aType, aGroups] = a;
57
+ const [bType, bGroups] = b;
58
+ const aValue = severityValues[getAggregatedSeverity(aGroups)];
59
+ const bValue = severityValues[getAggregatedSeverity(bGroups)];
60
+ if (aValue === bValue) return aType.localeCompare(bType, "en-US");
61
+ return aValue - bValue;
62
+ }).map(_ref2 => {
63
+ let [topLevelType, groups] = _ref2;
64
+ const formattedTopLevelType = isTty ? chalk__default.default.bgWhite(chalk__default.default.black(" ".concat(topLevelType, " "))) : "[".concat(topLevelType, "]");
65
+ const header = "".concat(headers[getAggregatedSeverity(groups)], " ").concat(formattedTopLevelType);
66
+ const body = groups.sort((a, b) => severityValues[getAggregatedSeverity(a)] - severityValues[getAggregatedSeverity(b)]).map(group => {
67
+ const formattedPath = " ".concat(chalk__default.default.bold(formatPath(group.path) || "(root)"));
68
+ const formattedMessages = group.problems.sort((a, b) => severityValues[a.severity] - severityValues[b.severity]).map(_ref3 => {
69
+ let {
70
+ severity,
71
+ message
72
+ } = _ref3;
73
+ return " ".concat(logSymbols__default.default[severity], " ").concat(message);
74
+ }).join("\n");
75
+ return "".concat(formattedPath, "\n").concat(formattedMessages);
76
+ }).join("\n");
77
+ return "".concat(header, "\n").concat(body);
78
+ }).join("\n\n");
79
+ return formatted;
80
+ }
81
+ async function validateAction(args, _ref4) {
82
+ let {
83
+ workDir,
84
+ output
85
+ } = _ref4;
86
+ var _a;
87
+ const flags = args.extOptions;
88
+ const rootPkgPath = (_a = readPkgUp__default.default.sync({
89
+ cwd: __dirname
90
+ })) == null ? void 0 : _a.path;
91
+ if (!rootPkgPath) {
92
+ throw new Error("Could not find root directory for `sanity` package");
93
+ }
94
+ const workerPath = path__default.default.join(path__default.default.dirname(rootPkgPath), "lib", "_internal", "cli", "threads", "validateSchema.js");
95
+ const level = flags.level || "warning";
96
+ if (level !== "error" && level !== "warning") {
97
+ throw new Error("Invalid level. Available levels are 'error' and 'warning'.");
98
+ }
99
+ const format = flags.format || "pretty";
100
+ if (!["pretty", "ndjson", "json"].includes(format)) {
101
+ throw new Error("Did not recognize format '".concat(flags.format, "'. Available formats are 'pretty', 'ndjson', and 'json'."));
102
+ }
103
+ let spinner;
104
+ if (format === "pretty") {
105
+ spinner = output.spinner(flags.workspace ? "Validating schema from workspace '".concat(flags.workspace, "'\u2026") : "Validating schema\u2026").start();
106
+ }
107
+ const worker = new worker_threads.Worker(workerPath, {
108
+ workerData: {
109
+ workDir,
110
+ level,
111
+ workspace: flags.workspace
112
+ },
113
+ // eslint-disable-next-line no-process-env
114
+ env: process.env
115
+ });
116
+ const {
117
+ validation
118
+ } = await new Promise((resolve, reject) => {
119
+ worker.addListener("message", resolve);
120
+ worker.addListener("error", reject);
121
+ });
122
+ const problems = validation.flatMap(group => group.problems);
123
+ const errorCount = problems.filter(problem => problem.severity === "error").length;
124
+ const warningCount = problems.filter(problem => problem.severity === "warning").length;
125
+ const overallSeverity = getAggregatedSeverity(validation);
126
+ switch (format) {
127
+ case "ndjson":
128
+ {
129
+ for (const group of validation) {
130
+ output.print(JSON.stringify(group));
131
+ }
132
+ break;
133
+ }
134
+ case "json":
135
+ {
136
+ output.print(JSON.stringify(validation));
137
+ break;
138
+ }
139
+ default:
140
+ {
141
+ spinner == null ? void 0 : spinner.succeed("Validated schema");
142
+ output.print("\nValidation results:");
143
+ output.print("".concat(logSymbols__default.default.error, " Errors: ").concat(errorCount.toLocaleString("en-US"), " error").concat(errorCount === 1 ? "" : "s"));
144
+ if (level !== "error") {
145
+ output.print("".concat(logSymbols__default.default.warning, " Warnings: ").concat(warningCount.toLocaleString("en-US"), " warning").concat(warningCount === 1 ? "" : "s"));
146
+ }
147
+ output.print();
148
+ output.print(formatSchemaValidation(validation));
149
+ }
150
+ }
151
+ process.exitCode = overallSeverity === "error" ? 1 : 0;
152
+ }
153
+ exports.default = validateAction;
154
+ //# sourceMappingURL=validateAction-4Jl_y_iB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateAction-4Jl_y_iB.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","default","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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"}
@@ -4,8 +4,8 @@ import logSymbols from 'log-symbols';
4
4
  import chalk from 'chalk';
5
5
  import { Worker } from 'worker_threads';
6
6
  import readPkgUp from 'read-pkg-up';
7
+ import { convertToTree, maxKeyLength, formatTree } from './_internal-yQwMw2ht.js';
7
8
  import { isatty } from 'tty';
8
- import { pathToString } from 'sanity';
9
9
  class MessageQueue {
10
10
  constructor() {
11
11
  this.resolver = null;
@@ -221,44 +221,10 @@ const levelHeaders = {
221
221
  info: isTty ? chalk.bold(chalk.cyan(chalk.black(" INFO "))) : chalk.cyan("[INFO]")
222
222
  };
223
223
  const link = (text, url) => isTty ? "\x1B]8;;".concat(url, "\x07").concat(text, "\x1B]8;;\x07") : chalk.underline(text);
224
- const maxKeyLength = function () {
225
- let children = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
226
- let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
227
- return Object.entries(children).map(_ref3 => {
228
- let [key, child] = _ref3;
229
- return Math.max(key.length + depth * 2, maxKeyLength(child.children, depth + 1));
230
- }).reduce((max, next) => next > max ? next : max, 0);
231
- };
232
224
  const compareLevels = (a, b) => levelValues[a.level] - levelValues[b.level];
233
- const formatTree = function () {
234
- let node = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
235
- let paddingLength = arguments.length > 1 ? arguments[1] : undefined;
236
- let indent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
237
- const entries = Object.entries(node);
238
- return entries.map((_ref4, index) => {
239
- let [key, child] = _ref4;
240
- var _a;
241
- const isLast = index === entries.length - 1;
242
- const nextIndent = "".concat(indent).concat(isLast ? " " : "\u2502 ");
243
- const nested = formatTree(child.children, paddingLength, nextIndent);
244
- if (!((_a = child.markers) == null ? void 0 : _a.length)) {
245
- const current2 = "".concat(indent).concat(isLast ? "\u2514" : "\u251C", "\u2500 ").concat(key);
246
- return [current2, nested].filter(Boolean).join("\n");
247
- }
248
- const [first, ...rest] = child.markers.slice().sort(compareLevels);
249
- const firstPadding = ".".repeat(paddingLength - indent.length - key.length);
250
- const elbow = isLast ? "\u2514" : "\u251C";
251
- const firstBullet = logSymbols[first.level];
252
- const subsequentPadding = " ".repeat(paddingLength - indent.length + 2);
253
- const firstMessage = "".concat(indent).concat(elbow, "\u2500 ").concat(key, " ").concat(firstPadding, " ").concat(firstBullet, " ").concat(first.message);
254
- const subsequentMessages = rest.map(marker => "".concat(nextIndent).concat(subsequentPadding, " ").concat(logSymbols[marker.level], " ").concat(marker.message)).join("\n");
255
- const current = [firstMessage, subsequentMessages].filter(Boolean).join("\n");
256
- return [current, nested].filter(Boolean).join("\n");
257
- }).join("\n");
258
- };
259
225
  const formatRootErrors = (root, hasChildren, paddingLength) => {
260
- if (!root.markers) return "";
261
- const [first, ...rest] = root.markers.slice().sort(compareLevels);
226
+ if (!root.nodes) return "";
227
+ const [first, ...rest] = root.nodes.slice().sort(compareLevels);
262
228
  if (!first) return "";
263
229
  const firstElbow = hasChildren ? "\u2502 " : "\u2514\u2500";
264
230
  const firstPadding = ".".repeat(paddingLength - 6);
@@ -268,31 +234,7 @@ const formatRootErrors = (root, hasChildren, paddingLength) => {
268
234
  const restOfLines = rest.map(marker => "".concat(subsequentElbow).concat(subsequentPadding, " ").concat(logSymbols[marker.level], " ").concat(marker.message)).join("\n");
269
235
  return [firstLine, restOfLines].filter(Boolean).join("\n");
270
236
  };
271
- function convertToTree(markers) {
272
- const root = {};
273
- function addMarker(marker) {
274
- let node = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : root;
275
- if (!marker.path.length) {
276
- if (!node.markers) node.markers = [];
277
- node.markers.push({
278
- level: marker.level,
279
- message: marker.message
280
- });
281
- return;
282
- }
283
- const [current, ...rest] = marker.path;
284
- const key = pathToString([current]);
285
- if (!node.children) node.children = {};
286
- if (!(key in node.children)) node.children[key] = {};
287
- addMarker({
288
- ...marker,
289
- path: rest
290
- }, node.children[key]);
291
- }
292
- for (const marker of markers) addMarker(marker);
293
- return root;
294
- }
295
- function formatDocumentValidation(_ref5) {
237
+ function formatDocumentValidation(_ref3) {
296
238
  let {
297
239
  basePath,
298
240
  documentId,
@@ -300,22 +242,32 @@ function formatDocumentValidation(_ref5) {
300
242
  level,
301
243
  studioHost,
302
244
  markers
303
- } = _ref5;
245
+ } = _ref3;
304
246
  const tree = convertToTree(markers);
305
247
  const editLink = studioHost && "".concat(studioHost).concat(basePath, "/intent/edit/id=").concat(encodeURIComponent(documentId), ";type=").concat(encodeURIComponent(documentType));
306
248
  const documentTypeHeader = isTty ? chalk.bgWhite(chalk.black(" ".concat(documentType, " "))) : "[".concat(documentType, "]");
307
249
  const header = "".concat(levelHeaders[level], " ").concat(documentTypeHeader, " ").concat(editLink ? link(documentId, editLink) : chalk.underline(documentId));
308
250
  const paddingLength = Math.max(maxKeyLength(tree.children) + 2, 30);
309
- const childErrors = formatTree(tree.children, paddingLength);
251
+ const childErrors = formatTree({
252
+ node: tree.children,
253
+ paddingLength,
254
+ getNodes: _ref4 => {
255
+ let {
256
+ nodes
257
+ } = _ref4;
258
+ return (nodes != null ? nodes : []).slice().sort(compareLevels);
259
+ },
260
+ getMessage: marker => [logSymbols[marker.level], marker.message].join(" ")
261
+ });
310
262
  const rootErrors = formatRootErrors(tree, childErrors.length > 0, paddingLength);
311
263
  return [header, rootErrors, childErrors].filter(Boolean).join("\n");
312
264
  }
313
- const pretty = async _ref6 => {
265
+ const pretty = async _ref5 => {
314
266
  let {
315
267
  output,
316
268
  worker,
317
269
  flags
318
- } = _ref6;
270
+ } = _ref5;
319
271
  const workspaceLoadStart = Date.now();
320
272
  const spinner = output.spinner(flags.workspace ? "Loading workspace '".concat(flags.workspace, "'\u2026") : "Loading workspace\u2026").start();
321
273
  const workspace = await worker.event.loadedWorkspace();
@@ -411,11 +363,11 @@ const pretty = async _ref6 => {
411
363
  await worker.dispose();
412
364
  return overallLevel;
413
365
  };
414
- const ndjson = async _ref7 => {
366
+ const ndjson = async _ref6 => {
415
367
  let {
416
368
  output,
417
369
  worker
418
- } = _ref7;
370
+ } = _ref6;
419
371
  let overallLevel = "info";
420
372
  for await (const {
421
373
  documentId,
@@ -439,11 +391,11 @@ const ndjson = async _ref7 => {
439
391
  await worker.dispose();
440
392
  return overallLevel;
441
393
  };
442
- const json = async _ref8 => {
394
+ const json = async _ref7 => {
443
395
  let {
444
396
  output,
445
397
  worker
446
- } = _ref8;
398
+ } = _ref7;
447
399
  let overallLevel = "info";
448
400
  const results = [];
449
401
  for await (const {
@@ -472,13 +424,13 @@ const reporters = {
472
424
  ndjson,
473
425
  json
474
426
  };
475
- async function validateAction(args, _ref9) {
427
+ async function validateAction(args, _ref8) {
476
428
  let {
477
429
  apiClient,
478
430
  workDir,
479
431
  output,
480
432
  prompt
481
- } = _ref9;
433
+ } = _ref8;
482
434
  const flags = args.extOptions;
483
435
  const unattendedMode = Boolean(flags.yes || flags.y);
484
436
  if (!unattendedMode) {
@@ -564,4 +516,4 @@ async function validateAction(args, _ref9) {
564
516
  process.exitCode = overallLevel === "error" ? 1 : 0;
565
517
  }
566
518
  export { validateAction as default };
567
- //# sourceMappingURL=validateAction-GUvMkXiN.js.map
519
+ //# sourceMappingURL=validateAction-6q8Sqwaz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateAction-6q8Sqwaz.js","sources":["../../src/_internal/cli/util/workerChannels.ts","../../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 type {MessagePort, Worker} from 'worker_threads'\n\ntype StreamReporter<TPayload = unknown> = {emit: (payload: TPayload) => void; end: () => void}\ntype EventReporter<TPayload = unknown> = (payload: TPayload) => void\ntype EventReceiver<TPayload = unknown> = () => Promise<TPayload>\ntype StreamReceiver<TPayload = unknown> = () => AsyncIterable<TPayload>\n\ntype EventKeys<TWorkerChannel extends WorkerChannel> = {\n [K in keyof TWorkerChannel]: TWorkerChannel[K] extends WorkerChannelEvent<any> ? K : never\n}[keyof TWorkerChannel]\ntype StreamKeys<TWorkerChannel extends WorkerChannel> = {\n [K in keyof TWorkerChannel]: TWorkerChannel[K] extends WorkerChannelStream<any> ? K : never\n}[keyof TWorkerChannel]\n\ntype EventMessage<TPayload = unknown> = {type: 'event'; name: string; payload: TPayload}\ntype StreamEmissionMessage<TPayload = unknown> = {type: 'emission'; name: string; payload: TPayload}\ntype StreamEndMessage = {type: 'end'; name: string}\ntype WorkerChannelMessage = EventMessage | StreamEmissionMessage | StreamEndMessage\n\n/**\n * Represents the definition of a \"worker channel\" to report progress from the\n * worker to the parent. Worker channels can define named events or streams and\n * the worker will report events and streams while the parent will await them.\n * This allows the control flow of the parent to follow the control flow of the\n * worker 1-to-1.\n */\nexport type WorkerChannel<\n TWorkerChannel extends Record<\n string,\n WorkerChannelEvent<unknown> | WorkerChannelStream<unknown>\n > = Record<string, WorkerChannelEvent<unknown> | WorkerChannelStream<unknown>>,\n> = TWorkerChannel\n\nexport type WorkerChannelEvent<TPayload = void> = {type: 'event'; payload: TPayload}\nexport type WorkerChannelStream<TPayload = void> = {type: 'stream'; payload: TPayload}\n\nexport interface WorkerChannelReporter<TWorkerChannel extends WorkerChannel> {\n event: {\n [K in EventKeys<TWorkerChannel>]: TWorkerChannel[K] extends WorkerChannelEvent<infer TPayload>\n ? EventReporter<TPayload>\n : void\n }\n stream: {\n [K in StreamKeys<TWorkerChannel>]: TWorkerChannel[K] extends WorkerChannelStream<infer TPayload>\n ? StreamReporter<TPayload>\n : void\n }\n}\n\nexport interface WorkerChannelReceiver<TWorkerChannel extends WorkerChannel> {\n event: {\n [K in EventKeys<TWorkerChannel>]: TWorkerChannel[K] extends WorkerChannelEvent<infer TPayload>\n ? EventReceiver<TPayload>\n : void\n }\n stream: {\n [K in StreamKeys<TWorkerChannel>]: TWorkerChannel[K] extends WorkerChannelStream<infer TPayload>\n ? StreamReceiver<TPayload>\n : void\n }\n // TODO: good candidate for [Symbol.asyncDispose] when our tooling better supports it\n dispose: () => Promise<number>\n}\n\n/**\n * A simple queue that has two primary methods: `push(message)` and\n * `await next()`. This message queue is used by the \"receiver\" of the worker\n * channel and this class handles buffering incoming messages if the worker is\n * producing faster than the parent as well as returning a promise if there is\n * no message yet in the queue when the parent awaits `next()`.\n */\nclass MessageQueue<T> {\n resolver: ((result: IteratorResult<T>) => void) | null = null\n queue: T[] = []\n\n push(message: T) {\n if (this.resolver) {\n this.resolver({value: message, done: false})\n this.resolver = null\n } else {\n this.queue.push(message)\n }\n }\n\n next(): Promise<IteratorResult<T>> {\n if (this.queue.length) {\n return Promise.resolve({value: this.queue.shift()!, done: false})\n }\n\n return new Promise((resolve) => (this.resolver = resolve))\n }\n\n end() {\n if (this.resolver) {\n this.resolver({value: undefined, done: true})\n }\n }\n}\n\nfunction isWorkerChannelMessage(message: unknown): message is WorkerChannelMessage {\n if (typeof message !== 'object') return false\n if (!message) return false\n if (!('type' in message)) return false\n if (typeof message.type !== 'string') return false\n const types: string[] = ['event', 'emission', 'end'] satisfies WorkerChannelMessage['type'][]\n return types.includes(message.type)\n}\n\n/**\n * Creates a \"worker channel receiver\" that subscribes to incoming messages\n * from the given worker and returns promises for worker channel events and\n * async iterators for worker channel streams.\n */\nexport function createReceiver<TWorkerChannel extends WorkerChannel>(\n worker: Worker,\n): WorkerChannelReceiver<TWorkerChannel> {\n const _events = new Map<string, MessageQueue<EventMessage>>()\n const _streams = new Map<string, MessageQueue<StreamEmissionMessage>>()\n const errors = new MessageQueue<{type: 'error'; error: unknown}>()\n\n const eventQueue = (name: string) => {\n const queue = _events.get(name) ?? new MessageQueue()\n if (!_events.has(name)) _events.set(name, queue)\n return queue\n }\n\n const streamQueue = (name: string) => {\n const queue = _streams.get(name) ?? new MessageQueue()\n if (!_streams.has(name)) _streams.set(name, queue)\n return queue\n }\n\n const handleMessage = (message: unknown) => {\n if (!isWorkerChannelMessage(message)) return\n if (message.type === 'event') eventQueue(message.name).push(message)\n if (message.type === 'emission') streamQueue(message.name).push(message)\n if (message.type === 'end') streamQueue(message.name).end()\n }\n\n const handleError = (error: unknown) => {\n errors.push({type: 'error', error})\n }\n\n worker.addListener('message', handleMessage)\n worker.addListener('error', handleError)\n\n return {\n event: new Proxy({} as WorkerChannelReceiver<TWorkerChannel>['event'], {\n get: (target, name) => {\n if (typeof name !== 'string') return target[name as keyof typeof target]\n\n const eventReceiver: EventReceiver = async () => {\n const {value} = await Promise.race([eventQueue(name).next(), errors.next()])\n if (value.type === 'error') throw value.error\n return value.payload\n }\n\n return eventReceiver\n },\n }),\n stream: new Proxy({} as WorkerChannelReceiver<TWorkerChannel>['stream'], {\n get: (target, prop) => {\n if (typeof prop !== 'string') return target[prop as keyof typeof target]\n const name = prop // alias for better typescript narrowing\n\n async function* streamReceiver() {\n while (true) {\n const {value, done} = await Promise.race([streamQueue(name).next(), errors.next()])\n if (done) return\n if (value.type === 'error') throw value.error\n yield value.payload\n }\n }\n\n return streamReceiver satisfies StreamReceiver\n },\n }),\n dispose: () => {\n worker.removeListener('message', handleMessage)\n worker.removeListener('error', handleError)\n return worker.terminate()\n },\n }\n}\n\n/**\n * Creates a \"worker channel reporter\" that sends messages to the given\n * `parentPort` to be received by a worker channel receiver.\n */\nexport function createReporter<TWorkerChannel extends WorkerChannel>(\n parentPort: MessagePort | null,\n): WorkerChannelReporter<TWorkerChannel> {\n if (!parentPort) {\n throw new Error('parentPart was falsy')\n }\n\n return {\n event: new Proxy({} as WorkerChannelReporter<TWorkerChannel>['event'], {\n get: (target, name) => {\n if (typeof name !== 'string') return target[name as keyof typeof target]\n\n const eventReporter: EventReporter = (payload) => {\n const message: EventMessage = {type: 'event', name, payload}\n parentPort.postMessage(message)\n }\n\n return eventReporter\n },\n }),\n stream: new Proxy({} as WorkerChannelReporter<TWorkerChannel>['stream'], {\n get: (target, name) => {\n if (typeof name !== 'string') return target[name as keyof typeof target]\n\n const streamReporter: StreamReporter = {\n emit: (payload) => {\n const message: StreamEmissionMessage = {type: 'emission', name, payload}\n parentPort.postMessage(message)\n },\n end: () => {\n const message: StreamEndMessage = {type: 'end', name}\n parentPort.postMessage(message)\n },\n }\n\n return streamReporter\n },\n }),\n }\n}\n","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":["MessageQueue","constructor","resolver","queue","push","message","value","done","next","length","Promise","resolve","shift","end","isWorkerChannelMessage","type","types","includes","createReceiver","worker","_events","Map","_streams","errors","eventQueue","name","_a","get","has","set","streamQueue","handleMessage","handleError","error","addListener","event","Proxy","target","eventReceiver","race","payload","stream","prop","streamReceiver","dispose","removeListener","terminate","DEFAULT_MAX_CUSTOM_VALIDATION_CONCURRENCY","defaultReporter","_ref","createValidationGenerator","documentId","documentType","markers","revision","level","validation","result","validateDocuments","options","workspace","clientConfig","configPath","dataset","projectId","workDir","process","cwd","reporter","maxCustomValidationConcurrency","ndjsonFilePath","rootPkgPath","sync","__dirname","path","Error","workerPath","join","dirname","Worker","workerData","JSON","parse","stringify","env","isTty","isatty","levelValues","warning","info","count","amount","subject","concat","toLocaleString","substring","percentageFormatter","Intl","NumberFormat","style","minimumFractionDigits","maximumFractionDigits","percent","format","Math","min","secondFormatter","seconds","startTime","endTime","Date","now","summary","_ref2","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","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","loadedWorkspace","succeed","file","documentCount","loadedDocumentCount","downloadStart","downloadedCount","exportProgress","percentage","totalDocumentsToValidate","exportFinished","referenceIntegrityStart","loadedReferenceIntegrity","validationStart","results","totals","validatedCount","print","localeCompare","overallLevel","ndjson","_ref6","json","_ref7","reporters","validateAction","args","_ref8","apiClient","prompt","extOptions","unattendedMode","yes","y","confirmed","single","default","exitCode","formatter","ListFormat","Object","keys","key","Number","isInteger","requireUser","requireProject","config","useProjectHostname","ignoreBrowserTokenWarning","filePath","stat","fs","promises","isFile"],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ import path from 'path';
2
+ import { Worker } from 'worker_threads';
3
+ import readPkgUp from 'read-pkg-up';
4
+ import logSymbols from 'log-symbols';
5
+ import { isatty } from 'tty';
6
+ import chalk from 'chalk';
7
+ const isTty = isatty(1);
8
+ const headers = {
9
+ error: isTty ? chalk.bold(chalk.bgRed(chalk.black(" ERROR "))) : chalk.red("[ERROR]"),
10
+ warning: isTty ? chalk.bold(chalk.bgYellow(chalk.black(" WARN "))) : chalk.yellow("[WARN]")
11
+ };
12
+ const severityValues = {
13
+ error: 0,
14
+ warning: 1
15
+ };
16
+ function formatPath(pathSegments) {
17
+ const format = function (_ref) {
18
+ let [curr, ...next] = _ref;
19
+ let mode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "object";
20
+ if (!curr) return "";
21
+ if (curr.kind === "property") return format(next, curr.name === "of" ? "array" : "object");
22
+ const name = curr.name ? curr.name : "<anonymous_".concat(curr.type, ">");
23
+ return "".concat(mode === "array" ? "[".concat(name, "]") : ".".concat(name)).concat(format(next));
24
+ };
25
+ return format(pathSegments.slice(1)).substring(1);
26
+ }
27
+ function getAggregatedSeverity(groupOrGroups) {
28
+ const groups = Array.isArray(groupOrGroups) ? groupOrGroups : [groupOrGroups];
29
+ return groups.flatMap(group => group.problems.map(problem => problem.severity)).find(severity => severity === "error") ? "error" : "warning";
30
+ }
31
+ function formatSchemaValidation(validation) {
32
+ let unnamedTopLevelTypeCount = 0;
33
+ const validationByType = Object.entries(validation.reduce((acc, next) => {
34
+ var _a;
35
+ const [firstSegment] = next.path;
36
+ if (!firstSegment) return acc;
37
+ if (firstSegment.kind !== "type") return acc;
38
+ const topLevelType = firstSegment.name || "<unnamed_".concat(firstSegment.type, "_type_").concat(unnamedTopLevelTypeCount++, ">");
39
+ const problems = (_a = acc[topLevelType]) != null ? _a : [];
40
+ problems.push(next);
41
+ acc[topLevelType] = problems;
42
+ return acc;
43
+ }, {}));
44
+ const formatted = validationByType.sort((a, b) => {
45
+ const [aType, aGroups] = a;
46
+ const [bType, bGroups] = b;
47
+ const aValue = severityValues[getAggregatedSeverity(aGroups)];
48
+ const bValue = severityValues[getAggregatedSeverity(bGroups)];
49
+ if (aValue === bValue) return aType.localeCompare(bType, "en-US");
50
+ return aValue - bValue;
51
+ }).map(_ref2 => {
52
+ let [topLevelType, groups] = _ref2;
53
+ const formattedTopLevelType = isTty ? chalk.bgWhite(chalk.black(" ".concat(topLevelType, " "))) : "[".concat(topLevelType, "]");
54
+ const header = "".concat(headers[getAggregatedSeverity(groups)], " ").concat(formattedTopLevelType);
55
+ const body = groups.sort((a, b) => severityValues[getAggregatedSeverity(a)] - severityValues[getAggregatedSeverity(b)]).map(group => {
56
+ const formattedPath = " ".concat(chalk.bold(formatPath(group.path) || "(root)"));
57
+ const formattedMessages = group.problems.sort((a, b) => severityValues[a.severity] - severityValues[b.severity]).map(_ref3 => {
58
+ let {
59
+ severity,
60
+ message
61
+ } = _ref3;
62
+ return " ".concat(logSymbols[severity], " ").concat(message);
63
+ }).join("\n");
64
+ return "".concat(formattedPath, "\n").concat(formattedMessages);
65
+ }).join("\n");
66
+ return "".concat(header, "\n").concat(body);
67
+ }).join("\n\n");
68
+ return formatted;
69
+ }
70
+ async function validateAction(args, _ref4) {
71
+ let {
72
+ workDir,
73
+ output
74
+ } = _ref4;
75
+ var _a;
76
+ const flags = args.extOptions;
77
+ const rootPkgPath = (_a = readPkgUp.sync({
78
+ cwd: __dirname
79
+ })) == null ? void 0 : _a.path;
80
+ if (!rootPkgPath) {
81
+ throw new Error("Could not find root directory for `sanity` package");
82
+ }
83
+ const workerPath = path.join(path.dirname(rootPkgPath), "lib", "_internal", "cli", "threads", "validateSchema.js");
84
+ const level = flags.level || "warning";
85
+ if (level !== "error" && level !== "warning") {
86
+ throw new Error("Invalid level. Available levels are 'error' and 'warning'.");
87
+ }
88
+ const format = flags.format || "pretty";
89
+ if (!["pretty", "ndjson", "json"].includes(format)) {
90
+ throw new Error("Did not recognize format '".concat(flags.format, "'. Available formats are 'pretty', 'ndjson', and 'json'."));
91
+ }
92
+ let spinner;
93
+ if (format === "pretty") {
94
+ spinner = output.spinner(flags.workspace ? "Validating schema from workspace '".concat(flags.workspace, "'\u2026") : "Validating schema\u2026").start();
95
+ }
96
+ const worker = new Worker(workerPath, {
97
+ workerData: {
98
+ workDir,
99
+ level,
100
+ workspace: flags.workspace
101
+ },
102
+ // eslint-disable-next-line no-process-env
103
+ env: process.env
104
+ });
105
+ const {
106
+ validation
107
+ } = await new Promise((resolve, reject) => {
108
+ worker.addListener("message", resolve);
109
+ worker.addListener("error", reject);
110
+ });
111
+ const problems = validation.flatMap(group => group.problems);
112
+ const errorCount = problems.filter(problem => problem.severity === "error").length;
113
+ const warningCount = problems.filter(problem => problem.severity === "warning").length;
114
+ const overallSeverity = getAggregatedSeverity(validation);
115
+ switch (format) {
116
+ case "ndjson":
117
+ {
118
+ for (const group of validation) {
119
+ output.print(JSON.stringify(group));
120
+ }
121
+ break;
122
+ }
123
+ case "json":
124
+ {
125
+ output.print(JSON.stringify(validation));
126
+ break;
127
+ }
128
+ default:
129
+ {
130
+ spinner == null ? void 0 : spinner.succeed("Validated schema");
131
+ output.print("\nValidation results:");
132
+ output.print("".concat(logSymbols.error, " Errors: ").concat(errorCount.toLocaleString("en-US"), " error").concat(errorCount === 1 ? "" : "s"));
133
+ if (level !== "error") {
134
+ output.print("".concat(logSymbols.warning, " Warnings: ").concat(warningCount.toLocaleString("en-US"), " warning").concat(warningCount === 1 ? "" : "s"));
135
+ }
136
+ output.print();
137
+ output.print(formatSchemaValidation(validation));
138
+ }
139
+ }
140
+ process.exitCode = overallSeverity === "error" ? 1 : 0;
141
+ }
142
+ export { validateAction as default };
143
+ //# sourceMappingURL=validateAction-Bz67ApRP.js.map