sanity 3.77.3-server-side-schemas.36 → 3.77.3-server-side-schemas.37
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-cjs/_internal.js +1 -1
- package/lib/_chunks-cjs/_internal.js.map +1 -1
- package/lib/_chunks-cjs/deleteSchemaAction.js +21 -25
- package/lib/_chunks-cjs/deleteSchemaAction.js.map +1 -1
- package/lib/_chunks-cjs/listSchemasAction.js +3 -5
- package/lib/_chunks-cjs/listSchemasAction.js.map +1 -1
- package/lib/_chunks-cjs/schemaApiClient.js +0 -20
- package/lib/_chunks-cjs/schemaApiClient.js.map +1 -1
- package/lib/_chunks-cjs/storeSchemaOutStrings.js +14 -0
- package/lib/_chunks-cjs/storeSchemaOutStrings.js.map +1 -0
- package/lib/_chunks-cjs/version.js +1 -1
- package/lib/_chunks-es/version.mjs +1 -1
- package/lib/_legacy/version.esm.js +1 -1
- package/package.json +10 -10
- package/src/_internal/cli/actions/schema/deleteSchemaAction.ts +43 -48
- package/src/_internal/cli/actions/schema/listSchemasAction.ts +0 -3
- package/src/_internal/cli/actions/schema/utils/schemaStoreValidation.ts +2 -2
- package/src/_internal/cli/actions/schema/utils/storeSchemaOutStrings.ts +4 -0
- package/src/_internal/cli/commands/schema/deleteSchemaCommand.ts +1 -1
@@ -1,12 +1,12 @@
|
|
1
1
|
"use strict";
|
2
|
-
var chalk = require("chalk"), uniq = require("lodash/uniq"), schemaApiClient = require("./schemaApiClient.js");
|
2
|
+
var chalk = require("chalk"), uniq = require("lodash/uniq"), schemaApiClient = require("./schemaApiClient.js"), storeSchemaOutStrings = require("./storeSchemaOutStrings.js");
|
3
3
|
function _interopDefaultCompat(e) {
|
4
4
|
return e && typeof e == "object" && "default" in e ? e : { default: e };
|
5
5
|
}
|
6
6
|
var chalk__default = /* @__PURE__ */ _interopDefaultCompat(chalk), uniq__default = /* @__PURE__ */ _interopDefaultCompat(uniq);
|
7
7
|
class DeleteIdError extends Error {
|
8
|
-
constructor(id,
|
9
|
-
super(options?.cause?.message, options), this.name = "DeleteIdError", this.id = id, this.
|
8
|
+
constructor(id, dataset, options) {
|
9
|
+
super(options?.cause?.message, options), this.name = "DeleteIdError", this.id = id, this.dataset = dataset;
|
10
10
|
}
|
11
11
|
}
|
12
12
|
function deleteSchemasActionForCommand(flags, context) {
|
@@ -43,45 +43,41 @@ async function deleteSchemaAction(flags, context) {
|
|
43
43
|
manifestDir,
|
44
44
|
output,
|
45
45
|
jsonReader
|
46
|
-
}).getManifest()).workspaces.filter((workspace) => !dataset || workspace.dataset === dataset).filter((workspace) => schemaApiClient.filterLogReadProjectIdMismatch(workspace, projectId, output))
|
47
|
-
schemaApiClient.assetIdsMatchesWorkspaces(ids.map((id) => id.schemaId), workspaces);
|
48
|
-
const results = await Promise.allSettled(workspaces.flatMap((workspace) => ids.filter(({
|
49
|
-
workspace: idWorkspace
|
50
|
-
}) => idWorkspace === workspace.name).map(async ({
|
46
|
+
}).getManifest()).workspaces.filter((workspace) => !dataset || workspace.dataset === dataset).filter((workspace) => schemaApiClient.filterLogReadProjectIdMismatch(workspace, projectId, output)), datasets = uniq__default.default(workspaces.map((w) => w.dataset)), results = await Promise.allSettled(datasets.flatMap((targetDataset) => ids.map(async ({
|
51
47
|
schemaId
|
52
48
|
}) => {
|
53
49
|
try {
|
54
50
|
const deletedSchema = await client.withConfig({
|
55
|
-
dataset:
|
51
|
+
dataset: targetDataset
|
56
52
|
}).delete(schemaId);
|
57
53
|
return {
|
58
|
-
|
54
|
+
dataset: targetDataset,
|
59
55
|
schemaId,
|
60
56
|
deleted: deletedSchema.results.length
|
61
57
|
};
|
62
58
|
} catch (err) {
|
63
|
-
throw new DeleteIdError(schemaId,
|
59
|
+
throw new DeleteIdError(schemaId, targetDataset, {
|
64
60
|
cause: err
|
65
61
|
});
|
66
62
|
}
|
67
|
-
}))), deletedIds = results.filter((r) => r.status === "fulfilled").filter((r) => r.value.deleted).map((r) => r.value
|
63
|
+
}))), deletedIds = results.filter((r) => r.status === "fulfilled").filter((r) => r.value.deleted).map((r) => r.value), notFound = uniq__default.default(results.filter((r) => r.status === "fulfilled").filter((r) => !r.value.deleted).filter((r) => !deletedIds.map(({
|
64
|
+
schemaId
|
65
|
+
}) => schemaId).includes(r.value.schemaId)).map((r) => r.value.schemaId)), deleteFailureIds = uniq__default.default(results.filter((r) => r.status === "rejected").map((result) => {
|
68
66
|
const error = result.reason;
|
69
67
|
if (error instanceof DeleteIdError)
|
70
|
-
return output.error(chalk__default.default.red(`Failed to delete schema "${error.id}" in dataset "${error.
|
68
|
+
return output.error(chalk__default.default.red(`Failed to delete schema "${error.id}" in dataset "${error.dataset}":
|
71
69
|
${error.message}`)), verbose && output.error(error), error.id;
|
72
70
|
throw error;
|
73
|
-
}), success = deletedIds.length === ids.length;
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
`));
|
83
|
-
}
|
84
|
-
return success ? "success" : "failure";
|
71
|
+
})), success = deletedIds.length === ids.length;
|
72
|
+
return success ? output.success(`Successfully deleted ${deletedIds.length}/${ids.length} schemas`) : output.error([`Deleted ${deletedIds.length}/${ids.length} schemas.`, deletedIds.length ? `Successfully deleted ids:
|
73
|
+
${deletedIds.map(({
|
74
|
+
schemaId,
|
75
|
+
dataset: targetDataset
|
76
|
+
}) => `- "${schemaId}" (in ${storeSchemaOutStrings.getDatasetsOutString([targetDataset])})`).join(`
|
77
|
+
`)}` : void 0, notFound.length ? `Ids not found in ${storeSchemaOutStrings.getDatasetsOutString(datasets)}:
|
78
|
+
${storeSchemaOutStrings.getStringList(notFound)}` : void 0, ...deleteFailureIds.length ? [`Failed to delete ids:
|
79
|
+
${storeSchemaOutStrings.getStringList(deleteFailureIds)}`, "Check logs for errors."] : []].filter(schemaApiClient.isDefined).join(`
|
80
|
+
`)), success ? "success" : "failure";
|
85
81
|
}
|
86
82
|
exports.default = deleteSchemasActionForCommand;
|
87
83
|
exports.deleteSchemaAction = deleteSchemaAction;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"deleteSchemaAction.js","sources":["../../src/_internal/cli/actions/schema/deleteSchemaAction.ts"],"sourcesContent":["import {type CliCommandContext} from '@sanity/cli'\nimport chalk from 'chalk'\nimport uniq from 'lodash/uniq'\n\nimport {isDefined} from '../../../manifest/manifestTypeHelpers'\nimport {type
|
1
|
+
{"version":3,"file":"deleteSchemaAction.js","sources":["../../src/_internal/cli/actions/schema/deleteSchemaAction.ts"],"sourcesContent":["import {type CliCommandContext} from '@sanity/cli'\nimport chalk from 'chalk'\nimport uniq from 'lodash/uniq'\n\nimport {isDefined} from '../../../manifest/manifestTypeHelpers'\nimport {type SchemaStoreContext} from './schemaStoreTypes'\nimport {createManifestExtractor, isManifestExtractSatisfied} from './utils/mainfestExtractor'\nimport {createManifestReader} from './utils/manifestReader'\nimport {createSchemaApiClient} from './utils/schemaApiClient'\nimport {\n filterLogReadProjectIdMismatch,\n parseDeleteSchemasConfig,\n type StoreSchemaCommonFlags,\n} from './utils/schemaStoreValidation'\nimport {getDatasetsOutString, getStringList} from './utils/storeSchemaOutStrings'\n\nexport interface DeleteSchemaFlags extends StoreSchemaCommonFlags {\n ids?: string\n dataset?: string\n}\n\ninterface DeleteResult {\n dataset: string\n schemaId: string\n deleted: boolean\n}\n\nclass DeleteIdError extends Error {\n public id: string\n public dataset: string\n constructor(id: string, dataset: string, options?: ErrorOptions) {\n super((options?.cause as {message?: string})?.message, options)\n this.name = 'DeleteIdError'\n this.id = id\n this.dataset = dataset\n }\n}\n\nexport default function deleteSchemasActionForCommand(\n flags: DeleteSchemaFlags,\n context: CliCommandContext,\n): Promise<'success' | 'failure'> {\n return deleteSchemaAction(flags, {\n ...context,\n manifestExtractor: createManifestExtractor(context),\n })\n}\n\n/**\n * Deletes all stored schemas matching --ids in workspace datasets.\n *\n * Workspaces are determined by on-disk manifest file – not directly from sanity.config.\n * All schema store actions require a manifest to exist, and can optionally regenerate the file with --extract-manifest.\n */\nexport async function deleteSchemaAction(\n flags: DeleteSchemaFlags,\n context: SchemaStoreContext,\n): Promise<'success' | 'failure'> {\n const {ids, dataset, extractManifest, manifestDir, verbose} = parseDeleteSchemasConfig(\n flags,\n context,\n )\n const {output, apiClient, jsonReader, manifestExtractor} = context\n\n // prettier-ignore\n if (!(await isManifestExtractSatisfied({schemaRequired: true, extractManifest, manifestDir, manifestExtractor, output,}))) {\n return 'failure'\n }\n\n const {client, projectId} = createSchemaApiClient(apiClient)\n const manifest = await createManifestReader({manifestDir, output, jsonReader}).getManifest()\n\n const workspaces = manifest.workspaces\n .filter((workspace) => !dataset || workspace.dataset === dataset)\n .filter((workspace) => filterLogReadProjectIdMismatch(workspace, projectId, output))\n\n const datasets = uniq(workspaces.map((w) => w.dataset))\n\n const results = await Promise.allSettled(\n datasets.flatMap((targetDataset: string) => {\n return ids.map(async ({schemaId}): Promise<DeleteResult> => {\n try {\n const deletedSchema = await client.withConfig({dataset: targetDataset}).delete(schemaId)\n return {dataset: targetDataset, schemaId, deleted: deletedSchema.results.length}\n } catch (err) {\n throw new DeleteIdError(schemaId, targetDataset, {cause: err})\n }\n })\n }),\n )\n\n const deletedIds = results\n .filter((r): r is PromiseFulfilledResult<DeleteResult> => r.status === 'fulfilled')\n .filter((r) => r.value.deleted)\n .map((r) => r.value)\n\n const notFound = uniq(\n results\n .filter((r): r is PromiseFulfilledResult<DeleteResult> => r.status === 'fulfilled')\n .filter((r) => !r.value.deleted)\n .filter((r) => !deletedIds.map(({schemaId}) => schemaId).includes(r.value.schemaId))\n .map((r) => r.value.schemaId),\n )\n\n const deleteFailureIds = uniq(\n results\n .filter((r) => r.status === 'rejected')\n .map((result) => {\n const error = result.reason\n if (error instanceof DeleteIdError) {\n output.error(\n chalk.red(\n `Failed to delete schema \"${error.id}\" in dataset \"${error.dataset}\":\\n${error.message}`,\n ),\n )\n if (verbose) output.error(error)\n return error.id\n }\n //hubris inc: given the try-catch wrapping the full promise \"this should never happen\"\n throw error\n }),\n )\n\n const success = deletedIds.length === ids.length\n if (success) {\n output.success(`Successfully deleted ${deletedIds.length}/${ids.length} schemas`)\n } else {\n output.error(\n [\n `Deleted ${deletedIds.length}/${ids.length} schemas.`,\n deletedIds.length\n ? `Successfully deleted ids:\\n${deletedIds\n .map(\n ({schemaId, dataset: targetDataset}) =>\n `- \"${schemaId}\" (in ${getDatasetsOutString([targetDataset])})`,\n )\n .join('\\n')}`\n : undefined,\n notFound.length\n ? `Ids not found in ${getDatasetsOutString(datasets)}:\\n${getStringList(notFound)}`\n : undefined,\n ...(deleteFailureIds.length\n ? [`Failed to delete ids:\\n${getStringList(deleteFailureIds)}`, 'Check logs for errors.']\n : []),\n ]\n .filter(isDefined)\n .join('\\n'),\n )\n }\n\n return success ? 'success' : 'failure'\n}\n"],"names":["DeleteIdError","Error","constructor","id","dataset","options","cause","message","name","deleteSchemasActionForCommand","flags","context","deleteSchemaAction","manifestExtractor","createManifestExtractor","ids","extractManifest","manifestDir","verbose","parseDeleteSchemasConfig","output","apiClient","jsonReader","isManifestExtractSatisfied","schemaRequired","client","projectId","createSchemaApiClient","workspaces","createManifestReader","getManifest","filter","workspace","filterLogReadProjectIdMismatch","datasets","uniq","map","w","results","Promise","allSettled","flatMap","targetDataset","schemaId","deletedSchema","withConfig","delete","deleted","length","err","deletedIds","r","status","value","notFound","includes","deleteFailureIds","result","error","reason","chalk","red","success","getDatasetsOutString","join","undefined","getStringList","isDefined"],"mappings":";;;;;;AA2BA,MAAMA,sBAAsBC,MAAM;AAAA,EAGhCC,YAAYC,IAAYC,SAAiBC,SAAwB;AAC/D,UAAOA,SAASC,OAA8BC,SAASF,OAAO,GAC9D,KAAKG,OAAO,iBACZ,KAAKL,KAAKA,IACV,KAAKC,UAAUA;AAAAA,EAAAA;AAEnB;AAEwBK,SAAAA,8BACtBC,OACAC,SACgC;AAChC,SAAOC,mBAAmBF,OAAO;AAAA,IAC/B,GAAGC;AAAAA,IACHE,mBAAmBC,wCAAwBH,OAAO;AAAA,EAAA,CACnD;AACH;AAQsBC,eAAAA,mBACpBF,OACAC,SACgC;AAC1B,QAAA;AAAA,IAACI;AAAAA,IAAKX;AAAAA,IAASY;AAAAA,IAAiBC;AAAAA,IAAaC;AAAAA,EAAAA,IAAWC,gBAAAA,yBAC5DT,OACAC,OACF,GACM;AAAA,IAACS;AAAAA,IAAQC;AAAAA,IAAWC;AAAAA,IAAYT;AAAAA,EAAAA,IAAqBF;AAGvD,MAAA,CAAE,MAAMY,gBAAAA,2BAA2B;AAAA,IAACC,gBAAgB;AAAA,IAAMR;AAAAA,IAAiBC;AAAAA,IAAcJ;AAAAA,IAAmBO;AAAAA,EAAAA,CAAQ;AAC/G,WAAA;AAGH,QAAA;AAAA,IAACK;AAAAA,IAAQC;AAAAA,MAAaC,gBAAsBN,sBAAAA,SAAS,GAGrDO,cAFW,MAAMC,gBAAAA,qBAAqB;AAAA,IAACZ;AAAAA,IAAaG;AAAAA,IAAQE;AAAAA,EAAAA,CAAW,EAAEQ,YAAAA,GAEnDF,WACzBG,OAAQC,CAAc,cAAA,CAAC5B,WAAW4B,UAAU5B,YAAYA,OAAO,EAC/D2B,OAAQC,CAAcC,cAAAA,gBAAAA,+BAA+BD,WAAWN,WAAWN,MAAM,CAAC,GAE/Ec,WAAWC,cAAAA,QAAKP,WAAWQ,IAAKC,CAAMA,MAAAA,EAAEjC,OAAO,CAAC,GAEhDkC,UAAU,MAAMC,QAAQC,WAC5BN,SAASO,QAASC,CACT3B,kBAAAA,IAAIqB,IAAI,OAAO;AAAA,IAACO;AAAAA,EAAAA,MAAqC;AACtD,QAAA;AACIC,YAAAA,gBAAgB,MAAMnB,OAAOoB,WAAW;AAAA,QAACzC,SAASsC;AAAAA,MAAAA,CAAc,EAAEI,OAAOH,QAAQ;AAChF,aAAA;AAAA,QAACvC,SAASsC;AAAAA,QAAeC;AAAAA,QAAUI,SAASH,cAAcN,QAAQU;AAAAA,MAAM;AAAA,aACxEC,KAAK;AACN,YAAA,IAAIjD,cAAc2C,UAAUD,eAAe;AAAA,QAACpC,OAAO2C;AAAAA,MAAAA,CAAI;AAAA,IAAA;AAAA,EAC/D,CACD,CACF,CACH,GAEMC,aAAaZ,QAChBP,OAAQoB,OAAiDA,EAAEC,WAAW,WAAW,EACjFrB,OAAQoB,OAAMA,EAAEE,MAAMN,OAAO,EAC7BX,IAAKe,OAAMA,EAAEE,KAAK,GAEfC,WAAWnB,cAAAA,QACfG,QACGP,OAAQoB,CAAAA,MAAiDA,EAAEC,WAAW,WAAW,EACjFrB,OAAQoB,CAAAA,MAAM,CAACA,EAAEE,MAAMN,OAAO,EAC9BhB,OAAQoB,OAAM,CAACD,WAAWd,IAAI,CAAC;AAAA,IAACO;AAAAA,EAAQ,MAAMA,QAAQ,EAAEY,SAASJ,EAAEE,MAAMV,QAAQ,CAAC,EAClFP,IAAKe,CAAAA,MAAMA,EAAEE,MAAMV,QAAQ,CAChC,GAEMa,mBAAmBrB,cAAAA,QACvBG,QACGP,OAAQoB,CAAMA,MAAAA,EAAEC,WAAW,UAAU,EACrChB,IAAKqB,CAAW,WAAA;AACf,UAAMC,QAAQD,OAAOE;AACrB,QAAID,iBAAiB1D;AACZ0D,aAAAA,OAAAA,MACLE,uBAAMC,IACJ,4BAA4BH,MAAMvD,EAAE,iBAAiBuD,MAAMtD,OAAO;AAAA,EAAOsD,MAAMnD,OAAO,EACxF,CACF,GACIW,WAASE,OAAOsC,MAAMA,KAAK,GACxBA,MAAMvD;AAGTuD,UAAAA;AAAAA,EACP,CAAA,CACL,GAEMI,UAAUZ,WAAWF,WAAWjC,IAAIiC;AACtCc,SAAAA,UACF1C,OAAO0C,QAAQ,wBAAwBZ,WAAWF,MAAM,IAAIjC,IAAIiC,MAAM,UAAU,IAEhF5B,OAAOsC,MACL,CACE,WAAWR,WAAWF,MAAM,IAAIjC,IAAIiC,MAAM,aAC1CE,WAAWF,SACP;AAAA,EAA8BE,WAC3Bd,IACC,CAAC;AAAA,IAACO;AAAAA,IAAUvC,SAASsC;AAAAA,EAAa,MAChC,MAAMC,QAAQ,SAASoB,sBAAAA,qBAAqB,CAACrB,aAAa,CAAC,CAAC,GAChE,EACCsB,KAAK;AAAA,CAAI,CAAC,KACbC,QACJX,SAASN,SACL,oBAAoBe,2CAAqB7B,QAAQ,CAAC;AAAA,EAAMgC,sBAAAA,cAAcZ,QAAQ,CAAC,KAC/EW,QACJ,GAAIT,iBAAiBR,SACjB,CAAC;AAAA,EAA0BkB,oCAAcV,gBAAgB,CAAC,IAAI,wBAAwB,IACtF,CAAG,CAAA,EAENzB,OAAOoC,yBAAS,EAChBH,KAAK;AAAA,CAAI,CACd,GAGKF,UAAU,YAAY;AAC/B;;;"}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
"use strict";
|
2
|
-
var chalk = require("chalk"), sortBy = require("lodash/sortBy"), uniq = require("lodash/uniq"), schemaApiClient = require("./schemaApiClient.js");
|
2
|
+
var chalk = require("chalk"), sortBy = require("lodash/sortBy"), uniq = require("lodash/uniq"), schemaApiClient = require("./schemaApiClient.js"), storeSchemaOutStrings = require("./storeSchemaOutStrings.js");
|
3
3
|
function _interopDefaultCompat(e) {
|
4
4
|
return e && typeof e == "object" && "default" in e ? e : { default: e };
|
5
5
|
}
|
@@ -42,9 +42,7 @@ async function listSchemasAction(flags, context) {
|
|
42
42
|
manifestDir,
|
43
43
|
output,
|
44
44
|
jsonReader
|
45
|
-
}).getManifest()).workspaces.filter((workspace) => schemaApiClient.filterLogReadProjectIdMismatch(workspace, projectId, output))
|
46
|
-
id && schemaApiClient.assetIdsMatchesWorkspaces([id], workspaces);
|
47
|
-
const datasets = uniq__default.default(workspaces.map((w) => w.dataset)), schemas = (await Promise.allSettled(datasets.map(async (dataset) => {
|
45
|
+
}).getManifest()).workspaces.filter((workspace) => schemaApiClient.filterLogReadProjectIdMismatch(workspace, projectId, output)), datasets = uniq__default.default(workspaces.map((w) => w.dataset)), schemas = (await Promise.allSettled(datasets.map(async (dataset) => {
|
48
46
|
try {
|
49
47
|
const datasetClient = client.withConfig({
|
50
48
|
dataset
|
@@ -68,7 +66,7 @@ async function listSchemasAction(flags, context) {
|
|
68
66
|
return [];
|
69
67
|
}).filter(schemaApiClient.isDefined).flat();
|
70
68
|
if (schemas.length === 0) {
|
71
|
-
const datasetString =
|
69
|
+
const datasetString = storeSchemaOutStrings.getDatasetsOutString(datasets);
|
72
70
|
return output.error(id ? `Schema for id "${id}" not found in ${datasetString}` : `No schemas found in ${datasetString}`), "failure";
|
73
71
|
}
|
74
72
|
return json ? output.print(`${JSON.stringify(id ? schemas[0] : schemas, null, 2)}`) : printSchemaList({
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"listSchemasAction.js","sources":["../../src/_internal/cli/actions/schema/listSchemasAction.ts"],"sourcesContent":["import {type CliCommandContext, type CliOutputter} from '@sanity/cli'\nimport chalk from 'chalk'\nimport sortBy from 'lodash/sortBy'\nimport uniq from 'lodash/uniq'\n\nimport {isDefined} from '../../../manifest/manifestTypeHelpers'\nimport {\n SANITY_WORKSPACE_SCHEMA_TYPE,\n type StoredWorkspaceSchema,\n} from '../../../manifest/manifestTypes'\nimport {type SchemaStoreContext} from './schemaStoreTypes'\nimport {createManifestExtractor, isManifestExtractSatisfied} from './utils/mainfestExtractor'\nimport {createManifestReader} from './utils/manifestReader'\nimport {createSchemaApiClient} from './utils/schemaApiClient'\nimport {\n
|
1
|
+
{"version":3,"file":"listSchemasAction.js","sources":["../../src/_internal/cli/actions/schema/listSchemasAction.ts"],"sourcesContent":["import {type CliCommandContext, type CliOutputter} from '@sanity/cli'\nimport chalk from 'chalk'\nimport sortBy from 'lodash/sortBy'\nimport uniq from 'lodash/uniq'\n\nimport {isDefined} from '../../../manifest/manifestTypeHelpers'\nimport {\n SANITY_WORKSPACE_SCHEMA_TYPE,\n type StoredWorkspaceSchema,\n} from '../../../manifest/manifestTypes'\nimport {type SchemaStoreContext} from './schemaStoreTypes'\nimport {createManifestExtractor, isManifestExtractSatisfied} from './utils/mainfestExtractor'\nimport {createManifestReader} from './utils/manifestReader'\nimport {createSchemaApiClient} from './utils/schemaApiClient'\nimport {\n filterLogReadProjectIdMismatch,\n parseListSchemasConfig,\n type StoreSchemaCommonFlags,\n} from './utils/schemaStoreValidation'\nimport {getDatasetsOutString} from './utils/storeSchemaOutStrings'\n\nexport interface SchemaListFlags extends StoreSchemaCommonFlags {\n json?: boolean\n id?: string\n}\n\nclass DatasetError extends Error {\n public dataset: string\n constructor(dataset: string, options?: ErrorOptions) {\n super((options?.cause as {message?: string})?.message, options)\n this.dataset = dataset\n this.name = 'DatasetError'\n }\n}\n\nexport default function listSchemasActionForCommand(\n flags: SchemaListFlags,\n context: CliCommandContext,\n): Promise<'success' | 'failure'> {\n return listSchemasAction(flags, {\n ...context,\n manifestExtractor: createManifestExtractor(context),\n })\n}\n\n/**\n * Lists stored schemas found in workspace datasets.\n *\n * Workspaces are determined by on-disk manifest file – not directly from sanity.config.\n * All schema store actions require a manifest file to exist, and can optionally regenerate the file with --extract-manifest.\n */\nexport async function listSchemasAction(\n flags: SchemaListFlags,\n context: SchemaStoreContext,\n): Promise<'success' | 'failure'> {\n const {json, id, manifestDir, extractManifest} = parseListSchemasConfig(flags, context)\n const {output, apiClient, jsonReader, manifestExtractor} = context\n\n // prettier-ignore\n if (!(await isManifestExtractSatisfied({schemaRequired: true, extractManifest, manifestDir, manifestExtractor, output,}))) {\n return 'failure'\n }\n const {client, projectId} = createSchemaApiClient(apiClient)\n\n const manifest = await createManifestReader({manifestDir, output, jsonReader}).getManifest()\n const workspaces = manifest.workspaces.filter((workspace) =>\n filterLogReadProjectIdMismatch(workspace, projectId, output),\n )\n\n const datasets = uniq(workspaces.map((w) => w.dataset))\n\n const schemaResults = await Promise.allSettled(\n datasets.map(async (dataset) => {\n try {\n const datasetClient = client.withConfig({dataset})\n return id\n ? datasetClient.getDocument<StoredWorkspaceSchema>(id)\n : datasetClient.fetch<StoredWorkspaceSchema[]>(`*[_type == $type]`, {\n type: SANITY_WORKSPACE_SCHEMA_TYPE,\n })\n } catch (error) {\n throw new DatasetError(dataset, {cause: error})\n }\n }),\n )\n\n const schemas = schemaResults\n .map((result, index) => {\n if (result.status === 'fulfilled') return result.value\n\n if (result.reason instanceof DatasetError) {\n const message = chalk.red(\n `↳ Failed to fetch schema from dataset \"${result.reason.dataset}\":\\n ${result.reason.message}`,\n )\n output.error(message)\n } else {\n //hubris inc: given the try-catch wrapping all the full promise \"this should never happen\"\n throw result.reason\n }\n return []\n })\n .filter(isDefined)\n .flat()\n\n if (schemas.length === 0) {\n const datasetString = getDatasetsOutString(datasets)\n output.error(\n id\n ? `Schema for id \"${id}\" not found in ${datasetString}`\n : `No schemas found in ${datasetString}`,\n )\n return 'failure'\n }\n\n if (json) {\n output.print(`${JSON.stringify(id ? schemas[0] : schemas, null, 2)}`)\n } else {\n printSchemaList({schemas, output})\n }\n return 'success'\n}\n\nfunction printSchemaList({\n schemas,\n output,\n}: {\n schemas: StoredWorkspaceSchema[]\n output: CliOutputter\n}) {\n const ordered = sortBy(\n schemas.map(({_createdAt: createdAt, _id: id, workspace}) => {\n return [id, workspace.name, workspace.dataset, workspace.projectId, createdAt].map(String)\n }),\n ['createdAt'],\n )\n const headings = ['Id', 'Workspace', 'Dataset', 'ProjectId', 'CreatedAt']\n const rows = ordered.reverse()\n\n const maxWidths = rows.reduce(\n (max, row) => row.map((current, index) => Math.max(current.length, max[index])),\n headings.map((str) => str.length),\n )\n\n const rowToString = (row: string[]) =>\n row.map((col, i) => `${col}`.padEnd(maxWidths[i])).join(' ')\n\n output.print(chalk.cyan(rowToString(headings)))\n rows.forEach((row) => output.print(rowToString(row)))\n}\n"],"names":["DatasetError","Error","constructor","dataset","options","cause","message","name","listSchemasActionForCommand","flags","context","listSchemasAction","manifestExtractor","createManifestExtractor","json","id","manifestDir","extractManifest","parseListSchemasConfig","output","apiClient","jsonReader","isManifestExtractSatisfied","schemaRequired","client","projectId","createSchemaApiClient","workspaces","createManifestReader","getManifest","filter","workspace","filterLogReadProjectIdMismatch","datasets","uniq","map","w","schemas","Promise","allSettled","datasetClient","withConfig","getDocument","fetch","type","SANITY_WORKSPACE_SCHEMA_TYPE","error","result","index","status","value","reason","chalk","red","isDefined","flat","length","datasetString","getDatasetsOutString","print","JSON","stringify","printSchemaList","ordered","sortBy","_createdAt","createdAt","_id","String","headings","rows","reverse","maxWidths","reduce","max","row","current","Math","str","rowToString","col","i","padEnd","join","cyan","forEach"],"mappings":"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"}
|
@@ -59,12 +59,6 @@ async function parseJsonFile(filePath) {
|
|
59
59
|
lastModified
|
60
60
|
};
|
61
61
|
}
|
62
|
-
function getDatasetsOutString(datasets) {
|
63
|
-
return datasets.length === 1 ? `dataset "${datasets[0]}"` : `datasets ${getStringArrayOutString(datasets)}`;
|
64
|
-
}
|
65
|
-
function getStringArrayOutString(array) {
|
66
|
-
return `[${array.map((d) => `"${d}"`).join(",")}]`;
|
67
|
-
}
|
68
62
|
const validForIdChars = "a-zA-Z0-9._-", validForIdPattern = new RegExp(`^[${validForIdChars}]+$`, "g"), requiredInId = SANITY_WORKSPACE_SCHEMA_TYPE.replace(/[.]/g, "\\."), idPattern = new RegExp(`^(?:[${validForIdChars}]+?\\.)?${requiredInId}\\.([${validForIdChars}]+)$`);
|
69
63
|
class FlagValidationError extends Error {
|
70
64
|
constructor(message) {
|
@@ -110,17 +104,6 @@ function assertNoErrors(errors) {
|
|
110
104
|
${errors.map((error) => ` - ${error}`).join(`
|
111
105
|
`)}`);
|
112
106
|
}
|
113
|
-
function assetIdsMatchesWorkspaces(ids, workspaces) {
|
114
|
-
const invalidIds = ids.map((id) => ({
|
115
|
-
id,
|
116
|
-
parsedId: parseWorkspaceSchemaId(id, [])
|
117
|
-
})).filter(({
|
118
|
-
id,
|
119
|
-
parsedId
|
120
|
-
}) => !parsedId || !workspaces.some((w) => w.name === parsedId.workspace));
|
121
|
-
if (invalidIds.length) throw new FlagValidationError(`Ids must match workspaces in scope, but got:
|
122
|
-
${getStringArrayOutString(invalidIds.map((id) => id.id))}`);
|
123
|
-
}
|
124
107
|
function parseIds(flags, errors) {
|
125
108
|
const ids = parseNonEmptyString(flags, "ids", errors).split(",").map((id) => id.trim()).filter((id) => !!id).map((id) => parseWorkspaceSchemaId(id, errors)).filter(isDefined), uniqueIds = uniqBy__default.default(ids, "schemaId");
|
126
109
|
return uniqueIds.length < ids.length && errors.push("ids contains duplicates"), uniqueIds;
|
@@ -231,13 +214,10 @@ function createSchemaApiClient(apiClient) {
|
|
231
214
|
}
|
232
215
|
exports.FlagValidationError = FlagValidationError;
|
233
216
|
exports.SANITY_WORKSPACE_SCHEMA_TYPE = SANITY_WORKSPACE_SCHEMA_TYPE;
|
234
|
-
exports.assetIdsMatchesWorkspaces = assetIdsMatchesWorkspaces;
|
235
217
|
exports.createManifestExtractor = createManifestExtractor;
|
236
218
|
exports.createManifestReader = createManifestReader;
|
237
219
|
exports.createSchemaApiClient = createSchemaApiClient;
|
238
220
|
exports.filterLogReadProjectIdMismatch = filterLogReadProjectIdMismatch;
|
239
|
-
exports.getDatasetsOutString = getDatasetsOutString;
|
240
|
-
exports.getStringArrayOutString = getStringArrayOutString;
|
241
221
|
exports.isDefined = isDefined;
|
242
222
|
exports.isManifestExtractSatisfied = isManifestExtractSatisfied;
|
243
223
|
exports.parseDeleteSchemasConfig = parseDeleteSchemasConfig;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"schemaApiClient.js","sources":["../../src/_internal/manifest/manifestTypes.ts","../../src/_internal/manifest/manifestTypeHelpers.ts","../../src/_internal/cli/actions/schema/utils/manifestReader.ts","../../src/_internal/cli/actions/schema/utils/storeSchemaOutStrings.ts","../../src/_internal/cli/actions/schema/utils/schemaStoreValidation.ts","../../src/_internal/cli/actions/schema/utils/mainfestExtractor.ts","../../src/_internal/cli/actions/schema/utils/schemaApiClient.ts"],"sourcesContent":["import {type SanityDocumentLike} from '@sanity/types'\n\nexport const SANITY_WORKSPACE_SCHEMA_TYPE = 'sanity.workspace.schema'\n\nexport type ManifestSerializable =\n | string\n | number\n | boolean\n | {[k: string]: ManifestSerializable}\n | ManifestSerializable[]\n\nexport interface CreateManifest {\n version: number\n createdAt: string\n workspaces: ManifestWorkspaceFile[]\n}\n\nexport interface ManifestWorkspaceFile extends Omit<CreateWorkspaceManifest, 'schema' | 'tools'> {\n schema: string // filename\n tools: string // filename\n}\n\nexport interface CreateWorkspaceManifest {\n name: string\n title?: string\n subtitle?: string\n basePath: string\n dataset: string\n projectId: string\n schema: ManifestSchemaType[]\n tools: ManifestTool[]\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n}\n\nexport interface ManifestSchemaType {\n type: string\n name: string\n title?: string\n deprecated?: {\n reason: string\n }\n readOnly?: boolean | 'conditional'\n hidden?: boolean | 'conditional'\n validation?: ManifestValidationGroup[]\n fields?: ManifestField[]\n to?: ManifestReferenceMember[]\n of?: ManifestArrayMember[]\n preview?: {\n select: Record<string, string>\n }\n fieldsets?: ManifestFieldset[]\n options?: Record<string, ManifestSerializable>\n //portable text\n marks?: {\n annotations?: ManifestArrayMember[]\n decorators?: ManifestTitledValue[]\n }\n lists?: ManifestTitledValue[]\n styles?: ManifestTitledValue[]\n\n // userland (assignable to ManifestSerializable | undefined)\n // not included to add some typesafty to extractManifest\n // [index: string]: unknown\n}\n\nexport interface ManifestFieldset {\n name: string\n title?: string\n [index: string]: ManifestSerializable | undefined\n}\n\nexport interface ManifestTitledValue {\n value: string\n title?: string\n}\n\nexport type ManifestField = ManifestSchemaType & {fieldset?: string}\nexport type ManifestArrayMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\nexport type ManifestReferenceMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\n\nexport interface ManifestValidationGroup {\n rules: ManifestValidationRule[]\n message?: string\n level?: 'error' | 'warning' | 'info'\n}\n\nexport type ManifestValidationRule = {\n flag: string\n constraint?: ManifestSerializable\n [index: string]: ManifestSerializable | undefined\n}\n\nexport interface ManifestTool {\n name: string\n title: string\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n type: string | null\n}\n\nexport type DefaultWorkspaceSchemaId = `${typeof SANITY_WORKSPACE_SCHEMA_TYPE}.${string}`\nexport type PrefixedWorkspaceSchemaId = `${string}.${DefaultWorkspaceSchemaId}`\nexport type WorkspaceSchemaId = DefaultWorkspaceSchemaId | PrefixedWorkspaceSchemaId\n\nexport interface StoredWorkspaceSchema extends SanityDocumentLike {\n _type: typeof SANITY_WORKSPACE_SCHEMA_TYPE\n _id: WorkspaceSchemaId\n workspace: ManifestWorkspaceFile\n /**\n * JSON.stringify version of ManifestSchemaType[] to save on attribute paths.\n * Consumers must use JSON.parse on the value.\n */\n schema: string\n //schema: ManifestSchemaType[]\n}\n","import {\n type CrossDatasetReferenceSchemaType,\n type ObjectField,\n type ObjectSchemaType,\n type ReferenceSchemaType,\n type SchemaType,\n} from '@sanity/types'\n\nconst DEFAULT_IMAGE_FIELDS = ['asset', 'hotspot', 'crop']\nconst DEFAULT_FILE_FIELDS = ['asset']\nconst DEFAULT_GEOPOINT_FIELDS = ['lat', 'lng', 'alt']\nconst DEFAULT_SLUG_FIELDS = ['current', 'source']\n\nexport function getCustomFields(type: ObjectSchemaType): (ObjectField & {fieldset?: string})[] {\n const fields = type.fieldsets\n ? type.fieldsets.flatMap((fs) => {\n if (fs.single) {\n return fs.field\n }\n return fs.fields.map((field) => ({\n ...field,\n fieldset: fs.name,\n }))\n })\n : type.fields\n\n if (isType(type, 'block')) {\n return []\n }\n if (isType(type, 'slug')) {\n return fields.filter((f) => !DEFAULT_SLUG_FIELDS.includes(f.name))\n }\n if (isType(type, 'geopoint')) {\n return fields.filter((f) => !DEFAULT_GEOPOINT_FIELDS.includes(f.name))\n }\n if (isType(type, 'image')) {\n return fields.filter((f) => !DEFAULT_IMAGE_FIELDS.includes(f.name))\n }\n if (isType(type, 'file')) {\n return fields.filter((f) => !DEFAULT_FILE_FIELDS.includes(f.name))\n }\n return fields\n}\n\nexport function isReference(type: SchemaType): type is ReferenceSchemaType {\n return isType(type, 'reference')\n}\n\nexport function isCrossDatasetReference(type: SchemaType): type is CrossDatasetReferenceSchemaType {\n return isType(type, 'crossDatasetReference')\n}\n\nexport function isObjectField(maybeOjectField: unknown): boolean {\n return (\n typeof maybeOjectField === 'object' && maybeOjectField !== null && 'name' in maybeOjectField\n )\n}\n\nexport function isCustomized(maybeCustomized: SchemaType): boolean {\n const hasFieldsArray =\n isObjectField(maybeCustomized) &&\n !isType(maybeCustomized, 'reference') &&\n !isType(maybeCustomized, 'crossDatasetReference') &&\n 'fields' in maybeCustomized &&\n Array.isArray(maybeCustomized.fields)\n\n if (!hasFieldsArray) {\n return false\n }\n\n const fields = getCustomFields(maybeCustomized)\n return !!fields.length\n}\n\nexport function isType(schemaType: SchemaType, typeName: string): boolean {\n if (schemaType.name === typeName) {\n return true\n }\n if (!schemaType.type) {\n return false\n }\n return isType(schemaType.type, typeName)\n}\n\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object'\n}\n\nexport function isPrimitive(value: unknown): value is string | boolean | number {\n return isString(value) || isBoolean(value) || isNumber(value)\n}\n\nexport function isString(value: unknown): value is string {\n return typeof value === 'string'\n}\n\nfunction isNumber(value: unknown): value is number {\n return typeof value === 'boolean'\n}\n\nfunction isBoolean(value: unknown): value is boolean {\n return typeof value === 'number'\n}\n","import {type Stats} from 'node:fs'\nimport {readFile, stat} from 'node:fs/promises'\nimport path, {join, resolve} from 'node:path'\n\nimport {type CliOutputter} from '@sanity/cli'\nimport chalk from 'chalk'\n\nimport {type CreateManifest, type ManifestSchemaType} from '../../../../manifest/manifestTypes'\nimport {MANIFEST_FILENAME} from '../../manifest/extractManifestAction'\nimport {type StoreSchemasFlags} from '../storeSchemasAction'\n\nexport type ManifestJsonReader = <T>(\n filePath: string,\n) => Promise<JsonFileParseSuccess<T> | undefined>\n\nexport type CreateManifestReaderFactory = (args: {\n manifestDir: string\n output: CliOutputter\n jsonReader?: <T>(filePath: string) => Promise<JsonFileParseSuccess<T> | undefined>\n}) => CreateManifestReader\n\nexport interface CreateManifestReader {\n getManifest: () => Promise<CreateManifest>\n getWorkspaceSchema: (workspaceName: string) => Promise<ManifestSchemaType[]>\n}\n\ninterface JsonFileParseSuccess<T> {\n parsedJson: T\n path: string\n lastModified: string\n}\n\n/**\n * The manifest reader will try to read manifest and workspace schema files _once_ and cache a successful result.\n * If you need to re-read the manifest from disk, create a new instance.\n */\nexport const createManifestReader: CreateManifestReaderFactory = ({\n manifestDir,\n output,\n jsonReader = parseJsonFile,\n}) => {\n let parsedManifest: JsonFileParseSuccess<CreateManifest>\n const parsedWorkspaces: Record<string, JsonFileParseSuccess<ManifestSchemaType[]> | undefined> =\n {}\n\n const getManifest: CreateManifestReader['getManifest'] = async () => {\n if (parsedManifest) {\n return parsedManifest?.parsedJson\n }\n\n const manifestFile = path.join(manifestDir, MANIFEST_FILENAME)\n\n const result = await jsonReader<CreateManifest>(manifestFile)\n if (!result) {\n throw new Error(\n `Manifest does not exist at ${manifestFile}. To create the manifest file, re-run with --${'extract-manifest' satisfies keyof StoreSchemasFlags} or run \"sanity manifest extract\"`,\n )\n }\n\n output.print(\n chalk.gray(`↳ Read manifest from ${manifestFile} (last modified: ${result.lastModified})`),\n )\n\n parsedManifest = result\n return result.parsedJson\n }\n\n const getWorkspaceSchema: CreateManifestReader['getWorkspaceSchema'] = async (workspaceName) => {\n if (parsedWorkspaces[workspaceName]) {\n return parsedWorkspaces[workspaceName]?.parsedJson\n }\n const manifest = await getManifest()\n if (!manifest) {\n throw Error('Manifest is required to read workspace schema.')\n }\n\n const workspaceManifest = manifest.workspaces.find(\n (workspace) => workspace.name === workspaceName,\n )\n\n if (!workspaceManifest) {\n throw Error(`No workspace named \"${workspaceName}\" found in manifest.`)\n }\n\n const workspaceSchemaFile = path.join(manifestDir, workspaceManifest.schema)\n const result = await jsonReader<ManifestSchemaType[]>(workspaceSchemaFile)\n if (!result) {\n throw Error(`Workspace schema file at \"${workspaceSchemaFile}\" does not exist.`)\n }\n parsedWorkspaces[workspaceName] = result\n return result.parsedJson\n }\n return {\n getManifest,\n getWorkspaceSchema,\n }\n}\n\nexport const getManifestDirPath = (workDir: string, customPath?: string) => {\n const defaultOutputDir = resolve(join(workDir, 'dist'))\n\n const outputDir = resolve(defaultOutputDir)\n const defaultStaticPath = join(outputDir, 'static')\n\n const staticPath = customPath ?? defaultStaticPath\n return path.resolve(process.cwd(), staticPath)\n}\n\nasync function parseJsonFile<T>(filePath: string): Promise<JsonFileParseSuccess<T> | undefined> {\n let stats: Stats\n try {\n stats = await stat(filePath)\n } catch (err) {\n // file does not exist\n return undefined\n }\n const content = await readFile(filePath, 'utf-8')\n const lastModified = stats.mtime.toISOString()\n const json = JSON.parse(content) as T\n if (!json) {\n throw new Error(`JSON file \"${filePath}\" was empty.`)\n }\n return {\n parsedJson: json,\n path: filePath,\n lastModified,\n }\n}\n","export function getDatasetsOutString(datasets: string[]) {\n return datasets.length === 1\n ? `dataset \"${datasets[0]}\"`\n : `datasets ${getStringArrayOutString(datasets)}`\n}\n\nexport function getStringArrayOutString(array: string[]) {\n return `[${array.map((d) => `\"${d}\"`).join(',')}]`\n}\n","import {type CliOutputter} from '@sanity/cli'\nimport uniqBy from 'lodash/uniqBy'\n\nimport {isDefined} from '../../../../manifest/manifestTypeHelpers'\nimport {SANITY_WORKSPACE_SCHEMA_TYPE} from '../../../../manifest/manifestTypes'\nimport {type DeleteSchemaFlags} from '../deleteSchemaAction'\nimport {type SchemaListFlags} from '../listSchemasAction'\nimport {type StoreSchemasFlags} from '../storeSchemasAction'\nimport {getManifestDirPath} from './manifestReader'\nimport {getStringArrayOutString} from './storeSchemaOutStrings'\n\nexport const validForIdChars = 'a-zA-Z0-9._-'\nexport const validForIdPattern = new RegExp(`^[${validForIdChars}]+$`, 'g')\n\nconst requiredInId = SANITY_WORKSPACE_SCHEMA_TYPE.replace(/[.]/g, '\\\\.')\nconst idPattern = new RegExp(\n `^(?:[${validForIdChars}]+?\\\\.)?${requiredInId}\\\\.([${validForIdChars}]+)$`,\n)\n\nexport class FlagValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'FlagValidationError'\n }\n}\n\ninterface WorkspaceSchemaId {\n schemaId: string\n workspace: string\n}\n\nexport interface StoreSchemaCommonFlags {\n 'extract-manifest'?: boolean\n 'manifest-dir'?: string\n 'verbose'?: boolean\n}\n\nfunction parseCommonFlags(\n flags: StoreSchemaCommonFlags,\n context: {workDir: string},\n errors: string[],\n) {\n const manifestDir = parseManifestDir(flags, errors)\n const verbose = !!flags.verbose\n const extractManifest = !!flags['extract-manifest']\n\n const fullManifestDir = getManifestDirPath(context.workDir, manifestDir)\n return {\n manifestDir: fullManifestDir,\n verbose,\n extractManifest,\n }\n}\n\nexport function parseStoreSchemasConfig(flags: StoreSchemasFlags, context: {workDir: string}) {\n const errors: string[] = []\n\n const commonFlags = parseCommonFlags(flags, context, errors)\n const workspaceName = parseWorkspace(flags, errors)\n const idPrefix = parseIdPrefix(flags, errors)\n const schemaRequired = !!flags['schema-required']\n\n assertNoErrors(errors)\n return {...commonFlags, workspaceName, idPrefix, schemaRequired}\n}\n\nexport function parseListSchemasConfig(flags: SchemaListFlags, context: {workDir: string}) {\n const errors: string[] = []\n\n const commonFlags = parseCommonFlags(flags, context, errors)\n const id = parseId(flags, errors)\n const json = !!flags.json\n\n assertNoErrors(errors)\n return {...commonFlags, json, id}\n}\n\nexport function parseDeleteSchemasConfig(flags: DeleteSchemaFlags, context: {workDir: string}) {\n const errors: string[] = []\n\n const commonFlags = parseCommonFlags(flags, context, errors)\n const ids = parseIds(flags, errors)\n const dataset = parseDataset(flags, errors)\n\n assertNoErrors(errors)\n return {...commonFlags, dataset, ids}\n}\n\nfunction assertNoErrors(errors: string[]) {\n if (errors.length) {\n throw new FlagValidationError(\n `Invalid arguments:\\n${errors.map((error) => ` - ${error}`).join('\\n')}`,\n )\n }\n}\n\nexport function assetIdsMatchesWorkspaces(ids: string[], workspaces: {name: string}[]) {\n const invalidIds = ids\n .map((id) => ({\n id,\n parsedId: parseWorkspaceSchemaId(id, []),\n }))\n .filter(({id, parsedId}) => !parsedId || !workspaces.some((w) => w.name === parsedId.workspace))\n\n if (invalidIds.length)\n throw new FlagValidationError(\n 'Ids must match workspaces in scope, but got:\\n' +\n ` ${getStringArrayOutString(invalidIds.map((id) => id.id))}`,\n )\n}\n\nfunction parseIds(flags: {ids?: unknown}, errors: string[]): WorkspaceSchemaId[] {\n const parsedIds = parseNonEmptyString(flags, 'ids', errors)\n const ids = parsedIds\n .split(',')\n .map((id) => id.trim())\n .filter((id) => !!id)\n .map((id) => parseWorkspaceSchemaId(id, errors))\n .filter(isDefined)\n\n const uniqueIds = uniqBy(ids, 'schemaId' satisfies keyof (typeof ids)[number])\n if (uniqueIds.length < ids.length) {\n errors.push(`ids contains duplicates`)\n }\n return uniqueIds\n}\n\nfunction parseId(flags: {id?: unknown}, errors: string[]) {\n const id = flags.id === undefined ? undefined : parseNonEmptyString(flags, 'id', errors)\n if (id) {\n return parseWorkspaceSchemaId(id, errors)?.schemaId\n }\n return undefined\n}\n\nexport function parseWorkspaceSchemaId(id: string, errors: string[]) {\n const trimmedId = id.trim()\n\n if (!trimmedId.match(validForIdPattern)) {\n errors.push(`id can only contain characters in [${validForIdChars}] but found: ${trimmedId}`)\n return undefined\n }\n\n const match = trimmedId.match(idPattern)\n const workspace = match?.[1] ?? ''\n if (!workspace) {\n errors.push(\n `id must end with ${SANITY_WORKSPACE_SCHEMA_TYPE}.<workspaceName> but found: ${trimmedId}`,\n )\n return undefined\n }\n return {\n schemaId: trimmedId,\n workspace,\n }\n}\n\nfunction parseDataset(flags: {dataset?: unknown}, errors: string[]) {\n return flags.dataset === undefined ? undefined : parseNonEmptyString(flags, 'dataset', errors)\n}\n\nfunction parseWorkspace(flags: {workspace?: unknown}, errors: string[]) {\n return flags.workspace === undefined ? undefined : parseNonEmptyString(flags, 'workspace', errors)\n}\n\nfunction parseManifestDir(flags: {'manifest-dir'?: unknown}, errors: string[]) {\n return flags['manifest-dir'] === undefined\n ? undefined\n : parseNonEmptyString(flags, 'manifest-dir', errors)\n}\n\nfunction parseIdPrefix(flags: {'id-prefix'?: unknown}, errors: string[]) {\n if (flags['id-prefix'] === undefined) {\n return undefined\n }\n\n const idPrefix = parseNonEmptyString(flags, 'id-prefix', errors)\n if (idPrefix.endsWith('.')) {\n errors.push(`idx-prefix argument cannot end with . (period), but was ${idPrefix}`)\n }\n\n if (!idPrefix.match(validForIdPattern)) {\n errors.push(\n `idx-prefix can only contain _id compatible characters [${validForIdChars}], but was ${idPrefix}`,\n )\n }\n\n return idPrefix\n}\n\nfunction parseNonEmptyString<\n Flag extends string,\n Flags extends Partial<Record<Flag, unknown | undefined>>,\n>(flags: Flags, flagName: Flag, errors: string[]): string {\n const flag = flags[flagName]\n if (!isString(flag) || !flag) {\n errors.push(`${flagName} argument is empty`)\n return ''\n }\n return flag\n}\n\nfunction isString(flag: unknown): flag is string {\n return typeof flag === 'string'\n}\n\nfunction getProjectIdMismatchMessage(\n workspace: {name: string; projectId: string},\n operation: 'read' | 'write',\n) {\n return `No permissions to ${operation} schema for workspace \"${workspace.name}\" with projectId \"${workspace.projectId}\"`\n}\n\n/**\n * At the moment schema store commands does not support studios where workspaces have multiple projects\n */\nexport function throwWriteProjectIdMismatch(\n workspace: {name: string; projectId: string},\n projectId: string,\n): void {\n if (workspace.projectId !== projectId) {\n throw new Error(getProjectIdMismatchMessage(workspace, 'write'))\n }\n}\n\nexport function filterLogReadProjectIdMismatch(\n workspace: {name: string; projectId: string},\n projectId: string,\n output: CliOutputter,\n) {\n const canRead = workspace.projectId === projectId\n if (!canRead) output.warn(`${getProjectIdMismatchMessage(workspace, 'read')} – ignoring it.`)\n return canRead\n}\n","import {type CliCommandArguments, type CliCommandContext, type CliOutputter} from '@sanity/cli'\nimport chalk from 'chalk'\n\nimport {type ExtractManifestFlags, extractManifestSafe} from '../../manifest/extractManifestAction'\nimport {FlagValidationError} from './schemaStoreValidation'\n\nexport type ManifestExtractor = (manifestDir: string) => Promise<void>\n\nexport async function isManifestExtractSatisfied(args: {\n schemaRequired: boolean\n extractManifest: boolean\n manifestDir: string\n manifestExtractor: (manifestDir: string) => Promise<void>\n output: CliOutputter\n}) {\n const {schemaRequired, extractManifest, manifestDir, manifestExtractor, output} = args\n if (!extractManifest) {\n return true\n }\n try {\n // a successful manifest extract will write a new manifest file, which manifestReader will then read from disk\n await manifestExtractor(manifestDir)\n return true\n } catch (err) {\n if (schemaRequired || err instanceof FlagValidationError) {\n throw err\n } else {\n output.print(chalk.gray(`↳ Failed to extract manifest:\\n ${err.message}`))\n return false\n }\n }\n}\n\nexport function createManifestExtractor(context: CliCommandContext) {\n return async (manifestDir: string) => {\n const error = await extractManifestSafe(\n {\n extOptions: {path: manifestDir},\n groupOrCommand: 'extract',\n argv: [],\n argsWithoutOptions: [],\n extraArguments: [],\n } as CliCommandArguments<ExtractManifestFlags>,\n context,\n )\n if (error) {\n throw error\n }\n }\n}\n","import {type CliApiClient} from '@sanity/cli'\n\nexport function createSchemaApiClient(apiClient: CliApiClient) {\n const client = apiClient({\n requireUser: true,\n requireProject: true,\n }).withConfig({apiVersion: 'v2025-03-01', useCdn: false})\n\n const projectId = client.config().projectId\n const dataset = client.config().dataset\n if (!projectId) throw new Error('Project ID is not defined')\n if (!dataset) throw new Error('Dataset is not defined')\n\n return {\n client,\n projectId,\n dataset,\n }\n}\n"],"names":["SANITY_WORKSPACE_SCHEMA_TYPE","isDefined","value","createManifestReader","manifestDir","output","jsonReader","parseJsonFile","parsedManifest","parsedWorkspaces","getManifest","parsedJson","manifestFile","path","join","MANIFEST_FILENAME","result","Error","print","chalk","gray","lastModified","getWorkspaceSchema","workspaceName","manifest","workspaceManifest","workspaces","find","workspace","name","workspaceSchemaFile","schema","getManifestDirPath","workDir","customPath","defaultOutputDir","resolve","outputDir","defaultStaticPath","staticPath","process","cwd","filePath","stats","stat","content","readFile","mtime","toISOString","json","JSON","parse","getDatasetsOutString","datasets","length","getStringArrayOutString","array","map","d","validForIdChars","validForIdPattern","RegExp","requiredInId","replace","idPattern","FlagValidationError","constructor","message","parseCommonFlags","flags","context","errors","parseManifestDir","verbose","extractManifest","parseStoreSchemasConfig","commonFlags","parseWorkspace","idPrefix","parseIdPrefix","schemaRequired","assertNoErrors","parseListSchemasConfig","id","parseId","parseDeleteSchemasConfig","ids","parseIds","dataset","parseDataset","error","assetIdsMatchesWorkspaces","invalidIds","parsedId","parseWorkspaceSchemaId","filter","some","w","parseNonEmptyString","split","trim","uniqueIds","uniqBy","push","undefined","schemaId","trimmedId","match","endsWith","flagName","flag","isString","getProjectIdMismatchMessage","operation","projectId","throwWriteProjectIdMismatch","filterLogReadProjectIdMismatch","canRead","warn","isManifestExtractSatisfied","args","manifestExtractor","err","createManifestExtractor","extractManifestSafe","extOptions","groupOrCommand","argv","argsWithoutOptions","extraArguments","createSchemaApiClient","apiClient","client","requireUser","requireProject","withConfig","apiVersion","useCdn","config"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"schemaApiClient.js","sources":["../../src/_internal/manifest/manifestTypes.ts","../../src/_internal/manifest/manifestTypeHelpers.ts","../../src/_internal/cli/actions/schema/utils/manifestReader.ts","../../src/_internal/cli/actions/schema/utils/schemaStoreValidation.ts","../../src/_internal/cli/actions/schema/utils/mainfestExtractor.ts","../../src/_internal/cli/actions/schema/utils/schemaApiClient.ts"],"sourcesContent":["import {type SanityDocumentLike} from '@sanity/types'\n\nexport const SANITY_WORKSPACE_SCHEMA_TYPE = 'sanity.workspace.schema'\n\nexport type ManifestSerializable =\n | string\n | number\n | boolean\n | {[k: string]: ManifestSerializable}\n | ManifestSerializable[]\n\nexport interface CreateManifest {\n version: number\n createdAt: string\n workspaces: ManifestWorkspaceFile[]\n}\n\nexport interface ManifestWorkspaceFile extends Omit<CreateWorkspaceManifest, 'schema' | 'tools'> {\n schema: string // filename\n tools: string // filename\n}\n\nexport interface CreateWorkspaceManifest {\n name: string\n title?: string\n subtitle?: string\n basePath: string\n dataset: string\n projectId: string\n schema: ManifestSchemaType[]\n tools: ManifestTool[]\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n}\n\nexport interface ManifestSchemaType {\n type: string\n name: string\n title?: string\n deprecated?: {\n reason: string\n }\n readOnly?: boolean | 'conditional'\n hidden?: boolean | 'conditional'\n validation?: ManifestValidationGroup[]\n fields?: ManifestField[]\n to?: ManifestReferenceMember[]\n of?: ManifestArrayMember[]\n preview?: {\n select: Record<string, string>\n }\n fieldsets?: ManifestFieldset[]\n options?: Record<string, ManifestSerializable>\n //portable text\n marks?: {\n annotations?: ManifestArrayMember[]\n decorators?: ManifestTitledValue[]\n }\n lists?: ManifestTitledValue[]\n styles?: ManifestTitledValue[]\n\n // userland (assignable to ManifestSerializable | undefined)\n // not included to add some typesafty to extractManifest\n // [index: string]: unknown\n}\n\nexport interface ManifestFieldset {\n name: string\n title?: string\n [index: string]: ManifestSerializable | undefined\n}\n\nexport interface ManifestTitledValue {\n value: string\n title?: string\n}\n\nexport type ManifestField = ManifestSchemaType & {fieldset?: string}\nexport type ManifestArrayMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\nexport type ManifestReferenceMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\n\nexport interface ManifestValidationGroup {\n rules: ManifestValidationRule[]\n message?: string\n level?: 'error' | 'warning' | 'info'\n}\n\nexport type ManifestValidationRule = {\n flag: string\n constraint?: ManifestSerializable\n [index: string]: ManifestSerializable | undefined\n}\n\nexport interface ManifestTool {\n name: string\n title: string\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n type: string | null\n}\n\nexport type DefaultWorkspaceSchemaId = `${typeof SANITY_WORKSPACE_SCHEMA_TYPE}.${string}`\nexport type PrefixedWorkspaceSchemaId = `${string}.${DefaultWorkspaceSchemaId}`\nexport type WorkspaceSchemaId = DefaultWorkspaceSchemaId | PrefixedWorkspaceSchemaId\n\nexport interface StoredWorkspaceSchema extends SanityDocumentLike {\n _type: typeof SANITY_WORKSPACE_SCHEMA_TYPE\n _id: WorkspaceSchemaId\n workspace: ManifestWorkspaceFile\n /**\n * JSON.stringify version of ManifestSchemaType[] to save on attribute paths.\n * Consumers must use JSON.parse on the value.\n */\n schema: string\n //schema: ManifestSchemaType[]\n}\n","import {\n type CrossDatasetReferenceSchemaType,\n type ObjectField,\n type ObjectSchemaType,\n type ReferenceSchemaType,\n type SchemaType,\n} from '@sanity/types'\n\nconst DEFAULT_IMAGE_FIELDS = ['asset', 'hotspot', 'crop']\nconst DEFAULT_FILE_FIELDS = ['asset']\nconst DEFAULT_GEOPOINT_FIELDS = ['lat', 'lng', 'alt']\nconst DEFAULT_SLUG_FIELDS = ['current', 'source']\n\nexport function getCustomFields(type: ObjectSchemaType): (ObjectField & {fieldset?: string})[] {\n const fields = type.fieldsets\n ? type.fieldsets.flatMap((fs) => {\n if (fs.single) {\n return fs.field\n }\n return fs.fields.map((field) => ({\n ...field,\n fieldset: fs.name,\n }))\n })\n : type.fields\n\n if (isType(type, 'block')) {\n return []\n }\n if (isType(type, 'slug')) {\n return fields.filter((f) => !DEFAULT_SLUG_FIELDS.includes(f.name))\n }\n if (isType(type, 'geopoint')) {\n return fields.filter((f) => !DEFAULT_GEOPOINT_FIELDS.includes(f.name))\n }\n if (isType(type, 'image')) {\n return fields.filter((f) => !DEFAULT_IMAGE_FIELDS.includes(f.name))\n }\n if (isType(type, 'file')) {\n return fields.filter((f) => !DEFAULT_FILE_FIELDS.includes(f.name))\n }\n return fields\n}\n\nexport function isReference(type: SchemaType): type is ReferenceSchemaType {\n return isType(type, 'reference')\n}\n\nexport function isCrossDatasetReference(type: SchemaType): type is CrossDatasetReferenceSchemaType {\n return isType(type, 'crossDatasetReference')\n}\n\nexport function isObjectField(maybeOjectField: unknown): boolean {\n return (\n typeof maybeOjectField === 'object' && maybeOjectField !== null && 'name' in maybeOjectField\n )\n}\n\nexport function isCustomized(maybeCustomized: SchemaType): boolean {\n const hasFieldsArray =\n isObjectField(maybeCustomized) &&\n !isType(maybeCustomized, 'reference') &&\n !isType(maybeCustomized, 'crossDatasetReference') &&\n 'fields' in maybeCustomized &&\n Array.isArray(maybeCustomized.fields)\n\n if (!hasFieldsArray) {\n return false\n }\n\n const fields = getCustomFields(maybeCustomized)\n return !!fields.length\n}\n\nexport function isType(schemaType: SchemaType, typeName: string): boolean {\n if (schemaType.name === typeName) {\n return true\n }\n if (!schemaType.type) {\n return false\n }\n return isType(schemaType.type, typeName)\n}\n\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object'\n}\n\nexport function isPrimitive(value: unknown): value is string | boolean | number {\n return isString(value) || isBoolean(value) || isNumber(value)\n}\n\nexport function isString(value: unknown): value is string {\n return typeof value === 'string'\n}\n\nfunction isNumber(value: unknown): value is number {\n return typeof value === 'boolean'\n}\n\nfunction isBoolean(value: unknown): value is boolean {\n return typeof value === 'number'\n}\n","import {type Stats} from 'node:fs'\nimport {readFile, stat} from 'node:fs/promises'\nimport path, {join, resolve} from 'node:path'\n\nimport {type CliOutputter} from '@sanity/cli'\nimport chalk from 'chalk'\n\nimport {type CreateManifest, type ManifestSchemaType} from '../../../../manifest/manifestTypes'\nimport {MANIFEST_FILENAME} from '../../manifest/extractManifestAction'\nimport {type StoreSchemasFlags} from '../storeSchemasAction'\n\nexport type ManifestJsonReader = <T>(\n filePath: string,\n) => Promise<JsonFileParseSuccess<T> | undefined>\n\nexport type CreateManifestReaderFactory = (args: {\n manifestDir: string\n output: CliOutputter\n jsonReader?: <T>(filePath: string) => Promise<JsonFileParseSuccess<T> | undefined>\n}) => CreateManifestReader\n\nexport interface CreateManifestReader {\n getManifest: () => Promise<CreateManifest>\n getWorkspaceSchema: (workspaceName: string) => Promise<ManifestSchemaType[]>\n}\n\ninterface JsonFileParseSuccess<T> {\n parsedJson: T\n path: string\n lastModified: string\n}\n\n/**\n * The manifest reader will try to read manifest and workspace schema files _once_ and cache a successful result.\n * If you need to re-read the manifest from disk, create a new instance.\n */\nexport const createManifestReader: CreateManifestReaderFactory = ({\n manifestDir,\n output,\n jsonReader = parseJsonFile,\n}) => {\n let parsedManifest: JsonFileParseSuccess<CreateManifest>\n const parsedWorkspaces: Record<string, JsonFileParseSuccess<ManifestSchemaType[]> | undefined> =\n {}\n\n const getManifest: CreateManifestReader['getManifest'] = async () => {\n if (parsedManifest) {\n return parsedManifest?.parsedJson\n }\n\n const manifestFile = path.join(manifestDir, MANIFEST_FILENAME)\n\n const result = await jsonReader<CreateManifest>(manifestFile)\n if (!result) {\n throw new Error(\n `Manifest does not exist at ${manifestFile}. To create the manifest file, re-run with --${'extract-manifest' satisfies keyof StoreSchemasFlags} or run \"sanity manifest extract\"`,\n )\n }\n\n output.print(\n chalk.gray(`↳ Read manifest from ${manifestFile} (last modified: ${result.lastModified})`),\n )\n\n parsedManifest = result\n return result.parsedJson\n }\n\n const getWorkspaceSchema: CreateManifestReader['getWorkspaceSchema'] = async (workspaceName) => {\n if (parsedWorkspaces[workspaceName]) {\n return parsedWorkspaces[workspaceName]?.parsedJson\n }\n const manifest = await getManifest()\n if (!manifest) {\n throw Error('Manifest is required to read workspace schema.')\n }\n\n const workspaceManifest = manifest.workspaces.find(\n (workspace) => workspace.name === workspaceName,\n )\n\n if (!workspaceManifest) {\n throw Error(`No workspace named \"${workspaceName}\" found in manifest.`)\n }\n\n const workspaceSchemaFile = path.join(manifestDir, workspaceManifest.schema)\n const result = await jsonReader<ManifestSchemaType[]>(workspaceSchemaFile)\n if (!result) {\n throw Error(`Workspace schema file at \"${workspaceSchemaFile}\" does not exist.`)\n }\n parsedWorkspaces[workspaceName] = result\n return result.parsedJson\n }\n return {\n getManifest,\n getWorkspaceSchema,\n }\n}\n\nexport const getManifestDirPath = (workDir: string, customPath?: string) => {\n const defaultOutputDir = resolve(join(workDir, 'dist'))\n\n const outputDir = resolve(defaultOutputDir)\n const defaultStaticPath = join(outputDir, 'static')\n\n const staticPath = customPath ?? defaultStaticPath\n return path.resolve(process.cwd(), staticPath)\n}\n\nasync function parseJsonFile<T>(filePath: string): Promise<JsonFileParseSuccess<T> | undefined> {\n let stats: Stats\n try {\n stats = await stat(filePath)\n } catch (err) {\n // file does not exist\n return undefined\n }\n const content = await readFile(filePath, 'utf-8')\n const lastModified = stats.mtime.toISOString()\n const json = JSON.parse(content) as T\n if (!json) {\n throw new Error(`JSON file \"${filePath}\" was empty.`)\n }\n return {\n parsedJson: json,\n path: filePath,\n lastModified,\n }\n}\n","import {type CliOutputter} from '@sanity/cli'\nimport uniqBy from 'lodash/uniqBy'\n\nimport {isDefined} from '../../../../manifest/manifestTypeHelpers'\nimport {SANITY_WORKSPACE_SCHEMA_TYPE} from '../../../../manifest/manifestTypes'\nimport {type DeleteSchemaFlags} from '../deleteSchemaAction'\nimport {type SchemaListFlags} from '../listSchemasAction'\nimport {type StoreSchemasFlags} from '../storeSchemasAction'\nimport {getManifestDirPath} from './manifestReader'\nimport {getStringArrayOutString} from './storeSchemaOutStrings'\n\nexport const validForIdChars = 'a-zA-Z0-9._-'\nexport const validForIdPattern = new RegExp(`^[${validForIdChars}]+$`, 'g')\n\nconst requiredInId = SANITY_WORKSPACE_SCHEMA_TYPE.replace(/[.]/g, '\\\\.')\nconst idPattern = new RegExp(\n `^(?:[${validForIdChars}]+?\\\\.)?${requiredInId}\\\\.([${validForIdChars}]+)$`,\n)\n\nexport class FlagValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'FlagValidationError'\n }\n}\n\ninterface WorkspaceSchemaId {\n schemaId: string\n workspace: string\n}\n\nexport interface StoreSchemaCommonFlags {\n 'extract-manifest'?: boolean\n 'manifest-dir'?: string\n 'verbose'?: boolean\n}\n\nfunction parseCommonFlags(\n flags: StoreSchemaCommonFlags,\n context: {workDir: string},\n errors: string[],\n) {\n const manifestDir = parseManifestDir(flags, errors)\n const verbose = !!flags.verbose\n const extractManifest = !!flags['extract-manifest']\n\n const fullManifestDir = getManifestDirPath(context.workDir, manifestDir)\n return {\n manifestDir: fullManifestDir,\n verbose,\n extractManifest,\n }\n}\n\nexport function parseStoreSchemasConfig(flags: StoreSchemasFlags, context: {workDir: string}) {\n const errors: string[] = []\n\n const commonFlags = parseCommonFlags(flags, context, errors)\n const workspaceName = parseWorkspace(flags, errors)\n const idPrefix = parseIdPrefix(flags, errors)\n const schemaRequired = !!flags['schema-required']\n\n assertNoErrors(errors)\n return {...commonFlags, workspaceName, idPrefix, schemaRequired}\n}\n\nexport function parseListSchemasConfig(flags: SchemaListFlags, context: {workDir: string}) {\n const errors: string[] = []\n\n const commonFlags = parseCommonFlags(flags, context, errors)\n const id = parseId(flags, errors)\n const json = !!flags.json\n\n assertNoErrors(errors)\n return {...commonFlags, json, id}\n}\n\nexport function parseDeleteSchemasConfig(flags: DeleteSchemaFlags, context: {workDir: string}) {\n const errors: string[] = []\n\n const commonFlags = parseCommonFlags(flags, context, errors)\n const ids = parseIds(flags, errors)\n const dataset = parseDataset(flags, errors)\n\n assertNoErrors(errors)\n return {...commonFlags, dataset, ids}\n}\n\nfunction assertNoErrors(errors: string[]) {\n if (errors.length) {\n throw new FlagValidationError(\n `Invalid arguments:\\n${errors.map((error) => ` - ${error}`).join('\\n')}`,\n )\n }\n}\n\nexport function assertIdsMatchesWorkspaces(ids: string[], workspaces: {name: string}[]) {\n const invalidIds = ids\n .map((id) => ({\n id,\n parsedId: parseWorkspaceSchemaId(id, []),\n }))\n .filter(({parsedId}) => !parsedId || !workspaces.some((w) => w.name === parsedId.workspace))\n\n if (invalidIds.length)\n throw new FlagValidationError(\n 'Ids must match workspaces in scope, but got:\\n' +\n ` ${getStringArrayOutString(invalidIds.map((id) => id.id))}`,\n )\n}\n\nfunction parseIds(flags: {ids?: unknown}, errors: string[]): WorkspaceSchemaId[] {\n const parsedIds = parseNonEmptyString(flags, 'ids', errors)\n const ids = parsedIds\n .split(',')\n .map((id) => id.trim())\n .filter((id) => !!id)\n .map((id) => parseWorkspaceSchemaId(id, errors))\n .filter(isDefined)\n\n const uniqueIds = uniqBy(ids, 'schemaId' satisfies keyof (typeof ids)[number])\n if (uniqueIds.length < ids.length) {\n errors.push(`ids contains duplicates`)\n }\n return uniqueIds\n}\n\nfunction parseId(flags: {id?: unknown}, errors: string[]) {\n const id = flags.id === undefined ? undefined : parseNonEmptyString(flags, 'id', errors)\n if (id) {\n return parseWorkspaceSchemaId(id, errors)?.schemaId\n }\n return undefined\n}\n\nexport function parseWorkspaceSchemaId(id: string, errors: string[]) {\n const trimmedId = id.trim()\n\n if (!trimmedId.match(validForIdPattern)) {\n errors.push(`id can only contain characters in [${validForIdChars}] but found: ${trimmedId}`)\n return undefined\n }\n\n const match = trimmedId.match(idPattern)\n const workspace = match?.[1] ?? ''\n if (!workspace) {\n errors.push(\n `id must end with ${SANITY_WORKSPACE_SCHEMA_TYPE}.<workspaceName> but found: ${trimmedId}`,\n )\n return undefined\n }\n return {\n schemaId: trimmedId,\n workspace,\n }\n}\n\nfunction parseDataset(flags: {dataset?: unknown}, errors: string[]) {\n return flags.dataset === undefined ? undefined : parseNonEmptyString(flags, 'dataset', errors)\n}\n\nfunction parseWorkspace(flags: {workspace?: unknown}, errors: string[]) {\n return flags.workspace === undefined ? undefined : parseNonEmptyString(flags, 'workspace', errors)\n}\n\nfunction parseManifestDir(flags: {'manifest-dir'?: unknown}, errors: string[]) {\n return flags['manifest-dir'] === undefined\n ? undefined\n : parseNonEmptyString(flags, 'manifest-dir', errors)\n}\n\nfunction parseIdPrefix(flags: {'id-prefix'?: unknown}, errors: string[]) {\n if (flags['id-prefix'] === undefined) {\n return undefined\n }\n\n const idPrefix = parseNonEmptyString(flags, 'id-prefix', errors)\n if (idPrefix.endsWith('.')) {\n errors.push(`idx-prefix argument cannot end with . (period), but was ${idPrefix}`)\n }\n\n if (!idPrefix.match(validForIdPattern)) {\n errors.push(\n `idx-prefix can only contain _id compatible characters [${validForIdChars}], but was ${idPrefix}`,\n )\n }\n\n return idPrefix\n}\n\nfunction parseNonEmptyString<\n Flag extends string,\n Flags extends Partial<Record<Flag, unknown | undefined>>,\n>(flags: Flags, flagName: Flag, errors: string[]): string {\n const flag = flags[flagName]\n if (!isString(flag) || !flag) {\n errors.push(`${flagName} argument is empty`)\n return ''\n }\n return flag\n}\n\nfunction isString(flag: unknown): flag is string {\n return typeof flag === 'string'\n}\n\nfunction getProjectIdMismatchMessage(\n workspace: {name: string; projectId: string},\n operation: 'read' | 'write',\n) {\n return `No permissions to ${operation} schema for workspace \"${workspace.name}\" with projectId \"${workspace.projectId}\"`\n}\n\n/**\n * At the moment schema store commands does not support studios where workspaces have multiple projects\n */\nexport function throwWriteProjectIdMismatch(\n workspace: {name: string; projectId: string},\n projectId: string,\n): void {\n if (workspace.projectId !== projectId) {\n throw new Error(getProjectIdMismatchMessage(workspace, 'write'))\n }\n}\n\nexport function filterLogReadProjectIdMismatch(\n workspace: {name: string; projectId: string},\n projectId: string,\n output: CliOutputter,\n) {\n const canRead = workspace.projectId === projectId\n if (!canRead) output.warn(`${getProjectIdMismatchMessage(workspace, 'read')} – ignoring it.`)\n return canRead\n}\n","import {type CliCommandArguments, type CliCommandContext, type CliOutputter} from '@sanity/cli'\nimport chalk from 'chalk'\n\nimport {type ExtractManifestFlags, extractManifestSafe} from '../../manifest/extractManifestAction'\nimport {FlagValidationError} from './schemaStoreValidation'\n\nexport type ManifestExtractor = (manifestDir: string) => Promise<void>\n\nexport async function isManifestExtractSatisfied(args: {\n schemaRequired: boolean\n extractManifest: boolean\n manifestDir: string\n manifestExtractor: (manifestDir: string) => Promise<void>\n output: CliOutputter\n}) {\n const {schemaRequired, extractManifest, manifestDir, manifestExtractor, output} = args\n if (!extractManifest) {\n return true\n }\n try {\n // a successful manifest extract will write a new manifest file, which manifestReader will then read from disk\n await manifestExtractor(manifestDir)\n return true\n } catch (err) {\n if (schemaRequired || err instanceof FlagValidationError) {\n throw err\n } else {\n output.print(chalk.gray(`↳ Failed to extract manifest:\\n ${err.message}`))\n return false\n }\n }\n}\n\nexport function createManifestExtractor(context: CliCommandContext) {\n return async (manifestDir: string) => {\n const error = await extractManifestSafe(\n {\n extOptions: {path: manifestDir},\n groupOrCommand: 'extract',\n argv: [],\n argsWithoutOptions: [],\n extraArguments: [],\n } as CliCommandArguments<ExtractManifestFlags>,\n context,\n )\n if (error) {\n throw error\n }\n }\n}\n","import {type CliApiClient} from '@sanity/cli'\n\nexport function createSchemaApiClient(apiClient: CliApiClient) {\n const client = apiClient({\n requireUser: true,\n requireProject: true,\n }).withConfig({apiVersion: 'v2025-03-01', useCdn: false})\n\n const projectId = client.config().projectId\n const dataset = client.config().dataset\n if (!projectId) throw new Error('Project ID is not defined')\n if (!dataset) throw new Error('Dataset is not defined')\n\n return {\n client,\n projectId,\n dataset,\n }\n}\n"],"names":["SANITY_WORKSPACE_SCHEMA_TYPE","isDefined","value","createManifestReader","manifestDir","output","jsonReader","parseJsonFile","parsedManifest","parsedWorkspaces","getManifest","parsedJson","manifestFile","path","join","MANIFEST_FILENAME","result","Error","print","chalk","gray","lastModified","getWorkspaceSchema","workspaceName","manifest","workspaceManifest","workspaces","find","workspace","name","workspaceSchemaFile","schema","getManifestDirPath","workDir","customPath","defaultOutputDir","resolve","outputDir","defaultStaticPath","staticPath","process","cwd","filePath","stats","stat","content","readFile","mtime","toISOString","json","JSON","parse","validForIdChars","validForIdPattern","RegExp","requiredInId","replace","idPattern","FlagValidationError","constructor","message","parseCommonFlags","flags","context","errors","parseManifestDir","verbose","extractManifest","parseStoreSchemasConfig","commonFlags","parseWorkspace","idPrefix","parseIdPrefix","schemaRequired","assertNoErrors","parseListSchemasConfig","id","parseId","parseDeleteSchemasConfig","ids","parseIds","dataset","parseDataset","length","map","error","parseNonEmptyString","split","trim","filter","parseWorkspaceSchemaId","uniqueIds","uniqBy","push","undefined","schemaId","trimmedId","match","endsWith","flagName","flag","isString","getProjectIdMismatchMessage","operation","projectId","throwWriteProjectIdMismatch","filterLogReadProjectIdMismatch","canRead","warn","isManifestExtractSatisfied","args","manifestExtractor","err","createManifestExtractor","extractManifestSafe","extOptions","groupOrCommand","argv","argsWithoutOptions","extraArguments","createSchemaApiClient","apiClient","client","requireUser","requireProject","withConfig","apiVersion","useCdn","config"],"mappings":"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"}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
function getDatasetsOutString(datasets) {
|
3
|
+
return datasets.length === 1 ? `dataset "${datasets[0]}"` : `datasets ${getStringArrayOutString(datasets)}`;
|
4
|
+
}
|
5
|
+
function getStringArrayOutString(array) {
|
6
|
+
return `[${array.map((d) => `"${d}"`).join(",")}]`;
|
7
|
+
}
|
8
|
+
function getStringList(array) {
|
9
|
+
return array.map((s) => `- "${s}"`).join(`
|
10
|
+
`);
|
11
|
+
}
|
12
|
+
exports.getDatasetsOutString = getDatasetsOutString;
|
13
|
+
exports.getStringList = getStringList;
|
14
|
+
//# sourceMappingURL=storeSchemaOutStrings.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"storeSchemaOutStrings.js","sources":["../../src/_internal/cli/actions/schema/utils/storeSchemaOutStrings.ts"],"sourcesContent":["export function getDatasetsOutString(datasets: string[]) {\n return datasets.length === 1\n ? `dataset \"${datasets[0]}\"`\n : `datasets ${getStringArrayOutString(datasets)}`\n}\n\nexport function getStringArrayOutString(array: string[]) {\n return `[${array.map((d) => `\"${d}\"`).join(',')}]`\n}\n\nexport function getStringList(array: string[]) {\n return array.map((s) => `- \"${s}\"`).join('\\n')\n}\n"],"names":["getDatasetsOutString","datasets","length","getStringArrayOutString","array","map","d","join","getStringList","s"],"mappings":";AAAO,SAASA,qBAAqBC,UAAoB;AAChDA,SAAAA,SAASC,WAAW,IACvB,YAAYD,SAAS,CAAC,CAAC,MACvB,YAAYE,wBAAwBF,QAAQ,CAAC;AACnD;AAEO,SAASE,wBAAwBC,OAAiB;AAChD,SAAA,IAAIA,MAAMC,IAAKC,CAAM,MAAA,IAAIA,CAAC,GAAG,EAAEC,KAAK,GAAG,CAAC;AACjD;AAEO,SAASC,cAAcJ,OAAiB;AAC7C,SAAOA,MAAMC,IAAKI,CAAAA,MAAM,MAAMA,CAAC,GAAG,EAAEF,KAAK;AAAA,CAAI;AAC/C;;;"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "sanity",
|
3
|
-
"version": "3.77.3-server-side-schemas.
|
3
|
+
"version": "3.77.3-server-side-schemas.37+5c53e652cf",
|
4
4
|
"description": "Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches",
|
5
5
|
"keywords": [
|
6
6
|
"sanity",
|
@@ -161,11 +161,11 @@
|
|
161
161
|
"@rexxars/react-json-inspector": "^9.0.1",
|
162
162
|
"@sanity/asset-utils": "^2.0.6",
|
163
163
|
"@sanity/bifur-client": "^0.4.1",
|
164
|
-
"@sanity/cli": "3.77.3-server-side-schemas.
|
164
|
+
"@sanity/cli": "3.77.3-server-side-schemas.37+5c53e652cf",
|
165
165
|
"@sanity/client": "^6.28.3",
|
166
166
|
"@sanity/color": "^3.0.0",
|
167
167
|
"@sanity/comlink": "^3.0.1",
|
168
|
-
"@sanity/diff": "3.77.3-server-side-schemas.
|
168
|
+
"@sanity/diff": "3.77.3-server-side-schemas.37+5c53e652cf",
|
169
169
|
"@sanity/diff-match-patch": "^3.1.1",
|
170
170
|
"@sanity/diff-patch": "^5.0.0",
|
171
171
|
"@sanity/eventsource": "^5.0.0",
|
@@ -175,15 +175,15 @@
|
|
175
175
|
"@sanity/import": "^3.38.0",
|
176
176
|
"@sanity/insert-menu": "^1.1.6",
|
177
177
|
"@sanity/logos": "^2.1.13",
|
178
|
-
"@sanity/migrate": "3.77.3-server-side-schemas.
|
179
|
-
"@sanity/mutator": "3.77.3-server-side-schemas.
|
178
|
+
"@sanity/migrate": "3.77.3-server-side-schemas.37+5c53e652cf",
|
179
|
+
"@sanity/mutator": "3.77.3-server-side-schemas.37+5c53e652cf",
|
180
180
|
"@sanity/presentation-comlink": "^1.0.12",
|
181
181
|
"@sanity/preview-url-secret": "^2.1.6",
|
182
|
-
"@sanity/schema": "3.77.3-server-side-schemas.
|
182
|
+
"@sanity/schema": "3.77.3-server-side-schemas.37+5c53e652cf",
|
183
183
|
"@sanity/telemetry": "^0.7.7",
|
184
|
-
"@sanity/types": "3.77.3-server-side-schemas.
|
184
|
+
"@sanity/types": "3.77.3-server-side-schemas.37+5c53e652cf",
|
185
185
|
"@sanity/ui": "^2.15.7",
|
186
|
-
"@sanity/util": "3.77.3-server-side-schemas.
|
186
|
+
"@sanity/util": "3.77.3-server-side-schemas.37+5c53e652cf",
|
187
187
|
"@sanity/uuid": "^3.0.2",
|
188
188
|
"@sentry/react": "^8.33.0",
|
189
189
|
"@tanstack/react-table": "^8.16.0",
|
@@ -282,7 +282,7 @@
|
|
282
282
|
"@repo/dev-aliases": "3.79.0",
|
283
283
|
"@repo/package.config": "3.79.0",
|
284
284
|
"@repo/test-config": "3.79.0",
|
285
|
-
"@sanity/codegen": "3.77.3-server-side-schemas.
|
285
|
+
"@sanity/codegen": "3.77.3-server-side-schemas.37+5c53e652cf",
|
286
286
|
"@sanity/generate-help-url": "^3.0.0",
|
287
287
|
"@sanity/pkg-utils": "6.13.4",
|
288
288
|
"@sanity/tsdoc": "1.0.169",
|
@@ -327,5 +327,5 @@
|
|
327
327
|
"engines": {
|
328
328
|
"node": ">=18"
|
329
329
|
},
|
330
|
-
"gitHead": "
|
330
|
+
"gitHead": "5c53e652cf337fdc54ef6a64330f263bf13c7bd1"
|
331
331
|
}
|