sanity
Version:
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
113 lines (112 loc) • 4.18 kB
JavaScript
import chalk from "chalk";
import { sortBy } from "lodash-es";
import { parseListSchemasConfig, ensureManifestExtractSatisfied, createSchemaApiClient, createManifestReader, projectIdDatasetPair, SCHEMA_PERMISSION_HELP_TEXT, isDefined, getProjectIdDatasetsOutString, createManifestExtractor } from "./schemaStoreOutStrings.js";
import { uniqueProjectIdDataset } from "./uniqueProjectIdDataset.js";
class DatasetError extends Error {
constructor(args) {
super(args.options?.cause?.message, args.options), this.projectId = args.projectId, this.dataset = args.dataset, this.name = "DatasetError";
}
}
function listSchemasActionForCommand(flags, context) {
return listSchemasAction(flags, {
...context,
manifestExtractor: createManifestExtractor(context)
});
}
async function listSchemasAction(flags, context) {
const {
json,
id,
manifestDir,
extractManifest
} = parseListSchemasConfig(flags, context), {
output,
apiClient,
jsonReader,
manifestExtractor
} = context;
if (!await ensureManifestExtractSatisfied({
schemaRequired: !0,
extractManifest,
manifestDir,
manifestExtractor,
output,
telemetry: context.telemetry
}))
return "failure";
const {
client
} = createSchemaApiClient(apiClient), manifest = await createManifestReader({
manifestDir,
output,
jsonReader
}).getManifest(), projectDatasets = uniqueProjectIdDataset(manifest.workspaces), schemas = (await Promise.allSettled(projectDatasets.map(async ({
projectId,
dataset
}) => {
try {
const datasetClient = client.withConfig({
projectId,
dataset
});
return id ? await datasetClient.request({
method: "GET",
url: `/projects/${projectId}/datasets/${dataset}/schemas/${id}`
}) : await datasetClient.request({
method: "GET",
url: `/projects/${projectId}/datasets/${dataset}/schemas`
});
} catch (error) {
throw new DatasetError({
projectId,
dataset,
options: {
cause: error
}
});
}
}))).map((result) => {
if (result.status === "fulfilled") return result.value;
const error = result.reason;
if (error instanceof DatasetError) {
if ("cause" in error && error.cause && typeof error.cause == "object" && "statusCode" in error.cause && error.cause.statusCode === 401)
return output.warn(`\u21B3 No permissions to read schema from ${projectIdDatasetPair(error)}. ${SCHEMA_PERMISSION_HELP_TEXT}:
${chalk.red(`${error.message}`)}`), [];
const message = chalk.red(`\u21B3 Failed to fetch schema from ${projectIdDatasetPair(error)}:
${error.message}`);
output.error(message);
} else
throw error;
return [];
}).filter(isDefined).flat();
if (schemas.length === 0) {
const datasetString = getProjectIdDatasetsOutString(projectDatasets);
return output.error(id ? `Schema for id "${id}" not found in ${datasetString}` : `No schemas found in ${datasetString}`), "failure";
}
return json ? output.print(`${JSON.stringify(id ? schemas[0] : schemas, null, 2)}`) : printSchemaList({
schemas,
output,
manifest
}), "success";
}
function printSchemaList({
schemas,
output,
manifest
}) {
const ordered = sortBy(schemas.map(({
_createdAt: createdAt,
_id: id,
workspace
}) => {
const workspaceData = manifest.workspaces.find((w) => w.name === workspace.name);
if (workspaceData)
return [id, workspace.name, workspaceData.dataset, workspaceData.projectId, createdAt].map(String);
}).filter(isDefined), ["createdAt"]), headings = ["Id", "Workspace", "Dataset", "ProjectId", "CreatedAt"], rows = ordered.reverse(), maxWidths = rows.reduce((max, row) => row.map((current, index) => Math.max(current.length, max[index])), headings.map((str) => str.length)), rowToString = (row) => row.map((col, i) => `${col}`.padEnd(maxWidths[i])).join(" ");
output.print(chalk.cyan(rowToString(headings))), rows.forEach((row) => output.print(rowToString(row)));
}
export {
listSchemasActionForCommand as default,
listSchemasAction
};
//# sourceMappingURL=listSchemasAction.js.map