@sanity/cli 7.2.3 → 7.4.0
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/bin/run.js +3 -12
- package/dist/actions/auth/authServer.js +37 -20
- package/dist/actions/auth/authServer.js.map +1 -1
- package/dist/actions/backup/assertDatasetExist.js +3 -3
- package/dist/actions/backup/assertDatasetExist.js.map +1 -1
- package/dist/actions/build/buildApp.js +15 -5
- package/dist/actions/build/buildApp.js.map +1 -1
- package/dist/actions/build/buildStaticFiles.js +57 -5
- package/dist/actions/build/buildStaticFiles.js.map +1 -1
- package/dist/actions/build/buildStudio.js +13 -5
- package/dist/actions/build/buildStudio.js.map +1 -1
- package/dist/actions/build/handlePrereleaseVersions.js +2 -2
- package/dist/actions/build/handlePrereleaseVersions.js.map +1 -1
- package/dist/actions/dataset/resolveDataset.js +2 -2
- package/dist/actions/dataset/resolveDataset.js.map +1 -1
- package/dist/actions/deploy/deployApp.js +43 -5
- package/dist/actions/deploy/deployApp.js.map +1 -1
- package/dist/actions/deploy/deployStudio.js +14 -2
- package/dist/actions/deploy/deployStudio.js.map +1 -1
- package/dist/actions/deploy/viewDeployment.js +32 -0
- package/dist/actions/deploy/viewDeployment.js.map +1 -0
- package/dist/actions/dev/devAction.js +219 -4
- package/dist/actions/dev/devAction.js.map +1 -1
- package/dist/actions/dev/registration/deriveInterfaces.js +46 -0
- package/dist/actions/dev/registration/deriveInterfaces.js.map +1 -0
- package/dist/actions/dev/registration/extractDevServerManifest.js +30 -0
- package/dist/actions/dev/registration/extractDevServerManifest.js.map +1 -0
- package/dist/actions/dev/registration/interfaceSetId.js +41 -0
- package/dist/actions/dev/registration/interfaceSetId.js.map +1 -0
- package/dist/actions/dev/registration/startDevManifestWatcher.js +104 -0
- package/dist/actions/dev/registration/startDevManifestWatcher.js.map +1 -0
- package/dist/actions/dev/registration/startDevServerRegistration.js +121 -0
- package/dist/actions/dev/registration/startDevServerRegistration.js.map +1 -0
- package/dist/actions/dev/servers/getDashboardAppUrl.js.map +1 -0
- package/dist/actions/dev/servers/getDevServerConfig.js +45 -0
- package/dist/actions/dev/servers/getDevServerConfig.js.map +1 -0
- package/dist/actions/dev/servers/startAppDevServer.js +78 -0
- package/dist/actions/dev/servers/startAppDevServer.js.map +1 -0
- package/dist/actions/dev/{startStudioDevServer.js → servers/startStudioDevServer.js} +20 -16
- package/dist/actions/dev/servers/startStudioDevServer.js.map +1 -0
- package/dist/actions/dev/types.js +7 -1
- package/dist/actions/dev/types.js.map +1 -1
- package/dist/actions/dev/workbench/startWorkbenchDevServer.js +276 -0
- package/dist/actions/dev/workbench/startWorkbenchDevServer.js.map +1 -0
- package/dist/actions/dev/workbench/writeWorkbenchRuntime.js +66 -0
- package/dist/actions/dev/workbench/writeWorkbenchRuntime.js.map +1 -0
- package/dist/actions/init/bootstrapLocalTemplate.js +15 -3
- package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
- package/dist/actions/init/bootstrapTemplate.js +3 -2
- package/dist/actions/init/bootstrapTemplate.js.map +1 -1
- package/dist/actions/init/createAppCliConfig.js +5 -2
- package/dist/actions/init/createAppCliConfig.js.map +1 -1
- package/dist/actions/init/createCliConfig.js +5 -3
- package/dist/actions/init/createCliConfig.js.map +1 -1
- package/dist/actions/init/createStudioConfig.js.map +1 -1
- package/dist/actions/init/initAction.js +11 -4
- package/dist/actions/init/initAction.js.map +1 -1
- package/dist/actions/init/initApp.js +2 -1
- package/dist/actions/init/initApp.js.map +1 -1
- package/dist/actions/init/initStudio.js +2 -1
- package/dist/actions/init/initStudio.js.map +1 -1
- package/dist/actions/init/scaffoldTemplate.js +6 -14
- package/dist/actions/init/scaffoldTemplate.js.map +1 -1
- package/dist/actions/init/templates/pageBuilder.js +1 -1
- package/dist/actions/init/templates/pageBuilder.js.map +1 -1
- package/dist/actions/init/types.js +1 -0
- package/dist/actions/init/types.js.map +1 -1
- package/dist/actions/manifest/{extractAppManifest.js → extractCoreAppManifest.js} +30 -11
- package/dist/actions/manifest/extractCoreAppManifest.js.map +1 -0
- package/dist/actions/manifest/extractManifest.js +7 -7
- package/dist/actions/manifest/extractManifest.js.map +1 -1
- package/dist/actions/manifest/iconResolver.js +2 -3
- package/dist/actions/manifest/iconResolver.js.map +1 -1
- package/dist/actions/manifest/sanitizeIcon.js +13 -0
- package/dist/actions/manifest/sanitizeIcon.js.map +1 -0
- package/dist/actions/manifest/types.js +4 -9
- package/dist/actions/manifest/types.js.map +1 -1
- package/dist/actions/manifest/writeManifestFile.js +1 -1
- package/dist/actions/manifest/writeManifestFile.js.map +1 -1
- package/dist/actions/mcp/editorConfigs.js +26 -2
- package/dist/actions/mcp/editorConfigs.js.map +1 -1
- package/dist/actions/mcp/setupMCP.js +24 -25
- package/dist/actions/mcp/setupMCP.js.map +1 -1
- package/dist/actions/mcp/types.js.map +1 -1
- package/dist/actions/skills/configureSkills.js +49 -0
- package/dist/actions/skills/configureSkills.js.map +1 -0
- package/dist/actions/skills/readSkillState.js +40 -5
- package/dist/actions/skills/readSkillState.js.map +1 -1
- package/dist/actions/skills/setupSkills.js +47 -6
- package/dist/actions/skills/setupSkills.js.map +1 -1
- package/dist/actions/skills/skillCandidates.js +40 -0
- package/dist/actions/skills/skillCandidates.js.map +1 -0
- package/dist/actions/telemetry/telemetryDisclosure.js +2 -3
- package/dist/actions/telemetry/telemetryDisclosure.js.map +1 -1
- package/dist/actions/tokens/validateRole.js +3 -3
- package/dist/actions/tokens/validateRole.js.map +1 -1
- package/dist/commands/backups/disable.js +1 -1
- package/dist/commands/backups/disable.js.map +1 -1
- package/dist/commands/backups/download.js +1 -1
- package/dist/commands/backups/download.js.map +1 -1
- package/dist/commands/backups/enable.js +1 -1
- package/dist/commands/backups/enable.js.map +1 -1
- package/dist/commands/backups/list.js +1 -1
- package/dist/commands/backups/list.js.map +1 -1
- package/dist/commands/datasets/embeddings/disable.js +1 -0
- package/dist/commands/datasets/embeddings/disable.js.map +1 -1
- package/dist/commands/datasets/embeddings/enable.js +1 -0
- package/dist/commands/datasets/embeddings/enable.js.map +1 -1
- package/dist/commands/datasets/embeddings/status.js +1 -0
- package/dist/commands/datasets/embeddings/status.js.map +1 -1
- package/dist/commands/dev.js +11 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/init.js +7 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/manifest/extract.js +7 -2
- package/dist/commands/manifest/extract.js.map +1 -1
- package/dist/commands/mcp/configure.js +1 -0
- package/dist/commands/mcp/configure.js.map +1 -1
- package/dist/commands/skills/install.js +40 -0
- package/dist/commands/skills/install.js.map +1 -0
- package/dist/commands/tokens/add.js +1 -1
- package/dist/commands/tokens/add.js.map +1 -1
- package/dist/exports/index.d.ts +6 -0
- package/dist/exports/index.js +8 -0
- package/dist/exports/index.js.map +1 -1
- package/dist/exports/runtime.d.ts +41 -0
- package/dist/exports/runtime.js +13 -0
- package/dist/exports/runtime.js.map +1 -0
- package/dist/hooks/prerun/setupTelemetry.js +3 -1
- package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
- package/dist/server/devServer.js +8 -3
- package/dist/server/devServer.js.map +1 -1
- package/dist/services/documents.js +0 -1
- package/dist/services/documents.js.map +1 -1
- package/dist/telemetry/skills.telemetry.js +8 -0
- package/dist/telemetry/skills.telemetry.js.map +1 -0
- package/dist/util/compareDependencyVersions.js +1 -1
- package/dist/util/compareDependencyVersions.js.map +1 -1
- package/dist/util/determineIsApp.js +12 -1
- package/dist/util/determineIsApp.js.map +1 -1
- package/dist/util/getSharedServerConfig.js +2 -1
- package/dist/util/getSharedServerConfig.js.map +1 -1
- package/dist/util/resolveLatestVersions.js +20 -2
- package/dist/util/resolveLatestVersions.js.map +1 -1
- package/dist/util/resolveReactStrictMode.js +11 -0
- package/dist/util/resolveReactStrictMode.js.map +1 -0
- package/oclif.config.js +2 -1
- package/oclif.manifest.json +146 -113
- package/package.json +29 -23
- package/templates/page-builder/schemaTypes/index.js +1 -1
- package/dist/actions/build/checkRequiredDependencies.js +0 -124
- package/dist/actions/build/checkRequiredDependencies.js.map +0 -1
- package/dist/actions/build/getAutoUpdatesImportMap.js +0 -66
- package/dist/actions/build/getAutoUpdatesImportMap.js.map +0 -1
- package/dist/actions/dev/getDashboardAppUrl.js.map +0 -1
- package/dist/actions/dev/getDevServerConfig.js +0 -32
- package/dist/actions/dev/getDevServerConfig.js.map +0 -1
- package/dist/actions/dev/startAppDevServer.js +0 -59
- package/dist/actions/dev/startAppDevServer.js.map +0 -1
- package/dist/actions/dev/startStudioDevServer.js.map +0 -1
- package/dist/actions/manifest/extractAppManifest.js.map +0 -1
- /package/dist/actions/dev/{getDashboardAppUrl.js → servers/getDashboardAppUrl.js} +0 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { getCliConfigUncached } from '@sanity/cli-core';
|
|
2
|
+
import { registerDevServer } from '@sanity/workbench-cli/dev';
|
|
3
|
+
import { checkForDeprecatedAppId, getAppId } from '../../../util/appId.js';
|
|
4
|
+
import { extractCoreAppManifest } from '../../manifest/extractCoreAppManifest.js';
|
|
5
|
+
import { deriveInterfaces } from './deriveInterfaces.js';
|
|
6
|
+
import { extractStudioManifest } from './extractDevServerManifest.js';
|
|
7
|
+
import { trackInterfaceSet } from './interfaceSetId.js';
|
|
8
|
+
import { startDevManifestWatcher } from './startDevManifestWatcher.js';
|
|
9
|
+
/**
|
|
10
|
+
* The address a dev server actually bound, preferring the live socket over the
|
|
11
|
+
* configured port — with non-strict ports the two can disagree. Used for the
|
|
12
|
+
* initial registration and again after an interface-set rebuild recreates the
|
|
13
|
+
* server, so the registry never advertises a port nothing listens on.
|
|
14
|
+
*/ function serverAddress(server) {
|
|
15
|
+
const resolvedHost = server.config.server.host;
|
|
16
|
+
const addr = server.httpServer?.address();
|
|
17
|
+
return {
|
|
18
|
+
host: typeof resolvedHost === 'string' ? resolvedHost : 'localhost',
|
|
19
|
+
port: typeof addr === 'object' && addr ? addr.port : server.config.server.port
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Register the dev server in the dev server registry and start a watcher for
|
|
24
|
+
* the manifest file. The workbench reads the registration to locate the dev
|
|
25
|
+
* server and display it in the UI; the manifest watcher keeps that registration
|
|
26
|
+
* pointed at the latest manifest, which the workbench renders as project metadata.
|
|
27
|
+
*/ export async function startDevServerRegistration(options) {
|
|
28
|
+
const { cliConfig, isApp, onInterfaceSetChange, output, server, workDir } = options;
|
|
29
|
+
checkForDeprecatedAppId({
|
|
30
|
+
cliConfig,
|
|
31
|
+
output
|
|
32
|
+
});
|
|
33
|
+
const { host: appHost, port: appPort } = serverAddress(server);
|
|
34
|
+
// Interfaces (panels/workers/app view) are derived from the branded
|
|
35
|
+
// `unstable_defineApp` config and forwarded on the registry entry (alongside,
|
|
36
|
+
// not inside, the manifest) so the workbench renders local panels, runs local
|
|
37
|
+
// workers, and resolves the app view without a deploy. The watcher below
|
|
38
|
+
// re-derives them on every `sanity.cli.ts` edit so adding/removing a view or
|
|
39
|
+
// service re-syncs live (FR-024) — the way `title`/`icon` already do.
|
|
40
|
+
const interfaces = deriveInterfaces(cliConfig.app, {
|
|
41
|
+
isApp
|
|
42
|
+
});
|
|
43
|
+
const registration = registerDevServer({
|
|
44
|
+
host: appHost,
|
|
45
|
+
id: getAppId(cliConfig),
|
|
46
|
+
interfaces,
|
|
47
|
+
port: appPort,
|
|
48
|
+
projectId: cliConfig?.api?.projectId,
|
|
49
|
+
type: isApp ? 'coreApp' : 'studio',
|
|
50
|
+
workDir
|
|
51
|
+
});
|
|
52
|
+
// Tracks whether a watcher pass changed the *set* of interfaces (rebuild
|
|
53
|
+
// needed) vs. only the manifest (title/icon) or a view/service source file
|
|
54
|
+
// (HMR handles it — the set is unchanged). Committed separately from the
|
|
55
|
+
// detection so a failed rebuild stays eligible for retry (see below).
|
|
56
|
+
const interfaceSet = trackInterfaceSet(interfaces);
|
|
57
|
+
const watcher = await startDevManifestWatcher({
|
|
58
|
+
extract: isApp ? async ({ workDir: wd })=>({
|
|
59
|
+
// Interfaces are NOT part of the manifest — they're re-derived from the
|
|
60
|
+
// same config edit and forwarded as a separate registry field, so a
|
|
61
|
+
// `views`/`services`/`entry` change re-syncs live (FR-024).
|
|
62
|
+
interfaces: deriveInterfaces((await getCliConfigUncached(wd)).app, {
|
|
63
|
+
isApp
|
|
64
|
+
}),
|
|
65
|
+
manifest: await extractCoreAppManifest({
|
|
66
|
+
workDir: wd
|
|
67
|
+
})
|
|
68
|
+
}) : async (params)=>({
|
|
69
|
+
// Studios declare views/services in `sanity.cli.ts` too — re-derive
|
|
70
|
+
// them like the app extract does. The registry patch is a shallow
|
|
71
|
+
// merge, so a hardcoded `interfaces: undefined` here would wipe the
|
|
72
|
+
// panels/workers forwarded by the initial registration on the very
|
|
73
|
+
// first regeneration.
|
|
74
|
+
interfaces: deriveInterfaces((await getCliConfigUncached(params.workDir)).app, {
|
|
75
|
+
isApp
|
|
76
|
+
}),
|
|
77
|
+
manifest: await extractStudioManifest(params)
|
|
78
|
+
}),
|
|
79
|
+
// A studio's project root resolves to `sanity.config.*`, but its workbench
|
|
80
|
+
// interfaces live in `sanity.cli.*` — watch that too so adding/removing a
|
|
81
|
+
// view or service regenerates without a manual restart. Apps already
|
|
82
|
+
// resolve their root to `sanity.cli.*`.
|
|
83
|
+
extraWatchFilenames: isApp ? undefined : [
|
|
84
|
+
'sanity.cli.js',
|
|
85
|
+
'sanity.cli.ts'
|
|
86
|
+
],
|
|
87
|
+
output,
|
|
88
|
+
update: async (patch)=>{
|
|
89
|
+
if (!interfaceSet.changed(patch.interfaces)) {
|
|
90
|
+
// Set unchanged (reorder, or a manifest-only/source-file edit) — patch
|
|
91
|
+
// the registry and let HMR handle the rest; no rebuild needed.
|
|
92
|
+
registration.update(patch);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Rebuild the app remote first (so the new view/service has an expose +
|
|
96
|
+
// artifact), THEN patch the registry — the registry patch is what reloads
|
|
97
|
+
// the workbench page, and it must re-fetch a remote that already exposes
|
|
98
|
+
// the new interface.
|
|
99
|
+
const rebuiltServer = await onInterfaceSetChange?.();
|
|
100
|
+
// Commit only after the rebuild resolves: a thrown rebuild surfaces
|
|
101
|
+
// through the watcher's failure path with the set uncommitted, so the
|
|
102
|
+
// next pass over the same declarations retries instead of skipping.
|
|
103
|
+
interfaceSet.commit(patch.interfaces);
|
|
104
|
+
// The recreated server can bind a different port (non-strict ports), so
|
|
105
|
+
// the patch carries its actual address alongside the manifest fields.
|
|
106
|
+
registration.update(rebuiltServer ? {
|
|
107
|
+
...patch,
|
|
108
|
+
...serverAddress(rebuiltServer)
|
|
109
|
+
} : patch);
|
|
110
|
+
},
|
|
111
|
+
workDir
|
|
112
|
+
});
|
|
113
|
+
return {
|
|
114
|
+
close: async ()=>{
|
|
115
|
+
registration.release();
|
|
116
|
+
await watcher.close();
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
//# sourceMappingURL=startDevServerRegistration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/dev/registration/startDevServerRegistration.ts"],"sourcesContent":["import {type CliConfig, getCliConfigUncached, type Output} from '@sanity/cli-core'\nimport {registerDevServer} from '@sanity/workbench-cli/dev'\nimport {type ViteDevServer} from 'vite'\n\nimport {checkForDeprecatedAppId, getAppId} from '../../../util/appId.js'\nimport {extractCoreAppManifest} from '../../manifest/extractCoreAppManifest.js'\nimport {deriveInterfaces} from './deriveInterfaces.js'\nimport {extractStudioManifest} from './extractDevServerManifest.js'\nimport {trackInterfaceSet} from './interfaceSetId.js'\nimport {startDevManifestWatcher} from './startDevManifestWatcher.js'\n\ninterface DevServerRegistrationOptions {\n cliConfig: CliConfig\n isApp: boolean\n output: Output\n server: ViteDevServer\n workDir: string\n\n /**\n * Called when the declared interface *set* changes (a view/service added,\n * removed, renamed, or repointed in `sanity.cli.ts`), awaited *before* the\n * registry is patched — the registry patch is what reloads the workbench\n * page, and it must re-fetch a remote that already exposes the new\n * interface, so the caller's rebuild has to complete first. A view/service\n * *source* edit doesn't change the set and never fires this. Studios\n * declare views/services the same way apps do, so both pass a rebuild.\n *\n * Resolves with the recreated dev server so the registry entry can be\n * patched with its actual address — workbench projects run with non-strict\n * ports, so the replacement isn't guaranteed to bind the port registered at\n * startup. Must reject when the restart doesn't produce a listening server:\n * the set id stays uncommitted so the next config save retries the rebuild\n * instead of advertising the new interface set on a dead port.\n */\n onInterfaceSetChange?: () => Promise<ViteDevServer>\n}\n\ninterface DevServerRegistrationHandle {\n close: () => Promise<void>\n}\n\n/**\n * The address a dev server actually bound, preferring the live socket over the\n * configured port — with non-strict ports the two can disagree. Used for the\n * initial registration and again after an interface-set rebuild recreates the\n * server, so the registry never advertises a port nothing listens on.\n */\nfunction serverAddress(server: ViteDevServer) {\n const resolvedHost = server.config.server.host\n const addr = server.httpServer?.address()\n return {\n host: typeof resolvedHost === 'string' ? resolvedHost : 'localhost',\n port: typeof addr === 'object' && addr ? addr.port : server.config.server.port,\n }\n}\n\n/**\n * Register the dev server in the dev server registry and start a watcher for\n * the manifest file. The workbench reads the registration to locate the dev\n * server and display it in the UI; the manifest watcher keeps that registration\n * pointed at the latest manifest, which the workbench renders as project metadata.\n */\nexport async function startDevServerRegistration(\n options: DevServerRegistrationOptions,\n): Promise<DevServerRegistrationHandle> {\n const {cliConfig, isApp, onInterfaceSetChange, output, server, workDir} = options\n\n checkForDeprecatedAppId({cliConfig, output})\n\n const {host: appHost, port: appPort} = serverAddress(server)\n\n // Interfaces (panels/workers/app view) are derived from the branded\n // `unstable_defineApp` config and forwarded on the registry entry (alongside,\n // not inside, the manifest) so the workbench renders local panels, runs local\n // workers, and resolves the app view without a deploy. The watcher below\n // re-derives them on every `sanity.cli.ts` edit so adding/removing a view or\n // service re-syncs live (FR-024) — the way `title`/`icon` already do.\n const interfaces = deriveInterfaces(cliConfig.app, {isApp})\n\n const registration = registerDevServer({\n host: appHost,\n id: getAppId(cliConfig),\n interfaces,\n port: appPort,\n projectId: cliConfig?.api?.projectId,\n type: isApp ? 'coreApp' : 'studio',\n workDir,\n })\n\n // Tracks whether a watcher pass changed the *set* of interfaces (rebuild\n // needed) vs. only the manifest (title/icon) or a view/service source file\n // (HMR handles it — the set is unchanged). Committed separately from the\n // detection so a failed rebuild stays eligible for retry (see below).\n const interfaceSet = trackInterfaceSet(interfaces)\n\n const watcher = await startDevManifestWatcher({\n extract: isApp\n ? async ({workDir: wd}) => ({\n // Interfaces are NOT part of the manifest — they're re-derived from the\n // same config edit and forwarded as a separate registry field, so a\n // `views`/`services`/`entry` change re-syncs live (FR-024).\n interfaces: deriveInterfaces((await getCliConfigUncached(wd)).app, {isApp}),\n manifest: await extractCoreAppManifest({workDir: wd}),\n })\n : async (params) => ({\n // Studios declare views/services in `sanity.cli.ts` too — re-derive\n // them like the app extract does. The registry patch is a shallow\n // merge, so a hardcoded `interfaces: undefined` here would wipe the\n // panels/workers forwarded by the initial registration on the very\n // first regeneration.\n interfaces: deriveInterfaces((await getCliConfigUncached(params.workDir)).app, {isApp}),\n manifest: await extractStudioManifest(params),\n }),\n // A studio's project root resolves to `sanity.config.*`, but its workbench\n // interfaces live in `sanity.cli.*` — watch that too so adding/removing a\n // view or service regenerates without a manual restart. Apps already\n // resolve their root to `sanity.cli.*`.\n extraWatchFilenames: isApp ? undefined : ['sanity.cli.js', 'sanity.cli.ts'],\n output,\n update: async (patch) => {\n if (!interfaceSet.changed(patch.interfaces)) {\n // Set unchanged (reorder, or a manifest-only/source-file edit) — patch\n // the registry and let HMR handle the rest; no rebuild needed.\n registration.update(patch)\n return\n }\n // Rebuild the app remote first (so the new view/service has an expose +\n // artifact), THEN patch the registry — the registry patch is what reloads\n // the workbench page, and it must re-fetch a remote that already exposes\n // the new interface.\n const rebuiltServer = await onInterfaceSetChange?.()\n // Commit only after the rebuild resolves: a thrown rebuild surfaces\n // through the watcher's failure path with the set uncommitted, so the\n // next pass over the same declarations retries instead of skipping.\n interfaceSet.commit(patch.interfaces)\n // The recreated server can bind a different port (non-strict ports), so\n // the patch carries its actual address alongside the manifest fields.\n registration.update(rebuiltServer ? {...patch, ...serverAddress(rebuiltServer)} : patch)\n },\n workDir,\n })\n\n return {\n close: async () => {\n registration.release()\n await watcher.close()\n },\n }\n}\n"],"names":["getCliConfigUncached","registerDevServer","checkForDeprecatedAppId","getAppId","extractCoreAppManifest","deriveInterfaces","extractStudioManifest","trackInterfaceSet","startDevManifestWatcher","serverAddress","server","resolvedHost","config","host","addr","httpServer","address","port","startDevServerRegistration","options","cliConfig","isApp","onInterfaceSetChange","output","workDir","appHost","appPort","interfaces","app","registration","id","projectId","api","type","interfaceSet","watcher","extract","wd","manifest","params","extraWatchFilenames","undefined","update","patch","changed","rebuiltServer","commit","close","release"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/dev/servers/getDashboardAppUrl.ts"],"sourcesContent":["import {getSanityUrl, subdebug} from '@sanity/cli-core'\n\nconst debug = subdebug('dev:getDashboardAppURL')\n\nconst DEFAULT_TIMEOUT = 5000\n\nconst getDefaultDashboardURL = ({\n organizationId,\n url,\n}: {\n organizationId: string\n url: string\n}): string => {\n return getSanityUrl(\n `/@${organizationId}?${new URLSearchParams({\n dev: url,\n }).toString()}`,\n )\n}\n\n/**\n * Gets the dashboard URL from API or uses the default dashboard URL\n */\nexport const getDashboardAppURL = async ({\n httpHost = 'localhost',\n httpPort = 3333,\n organizationId,\n}: {\n httpHost?: string\n httpPort?: number\n organizationId: string\n}): Promise<string> => {\n const url = `http://${httpHost}:${httpPort}`\n\n const abortController = new AbortController()\n // Wait for 5 seconds before aborting the request\n const timer = setTimeout(() => abortController.abort(), DEFAULT_TIMEOUT)\n try {\n const queryParams = new URLSearchParams({\n organizationId,\n url,\n })\n\n const res = await globalThis.fetch(\n getSanityUrl(`/api/dashboard/mode/development/resolve-url?${queryParams.toString()}`),\n {\n signal: abortController.signal,\n },\n )\n\n if (!res.ok) {\n debug(`Failed to fetch dashboard URL: ${res.statusText}`)\n return getDefaultDashboardURL({organizationId, url})\n }\n\n const body = await res.json()\n // <dashboard-app-url>/<orgniazationId>?dev=<dev-server-url>\n return body?.url ?? getDefaultDashboardURL({organizationId, url})\n } catch (err) {\n debug(`Failed to fetch dashboard URL: ${err instanceof Error ? err.message : String(err)}`)\n return getDefaultDashboardURL({organizationId, url})\n } finally {\n clearTimeout(timer)\n }\n}\n"],"names":["getSanityUrl","subdebug","debug","DEFAULT_TIMEOUT","getDefaultDashboardURL","organizationId","url","URLSearchParams","dev","toString","getDashboardAppURL","httpHost","httpPort","abortController","AbortController","timer","setTimeout","abort","queryParams","res","globalThis","fetch","signal","ok","statusText","body","json","err","Error","message","String","clearTimeout"],"mappings":"AAAA,SAAQA,YAAY,EAAEC,QAAQ,QAAO,mBAAkB;AAEvD,MAAMC,QAAQD,SAAS;AAEvB,MAAME,kBAAkB;AAExB,MAAMC,yBAAyB,CAAC,EAC9BC,cAAc,EACdC,GAAG,EAIJ;IACC,OAAON,aACL,CAAC,EAAE,EAAEK,eAAe,CAAC,EAAE,IAAIE,gBAAgB;QACzCC,KAAKF;IACP,GAAGG,QAAQ,IAAI;AAEnB;AAEA;;CAEC,GACD,OAAO,MAAMC,qBAAqB,OAAO,EACvCC,WAAW,WAAW,EACtBC,WAAW,IAAI,EACfP,cAAc,EAKf;IACC,MAAMC,MAAM,CAAC,OAAO,EAAEK,SAAS,CAAC,EAAEC,UAAU;IAE5C,MAAMC,kBAAkB,IAAIC;IAC5B,iDAAiD;IACjD,MAAMC,QAAQC,WAAW,IAAMH,gBAAgBI,KAAK,IAAId;IACxD,IAAI;QACF,MAAMe,cAAc,IAAIX,gBAAgB;YACtCF;YACAC;QACF;QAEA,MAAMa,MAAM,MAAMC,WAAWC,KAAK,CAChCrB,aAAa,CAAC,4CAA4C,EAAEkB,YAAYT,QAAQ,IAAI,GACpF;YACEa,QAAQT,gBAAgBS,MAAM;QAChC;QAGF,IAAI,CAACH,IAAII,EAAE,EAAE;YACXrB,MAAM,CAAC,+BAA+B,EAAEiB,IAAIK,UAAU,EAAE;YACxD,OAAOpB,uBAAuB;gBAACC;gBAAgBC;YAAG;QACpD;QAEA,MAAMmB,OAAO,MAAMN,IAAIO,IAAI;QAC3B,4DAA4D;QAC5D,OAAOD,MAAMnB,OAAOF,uBAAuB;YAACC;YAAgBC;QAAG;IACjE,EAAE,OAAOqB,KAAK;QACZzB,MAAM,CAAC,+BAA+B,EAAEyB,eAAeC,QAAQD,IAAIE,OAAO,GAAGC,OAAOH,MAAM;QAC1F,OAAOvB,uBAAuB;YAACC;YAAgBC;QAAG;IACpD,SAAU;QACRyB,aAAahB;IACf;AACF,EAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { getSanityEnvVar, isWorkbenchApp } from '@sanity/cli-core';
|
|
3
|
+
import { spinner } from '@sanity/cli-core/ux';
|
|
4
|
+
import { determineIsApp } from '../../../util/determineIsApp.js';
|
|
5
|
+
import { getSharedServerConfig } from '../../../util/getSharedServerConfig.js';
|
|
6
|
+
import { resolveReactStrictMode } from '../../../util/resolveReactStrictMode.js';
|
|
7
|
+
export function getDevServerConfig({ cliConfig, flags, httpPort, output, workDir }) {
|
|
8
|
+
const configSpinner = spinner('Checking configuration files...');
|
|
9
|
+
const baseConfig = getSharedServerConfig({
|
|
10
|
+
cliConfig,
|
|
11
|
+
flags: {
|
|
12
|
+
host: flags.host,
|
|
13
|
+
port: flags.port
|
|
14
|
+
},
|
|
15
|
+
workDir
|
|
16
|
+
});
|
|
17
|
+
configSpinner.succeed();
|
|
18
|
+
const isApp = cliConfig ? determineIsApp(cliConfig) : false;
|
|
19
|
+
const reactStrictMode = resolveReactStrictMode(cliConfig);
|
|
20
|
+
// `views` is declared via `unstable_defineApp`, so read it off the branded
|
|
21
|
+
// app result rather than the legacy `app` config type.
|
|
22
|
+
const app = cliConfig?.app;
|
|
23
|
+
const envBasePath = getSanityEnvVar('BASEPATH', isApp ?? false);
|
|
24
|
+
if (envBasePath && cliConfig?.project?.basePath) {
|
|
25
|
+
output.warn(`Overriding configured base path (${cliConfig.project.basePath}) with value from environment variable (${envBasePath})`);
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
...baseConfig,
|
|
29
|
+
// The app's navigable entry. A branded app that omits `entry` has no app
|
|
30
|
+
// view (sanity-io/workbench spec 002-workbench-extension-api, US5): the runtime/federation skip the `./App` render path entirely.
|
|
31
|
+
entry: app?.entry,
|
|
32
|
+
// `devAction` passes an explicit port when a running workbench claimed the
|
|
33
|
+
// configured one; otherwise the shared resolution stands.
|
|
34
|
+
httpPort: httpPort ?? baseConfig.httpPort,
|
|
35
|
+
isWorkbenchApp: isWorkbenchApp(app),
|
|
36
|
+
reactCompiler: cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,
|
|
37
|
+
reactStrictMode,
|
|
38
|
+
services: isWorkbenchApp(app) ? app.services : undefined,
|
|
39
|
+
staticPath: path.join(workDir, 'static'),
|
|
40
|
+
typegen: cliConfig?.typegen,
|
|
41
|
+
views: isWorkbenchApp(app) ? app.views : undefined
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=getDevServerConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/dev/servers/getDevServerConfig.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {type CliConfig, getSanityEnvVar, isWorkbenchApp, type Output} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {type DevServerOptions} from '../../../server/devServer.js'\nimport {determineIsApp} from '../../../util/determineIsApp.js'\nimport {getSharedServerConfig} from '../../../util/getSharedServerConfig.js'\nimport {resolveReactStrictMode} from '../../../util/resolveReactStrictMode.js'\nimport {type DevFlags} from '../types.js'\n\nexport function getDevServerConfig({\n cliConfig,\n flags,\n httpPort,\n output,\n workDir,\n}: {\n cliConfig?: CliConfig\n flags: DevFlags\n httpPort?: number\n output: Output\n workDir: string\n}): Omit<DevServerOptions, 'spinner'> {\n const configSpinner = spinner('Checking configuration files...')\n\n const baseConfig = getSharedServerConfig({\n cliConfig,\n flags: {\n host: flags.host,\n port: flags.port,\n },\n workDir,\n })\n\n configSpinner.succeed()\n\n const isApp = cliConfig ? determineIsApp(cliConfig) : false\n const reactStrictMode = resolveReactStrictMode(cliConfig)\n // `views` is declared via `unstable_defineApp`, so read it off the branded\n // app result rather than the legacy `app` config type.\n const app = cliConfig?.app\n\n const envBasePath = getSanityEnvVar('BASEPATH', isApp ?? false)\n if (envBasePath && cliConfig?.project?.basePath) {\n output.warn(\n `Overriding configured base path (${cliConfig.project.basePath}) with value from environment variable (${envBasePath})`,\n )\n }\n\n return {\n ...baseConfig,\n // The app's navigable entry. A branded app that omits `entry` has no app\n // view (sanity-io/workbench spec 002-workbench-extension-api, US5): the runtime/federation skip the `./App` render path entirely.\n entry: app?.entry,\n // `devAction` passes an explicit port when a running workbench claimed the\n // configured one; otherwise the shared resolution stands.\n httpPort: httpPort ?? baseConfig.httpPort,\n isWorkbenchApp: isWorkbenchApp(app),\n reactCompiler: cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,\n reactStrictMode,\n services: isWorkbenchApp(app) ? app.services : undefined,\n staticPath: path.join(workDir, 'static'),\n typegen: cliConfig?.typegen,\n views: isWorkbenchApp(app) ? app.views : undefined,\n }\n}\n"],"names":["path","getSanityEnvVar","isWorkbenchApp","spinner","determineIsApp","getSharedServerConfig","resolveReactStrictMode","getDevServerConfig","cliConfig","flags","httpPort","output","workDir","configSpinner","baseConfig","host","port","succeed","isApp","reactStrictMode","app","envBasePath","project","basePath","warn","entry","reactCompiler","undefined","services","staticPath","join","typegen","views"],"mappings":"AAAA,OAAOA,UAAU,YAAW;AAE5B,SAAwBC,eAAe,EAAEC,cAAc,QAAoB,mBAAkB;AAC7F,SAAQC,OAAO,QAAO,sBAAqB;AAG3C,SAAQC,cAAc,QAAO,kCAAiC;AAC9D,SAAQC,qBAAqB,QAAO,yCAAwC;AAC5E,SAAQC,sBAAsB,QAAO,0CAAyC;AAG9E,OAAO,SAASC,mBAAmB,EACjCC,SAAS,EACTC,KAAK,EACLC,QAAQ,EACRC,MAAM,EACNC,OAAO,EAOR;IACC,MAAMC,gBAAgBV,QAAQ;IAE9B,MAAMW,aAAaT,sBAAsB;QACvCG;QACAC,OAAO;YACLM,MAAMN,MAAMM,IAAI;YAChBC,MAAMP,MAAMO,IAAI;QAClB;QACAJ;IACF;IAEAC,cAAcI,OAAO;IAErB,MAAMC,QAAQV,YAAYJ,eAAeI,aAAa;IACtD,MAAMW,kBAAkBb,uBAAuBE;IAC/C,2EAA2E;IAC3E,uDAAuD;IACvD,MAAMY,MAAMZ,WAAWY;IAEvB,MAAMC,cAAcpB,gBAAgB,YAAYiB,SAAS;IACzD,IAAIG,eAAeb,WAAWc,SAASC,UAAU;QAC/CZ,OAAOa,IAAI,CACT,CAAC,iCAAiC,EAAEhB,UAAUc,OAAO,CAACC,QAAQ,CAAC,wCAAwC,EAAEF,YAAY,CAAC,CAAC;IAE3H;IAEA,OAAO;QACL,GAAGP,UAAU;QACb,yEAAyE;QACzE,kIAAkI;QAClIW,OAAOL,KAAKK;QACZ,2EAA2E;QAC3E,0DAA0D;QAC1Df,UAAUA,YAAYI,WAAWJ,QAAQ;QACzCR,gBAAgBA,eAAekB;QAC/BM,eAAelB,aAAa,mBAAmBA,YAAYA,UAAUkB,aAAa,GAAGC;QACrFR;QACAS,UAAU1B,eAAekB,OAAOA,IAAIQ,QAAQ,GAAGD;QAC/CE,YAAY7B,KAAK8B,IAAI,CAAClB,SAAS;QAC/BmB,SAASvB,WAAWuB;QACpBC,OAAO9B,eAAekB,OAAOA,IAAIY,KAAK,GAAGL;IAC3C;AACF"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { styleText } from 'node:util';
|
|
2
|
+
import { isWorkbenchApp as determineIsWorkbenchApp } from '@sanity/cli-core';
|
|
3
|
+
import { startDevServer } from '../../../server/devServer.js';
|
|
4
|
+
import { gracefulServerDeath } from '../../../server/gracefulServerDeath.js';
|
|
5
|
+
import { devDebug } from '../devDebug.js';
|
|
6
|
+
import { getDashboardAppURL } from './getDashboardAppUrl.js';
|
|
7
|
+
import { getDevServerConfig } from './getDevServerConfig.js';
|
|
8
|
+
export async function startAppDevServer(options) {
|
|
9
|
+
const { cliConfig, flags, httpPort, output, workbenchAvailable, workDir } = options;
|
|
10
|
+
const isWorkbenchApp = determineIsWorkbenchApp(cliConfig?.app);
|
|
11
|
+
// Workbench apps don't load through the dashboard, so the flag has no
|
|
12
|
+
// meaning for them and is ignored.
|
|
13
|
+
if (!isWorkbenchApp && !flags['load-in-dashboard']) {
|
|
14
|
+
output.warn(`Apps cannot run without the Sanity dashboard`);
|
|
15
|
+
output.warn(`Starting dev server with the --load-in-dashboard flag set to true`);
|
|
16
|
+
}
|
|
17
|
+
let organizationId;
|
|
18
|
+
if (cliConfig && 'app' in cliConfig && cliConfig.app?.organizationId) {
|
|
19
|
+
organizationId = cliConfig.app.organizationId;
|
|
20
|
+
}
|
|
21
|
+
if (!organizationId) {
|
|
22
|
+
output.error(`Apps require an organization ID (orgId) specified in your sanity.cli.ts file`, {
|
|
23
|
+
exit: 1
|
|
24
|
+
});
|
|
25
|
+
return {
|
|
26
|
+
reason: 'missing-organization-id',
|
|
27
|
+
started: false
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const config = getDevServerConfig({
|
|
31
|
+
cliConfig,
|
|
32
|
+
flags,
|
|
33
|
+
httpPort,
|
|
34
|
+
output,
|
|
35
|
+
workDir
|
|
36
|
+
});
|
|
37
|
+
try {
|
|
38
|
+
output.log('Starting dev server');
|
|
39
|
+
const appTitle = cliConfig && 'app' in cliConfig ? cliConfig.app?.title : undefined;
|
|
40
|
+
const { close, server } = await startDevServer({
|
|
41
|
+
...config,
|
|
42
|
+
appTitle,
|
|
43
|
+
isApp: true
|
|
44
|
+
});
|
|
45
|
+
const { port } = server.config.server;
|
|
46
|
+
if (isWorkbenchApp) {
|
|
47
|
+
// Federated apps surface through the workbench, so the dashboard URL is
|
|
48
|
+
// meaningless for them. When the workbench runs, devAction announces its
|
|
49
|
+
// URL instead — only the package-unavailable fallback logs from here.
|
|
50
|
+
if (!workbenchAvailable) {
|
|
51
|
+
output.log(`App dev server started on port ${port}`);
|
|
52
|
+
}
|
|
53
|
+
} else {
|
|
54
|
+
const httpHost = config.httpHost || 'localhost';
|
|
55
|
+
const dashboardAppUrl = await getDashboardAppURL({
|
|
56
|
+
httpHost,
|
|
57
|
+
httpPort: port,
|
|
58
|
+
organizationId
|
|
59
|
+
});
|
|
60
|
+
output.log(`Dev server started on port ${port}`);
|
|
61
|
+
output.log(`View your app in the Sanity dashboard here:`);
|
|
62
|
+
output.log(styleText([
|
|
63
|
+
'blue',
|
|
64
|
+
'underline'
|
|
65
|
+
], dashboardAppUrl));
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
close,
|
|
69
|
+
server,
|
|
70
|
+
started: true
|
|
71
|
+
};
|
|
72
|
+
} catch (err) {
|
|
73
|
+
devDebug('Error starting app dev server', err);
|
|
74
|
+
throw gracefulServerDeath('dev', config.httpHost, config.httpPort, err);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
//# sourceMappingURL=startAppDevServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/dev/servers/startAppDevServer.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {isWorkbenchApp as determineIsWorkbenchApp} from '@sanity/cli-core'\n\nimport {startDevServer} from '../../../server/devServer.js'\nimport {gracefulServerDeath} from '../../../server/gracefulServerDeath.js'\nimport {devDebug} from '../devDebug.js'\nimport {type DevActionOptions, type StartDevServerResult} from '../types.js'\nimport {getDashboardAppURL} from './getDashboardAppUrl.js'\nimport {getDevServerConfig} from './getDevServerConfig.js'\n\nexport async function startAppDevServer(options: DevActionOptions): Promise<StartDevServerResult> {\n const {cliConfig, flags, httpPort, output, workbenchAvailable, workDir} = options\n\n const isWorkbenchApp = determineIsWorkbenchApp(cliConfig?.app)\n\n // Workbench apps don't load through the dashboard, so the flag has no\n // meaning for them and is ignored.\n if (!isWorkbenchApp && !flags['load-in-dashboard']) {\n output.warn(`Apps cannot run without the Sanity dashboard`)\n output.warn(`Starting dev server with the --load-in-dashboard flag set to true`)\n }\n\n let organizationId: string | undefined\n if (cliConfig && 'app' in cliConfig && cliConfig.app?.organizationId) {\n organizationId = cliConfig.app.organizationId\n }\n\n if (!organizationId) {\n output.error(`Apps require an organization ID (orgId) specified in your sanity.cli.ts file`, {\n exit: 1,\n })\n return {reason: 'missing-organization-id', started: false}\n }\n\n const config = getDevServerConfig({cliConfig, flags, httpPort, output, workDir})\n\n try {\n output.log('Starting dev server')\n\n const appTitle = cliConfig && 'app' in cliConfig ? cliConfig.app?.title : undefined\n const {close, server} = await startDevServer({\n ...config,\n appTitle,\n isApp: true,\n })\n\n const {port} = server.config.server\n\n if (isWorkbenchApp) {\n // Federated apps surface through the workbench, so the dashboard URL is\n // meaningless for them. When the workbench runs, devAction announces its\n // URL instead — only the package-unavailable fallback logs from here.\n if (!workbenchAvailable) {\n output.log(`App dev server started on port ${port}`)\n }\n } else {\n const httpHost = config.httpHost || 'localhost'\n\n const dashboardAppUrl = await getDashboardAppURL({\n httpHost,\n httpPort: port,\n organizationId,\n })\n output.log(`Dev server started on port ${port}`)\n output.log(`View your app in the Sanity dashboard here:`)\n output.log(styleText(['blue', 'underline'], dashboardAppUrl))\n }\n\n return {close, server, started: true}\n } catch (err) {\n devDebug('Error starting app dev server', err)\n throw gracefulServerDeath('dev', config.httpHost, config.httpPort, err)\n }\n}\n"],"names":["styleText","isWorkbenchApp","determineIsWorkbenchApp","startDevServer","gracefulServerDeath","devDebug","getDashboardAppURL","getDevServerConfig","startAppDevServer","options","cliConfig","flags","httpPort","output","workbenchAvailable","workDir","app","warn","organizationId","error","exit","reason","started","config","log","appTitle","title","undefined","close","server","isApp","port","httpHost","dashboardAppUrl","err"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,kBAAkBC,uBAAuB,QAAO,mBAAkB;AAE1E,SAAQC,cAAc,QAAO,+BAA8B;AAC3D,SAAQC,mBAAmB,QAAO,yCAAwC;AAC1E,SAAQC,QAAQ,QAAO,iBAAgB;AAEvC,SAAQC,kBAAkB,QAAO,0BAAyB;AAC1D,SAAQC,kBAAkB,QAAO,0BAAyB;AAE1D,OAAO,eAAeC,kBAAkBC,OAAyB;IAC/D,MAAM,EAACC,SAAS,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,kBAAkB,EAAEC,OAAO,EAAC,GAAGN;IAE1E,MAAMR,iBAAiBC,wBAAwBQ,WAAWM;IAE1D,sEAAsE;IACtE,mCAAmC;IACnC,IAAI,CAACf,kBAAkB,CAACU,KAAK,CAAC,oBAAoB,EAAE;QAClDE,OAAOI,IAAI,CAAC,CAAC,4CAA4C,CAAC;QAC1DJ,OAAOI,IAAI,CAAC,CAAC,iEAAiE,CAAC;IACjF;IAEA,IAAIC;IACJ,IAAIR,aAAa,SAASA,aAAaA,UAAUM,GAAG,EAAEE,gBAAgB;QACpEA,iBAAiBR,UAAUM,GAAG,CAACE,cAAc;IAC/C;IAEA,IAAI,CAACA,gBAAgB;QACnBL,OAAOM,KAAK,CAAC,CAAC,4EAA4E,CAAC,EAAE;YAC3FC,MAAM;QACR;QACA,OAAO;YAACC,QAAQ;YAA2BC,SAAS;QAAK;IAC3D;IAEA,MAAMC,SAAShB,mBAAmB;QAACG;QAAWC;QAAOC;QAAUC;QAAQE;IAAO;IAE9E,IAAI;QACFF,OAAOW,GAAG,CAAC;QAEX,MAAMC,WAAWf,aAAa,SAASA,YAAYA,UAAUM,GAAG,EAAEU,QAAQC;QAC1E,MAAM,EAACC,KAAK,EAAEC,MAAM,EAAC,GAAG,MAAM1B,eAAe;YAC3C,GAAGoB,MAAM;YACTE;YACAK,OAAO;QACT;QAEA,MAAM,EAACC,IAAI,EAAC,GAAGF,OAAON,MAAM,CAACM,MAAM;QAEnC,IAAI5B,gBAAgB;YAClB,wEAAwE;YACxE,yEAAyE;YACzE,sEAAsE;YACtE,IAAI,CAACa,oBAAoB;gBACvBD,OAAOW,GAAG,CAAC,CAAC,+BAA+B,EAAEO,MAAM;YACrD;QACF,OAAO;YACL,MAAMC,WAAWT,OAAOS,QAAQ,IAAI;YAEpC,MAAMC,kBAAkB,MAAM3B,mBAAmB;gBAC/C0B;gBACApB,UAAUmB;gBACVb;YACF;YACAL,OAAOW,GAAG,CAAC,CAAC,2BAA2B,EAAEO,MAAM;YAC/ClB,OAAOW,GAAG,CAAC,CAAC,2CAA2C,CAAC;YACxDX,OAAOW,GAAG,CAACxB,UAAU;gBAAC;gBAAQ;aAAY,EAAEiC;QAC9C;QAEA,OAAO;YAACL;YAAOC;YAAQP,SAAS;QAAI;IACtC,EAAE,OAAOY,KAAK;QACZ7B,SAAS,iCAAiC6B;QAC1C,MAAM9B,oBAAoB,OAAOmB,OAAOS,QAAQ,EAAET,OAAOX,QAAQ,EAAEsB;IACrE;AACF"}
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
import { styleText } from 'node:util';
|
|
2
|
-
import { checkStudioDependencyVersions } from '@sanity/cli-build/_internal/build';
|
|
3
|
-
import { getLocalPackageVersion, isInteractive } from '@sanity/cli-core';
|
|
2
|
+
import { checkRequiredDependencies, checkStudioDependencyVersions } from '@sanity/cli-build/_internal/build';
|
|
3
|
+
import { getLocalPackageVersion, isInteractive, isWorkbenchApp } from '@sanity/cli-core';
|
|
4
4
|
import { confirm, logSymbols, spinner } from '@sanity/cli-core/ux';
|
|
5
5
|
import { parse as semverParse } from 'semver';
|
|
6
|
-
import { startDevServer } from '
|
|
7
|
-
import { gracefulServerDeath } from '
|
|
8
|
-
import { getProjectById } from '
|
|
9
|
-
import { getAppId } from '
|
|
10
|
-
import { compareDependencyVersions } from '
|
|
11
|
-
import { getPackageManagerChoice } from '
|
|
12
|
-
import { upgradePackages } from '
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import { devDebug } from './devDebug.js';
|
|
6
|
+
import { startDevServer } from '../../../server/devServer.js';
|
|
7
|
+
import { gracefulServerDeath } from '../../../server/gracefulServerDeath.js';
|
|
8
|
+
import { getProjectById } from '../../../services/projects.js';
|
|
9
|
+
import { getAppId } from '../../../util/appId.js';
|
|
10
|
+
import { compareDependencyVersions } from '../../../util/compareDependencyVersions.js';
|
|
11
|
+
import { getPackageManagerChoice } from '../../../util/packageManager/packageManagerChoice.js';
|
|
12
|
+
import { upgradePackages } from '../../../util/packageManager/upgradePackages.js';
|
|
13
|
+
import { shouldAutoUpdate } from '../../build/shouldAutoUpdate.js';
|
|
14
|
+
import { devDebug } from '../devDebug.js';
|
|
16
15
|
import { getDashboardAppURL } from './getDashboardAppUrl.js';
|
|
17
16
|
import { getDevServerConfig } from './getDevServerConfig.js';
|
|
18
17
|
export async function startStudioDevServer(options) {
|
|
19
|
-
const { cliConfig, flags, output, workDir } = options;
|
|
18
|
+
const { cliConfig, flags, httpPort, output, workbenchAvailable, workDir } = options;
|
|
20
19
|
const projectId = cliConfig?.api?.projectId;
|
|
21
20
|
let organizationId;
|
|
22
|
-
|
|
21
|
+
// Workbench apps don't load through the dashboard, so the flag has no
|
|
22
|
+
// meaning for them and is ignored.
|
|
23
|
+
const loadInDashboard = flags['load-in-dashboard'] && !isWorkbenchApp(cliConfig?.app);
|
|
23
24
|
// Check studio dependency versions
|
|
24
25
|
await checkStudioDependencyVersions(workDir, output);
|
|
25
26
|
const { installedSanityVersion } = await checkRequiredDependencies(options);
|
|
@@ -95,6 +96,7 @@ export async function startStudioDevServer(options) {
|
|
|
95
96
|
const config = getDevServerConfig({
|
|
96
97
|
cliConfig,
|
|
97
98
|
flags,
|
|
99
|
+
httpPort,
|
|
98
100
|
output,
|
|
99
101
|
workDir
|
|
100
102
|
});
|
|
@@ -139,10 +141,12 @@ export async function startStudioDevServer(options) {
|
|
|
139
141
|
const appType = 'Sanity Studio';
|
|
140
142
|
const viteVersion = await getLocalPackageVersion('vite', import.meta.url);
|
|
141
143
|
spin.succeed();
|
|
142
|
-
loggerInfo(`${appType} ` + `using ${styleText('cyan', `vite@${viteVersion}`)} ` + `ready in ${styleText('cyan', `${Math.ceil(startupDuration)}ms`)}
|
|
144
|
+
loggerInfo(`${appType} ` + `using ${styleText('cyan', `vite@${viteVersion}`)} ` + `ready in ${styleText('cyan', `${Math.ceil(startupDuration)}ms`)}` + (workbenchAvailable ? '' : ` and running at ${styleText('cyan', url)}`));
|
|
143
145
|
}
|
|
144
146
|
return {
|
|
145
|
-
close
|
|
147
|
+
close,
|
|
148
|
+
server,
|
|
149
|
+
started: true
|
|
146
150
|
};
|
|
147
151
|
} catch (err) {
|
|
148
152
|
devDebug('Error starting studio dev server', err);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/dev/servers/startStudioDevServer.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {\n checkRequiredDependencies,\n checkStudioDependencyVersions,\n} from '@sanity/cli-build/_internal/build'\nimport {getLocalPackageVersion, isInteractive, isWorkbenchApp} from '@sanity/cli-core'\nimport {confirm, logSymbols, spinner} from '@sanity/cli-core/ux'\nimport {parse as semverParse} from 'semver'\n\nimport {startDevServer} from '../../../server/devServer.js'\nimport {gracefulServerDeath} from '../../../server/gracefulServerDeath.js'\nimport {getProjectById} from '../../../services/projects.js'\nimport {getAppId} from '../../../util/appId.js'\nimport {compareDependencyVersions} from '../../../util/compareDependencyVersions.js'\nimport {getPackageManagerChoice} from '../../../util/packageManager/packageManagerChoice.js'\nimport {upgradePackages} from '../../../util/packageManager/upgradePackages.js'\nimport {shouldAutoUpdate} from '../../build/shouldAutoUpdate.js'\nimport {devDebug} from '../devDebug.js'\nimport {type DevActionOptions, type StartDevServerResult} from '../types.js'\nimport {getDashboardAppURL} from './getDashboardAppUrl.js'\nimport {getDevServerConfig} from './getDevServerConfig.js'\n\nexport async function startStudioDevServer(\n options: DevActionOptions,\n): Promise<StartDevServerResult> {\n const {cliConfig, flags, httpPort, output, workbenchAvailable, workDir} = options\n const projectId = cliConfig?.api?.projectId\n let organizationId: string | undefined\n\n // Workbench apps don't load through the dashboard, so the flag has no\n // meaning for them and is ignored.\n const loadInDashboard = flags['load-in-dashboard'] && !isWorkbenchApp(cliConfig?.app)\n\n // Check studio dependency versions\n await checkStudioDependencyVersions(workDir, output)\n\n const {installedSanityVersion} = await checkRequiredDependencies(options)\n\n // Check if auto-updates are enabled\n const autoUpdatesEnabled = shouldAutoUpdate({cliConfig, flags, output})\n\n if (autoUpdatesEnabled) {\n // Get the clean version without build metadata: https://semver.org/#spec-item-10\n const cleanSanityVersion = semverParse(installedSanityVersion)?.version\n if (!cleanSanityVersion) {\n throw new Error(`Failed to parse installed Sanity version: ${installedSanityVersion}`)\n }\n\n const sanityDependencies = [\n {name: 'sanity', version: cleanSanityVersion},\n {name: '@sanity/vision', version: cleanSanityVersion},\n ]\n\n output.log(`${logSymbols.info} Running with auto-updates enabled`)\n\n // Check local versions against deployed versions\n let result: Awaited<ReturnType<typeof compareDependencyVersions>> | undefined\n\n const appId = getAppId(cliConfig)\n\n try {\n result = await compareDependencyVersions(sanityDependencies, workDir, {appId})\n } catch (err) {\n output.warn(`Failed to compare local versions against auto-updating versions: ${err}`)\n }\n\n if (result?.unresolvedPrerelease.length) {\n for (const mod of result.unresolvedPrerelease) {\n output.warn(\n `Your local version of ${mod.pkg} (${mod.version}) is a prerelease not available on the auto-updates CDN. The locally installed version will be used.`,\n )\n }\n }\n\n // mismatch between local and auto-updating dependencies\n if (result?.mismatched.length) {\n const message =\n `The following local package versions are different from the versions currently served at runtime.\\n` +\n `When using auto updates, we recommend that you run with the same versions locally as will be used when deploying.\\n\\n` +\n `${result.mismatched.map((mod) => ` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\\n')}\\n\\n`\n\n if (isInteractive()) {\n const shouldUpgrade = await confirm({\n default: true,\n message: styleText('yellow', `${message}Do you want to upgrade local versions?`),\n })\n if (shouldUpgrade) {\n await upgradePackages(\n {\n packageManager: (await getPackageManagerChoice(workDir, {interactive: false})).chosen,\n packages: result.mismatched.map((res) => [res.pkg, res.remote]),\n },\n {output, workDir},\n )\n }\n } else {\n // In this case we warn the user but we don't ask them if they want to upgrade because it's not interactive.\n output.log(styleText('yellow', message))\n }\n }\n }\n\n if (cliConfig?.schemaExtraction?.enabled) {\n output.log(`${logSymbols.info} Running dev server with schema extraction enabled`)\n }\n\n const config = getDevServerConfig({cliConfig, flags, httpPort, output, workDir})\n\n if (loadInDashboard) {\n if (!projectId) {\n output.error('Project Id is required to load in dashboard', {exit: 1})\n }\n\n try {\n const project = await getProjectById(projectId!)\n organizationId = project.organizationId!\n } catch (error) {\n devDebug('Error getting organization id from project id', error)\n output.error('Failed to get organization id from project id', {exit: 1})\n }\n }\n\n try {\n const startTime = Date.now()\n const spin = spinner('Starting dev server').start()\n const {close, server} = await startDevServer(config)\n\n const {info: loggerInfo} = server.config.logger\n const {port} = server.config.server\n const httpHost = config.httpHost || 'localhost'\n\n if (loadInDashboard) {\n spin.succeed()\n\n output.log(`Dev server started on port ${port}`)\n output.log(`View your studio in the Sanity dashboard here:`)\n output.log(\n styleText(\n ['blue', 'underline'],\n await getDashboardAppURL({\n httpHost,\n httpPort: port,\n organizationId: organizationId!,\n }),\n ),\n )\n } else {\n const startupDuration = Date.now() - startTime\n const url = `http://${httpHost || 'localhost'}:${port}${config.basePath}`\n const appType = 'Sanity Studio'\n\n const viteVersion = await getLocalPackageVersion('vite', import.meta.url)\n spin.succeed()\n\n loggerInfo(\n `${appType} ` +\n `using ${styleText('cyan', `vite@${viteVersion}`)} ` +\n `ready in ${styleText('cyan', `${Math.ceil(startupDuration)}ms`)}` +\n (workbenchAvailable ? '' : ` and running at ${styleText('cyan', url)}`),\n )\n }\n\n return {close, server, started: true}\n } catch (err) {\n devDebug('Error starting studio dev server', err)\n throw gracefulServerDeath('dev', config.httpHost, config.httpPort, err)\n }\n}\n"],"names":["styleText","checkRequiredDependencies","checkStudioDependencyVersions","getLocalPackageVersion","isInteractive","isWorkbenchApp","confirm","logSymbols","spinner","parse","semverParse","startDevServer","gracefulServerDeath","getProjectById","getAppId","compareDependencyVersions","getPackageManagerChoice","upgradePackages","shouldAutoUpdate","devDebug","getDashboardAppURL","getDevServerConfig","startStudioDevServer","options","cliConfig","flags","httpPort","output","workbenchAvailable","workDir","projectId","api","organizationId","loadInDashboard","app","installedSanityVersion","autoUpdatesEnabled","cleanSanityVersion","version","Error","sanityDependencies","name","log","info","result","appId","err","warn","unresolvedPrerelease","length","mod","pkg","mismatched","message","map","installed","remote","join","shouldUpgrade","default","packageManager","interactive","chosen","packages","res","schemaExtraction","enabled","config","error","exit","project","startTime","Date","now","spin","start","close","server","loggerInfo","logger","port","httpHost","succeed","startupDuration","url","basePath","appType","viteVersion","Math","ceil","started"],"mappings":"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"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Result of starting an app/studio dev server. Discriminated on `started` so
|
|
3
|
+
* callers handle the didn't-start case explicitly instead of null-checking
|
|
4
|
+
* optional fields. A server that fails to *boot* still throws — the
|
|
5
|
+
* not-started arm is reserved for expected early exits the server has
|
|
6
|
+
* already reported to the user.
|
|
7
|
+
*/ export { };
|
|
2
8
|
|
|
3
9
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/dev/types.ts"],"sourcesContent":["import {type CliConfig, type Output} from '@sanity/cli-core'\n\nimport {type DevCommand} from '../../commands/dev.js'\n\nexport type DevFlags = DevCommand['flags']\n\nexport interface DevActionOptions {\n cliConfig: CliConfig\n flags: DevFlags\n isApp: boolean\n output: Output\n workDir: string\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/dev/types.ts"],"sourcesContent":["import {type CliConfig, type Output} from '@sanity/cli-core'\nimport {type ViteDevServer} from 'vite'\n\nimport {type DevCommand} from '../../commands/dev.js'\n\nexport type DevFlags = DevCommand['flags']\n\nexport interface DevActionOptions {\n cliConfig: CliConfig\n flags: DevFlags\n isApp: boolean\n output: Output\n workDir: string\n\n /**\n * Port the app/studio dev server should bind. `devAction` sets it when a\n * running workbench has claimed the configured port; otherwise it stays\n * absent and the server resolves its port from flags/env/config.\n */\n httpPort?: number\n\n workbenchAvailable?: boolean\n}\n\n/**\n * Result of starting an app/studio dev server. Discriminated on `started` so\n * callers handle the didn't-start case explicitly instead of null-checking\n * optional fields. A server that fails to *boot* still throws — the\n * not-started arm is reserved for expected early exits the server has\n * already reported to the user.\n */\nexport type StartDevServerResult =\n | {close: () => Promise<void>; server: ViteDevServer; started: true}\n | {reason: 'missing-organization-id'; started: false}\n"],"names":[],"mappings":"AAwBA;;;;;;CAMC,GACD,WAEuD"}
|