@sanity/cli 6.0.0-alpha.20 → 6.0.0-alpha.21
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/README.md +405 -225
- package/dist/actions/auth/authServer.js +13 -11
- package/dist/actions/auth/authServer.js.map +1 -1
- package/dist/actions/auth/login/getProvider.js +43 -39
- package/dist/actions/auth/login/getProvider.js.map +1 -1
- package/dist/actions/auth/login/getSSOProvider.js +25 -19
- package/dist/actions/auth/login/getSSOProvider.js.map +1 -1
- package/dist/actions/auth/login/login.js +12 -33
- package/dist/actions/auth/login/login.js.map +1 -1
- package/dist/actions/auth/types.js.map +1 -1
- package/dist/actions/codemods/reactIconsV3.js +2 -2
- package/dist/actions/codemods/reactIconsV3.js.map +1 -1
- package/dist/actions/debug/formatters.js +22 -0
- package/dist/actions/debug/formatters.js.map +1 -0
- package/dist/actions/dev/getDashboardAppUrl.js +3 -3
- package/dist/actions/dev/getDashboardAppUrl.js.map +1 -1
- package/dist/actions/documents/validateDocuments.worker.js +2 -2
- package/dist/actions/documents/validateDocuments.worker.js.map +1 -1
- package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js +1 -1
- package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js.map +1 -1
- package/dist/actions/documents/validation/reporters/prettyReporter/tree.js +108 -0
- package/dist/actions/documents/validation/reporters/prettyReporter/tree.js.map +1 -0
- package/dist/actions/graphql/SchemaError.js +4 -26
- package/dist/actions/graphql/SchemaError.js.map +1 -1
- package/dist/actions/graphql/extractFromSanitySchema.js +3 -4
- package/dist/actions/graphql/extractFromSanitySchema.js.map +1 -1
- package/dist/actions/graphql/extractGraphQLAPIs.js +150 -0
- package/dist/actions/graphql/extractGraphQLAPIs.js.map +1 -0
- package/dist/actions/graphql/extractGraphQLAPIs.worker.js +12 -0
- package/dist/actions/graphql/extractGraphQLAPIs.worker.js.map +1 -0
- package/dist/actions/graphql/gen1/index.js +5 -5
- package/dist/actions/graphql/gen1/index.js.map +1 -1
- package/dist/actions/graphql/gen2/index.js +6 -6
- package/dist/actions/graphql/gen2/index.js.map +1 -1
- package/dist/actions/graphql/gen3/generateTypeQueries.js +2 -3
- package/dist/actions/graphql/gen3/generateTypeQueries.js.map +1 -1
- package/dist/actions/graphql/gen3/index.js +6 -7
- package/dist/actions/graphql/gen3/index.js.map +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js +12 -35
- package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.worker.js +75 -106
- package/dist/actions/graphql/getGraphQLAPIs.worker.js.map +1 -1
- package/dist/actions/graphql/helpers.js +13 -0
- package/dist/actions/graphql/helpers.js.map +1 -1
- package/dist/actions/graphql/resolveGraphQLApisFromWorkspaces.js +187 -0
- package/dist/actions/graphql/resolveGraphQLApisFromWorkspaces.js.map +1 -0
- package/dist/actions/graphql/types.js +1 -1
- package/dist/actions/graphql/types.js.map +1 -1
- package/dist/actions/init/bootstrapLocalTemplate.js +2 -1
- package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
- package/dist/actions/init/bootstrapRemoteTemplate.js +6 -5
- package/dist/actions/init/bootstrapRemoteTemplate.js.map +1 -1
- package/dist/actions/init/createPackageManifest.js +5 -0
- package/dist/actions/init/createPackageManifest.js.map +1 -1
- package/dist/actions/init/templates/appQuickstart.js +2 -1
- package/dist/actions/init/templates/appQuickstart.js.map +1 -1
- package/dist/actions/init/templates/appSanityUi.js +2 -1
- package/dist/actions/init/templates/appSanityUi.js.map +1 -1
- package/dist/actions/init/types.js.map +1 -1
- package/dist/actions/media/importMedia.js +1 -2
- package/dist/actions/media/importMedia.js.map +1 -1
- package/dist/actions/projects/getManageUrl.js +1 -2
- package/dist/actions/projects/getManageUrl.js.map +1 -1
- package/dist/actions/schema/validateSchema.worker.js +1 -3
- package/dist/actions/schema/validateSchema.worker.js.map +1 -1
- package/dist/actions/telemetry/isTrueish.js +10 -0
- package/dist/actions/telemetry/isTrueish.js.map +1 -0
- package/dist/actions/telemetry/resolveConsent.js +2 -1
- package/dist/actions/telemetry/resolveConsent.js.map +1 -1
- package/dist/actions/telemetry/setConsent.js +2 -1
- package/dist/actions/telemetry/setConsent.js.map +1 -1
- package/dist/actions/versions/findSanityModulesVersions.js +1 -2
- package/dist/actions/versions/findSanityModulesVersions.js.map +1 -1
- package/dist/commands/backup/disable.js +21 -1
- package/dist/commands/backup/disable.js.map +1 -1
- package/dist/commands/backup/download.js +18 -4
- package/dist/commands/backup/download.js.map +1 -1
- package/dist/commands/backup/enable.js +21 -1
- package/dist/commands/backup/enable.js.map +1 -1
- package/dist/commands/backup/list.js +15 -1
- package/dist/commands/backup/list.js.map +1 -1
- package/dist/commands/cors/add.js +19 -1
- package/dist/commands/cors/add.js.map +1 -1
- package/dist/commands/cors/delete.js +21 -1
- package/dist/commands/cors/delete.js.map +1 -1
- package/dist/commands/cors/list.js +21 -1
- package/dist/commands/cors/list.js.map +1 -1
- package/dist/commands/dataset/alias/create.js +4 -2
- package/dist/commands/dataset/alias/create.js.map +1 -1
- package/dist/commands/dataset/alias/delete.js +4 -2
- package/dist/commands/dataset/alias/delete.js.map +1 -1
- package/dist/commands/dataset/alias/link.js +4 -2
- package/dist/commands/dataset/alias/link.js.map +1 -1
- package/dist/commands/dataset/alias/unlink.js +4 -2
- package/dist/commands/dataset/alias/unlink.js.map +1 -1
- package/dist/commands/dataset/copy.js +4 -2
- package/dist/commands/dataset/copy.js.map +1 -1
- package/dist/commands/dataset/create.js +4 -2
- package/dist/commands/dataset/create.js.map +1 -1
- package/dist/commands/dataset/delete.js +4 -2
- package/dist/commands/dataset/delete.js.map +1 -1
- package/dist/commands/dataset/embeddings/disable.js +4 -2
- package/dist/commands/dataset/embeddings/disable.js.map +1 -1
- package/dist/commands/dataset/embeddings/enable.js +6 -4
- package/dist/commands/dataset/embeddings/enable.js.map +1 -1
- package/dist/commands/dataset/embeddings/status.js +4 -2
- package/dist/commands/dataset/embeddings/status.js.map +1 -1
- package/dist/commands/dataset/export.js +7 -11
- package/dist/commands/dataset/export.js.map +1 -1
- package/dist/commands/dataset/list.js +4 -2
- package/dist/commands/dataset/list.js.map +1 -1
- package/dist/commands/dataset/visibility/get.js +4 -2
- package/dist/commands/dataset/visibility/get.js.map +1 -1
- package/dist/commands/dataset/visibility/set.js +4 -2
- package/dist/commands/dataset/visibility/set.js.map +1 -1
- package/dist/commands/debug.js +2 -1
- package/dist/commands/debug.js.map +1 -1
- package/dist/commands/documents/create.js +15 -5
- package/dist/commands/documents/create.js.map +1 -1
- package/dist/commands/documents/delete.js +17 -6
- package/dist/commands/documents/delete.js.map +1 -1
- package/dist/commands/documents/get.js +15 -6
- package/dist/commands/documents/get.js.map +1 -1
- package/dist/commands/documents/query.js +24 -12
- package/dist/commands/documents/query.js.map +1 -1
- package/dist/commands/documents/validate.js +29 -9
- package/dist/commands/documents/validate.js.map +1 -1
- package/dist/commands/graphql/deploy.js +55 -28
- package/dist/commands/graphql/deploy.js.map +1 -1
- package/dist/commands/graphql/list.js +14 -1
- package/dist/commands/graphql/list.js.map +1 -1
- package/dist/commands/graphql/undeploy.js +36 -14
- package/dist/commands/graphql/undeploy.js.map +1 -1
- package/dist/commands/hook/attempt.js +21 -1
- package/dist/commands/hook/attempt.js.map +1 -1
- package/dist/commands/hook/create.js +22 -2
- package/dist/commands/hook/create.js.map +1 -1
- package/dist/commands/hook/delete.js +21 -1
- package/dist/commands/hook/delete.js.map +1 -1
- package/dist/commands/hook/list.js +21 -1
- package/dist/commands/hook/list.js.map +1 -1
- package/dist/commands/hook/logs.js +19 -1
- package/dist/commands/hook/logs.js.map +1 -1
- package/dist/commands/init.js +13 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +13 -6
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +8 -6
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/media/create-aspect.js +3 -3
- package/dist/commands/media/create-aspect.js.map +1 -1
- package/dist/commands/media/delete-aspect.js +8 -1
- package/dist/commands/media/delete-aspect.js.map +1 -1
- package/dist/commands/media/deploy-aspect.js +20 -3
- package/dist/commands/media/deploy-aspect.js.map +1 -1
- package/dist/commands/media/export.js +8 -1
- package/dist/commands/media/export.js.map +1 -1
- package/dist/commands/media/import.js +9 -2
- package/dist/commands/media/import.js.map +1 -1
- package/dist/commands/schema/delete.js +19 -6
- package/dist/commands/schema/delete.js.map +1 -1
- package/dist/commands/schema/deploy.js +8 -2
- package/dist/commands/schema/deploy.js.map +1 -1
- package/dist/commands/tokens/add.js +23 -1
- package/dist/commands/tokens/add.js.map +1 -1
- package/dist/commands/tokens/delete.js +19 -1
- package/dist/commands/tokens/delete.js.map +1 -1
- package/dist/commands/tokens/list.js +19 -1
- package/dist/commands/tokens/list.js.map +1 -1
- package/dist/commands/users/invite.js +23 -1
- package/dist/commands/users/invite.js.map +1 -1
- package/dist/commands/users/list.js +23 -1
- package/dist/commands/users/list.js.map +1 -1
- package/dist/hooks/prerun/flushTelemetry.worker.js +1 -1
- package/dist/hooks/prerun/flushTelemetry.worker.js.map +1 -1
- package/dist/hooks/prerun/setupTelemetry.js +2 -1
- package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
- package/dist/prompts/promptForProject.js.map +1 -1
- package/dist/{actions/auth/login/promptProviders.js → prompts/promptForProviders.js} +3 -3
- package/dist/prompts/promptForProviders.js.map +1 -0
- package/dist/services/auth.js +36 -3
- package/dist/services/auth.js.map +1 -1
- package/dist/services/docs.js +2 -2
- package/dist/services/docs.js.map +1 -1
- package/dist/services/getUrlHeaders.js +0 -2
- package/dist/services/getUrlHeaders.js.map +1 -1
- package/dist/services/projects.js +4 -2
- package/dist/services/projects.js.map +1 -1
- package/dist/services/telemetry.js +2 -1
- package/dist/services/telemetry.js.map +1 -1
- package/dist/util/createExpiringConfig.js +64 -0
- package/dist/util/createExpiringConfig.js.map +1 -0
- package/dist/util/detectFramework.js +135 -0
- package/dist/util/detectFramework.js.map +1 -0
- package/dist/util/extractDocumentsFromNdjsonOrTarball.js +1 -2
- package/dist/util/extractDocumentsFromNdjsonOrTarball.js.map +1 -1
- package/dist/util/isSchemaError.js +11 -0
- package/dist/util/isSchemaError.js.map +1 -0
- package/dist/util/isTar.js +8 -0
- package/dist/util/isTar.js.map +1 -0
- package/dist/util/sharedFlags.js +44 -14
- package/dist/util/sharedFlags.js.map +1 -1
- package/dist/util/telemetry/cleanupOldTelemetryFiles.js +30 -0
- package/dist/util/telemetry/cleanupOldTelemetryFiles.js.map +1 -0
- package/dist/util/telemetry/createTelemetryStore.js +95 -0
- package/dist/util/telemetry/createTelemetryStore.js.map +1 -0
- package/dist/util/telemetry/createTraceId.js +10 -0
- package/dist/util/telemetry/createTraceId.js.map +1 -0
- package/dist/util/telemetry/findTelemetryFiles.js +35 -0
- package/dist/util/telemetry/findTelemetryFiles.js.map +1 -0
- package/dist/util/telemetry/flushTelemetryFiles.js +118 -0
- package/dist/util/telemetry/flushTelemetryFiles.js.map +1 -0
- package/dist/util/telemetry/generateTelemetryFilePath.js +30 -0
- package/dist/util/telemetry/generateTelemetryFilePath.js.map +1 -0
- package/dist/util/telemetry/logger.js +59 -0
- package/dist/util/telemetry/logger.js.map +1 -0
- package/dist/util/telemetry/readNDJSON.js +28 -0
- package/dist/util/telemetry/readNDJSON.js.map +1 -0
- package/dist/util/telemetry/telemetryStoreDebug.js +7 -0
- package/dist/util/telemetry/telemetryStoreDebug.js.map +1 -0
- package/dist/util/telemetry/trace.js +150 -0
- package/dist/util/telemetry/trace.js.map +1 -0
- package/dist/util/update/updateChecker.js +2 -1
- package/dist/util/update/updateChecker.js.map +1 -1
- package/oclif.manifest.json +966 -529
- package/package.json +19 -22
- package/dist/actions/auth/login/promptProviders.js.map +0 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { getSanityUrl, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
2
2
|
import open from 'open';
|
|
3
|
+
import { promptForProject } from '../../prompts/promptForProject.js';
|
|
3
4
|
import { getProjectById } from '../../services/projects.js';
|
|
5
|
+
import { getProjectIdFlag } from '../../util/sharedFlags.js';
|
|
4
6
|
const createHookDebug = subdebug('hook:create');
|
|
5
7
|
export class CreateHookCommand extends SanityCommand {
|
|
6
8
|
static description = 'Create a new webhook for the current project';
|
|
@@ -8,10 +10,28 @@ export class CreateHookCommand extends SanityCommand {
|
|
|
8
10
|
{
|
|
9
11
|
command: '<%= config.bin %> <%= command.id %>',
|
|
10
12
|
description: 'Create a new webhook for the current project'
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
command: '<%= config.bin %> <%= command.id %> --project-id abc123',
|
|
16
|
+
description: 'Create a webhook for a specific project'
|
|
11
17
|
}
|
|
12
18
|
];
|
|
19
|
+
static flags = {
|
|
20
|
+
...getProjectIdFlag({
|
|
21
|
+
description: 'Project ID to create webhook for (overrides CLI configuration)'
|
|
22
|
+
})
|
|
23
|
+
};
|
|
13
24
|
async run() {
|
|
14
|
-
const projectId = await this.getProjectId(
|
|
25
|
+
const projectId = await this.getProjectId({
|
|
26
|
+
fallback: ()=>promptForProject({
|
|
27
|
+
requiredPermissions: [
|
|
28
|
+
{
|
|
29
|
+
grant: 'read',
|
|
30
|
+
permission: 'sanity.project'
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
})
|
|
34
|
+
});
|
|
15
35
|
let projectInfo;
|
|
16
36
|
try {
|
|
17
37
|
projectInfo = await getProjectById(projectId);
|
|
@@ -23,7 +43,7 @@ export class CreateHookCommand extends SanityCommand {
|
|
|
23
43
|
});
|
|
24
44
|
}
|
|
25
45
|
const organizationId = projectInfo.organizationId || 'personal';
|
|
26
|
-
const manageUrl =
|
|
46
|
+
const manageUrl = getSanityUrl(`/organizations/${organizationId}/project/${projectId}/api/webhooks/new`);
|
|
27
47
|
this.log(`Opening ${manageUrl}`);
|
|
28
48
|
try {
|
|
29
49
|
await open(manageUrl);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/hook/create.ts"],"sourcesContent":["import {getSanityUrl, SanityCommand, subdebug} from '@sanity/cli-core'\nimport open from 'open'\n\nimport {getProjectById} from '../../services/projects.js'\n\nconst createHookDebug = subdebug('hook:create')\n\nexport class CreateHookCommand extends SanityCommand<typeof CreateHookCommand> {\n static override description = 'Create a new webhook for the current project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create a new webhook for the current project',\n },\n ]\n\n public async run() {\n const projectId = await this.getProjectId()\n\n let projectInfo: {organizationId?: string | null}\n try {\n projectInfo = await getProjectById(projectId)\n } catch (error) {\n const err = error as Error\n createHookDebug(`Error fetching project info for project ${projectId}`, err)\n this.error(`Failed to fetch project information:\\n${err.message}`, {exit: 1})\n }\n\n const organizationId = projectInfo.organizationId || 'personal'\n const manageUrl =
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/hook/create.ts"],"sourcesContent":["import {getSanityUrl, SanityCommand, subdebug} from '@sanity/cli-core'\nimport open from 'open'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getProjectById} from '../../services/projects.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst createHookDebug = subdebug('hook:create')\n\nexport class CreateHookCommand extends SanityCommand<typeof CreateHookCommand> {\n static override description = 'Create a new webhook for the current project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create a new webhook for the current project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Create a webhook for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to create webhook for (overrides CLI configuration)',\n }),\n }\n\n public async run() {\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({requiredPermissions: [{grant: 'read', permission: 'sanity.project'}]}),\n })\n\n let projectInfo: {organizationId?: string | null}\n try {\n projectInfo = await getProjectById(projectId)\n } catch (error) {\n const err = error as Error\n createHookDebug(`Error fetching project info for project ${projectId}`, err)\n this.error(`Failed to fetch project information:\\n${err.message}`, {exit: 1})\n }\n\n const organizationId = projectInfo.organizationId || 'personal'\n const manageUrl = getSanityUrl(\n `/organizations/${organizationId}/project/${projectId}/api/webhooks/new`,\n )\n\n this.log(`Opening ${manageUrl}`)\n\n try {\n await open(manageUrl)\n } catch (error) {\n const err = error as Error\n createHookDebug('Error opening browser', err)\n this.error(`Failed to open browser:\\n${err.message}`, {exit: 1})\n }\n }\n}\n"],"names":["getSanityUrl","SanityCommand","subdebug","open","promptForProject","getProjectById","getProjectIdFlag","createHookDebug","CreateHookCommand","description","examples","command","flags","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","projectInfo","error","err","message","exit","organizationId","manageUrl","log"],"mappings":"AAAA,SAAQA,YAAY,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACtE,OAAOC,UAAU,OAAM;AAEvB,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,cAAc,QAAO,6BAA4B;AACzD,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,kBAAkBL,SAAS;AAEjC,OAAO,MAAMM,0BAA0BP;IACrC,OAAgBQ,cAAc,+CAA8C;IAC5E,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;QACf,EAAE;IACJ,EAAC;IAED,MAAaI,MAAM;QACjB,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRZ,iBAAiB;oBAACa,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAgB;qBAAE;gBAAA;QAC1F;QAEA,IAAIC;QACJ,IAAI;YACFA,cAAc,MAAMf,eAAeS;QACrC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YACZd,gBAAgB,CAAC,wCAAwC,EAAEO,WAAW,EAAEQ;YACxE,IAAI,CAACD,KAAK,CAAC,CAAC,sCAAsC,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QAC7E;QAEA,MAAMC,iBAAiBL,YAAYK,cAAc,IAAI;QACrD,MAAMC,YAAY1B,aAChB,CAAC,eAAe,EAAEyB,eAAe,SAAS,EAAEX,UAAU,iBAAiB,CAAC;QAG1E,IAAI,CAACa,GAAG,CAAC,CAAC,QAAQ,EAAED,WAAW;QAE/B,IAAI;YACF,MAAMvB,KAAKuB;QACb,EAAE,OAAOL,OAAO;YACd,MAAMC,MAAMD;YACZd,gBAAgB,yBAAyBe;YACzC,IAAI,CAACD,KAAK,CAAC,CAAC,yBAAyB,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QAChE;IACF;AACF"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Args } from '@oclif/core';
|
|
2
2
|
import { SanityCommand, subdebug } from '@sanity/cli-core';
|
|
3
3
|
import { select } from '@sanity/cli-core/ux';
|
|
4
|
+
import { promptForProject } from '../../prompts/promptForProject.js';
|
|
4
5
|
import { deleteHookForProject, listHooksForProject } from '../../services/hooks.js';
|
|
6
|
+
import { getProjectIdFlag } from '../../util/sharedFlags.js';
|
|
5
7
|
const deleteHookDebug = subdebug('hook:delete');
|
|
6
8
|
export class Delete extends SanityCommand {
|
|
7
9
|
static args = {
|
|
@@ -19,11 +21,29 @@ export class Delete extends SanityCommand {
|
|
|
19
21
|
{
|
|
20
22
|
command: '<%= config.bin %> <%= command.id %> my-hook',
|
|
21
23
|
description: 'Delete a specific hook by name'
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
command: '<%= config.bin %> <%= command.id %> --project-id abc123',
|
|
27
|
+
description: 'Delete a hook from a specific project'
|
|
22
28
|
}
|
|
23
29
|
];
|
|
30
|
+
static flags = {
|
|
31
|
+
...getProjectIdFlag({
|
|
32
|
+
description: 'Project ID to delete webhook from (overrides CLI configuration)'
|
|
33
|
+
})
|
|
34
|
+
};
|
|
24
35
|
async run() {
|
|
25
36
|
const { args } = await this.parse(Delete);
|
|
26
|
-
const projectId = await this.getProjectId(
|
|
37
|
+
const projectId = await this.getProjectId({
|
|
38
|
+
fallback: ()=>promptForProject({
|
|
39
|
+
requiredPermissions: [
|
|
40
|
+
{
|
|
41
|
+
grant: 'delete',
|
|
42
|
+
permission: 'sanity.project.webhooks'
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
})
|
|
46
|
+
});
|
|
27
47
|
// Get the hook ID to delete
|
|
28
48
|
const hookId = await this.promptForHook(args.name, projectId);
|
|
29
49
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/hook/delete.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {deleteHookForProject, listHooksForProject} from '../../services/hooks.js'\n\nconst deleteHookDebug = subdebug('hook:delete')\n\nexport class Delete extends SanityCommand<typeof Delete> {\n static override args = {\n name: Args.string({\n description: 'Name of hook to delete (will prompt if not provided)',\n required: false,\n }),\n }\n\n static override description = 'Delete a hook within your project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively select and delete a hook',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-hook',\n description: 'Delete a specific hook by name',\n },\n ]\n\n public async run(): Promise<void> {\n const {args} = await this.parse(Delete)\n\n const projectId = await this.getProjectId()\n\n // Get the hook ID to delete\n const hookId = await this.promptForHook(args.name, projectId)\n\n try {\n await deleteHookForProject(projectId, hookId)\n\n this.log('Hook deleted')\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error deleting hook ${hookId} for project ${projectId}`, err)\n this.error(`Hook deletion failed:\\n${err.message}`, {exit: 1})\n }\n }\n\n private async promptForHook(\n specifiedName: string | undefined,\n projectId: string,\n ): Promise<string> {\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Failed to fetch hooks:\\n${err.message}`, {exit: 1})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks configured for this project.', {exit: 1})\n }\n\n // If hook name is specified, find it in the list\n if (specifiedName) {\n const specifiedNameLower = specifiedName.toLowerCase()\n const selectedHook = hooks.find((hook) => hook.name.toLowerCase() === specifiedNameLower)\n\n if (!selectedHook) {\n this.error(`Hook with name \"${specifiedName}\" not found`, {exit: 1})\n }\n\n return selectedHook.id\n }\n\n // If no hook name specified, prompt user to select one\n const choices = hooks.map((hook) => ({\n name: hook.name,\n value: hook.id,\n }))\n\n const selectedId = await select({\n choices,\n message: 'Select hook to delete',\n })\n\n return selectedId\n }\n}\n"],"names":["Args","SanityCommand","subdebug","select","deleteHookForProject","listHooksForProject","deleteHookDebug","Delete","args","name","string","description","required","examples","command","run","parse","projectId","getProjectId","hookId","promptForHook","log","error","err","message","exit","specifiedName","hooks","length","specifiedNameLower","toLowerCase","selectedHook","find","hook","id","choices","map","value","selectedId"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,MAAM,QAAO,sBAAqB;AAG1C,SAAQC,oBAAoB,EAAEC,mBAAmB,QAAO,0BAAyB;
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/hook/delete.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteHookForProject, listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteHookDebug = subdebug('hook:delete')\n\nexport class Delete extends SanityCommand<typeof Delete> {\n static override args = {\n name: Args.string({\n description: 'Name of hook to delete (will prompt if not provided)',\n required: false,\n }),\n }\n\n static override description = 'Delete a hook within your project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively select and delete a hook',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-hook',\n description: 'Delete a specific hook by name',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Delete a hook from a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete webhook from (overrides CLI configuration)',\n }),\n }\n\n public async run(): Promise<void> {\n const {args} = await this.parse(Delete)\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'delete', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n // Get the hook ID to delete\n const hookId = await this.promptForHook(args.name, projectId)\n\n try {\n await deleteHookForProject(projectId, hookId)\n\n this.log('Hook deleted')\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error deleting hook ${hookId} for project ${projectId}`, err)\n this.error(`Hook deletion failed:\\n${err.message}`, {exit: 1})\n }\n }\n\n private async promptForHook(\n specifiedName: string | undefined,\n projectId: string,\n ): Promise<string> {\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Failed to fetch hooks:\\n${err.message}`, {exit: 1})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks configured for this project.', {exit: 1})\n }\n\n // If hook name is specified, find it in the list\n if (specifiedName) {\n const specifiedNameLower = specifiedName.toLowerCase()\n const selectedHook = hooks.find((hook) => hook.name.toLowerCase() === specifiedNameLower)\n\n if (!selectedHook) {\n this.error(`Hook with name \"${specifiedName}\" not found`, {exit: 1})\n }\n\n return selectedHook.id\n }\n\n // If no hook name specified, prompt user to select one\n const choices = hooks.map((hook) => ({\n name: hook.name,\n value: hook.id,\n }))\n\n const selectedId = await select({\n choices,\n message: 'Select hook to delete',\n })\n\n return selectedId\n }\n}\n"],"names":["Args","SanityCommand","subdebug","select","promptForProject","deleteHookForProject","listHooksForProject","getProjectIdFlag","deleteHookDebug","Delete","args","name","string","description","required","examples","command","flags","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hookId","promptForHook","log","error","err","message","exit","specifiedName","hooks","length","specifiedNameLower","toLowerCase","selectedHook","find","hook","id","choices","map","value","selectedId"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,MAAM,QAAO,sBAAqB;AAG1C,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,oBAAoB,EAAEC,mBAAmB,QAAO,0BAAyB;AACjF,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,kBAAkBN,SAAS;AAEjC,OAAO,MAAMO,eAAeR;IAC1B,OAAgBS,OAAO;QACrBC,MAAMX,KAAKY,MAAM,CAAC;YAChBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,oCAAmC;IAEjE,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAClBM,aAAa;QACf,EAAE;IACJ,EAAC;IAED,MAAaK,MAAqB;QAChC,MAAM,EAACR,IAAI,EAAC,GAAG,MAAM,IAAI,CAACS,KAAK,CAACV;QAEhC,MAAMW,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRlB,iBAAiB;oBACfmB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAUC,YAAY;wBAAyB;qBAAE;gBACjF;QACJ;QAEA,4BAA4B;QAC5B,MAAMC,SAAS,MAAM,IAAI,CAACC,aAAa,CAACjB,KAAKC,IAAI,EAAES;QAEnD,IAAI;YACF,MAAMf,qBAAqBe,WAAWM;YAEtC,IAAI,CAACE,GAAG,CAAC;QACX,EAAE,OAAOC,OAAO;YACd,MAAMC,MAAMD;YACZrB,gBAAgB,CAAC,oBAAoB,EAAEkB,OAAO,aAAa,EAAEN,WAAW,EAAEU;YAC1E,IAAI,CAACD,KAAK,CAAC,CAAC,uBAAuB,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QAC9D;IACF;IAEA,MAAcL,cACZM,aAAiC,EACjCb,SAAiB,EACA;QACjB,IAAIc;QACJ,IAAI;YACFA,QAAQ,MAAM5B,oBAAoBc;QACpC,EAAE,OAAOS,OAAO;YACd,MAAMC,MAAMD;YACZrB,gBAAgB,CAAC,iCAAiC,EAAEY,WAAW,EAAEU;YACjE,IAAI,CAACD,KAAK,CAAC,CAAC,wBAAwB,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QAC/D;QAEA,IAAIE,MAAMC,MAAM,KAAK,GAAG;YACtB,IAAI,CAACN,KAAK,CAAC,yCAAyC;gBAACG,MAAM;YAAC;QAC9D;QAEA,iDAAiD;QACjD,IAAIC,eAAe;YACjB,MAAMG,qBAAqBH,cAAcI,WAAW;YACpD,MAAMC,eAAeJ,MAAMK,IAAI,CAAC,CAACC,OAASA,KAAK7B,IAAI,CAAC0B,WAAW,OAAOD;YAEtE,IAAI,CAACE,cAAc;gBACjB,IAAI,CAACT,KAAK,CAAC,CAAC,gBAAgB,EAAEI,cAAc,WAAW,CAAC,EAAE;oBAACD,MAAM;gBAAC;YACpE;YAEA,OAAOM,aAAaG,EAAE;QACxB;QAEA,uDAAuD;QACvD,MAAMC,UAAUR,MAAMS,GAAG,CAAC,CAACH,OAAU,CAAA;gBACnC7B,MAAM6B,KAAK7B,IAAI;gBACfiC,OAAOJ,KAAKC,EAAE;YAChB,CAAA;QAEA,MAAMI,aAAa,MAAM1C,OAAO;YAC9BuC;YACAX,SAAS;QACX;QAEA,OAAOc;IACT;AACF"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { SanityCommand, subdebug } from '@sanity/cli-core';
|
|
2
|
+
import { promptForProject } from '../../prompts/promptForProject.js';
|
|
2
3
|
import { listHooksForProject } from '../../services/hooks.js';
|
|
4
|
+
import { getProjectIdFlag } from '../../util/sharedFlags.js';
|
|
3
5
|
const listHookDebug = subdebug('hook:list');
|
|
4
6
|
export class List extends SanityCommand {
|
|
5
7
|
static description = 'List hooks for a given project';
|
|
@@ -7,11 +9,29 @@ export class List extends SanityCommand {
|
|
|
7
9
|
{
|
|
8
10
|
command: '<%= config.bin %> <%= command.id %>',
|
|
9
11
|
description: 'List hooks for a given project'
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
command: '<%= config.bin %> <%= command.id %> --project-id abc123',
|
|
15
|
+
description: 'List hooks for a specific project'
|
|
10
16
|
}
|
|
11
17
|
];
|
|
18
|
+
static flags = {
|
|
19
|
+
...getProjectIdFlag({
|
|
20
|
+
description: 'Project ID to list webhooks for (overrides CLI configuration)'
|
|
21
|
+
})
|
|
22
|
+
};
|
|
12
23
|
async run() {
|
|
13
24
|
// Ensure we have project context
|
|
14
|
-
const projectId = await this.getProjectId(
|
|
25
|
+
const projectId = await this.getProjectId({
|
|
26
|
+
fallback: ()=>promptForProject({
|
|
27
|
+
requiredPermissions: [
|
|
28
|
+
{
|
|
29
|
+
grant: 'read',
|
|
30
|
+
permission: 'sanity.project.webhooks'
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
})
|
|
34
|
+
});
|
|
15
35
|
let hooks;
|
|
16
36
|
try {
|
|
17
37
|
hooks = await listHooksForProject(projectId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/hook/list.ts"],"sourcesContent":["import {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {listHooksForProject} from '../../services/hooks.js'\n\nconst listHookDebug = subdebug('hook:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List hooks for a given project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List hooks for a given project',\n },\n ]\n\n public async run() {\n // Ensure we have project context\n const projectId = await this.getProjectId()\n\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n\n listHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Hook list retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n for (const hook of hooks) {\n this.log(`Name: ${hook.name}`)\n this.log(`Dataset: ${hook.dataset}`)\n this.log(`URL: ${hook.url}`)\n\n if (hook.type === 'document') {\n this.log(`HTTP method: ${hook.httpMethod}`)\n\n if (hook.description) {\n this.log(`Description: ${hook.description}`)\n }\n }\n\n this.log('')\n }\n }\n}\n"],"names":["SanityCommand","subdebug","listHooksForProject","listHookDebug","List","description","examples","command","run","projectId","getProjectId","hooks","error","err","message","exit","hook","log","name","dataset","url","type","httpMethod"],"mappings":"AAAA,SAAQA,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAGxD,SAAQC,mBAAmB,QAAO,0BAAyB;
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/hook/list.ts"],"sourcesContent":["import {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listHookDebug = subdebug('hook:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List hooks for a given project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List hooks for a given project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List hooks for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list webhooks for (overrides CLI configuration)',\n }),\n }\n\n public async run() {\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n\n listHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Hook list retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n for (const hook of hooks) {\n this.log(`Name: ${hook.name}`)\n this.log(`Dataset: ${hook.dataset}`)\n this.log(`URL: ${hook.url}`)\n\n if (hook.type === 'document') {\n this.log(`HTTP method: ${hook.httpMethod}`)\n\n if (hook.description) {\n this.log(`Description: ${hook.description}`)\n }\n }\n\n this.log('')\n }\n }\n}\n"],"names":["SanityCommand","subdebug","promptForProject","listHooksForProject","getProjectIdFlag","listHookDebug","List","description","examples","command","flags","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hooks","error","err","message","exit","hook","log","name","dataset","url","type","httpMethod"],"mappings":"AAAA,SAAQA,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAGxD,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,mBAAmB,QAAO,0BAAyB;AAC3D,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,gBAAgBJ,SAAS;AAE/B,OAAO,MAAMK,aAAaN;IACxB,OAAgBO,cAAc,iCAAgC;IAC9D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;QACf,EAAE;IACJ,EAAC;IAED,MAAaI,MAAM;QACjB,iCAAiC;QACjC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRZ,iBAAiB;oBACfa,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,QAAQ,MAAMf,oBAAoBS;QACpC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YAEZd,cAAc,CAAC,iCAAiC,EAAEO,WAAW,EAAEQ;YAC/D,IAAI,CAACD,KAAK,CAAC,CAAC,6BAA6B,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QACpE;QAEA,KAAK,MAAMC,QAAQL,MAAO;YACxB,IAAI,CAACM,GAAG,CAAC,CAAC,MAAM,EAAED,KAAKE,IAAI,EAAE;YAC7B,IAAI,CAACD,GAAG,CAAC,CAAC,SAAS,EAAED,KAAKG,OAAO,EAAE;YACnC,IAAI,CAACF,GAAG,CAAC,CAAC,KAAK,EAAED,KAAKI,GAAG,EAAE;YAE3B,IAAIJ,KAAKK,IAAI,KAAK,YAAY;gBAC5B,IAAI,CAACJ,GAAG,CAAC,CAAC,aAAa,EAAED,KAAKM,UAAU,EAAE;gBAE1C,IAAIN,KAAKhB,WAAW,EAAE;oBACpB,IAAI,CAACiB,GAAG,CAAC,CAAC,aAAa,EAAED,KAAKhB,WAAW,EAAE;gBAC7C;YACF;YAEA,IAAI,CAACiB,GAAG,CAAC;QACX;IACF;AACF"}
|
|
@@ -4,7 +4,9 @@ import { SanityCommand, subdebug } from '@sanity/cli-core';
|
|
|
4
4
|
import { select } from '@sanity/cli-core/ux';
|
|
5
5
|
import groupBy from 'lodash-es/groupBy.js';
|
|
6
6
|
import { formatFailure } from '../../actions/hook/formatFailure.js';
|
|
7
|
+
import { promptForProject } from '../../prompts/promptForProject.js';
|
|
7
8
|
import { getHookAttemptsForProject, getHookMessagesForProject, getHooksForProject } from '../../services/hooks.js';
|
|
9
|
+
import { getProjectIdFlag } from '../../util/sharedFlags.js';
|
|
8
10
|
const logsHookDebug = subdebug('hook:logs');
|
|
9
11
|
export class LogsHookCommand extends SanityCommand {
|
|
10
12
|
static args = {
|
|
@@ -22,9 +24,16 @@ export class LogsHookCommand extends SanityCommand {
|
|
|
22
24
|
{
|
|
23
25
|
command: '<%= config.bin %> <%= command.id %> [NAME]',
|
|
24
26
|
description: 'List latest log entries for a specific hook by name'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
command: '<%= config.bin %> <%= command.id %> --project-id abc123',
|
|
30
|
+
description: 'List hook logs for a specific project'
|
|
25
31
|
}
|
|
26
32
|
];
|
|
27
33
|
static flags = {
|
|
34
|
+
...getProjectIdFlag({
|
|
35
|
+
description: 'Project ID to view webhook logs for (overrides CLI configuration)'
|
|
36
|
+
}),
|
|
28
37
|
detailed: Flags.boolean({
|
|
29
38
|
description: 'Include detailed payload and attempts',
|
|
30
39
|
required: false
|
|
@@ -33,7 +42,16 @@ export class LogsHookCommand extends SanityCommand {
|
|
|
33
42
|
async run() {
|
|
34
43
|
const { args, flags } = await this.parse(LogsHookCommand);
|
|
35
44
|
// Ensure we have project context
|
|
36
|
-
const projectId = await this.getProjectId(
|
|
45
|
+
const projectId = await this.getProjectId({
|
|
46
|
+
fallback: ()=>promptForProject({
|
|
47
|
+
requiredPermissions: [
|
|
48
|
+
{
|
|
49
|
+
grant: 'read',
|
|
50
|
+
permission: 'sanity.project.webhooks'
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
})
|
|
54
|
+
});
|
|
37
55
|
// Get hooks for the project
|
|
38
56
|
let hooks;
|
|
39
57
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/hook/logs.ts"],"sourcesContent":["import {inspect, styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport groupBy from 'lodash-es/groupBy.js'\n\nimport {formatFailure} from '../../actions/hook/formatFailure.js'\nimport {type DeliveryAttempt, type Hook, type HookMessage} from '../../actions/hook/types'\nimport {\n getHookAttemptsForProject,\n getHookMessagesForProject,\n getHooksForProject,\n} from '../../services/hooks.js'\n\nconst logsHookDebug = subdebug('hook:logs')\n\nexport class LogsHookCommand extends SanityCommand<typeof LogsHookCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the hook to show logs for',\n required: false,\n }),\n }\n\n static override description = 'List latest log entries for a given hook'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List latest log entries for a given hook',\n },\n {\n command: '<%= config.bin %> <%= command.id %> [NAME]',\n description: 'List latest log entries for a specific hook by name',\n },\n ]\n\n static override flags = {\n detailed: Flags.boolean({\n description: 'Include detailed payload and attempts',\n required: false,\n }),\n }\n\n public async run() {\n const {args, flags} = await this.parse(LogsHookCommand)\n\n // Ensure we have project context\n const projectId = await this.getProjectId()\n\n // Get hooks for the project\n let hooks: Hook[]\n try {\n hooks = await getHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n logsHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Hook list retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks currently registered', {exit: 1})\n }\n\n // If hook name is provided, find that specific hook\n let selectedHook: Hook | undefined\n if (args.name) {\n selectedHook = hooks.find((hook) => hook.name.toLowerCase() === args.name?.toLowerCase())\n if (!selectedHook) {\n this.error(`Hook with name \"${args.name}\" not found`, {exit: 1})\n }\n } else if (hooks.length === 1) {\n // If only one hook exists, use that\n selectedHook = hooks[0]\n } else {\n // Otherwise prompt user to select a hook\n selectedHook = await this.selectHook(hooks)\n }\n\n if (!selectedHook) {\n this.error('No hook selected', {exit: 1})\n }\n\n // Fetch messages and attempts for the selected hook\n let messages: HookMessage[]\n let attempts: DeliveryAttempt[] = []\n try {\n ;[messages, attempts] = await Promise.all([\n getHookMessagesForProject({\n hookId: selectedHook.id,\n projectId,\n }),\n getHookAttemptsForProject({\n hookId: selectedHook.id,\n projectId,\n }),\n ])\n } catch (error) {\n const err = error as Error\n logsHookDebug(`Error fetching logs for hook ${selectedHook.id}`, err)\n this.error(`Hook logs retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n // Group attempts by message ID\n const groupedAttempts = groupBy(attempts, 'messageId')\n\n // Populate messages with attempts\n const populated = messages.map((msg): HookMessage & {attempts: DeliveryAttempt[]} => ({\n ...msg,\n attempts: groupedAttempts[msg.id] || [],\n }))\n\n const totalMessages = messages.length - 1\n\n for (const [i, message] of populated.entries()) {\n this.printMessage(message, {detailed: flags.detailed})\n this.printSeparator(totalMessages === i)\n }\n }\n\n private formatAttemptDate(dateString: string): string {\n try {\n return new Date(dateString).toISOString().replace(/\\.\\d+Z$/, 'Z')\n } catch {\n return dateString // fallback to original if parsing fails\n }\n }\n\n private printMessage(\n message: HookMessage & {attempts: DeliveryAttempt[]},\n options: {detailed?: boolean},\n ) {\n const {detailed} = options\n\n this.log(`Date: ${message.createdAt}`)\n this.log(`Status: ${message.status}`)\n if (message.resultCode) {\n this.log(`Result code: ${message.resultCode}`)\n }\n\n if (message.failureCount > 0) {\n this.log(`Failures: ${message.failureCount}`)\n }\n\n if (detailed) {\n this.log('Payload:')\n try {\n const payload = JSON.parse(message.payload)\n this.log(inspect(payload, {colors: true}))\n } catch (error) {\n this.log(`Payload (raw): ${message.payload}`)\n logsHookDebug('Failed to parse payload JSON:', error)\n }\n }\n\n if (detailed && message.attempts && message.attempts.length > 0) {\n this.log('Attempts:')\n for (const attempt of message.attempts) {\n const date = this.formatAttemptDate(attempt.createdAt)\n const prefix = ` [${date}]`\n\n if (attempt.inProgress) {\n this.log(`${prefix} ${styleText('yellow', 'Pending')}`)\n } else if (attempt.isFailure) {\n const failure = formatFailure(attempt, {includeHelp: true})\n this.log(`${prefix} ${styleText('yellow', `Failure: ${failure}`)}`)\n } else {\n this.log(`${prefix} Success: HTTP ${attempt.resultCode} (${attempt.duration}ms)`)\n }\n }\n }\n\n // Leave some empty space between messages\n this.log('')\n }\n\n private printSeparator(skip: boolean) {\n if (!skip) {\n this.log('---\\n')\n }\n }\n\n private async selectHook(hooks: Hook[]) {\n const hookId = await select({\n choices: hooks.map((hook) => ({\n name: hook.name,\n value: hook.id,\n })),\n message: 'Select hook to list logs for',\n })\n\n return hooks.find((hook) => hook.id === hookId)\n }\n}\n"],"names":["inspect","styleText","Args","Flags","SanityCommand","subdebug","select","groupBy","formatFailure","getHookAttemptsForProject","getHookMessagesForProject","getHooksForProject","logsHookDebug","LogsHookCommand","args","name","string","description","required","examples","command","flags","detailed","boolean","run","parse","projectId","getProjectId","hooks","error","err","message","exit","length","selectedHook","find","hook","toLowerCase","selectHook","messages","attempts","Promise","all","hookId","id","groupedAttempts","populated","map","msg","totalMessages","i","entries","printMessage","printSeparator","formatAttemptDate","dateString","Date","toISOString","replace","options","log","createdAt","status","resultCode","failureCount","payload","JSON","colors","attempt","date","prefix","inProgress","isFailure","failure","includeHelp","duration","skip","choices","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/hook/logs.ts"],"sourcesContent":["import {inspect, styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport groupBy from 'lodash-es/groupBy.js'\n\nimport {formatFailure} from '../../actions/hook/formatFailure.js'\nimport {type DeliveryAttempt, type Hook, type HookMessage} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n getHookAttemptsForProject,\n getHookMessagesForProject,\n getHooksForProject,\n} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst logsHookDebug = subdebug('hook:logs')\n\nexport class LogsHookCommand extends SanityCommand<typeof LogsHookCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the hook to show logs for',\n required: false,\n }),\n }\n\n static override description = 'List latest log entries for a given hook'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List latest log entries for a given hook',\n },\n {\n command: '<%= config.bin %> <%= command.id %> [NAME]',\n description: 'List latest log entries for a specific hook by name',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List hook logs for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to view webhook logs for (overrides CLI configuration)',\n }),\n detailed: Flags.boolean({\n description: 'Include detailed payload and attempts',\n required: false,\n }),\n }\n\n public async run() {\n const {args, flags} = await this.parse(LogsHookCommand)\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n // Get hooks for the project\n let hooks: Hook[]\n try {\n hooks = await getHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n logsHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Hook list retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks currently registered', {exit: 1})\n }\n\n // If hook name is provided, find that specific hook\n let selectedHook: Hook | undefined\n if (args.name) {\n selectedHook = hooks.find((hook) => hook.name.toLowerCase() === args.name?.toLowerCase())\n if (!selectedHook) {\n this.error(`Hook with name \"${args.name}\" not found`, {exit: 1})\n }\n } else if (hooks.length === 1) {\n // If only one hook exists, use that\n selectedHook = hooks[0]\n } else {\n // Otherwise prompt user to select a hook\n selectedHook = await this.selectHook(hooks)\n }\n\n if (!selectedHook) {\n this.error('No hook selected', {exit: 1})\n }\n\n // Fetch messages and attempts for the selected hook\n let messages: HookMessage[]\n let attempts: DeliveryAttempt[] = []\n try {\n ;[messages, attempts] = await Promise.all([\n getHookMessagesForProject({\n hookId: selectedHook.id,\n projectId,\n }),\n getHookAttemptsForProject({\n hookId: selectedHook.id,\n projectId,\n }),\n ])\n } catch (error) {\n const err = error as Error\n logsHookDebug(`Error fetching logs for hook ${selectedHook.id}`, err)\n this.error(`Hook logs retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n // Group attempts by message ID\n const groupedAttempts = groupBy(attempts, 'messageId')\n\n // Populate messages with attempts\n const populated = messages.map((msg): HookMessage & {attempts: DeliveryAttempt[]} => ({\n ...msg,\n attempts: groupedAttempts[msg.id] || [],\n }))\n\n const totalMessages = messages.length - 1\n\n for (const [i, message] of populated.entries()) {\n this.printMessage(message, {detailed: flags.detailed})\n this.printSeparator(totalMessages === i)\n }\n }\n\n private formatAttemptDate(dateString: string): string {\n try {\n return new Date(dateString).toISOString().replace(/\\.\\d+Z$/, 'Z')\n } catch {\n return dateString // fallback to original if parsing fails\n }\n }\n\n private printMessage(\n message: HookMessage & {attempts: DeliveryAttempt[]},\n options: {detailed?: boolean},\n ) {\n const {detailed} = options\n\n this.log(`Date: ${message.createdAt}`)\n this.log(`Status: ${message.status}`)\n if (message.resultCode) {\n this.log(`Result code: ${message.resultCode}`)\n }\n\n if (message.failureCount > 0) {\n this.log(`Failures: ${message.failureCount}`)\n }\n\n if (detailed) {\n this.log('Payload:')\n try {\n const payload = JSON.parse(message.payload)\n this.log(inspect(payload, {colors: true}))\n } catch (error) {\n this.log(`Payload (raw): ${message.payload}`)\n logsHookDebug('Failed to parse payload JSON:', error)\n }\n }\n\n if (detailed && message.attempts && message.attempts.length > 0) {\n this.log('Attempts:')\n for (const attempt of message.attempts) {\n const date = this.formatAttemptDate(attempt.createdAt)\n const prefix = ` [${date}]`\n\n if (attempt.inProgress) {\n this.log(`${prefix} ${styleText('yellow', 'Pending')}`)\n } else if (attempt.isFailure) {\n const failure = formatFailure(attempt, {includeHelp: true})\n this.log(`${prefix} ${styleText('yellow', `Failure: ${failure}`)}`)\n } else {\n this.log(`${prefix} Success: HTTP ${attempt.resultCode} (${attempt.duration}ms)`)\n }\n }\n }\n\n // Leave some empty space between messages\n this.log('')\n }\n\n private printSeparator(skip: boolean) {\n if (!skip) {\n this.log('---\\n')\n }\n }\n\n private async selectHook(hooks: Hook[]) {\n const hookId = await select({\n choices: hooks.map((hook) => ({\n name: hook.name,\n value: hook.id,\n })),\n message: 'Select hook to list logs for',\n })\n\n return hooks.find((hook) => hook.id === hookId)\n }\n}\n"],"names":["inspect","styleText","Args","Flags","SanityCommand","subdebug","select","groupBy","formatFailure","promptForProject","getHookAttemptsForProject","getHookMessagesForProject","getHooksForProject","getProjectIdFlag","logsHookDebug","LogsHookCommand","args","name","string","description","required","examples","command","flags","detailed","boolean","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hooks","error","err","message","exit","length","selectedHook","find","hook","toLowerCase","selectHook","messages","attempts","Promise","all","hookId","id","groupedAttempts","populated","map","msg","totalMessages","i","entries","printMessage","printSeparator","formatAttemptDate","dateString","Date","toISOString","replace","options","log","createdAt","status","resultCode","failureCount","payload","JSON","colors","attempt","date","prefix","inProgress","isFailure","failure","includeHelp","duration","skip","choices","value"],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -9,7 +9,6 @@ import { confirm, input, logSymbols, select, Separator, spinner } from '@sanity/
|
|
|
9
9
|
import { isHttpError } from '@sanity/client';
|
|
10
10
|
import { DatasetImportCommand } from '@sanity/import';
|
|
11
11
|
import { frameworks } from '@vercel/frameworks';
|
|
12
|
-
import { detectFrameworkRecord, LocalFileSystemDetector } from '@vercel/fs-detectors';
|
|
13
12
|
import { execa } from 'execa';
|
|
14
13
|
import deburr from 'lodash-es/deburr.js';
|
|
15
14
|
import { getProviderName } from '../actions/auth/getProviderName.js';
|
|
@@ -43,6 +42,7 @@ import { getPlanId, getPlanIdFromCoupon } from '../services/plans.js';
|
|
|
43
42
|
import { createProject, listProjects, updateProjectInitializedAt } from '../services/projects.js';
|
|
44
43
|
import { getCliUser } from '../services/user.js';
|
|
45
44
|
import { CLIInitStepCompleted } from '../telemetry/init.telemetry.js';
|
|
45
|
+
import { detectFrameworkRecord } from '../util/detectFramework.js';
|
|
46
46
|
import { absolutify, validateEmptyPath } from '../util/fsUtils.js';
|
|
47
47
|
import { getProjectDefaults } from '../util/getProjectDefaults.js';
|
|
48
48
|
import { getPeerDependencies } from '../util/packageManager/getPeerDependencies.js';
|
|
@@ -297,7 +297,7 @@ export class InitCommand extends SanityCommand {
|
|
|
297
297
|
}
|
|
298
298
|
const detectedFramework = await detectFrameworkRecord({
|
|
299
299
|
frameworkList: frameworks,
|
|
300
|
-
|
|
300
|
+
rootPath: process.cwd()
|
|
301
301
|
});
|
|
302
302
|
const isNextJs = detectedFramework?.slug === 'nextjs';
|
|
303
303
|
let remoteTemplateInfo;
|
|
@@ -696,10 +696,17 @@ export class InitCommand extends SanityCommand {
|
|
|
696
696
|
this._trace.log({
|
|
697
697
|
step: 'login'
|
|
698
698
|
});
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
699
|
+
try {
|
|
700
|
+
await login({
|
|
701
|
+
output: this.output,
|
|
702
|
+
telemetry: this._trace.newContext('login')
|
|
703
|
+
});
|
|
704
|
+
} catch (error) {
|
|
705
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
706
|
+
this.error(`Login failed: ${message}`, {
|
|
707
|
+
exit: 1
|
|
708
|
+
});
|
|
709
|
+
}
|
|
703
710
|
}
|
|
704
711
|
user = await getCliUser();
|
|
705
712
|
this.log(`${logSymbols.success} You are logged in as ${user.email} using ${getProviderName(user.provider)}`);
|