@sanity/cli 6.5.3 → 6.7.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.
Files changed (188) hide show
  1. package/README.md +18 -5
  2. package/bin/run.js +3 -1
  3. package/dist/actions/auth/login/login.js +39 -13
  4. package/dist/actions/auth/login/login.js.map +1 -1
  5. package/dist/actions/auth/login/validateToken.js +39 -0
  6. package/dist/actions/auth/login/validateToken.js.map +1 -0
  7. package/dist/actions/build/buildApp.js +4 -5
  8. package/dist/actions/build/buildApp.js.map +1 -1
  9. package/dist/actions/build/buildStaticFiles.js +12 -4
  10. package/dist/actions/build/buildStaticFiles.js.map +1 -1
  11. package/dist/actions/build/buildStudio.js +6 -14
  12. package/dist/actions/build/buildStudio.js.map +1 -1
  13. package/dist/actions/build/{getStudioEnvironmentVariables.js → getEnvironmentVariables.js} +15 -19
  14. package/dist/actions/build/getEnvironmentVariables.js.map +1 -0
  15. package/dist/actions/deploy/deployStudio.js +1 -2
  16. package/dist/actions/deploy/deployStudio.js.map +1 -1
  17. package/dist/actions/deploy/deployStudioSchemasAndManifests.js +1 -2
  18. package/dist/actions/deploy/deployStudioSchemasAndManifests.js.map +1 -1
  19. package/dist/actions/deploy/deployStudioSchemasAndManifests.worker.js +1 -1
  20. package/dist/actions/deploy/deployStudioSchemasAndManifests.worker.js.map +1 -1
  21. package/dist/actions/dev/startStudioDevServer.js +1 -1
  22. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  23. package/dist/actions/documents/validateDocuments.worker.js +1 -2
  24. package/dist/actions/documents/validateDocuments.worker.js.map +1 -1
  25. package/dist/actions/graphql/SchemaError.js +1 -1
  26. package/dist/actions/graphql/SchemaError.js.map +1 -1
  27. package/dist/actions/init/initAction.js +32 -1
  28. package/dist/actions/init/initAction.js.map +1 -1
  29. package/dist/actions/init/scaffoldTemplate.js +32 -18
  30. package/dist/actions/init/scaffoldTemplate.js.map +1 -1
  31. package/dist/actions/init/templates/index.js +2 -0
  32. package/dist/actions/init/templates/index.js.map +1 -1
  33. package/dist/actions/init/templates/pageBuilder.js +32 -0
  34. package/dist/actions/init/templates/pageBuilder.js.map +1 -0
  35. package/dist/actions/init/types.js +2 -1
  36. package/dist/actions/init/types.js.map +1 -1
  37. package/dist/actions/manifest/extractManifest.js +1 -1
  38. package/dist/actions/manifest/extractManifest.js.map +1 -1
  39. package/dist/actions/manifest/extractManifest.worker.js +1 -1
  40. package/dist/actions/manifest/extractManifest.worker.js.map +1 -1
  41. package/dist/actions/mcp/editorConfigs.js +51 -11
  42. package/dist/actions/mcp/editorConfigs.js.map +1 -1
  43. package/dist/actions/mcp/promptForMCPSetup.js +16 -11
  44. package/dist/actions/mcp/promptForMCPSetup.js.map +1 -1
  45. package/dist/actions/mcp/setupMCP.js +180 -61
  46. package/dist/actions/mcp/setupMCP.js.map +1 -1
  47. package/dist/actions/mcp/types.js.map +1 -1
  48. package/dist/actions/schema/deploySchemas.js +1 -1
  49. package/dist/actions/schema/deploySchemas.js.map +1 -1
  50. package/dist/actions/schema/extractSanityWorkspace.worker.js +1 -1
  51. package/dist/actions/schema/extractSanityWorkspace.worker.js.map +1 -1
  52. package/dist/actions/schema/extractSchema.js +1 -4
  53. package/dist/actions/schema/extractSchema.js.map +1 -1
  54. package/dist/actions/schema/extractSchemaWatcher.js +1 -4
  55. package/dist/actions/schema/extractSchemaWatcher.js.map +1 -1
  56. package/dist/actions/schema/getExtractOptions.js +8 -18
  57. package/dist/actions/schema/getExtractOptions.js.map +1 -1
  58. package/dist/actions/schema/types.js +0 -6
  59. package/dist/actions/schema/types.js.map +1 -1
  60. package/dist/actions/schema/validateAction.js +1 -1
  61. package/dist/actions/schema/validateAction.js.map +1 -1
  62. package/dist/actions/schema/validateSchema.worker.js +1 -2
  63. package/dist/actions/schema/validateSchema.worker.js.map +1 -1
  64. package/dist/actions/schema/watchExtractSchema.js +1 -1
  65. package/dist/actions/schema/watchExtractSchema.js.map +1 -1
  66. package/dist/actions/skills/readSkillState.js +54 -0
  67. package/dist/actions/skills/readSkillState.js.map +1 -0
  68. package/dist/actions/skills/setupSkills.js +73 -0
  69. package/dist/actions/skills/setupSkills.js.map +1 -0
  70. package/dist/commands/build.js +9 -22
  71. package/dist/commands/build.js.map +1 -1
  72. package/dist/commands/cors/add.js +5 -5
  73. package/dist/commands/cors/add.js.map +1 -1
  74. package/dist/commands/datasets/export.js +9 -0
  75. package/dist/commands/datasets/export.js.map +1 -1
  76. package/dist/commands/docs/read.js +33 -12
  77. package/dist/commands/docs/read.js.map +1 -1
  78. package/dist/commands/init.js +12 -1
  79. package/dist/commands/init.js.map +1 -1
  80. package/dist/commands/login.js +28 -5
  81. package/dist/commands/login.js.map +1 -1
  82. package/dist/commands/manifest/extract.js +1 -2
  83. package/dist/commands/manifest/extract.js.map +1 -1
  84. package/dist/commands/mcp/configure.js +2 -1
  85. package/dist/commands/mcp/configure.js.map +1 -1
  86. package/dist/commands/schemas/deploy.js +1 -2
  87. package/dist/commands/schemas/deploy.js.map +1 -1
  88. package/dist/exports/_internal.d.ts +2 -1
  89. package/dist/exports/_internal.js +1 -1
  90. package/dist/exports/_internal.js.map +1 -1
  91. package/dist/server/devServer.js +25 -4
  92. package/dist/server/devServer.js.map +1 -1
  93. package/dist/server/previewServer.js +1 -1
  94. package/dist/server/previewServer.js.map +1 -1
  95. package/dist/services/mcp.js +1 -1
  96. package/dist/services/mcp.js.map +1 -1
  97. package/dist/telemetry/init.telemetry.js.map +1 -1
  98. package/oclif.manifest.json +237 -205
  99. package/package.json +15 -16
  100. package/templates/page-builder/README.md +9 -0
  101. package/templates/page-builder/schemaTypes/hero.js +31 -0
  102. package/templates/page-builder/schemaTypes/index.js +19 -0
  103. package/templates/page-builder/static/.gitkeep +0 -0
  104. package/dist/actions/build/buildDebug.js +0 -4
  105. package/dist/actions/build/buildDebug.js.map +0 -1
  106. package/dist/actions/build/buildVendorDependencies.js +0 -149
  107. package/dist/actions/build/buildVendorDependencies.js.map +0 -1
  108. package/dist/actions/build/checkStudioDependencyVersions.js +0 -155
  109. package/dist/actions/build/checkStudioDependencyVersions.js.map +0 -1
  110. package/dist/actions/build/createExternalFromImportMap.js +0 -11
  111. package/dist/actions/build/createExternalFromImportMap.js.map +0 -1
  112. package/dist/actions/build/decorateIndexWithAutoGeneratedWarning.js +0 -13
  113. package/dist/actions/build/decorateIndexWithAutoGeneratedWarning.js.map +0 -1
  114. package/dist/actions/build/decorateIndexWithBridgeScript.js +0 -17
  115. package/dist/actions/build/decorateIndexWithBridgeScript.js.map +0 -1
  116. package/dist/actions/build/decorateIndexWithStagingScript.js +0 -16
  117. package/dist/actions/build/decorateIndexWithStagingScript.js.map +0 -1
  118. package/dist/actions/build/getAppEnvVars.js +0 -9
  119. package/dist/actions/build/getAppEnvVars.js.map +0 -1
  120. package/dist/actions/build/getEntryModule.js +0 -46
  121. package/dist/actions/build/getEntryModule.js.map +0 -1
  122. package/dist/actions/build/getPossibleDocumentComponentLocations.js +0 -11
  123. package/dist/actions/build/getPossibleDocumentComponentLocations.js.map +0 -1
  124. package/dist/actions/build/getStudioEnvVars.js +0 -9
  125. package/dist/actions/build/getStudioEnvVars.js.map +0 -1
  126. package/dist/actions/build/getStudioEnvironmentVariables.js.map +0 -1
  127. package/dist/actions/build/getViteConfig.js +0 -219
  128. package/dist/actions/build/getViteConfig.js.map +0 -1
  129. package/dist/actions/build/normalizeBasePath.js +0 -9
  130. package/dist/actions/build/normalizeBasePath.js.map +0 -1
  131. package/dist/actions/build/renderDocument.js +0 -50
  132. package/dist/actions/build/renderDocument.js.map +0 -1
  133. package/dist/actions/build/renderDocument.worker.js +0 -9
  134. package/dist/actions/build/renderDocument.worker.js.map +0 -1
  135. package/dist/actions/build/renderDocumentWorker/addTimestampImportMapScriptToHtml.js +0 -79
  136. package/dist/actions/build/renderDocumentWorker/addTimestampImportMapScriptToHtml.js.map +0 -1
  137. package/dist/actions/build/renderDocumentWorker/components/BasicDocument.js +0 -61
  138. package/dist/actions/build/renderDocumentWorker/components/BasicDocument.js.map +0 -1
  139. package/dist/actions/build/renderDocumentWorker/components/DefaultDocument.js +0 -165
  140. package/dist/actions/build/renderDocumentWorker/components/DefaultDocument.js.map +0 -1
  141. package/dist/actions/build/renderDocumentWorker/components/Favicons.js +0 -28
  142. package/dist/actions/build/renderDocumentWorker/components/Favicons.js.map +0 -1
  143. package/dist/actions/build/renderDocumentWorker/components/GlobalErrorHandler.js +0 -178
  144. package/dist/actions/build/renderDocumentWorker/components/GlobalErrorHandler.js.map +0 -1
  145. package/dist/actions/build/renderDocumentWorker/components/NoJavascript.js +0 -51
  146. package/dist/actions/build/renderDocumentWorker/components/NoJavascript.js.map +0 -1
  147. package/dist/actions/build/renderDocumentWorker/getDocumentComponent.js +0 -41
  148. package/dist/actions/build/renderDocumentWorker/getDocumentComponent.js.map +0 -1
  149. package/dist/actions/build/renderDocumentWorker/getDocumentHtml.js +0 -55
  150. package/dist/actions/build/renderDocumentWorker/getDocumentHtml.js.map +0 -1
  151. package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js +0 -31
  152. package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js.map +0 -1
  153. package/dist/actions/build/renderDocumentWorker/tryLoadDocumentComponent.js +0 -30
  154. package/dist/actions/build/renderDocumentWorker/tryLoadDocumentComponent.js.map +0 -1
  155. package/dist/actions/build/renderDocumentWorker/types.js +0 -5
  156. package/dist/actions/build/renderDocumentWorker/types.js.map +0 -1
  157. package/dist/actions/build/writeSanityRuntime.js +0 -64
  158. package/dist/actions/build/writeSanityRuntime.js.map +0 -1
  159. package/dist/actions/docs/normalizeDocsPath.js +0 -15
  160. package/dist/actions/docs/normalizeDocsPath.js.map +0 -1
  161. package/dist/actions/schema/extractSanitySchema.worker.js +0 -33
  162. package/dist/actions/schema/extractSanitySchema.worker.js.map +0 -1
  163. package/dist/actions/schema/formatSchemaValidation.js +0 -78
  164. package/dist/actions/schema/formatSchemaValidation.js.map +0 -1
  165. package/dist/actions/schema/matchSchemaPattern.js +0 -22
  166. package/dist/actions/schema/matchSchemaPattern.js.map +0 -1
  167. package/dist/actions/schema/runSchemaExtraction.js +0 -39
  168. package/dist/actions/schema/runSchemaExtraction.js.map +0 -1
  169. package/dist/actions/schema/utils/SchemaExtractionError.js +0 -10
  170. package/dist/actions/schema/utils/SchemaExtractionError.js.map +0 -1
  171. package/dist/actions/schema/utils/extractValidationFromSchemaError.js +0 -12
  172. package/dist/actions/schema/utils/extractValidationFromSchemaError.js.map +0 -1
  173. package/dist/constants.js +0 -8
  174. package/dist/constants.js.map +0 -1
  175. package/dist/server/vite/plugin-sanity-build-entries.js +0 -67
  176. package/dist/server/vite/plugin-sanity-build-entries.js.map +0 -1
  177. package/dist/server/vite/plugin-sanity-favicons.js +0 -72
  178. package/dist/server/vite/plugin-sanity-favicons.js.map +0 -1
  179. package/dist/server/vite/plugin-sanity-runtime-rewrite.js +0 -18
  180. package/dist/server/vite/plugin-sanity-runtime-rewrite.js.map +0 -1
  181. package/dist/server/vite/plugin-schema-extraction.js +0 -201
  182. package/dist/server/vite/plugin-schema-extraction.js.map +0 -1
  183. package/dist/telemetry/build.telemetry.js +0 -13
  184. package/dist/telemetry/build.telemetry.js.map +0 -1
  185. package/dist/telemetry/extractSchema.telemetry.js +0 -18
  186. package/dist/telemetry/extractSchema.telemetry.js.map +0 -1
  187. package/dist/util/getWorkspace.js +0 -18
  188. package/dist/util/getWorkspace.js.map +0 -1
package/README.md CHANGED
@@ -408,8 +408,8 @@ FLAGS
408
408
  DESCRIPTION
409
409
  Destroy a remote Stack deployment and its resources
410
410
 
411
- Permanently removes the remote Stack and all its provisioned resources. Your local Blueprint files remain untouched,
412
- allowing you to redeploy later with 'blueprints init' + 'blueprints deploy'.
411
+ Permanently removes the remote Stack and all its provisioned resources. Your Blueprint manifest and resource files
412
+ remain intact; "stackId" is unset in your local config.
413
413
 
414
414
  This is a destructive operation. You will be prompted to confirm unless --force is specified.
415
415
 
@@ -529,9 +529,17 @@ EXAMPLES
529
529
 
530
530
  $ sanity blueprints init --blueprint-type <json|js|ts>
531
531
 
532
- $ sanity blueprints init --blueprint-type <json|js|ts> --project-id <projectId> --stack-id <stackId>
532
+ $ sanity blueprints init --organization-id <organizationId>
533
533
 
534
- $ sanity blueprints init --blueprint-type <json|js|ts> --stack-name <stackName>
534
+ $ sanity blueprints init --project-id <projectId>
535
+
536
+ $ sanity blueprints init --stack-name <newStackName>
537
+
538
+ $ sanity blueprints init --stack-id <existingStackId>
539
+
540
+ $ sanity blueprints init new-stack --type <json|js|ts> --org <organizationId> --name <newStackName>
541
+
542
+ $ sanity blueprints init old-stack --type <json|js|ts> --project-id <projectId> --stack-id <existingStackId>
535
543
  ```
536
544
 
537
545
  ## `sanity blueprints logs`
@@ -2489,13 +2497,14 @@ Log in to your Sanity account
2489
2497
 
2490
2498
  ```
2491
2499
  USAGE
2492
- $ sanity login [--open] [--provider <providerId> | --sso <slug>] [--sso-provider <name> ]
2500
+ $ sanity login [--open] [--provider <providerId> | --sso <slug> | --with-token] [--sso-provider <name> ]
2493
2501
 
2494
2502
  FLAGS
2495
2503
  --[no-]open Open a browser window to log in (`--no-open` only prints URL)
2496
2504
  --provider=<providerId> Log in using the given provider
2497
2505
  --sso=<slug> Log in using Single Sign-On, using the given organization slug
2498
2506
  --sso-provider=<name> Select a specific SSO provider by name (use with --sso)
2507
+ --with-token Read token from standard input
2499
2508
 
2500
2509
  DESCRIPTION
2501
2510
  Log in to your Sanity account
@@ -2516,6 +2525,10 @@ EXAMPLES
2516
2525
  Log in using a specific SSO provider within an organization
2517
2526
 
2518
2527
  $ sanity login --sso my-organization --sso-provider "Okta SSO"
2528
+
2529
+ Log in using a token from standard input
2530
+
2531
+ $ sanity login --with-token < token.txt
2519
2532
  ```
2520
2533
 
2521
2534
  ## `sanity logout`
package/bin/run.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {execute} from '@oclif/core'
2
+ import {execute, settings} from '@oclif/core'
3
3
 
4
4
  var err = '\u001B[31m\u001B[1mERROR:\u001B[22m\u001B[39m '
5
5
  var nodeVersionParts = process.version.replace(/^v/i, '').split('.').map(Number)
@@ -30,4 +30,6 @@ if (!isSupportedNodeVersion(majorVersion, minorVersion, patchVersion)) {
30
30
  process.exit(1)
31
31
  }
32
32
 
33
+ settings.enableAutoTranspile = false
34
+
33
35
  await execute({dir: import.meta.url})
@@ -1,16 +1,19 @@
1
1
  import { getCliToken, getUserConfig, setCliUserConfig, subdebug } from '@sanity/cli-core';
2
2
  import { spinner } from '@sanity/cli-core/ux';
3
+ import { isHttpError } from '@sanity/client';
3
4
  import open from 'open';
4
5
  import { logout } from '../../../services/auth.js';
5
6
  import { LoginTrace } from '../../../telemetry/login.telemetry.js';
6
7
  import { canLaunchBrowser } from '../../../util/canLaunchBrowser.js';
7
8
  import { startServerForTokenCallback } from '../authServer.js';
8
9
  import { getProvider } from './getProvider.js';
10
+ import { isSanityApiToken, validateToken } from './validateToken.js';
9
11
  const debug = subdebug('login');
10
12
  /**
11
13
  * Trigger the authentication flow for the CLI.
12
14
  *
13
- * NOTE: This uses terminal prompts and will not work for non-interactive/programmatic uses.
15
+ * NOTE: Without a token option, this uses terminal prompts and will not work for
16
+ * non-interactive/programmatic uses.
14
17
  *
15
18
  * @param options - Options for the login operation
16
19
  * @returns Promise that resolves when the login operation is complete
@@ -19,9 +22,19 @@ const debug = subdebug('login');
19
22
  */ export async function login(options) {
20
23
  const { output, telemetry } = options;
21
24
  const previousToken = await getCliToken();
22
- const hasExistingToken = Boolean(previousToken);
23
25
  const trace = telemetry.trace(LoginTrace);
24
26
  trace.start();
27
+ if (typeof options.token === 'string') {
28
+ try {
29
+ const authToken = await validateToken(options.token);
30
+ await storeAuthToken(authToken, previousToken, output);
31
+ trace.complete();
32
+ } catch (err) {
33
+ trace.error(err);
34
+ throw err;
35
+ }
36
+ return;
37
+ }
25
38
  const provider = await getProvider({
26
39
  experimental: options.experimental,
27
40
  orgSlug: options.sso,
@@ -43,7 +56,10 @@ const debug = subdebug('login');
43
56
  const shouldLaunchBrowser = canLaunchBrowser() && options.open !== false;
44
57
  const actionText = shouldLaunchBrowser ? 'Opening browser at' : 'Please open a browser at';
45
58
  output.log(`\n${actionText} ${loginUrl.href}\n`);
46
- const spin = spinner('Waiting for browser login to complete... Press Ctrl + C to cancel').start();
59
+ const spin = spinner({
60
+ discardStdin: false,
61
+ text: 'Waiting for browser login to complete... Press Ctrl + C to cancel'
62
+ }).start();
47
63
  if (shouldLaunchBrowser) {
48
64
  open(loginUrl.href);
49
65
  }
@@ -62,20 +78,30 @@ const debug = subdebug('login');
62
78
  server.close(()=>resolve());
63
79
  });
64
80
  }
65
- // Store the token
81
+ await storeAuthToken(authToken, previousToken, output);
82
+ trace.complete();
83
+ }
84
+ async function storeAuthToken(authToken, previousToken, output) {
66
85
  setCliUserConfig('authToken', authToken);
67
- // Clear cached telemetry consent
68
86
  getUserConfig().delete('telemetryConsent');
69
87
  // If we had a session previously, attempt to clear it
70
- if (hasExistingToken) {
71
- await logout(previousToken).catch((err)=>{
72
- const statusCode = err && err.response && err.response.statusCode;
73
- if (statusCode !== 401) {
74
- output.warn('Failed to invalidate previous session');
75
- }
76
- });
88
+ if (previousToken && previousToken !== authToken) {
89
+ await invalidateAuthToken(previousToken, output);
90
+ }
91
+ }
92
+ async function invalidateAuthToken(token, output) {
93
+ try {
94
+ if (await isSanityApiToken(token)) return;
95
+ } catch (err) {
96
+ if (isHttpError(err) && err.statusCode === 401) return;
97
+ }
98
+ try {
99
+ await logout(token);
100
+ } catch (err) {
101
+ if (!isHttpError(err) || err.statusCode !== 401) {
102
+ output.warn('Failed to invalidate previous session');
103
+ }
77
104
  }
78
- trace.complete();
79
105
  }
80
106
 
81
107
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/actions/auth/login/login.ts"],"sourcesContent":["import {\n type CLITelemetryStore,\n getCliToken,\n getUserConfig,\n type Output,\n setCliUserConfig,\n subdebug,\n} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport open from 'open'\n\nimport {logout} from '../../../services/auth.js'\nimport {LoginTrace} from '../../../telemetry/login.telemetry.js'\nimport {canLaunchBrowser} from '../../../util/canLaunchBrowser.js'\nimport {startServerForTokenCallback} from '../authServer.js'\nimport {getProvider} from './getProvider.js'\n\nconst debug = subdebug('login')\n\ninterface LoginOptions {\n output: Output\n\n telemetry: CLITelemetryStore\n\n experimental?: boolean\n open?: boolean\n provider?: string\n sso?: string\n ssoProvider?: string\n}\n\n/**\n * Trigger the authentication flow for the CLI.\n *\n * NOTE: This uses terminal prompts and will not work for non-interactive/programmatic uses.\n *\n * @param options - Options for the login operation\n * @returns Promise that resolves when the login operation is complete\n * @throws Will throw if login fails or is cancelled\n * @internal\n */\nexport async function login(options: LoginOptions) {\n const {output, telemetry} = options\n const previousToken = await getCliToken()\n const hasExistingToken = Boolean(previousToken)\n\n const trace = telemetry.trace(LoginTrace)\n trace.start()\n\n const provider = await getProvider({\n experimental: options.experimental,\n orgSlug: options.sso,\n specifiedProvider: options.provider,\n ssoProvider: options.ssoProvider,\n })\n\n trace.log({provider: provider?.name, step: 'selectProvider'})\n\n if (provider === undefined) {\n throw new Error('No authentication providers found')\n }\n\n const {loginUrl, server, token: tokenPromise} = await startServerForTokenCallback(provider.url)\n\n trace.log({step: 'waitForToken'})\n\n // Open a browser on the login page (or tell the user to)\n const shouldLaunchBrowser = canLaunchBrowser() && options.open !== false\n const actionText = shouldLaunchBrowser ? 'Opening browser at' : 'Please open a browser at'\n\n output.log(`\\n${actionText} ${loginUrl.href}\\n`)\n\n const spin = spinner('Waiting for browser login to complete... Press Ctrl + C to cancel').start()\n\n if (shouldLaunchBrowser) {\n open(loginUrl.href)\n }\n\n // Wait for a success/error on the HTTP callback server\n let authToken: string\n try {\n authToken = (await tokenPromise).token\n spin.stop()\n } catch (err: unknown) {\n spin.stop()\n trace.error(err as Error)\n debug('Error retrieving token: %O', err)\n throw err\n } finally {\n await new Promise<void>((resolve) => {\n server.close(() => resolve())\n })\n }\n\n // Store the token\n setCliUserConfig('authToken', authToken)\n\n // Clear cached telemetry consent\n getUserConfig().delete('telemetryConsent')\n\n // If we had a session previously, attempt to clear it\n if (hasExistingToken) {\n await logout(previousToken).catch((err) => {\n const statusCode = err && err.response && err.response.statusCode\n if (statusCode !== 401) {\n output.warn('Failed to invalidate previous session')\n }\n })\n }\n\n trace.complete()\n}\n"],"names":["getCliToken","getUserConfig","setCliUserConfig","subdebug","spinner","open","logout","LoginTrace","canLaunchBrowser","startServerForTokenCallback","getProvider","debug","login","options","output","telemetry","previousToken","hasExistingToken","Boolean","trace","start","provider","experimental","orgSlug","sso","specifiedProvider","ssoProvider","log","name","step","undefined","Error","loginUrl","server","token","tokenPromise","url","shouldLaunchBrowser","actionText","href","spin","authToken","stop","err","error","Promise","resolve","close","delete","catch","statusCode","response","warn","complete"],"mappings":"AAAA,SAEEA,WAAW,EACXC,aAAa,EAEbC,gBAAgB,EAChBC,QAAQ,QACH,mBAAkB;AACzB,SAAQC,OAAO,QAAO,sBAAqB;AAC3C,OAAOC,UAAU,OAAM;AAEvB,SAAQC,MAAM,QAAO,4BAA2B;AAChD,SAAQC,UAAU,QAAO,wCAAuC;AAChE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,2BAA2B,QAAO,mBAAkB;AAC5D,SAAQC,WAAW,QAAO,mBAAkB;AAE5C,MAAMC,QAAQR,SAAS;AAcvB;;;;;;;;;CASC,GACD,OAAO,eAAeS,MAAMC,OAAqB;IAC/C,MAAM,EAACC,MAAM,EAAEC,SAAS,EAAC,GAAGF;IAC5B,MAAMG,gBAAgB,MAAMhB;IAC5B,MAAMiB,mBAAmBC,QAAQF;IAEjC,MAAMG,QAAQJ,UAAUI,KAAK,CAACZ;IAC9BY,MAAMC,KAAK;IAEX,MAAMC,WAAW,MAAMX,YAAY;QACjCY,cAAcT,QAAQS,YAAY;QAClCC,SAASV,QAAQW,GAAG;QACpBC,mBAAmBZ,QAAQQ,QAAQ;QACnCK,aAAab,QAAQa,WAAW;IAClC;IAEAP,MAAMQ,GAAG,CAAC;QAACN,UAAUA,UAAUO;QAAMC,MAAM;IAAgB;IAE3D,IAAIR,aAAaS,WAAW;QAC1B,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAM,EAACC,QAAQ,EAAEC,MAAM,EAAEC,OAAOC,YAAY,EAAC,GAAG,MAAM1B,4BAA4BY,SAASe,GAAG;IAE9FjB,MAAMQ,GAAG,CAAC;QAACE,MAAM;IAAc;IAE/B,yDAAyD;IACzD,MAAMQ,sBAAsB7B,sBAAsBK,QAAQR,IAAI,KAAK;IACnE,MAAMiC,aAAaD,sBAAsB,uBAAuB;IAEhEvB,OAAOa,GAAG,CAAC,CAAC,EAAE,EAAEW,WAAW,CAAC,EAAEN,SAASO,IAAI,CAAC,EAAE,CAAC;IAE/C,MAAMC,OAAOpC,QAAQ,qEAAqEgB,KAAK;IAE/F,IAAIiB,qBAAqB;QACvBhC,KAAK2B,SAASO,IAAI;IACpB;IAEA,uDAAuD;IACvD,IAAIE;IACJ,IAAI;QACFA,YAAY,AAAC,CAAA,MAAMN,YAAW,EAAGD,KAAK;QACtCM,KAAKE,IAAI;IACX,EAAE,OAAOC,KAAc;QACrBH,KAAKE,IAAI;QACTvB,MAAMyB,KAAK,CAACD;QACZhC,MAAM,8BAA8BgC;QACpC,MAAMA;IACR,SAAU;QACR,MAAM,IAAIE,QAAc,CAACC;YACvBb,OAAOc,KAAK,CAAC,IAAMD;QACrB;IACF;IAEA,kBAAkB;IAClB5C,iBAAiB,aAAauC;IAE9B,iCAAiC;IACjCxC,gBAAgB+C,MAAM,CAAC;IAEvB,sDAAsD;IACtD,IAAI/B,kBAAkB;QACpB,MAAMX,OAAOU,eAAeiC,KAAK,CAAC,CAACN;YACjC,MAAMO,aAAaP,OAAOA,IAAIQ,QAAQ,IAAIR,IAAIQ,QAAQ,CAACD,UAAU;YACjE,IAAIA,eAAe,KAAK;gBACtBpC,OAAOsC,IAAI,CAAC;YACd;QACF;IACF;IAEAjC,MAAMkC,QAAQ;AAChB"}
1
+ {"version":3,"sources":["../../../../src/actions/auth/login/login.ts"],"sourcesContent":["import {\n type CLITelemetryStore,\n getCliToken,\n getUserConfig,\n type Output,\n setCliUserConfig,\n subdebug,\n} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {isHttpError} from '@sanity/client'\nimport open from 'open'\n\nimport {logout} from '../../../services/auth.js'\nimport {LoginTrace} from '../../../telemetry/login.telemetry.js'\nimport {canLaunchBrowser} from '../../../util/canLaunchBrowser.js'\nimport {startServerForTokenCallback} from '../authServer.js'\nimport {getProvider} from './getProvider.js'\nimport {isSanityApiToken, validateToken} from './validateToken.js'\n\nconst debug = subdebug('login')\n\ninterface LoginOptions {\n output: Output\n\n telemetry: CLITelemetryStore\n\n experimental?: boolean\n open?: boolean\n provider?: string\n sso?: string\n ssoProvider?: string\n token?: string\n}\n\n/**\n * Trigger the authentication flow for the CLI.\n *\n * NOTE: Without a token option, this uses terminal prompts and will not work for\n * non-interactive/programmatic uses.\n *\n * @param options - Options for the login operation\n * @returns Promise that resolves when the login operation is complete\n * @throws Will throw if login fails or is cancelled\n * @internal\n */\nexport async function login(options: LoginOptions) {\n const {output, telemetry} = options\n const previousToken = await getCliToken()\n\n const trace = telemetry.trace(LoginTrace)\n trace.start()\n\n if (typeof options.token === 'string') {\n try {\n const authToken = await validateToken(options.token)\n await storeAuthToken(authToken, previousToken, output)\n trace.complete()\n } catch (err: unknown) {\n trace.error(err as Error)\n throw err\n }\n return\n }\n\n const provider = await getProvider({\n experimental: options.experimental,\n orgSlug: options.sso,\n specifiedProvider: options.provider,\n ssoProvider: options.ssoProvider,\n })\n\n trace.log({provider: provider?.name, step: 'selectProvider'})\n\n if (provider === undefined) {\n throw new Error('No authentication providers found')\n }\n\n const {loginUrl, server, token: tokenPromise} = await startServerForTokenCallback(provider.url)\n\n trace.log({step: 'waitForToken'})\n\n // Open a browser on the login page (or tell the user to)\n const shouldLaunchBrowser = canLaunchBrowser() && options.open !== false\n const actionText = shouldLaunchBrowser ? 'Opening browser at' : 'Please open a browser at'\n\n output.log(`\\n${actionText} ${loginUrl.href}\\n`)\n\n const spin = spinner({\n discardStdin: false, // dont swallow ctrl-c\n text: 'Waiting for browser login to complete... Press Ctrl + C to cancel',\n }).start()\n\n if (shouldLaunchBrowser) {\n open(loginUrl.href)\n }\n\n // Wait for a success/error on the HTTP callback server\n let authToken: string\n try {\n authToken = (await tokenPromise).token\n spin.stop()\n } catch (err: unknown) {\n spin.stop()\n trace.error(err as Error)\n debug('Error retrieving token: %O', err)\n throw err\n } finally {\n await new Promise<void>((resolve) => {\n server.close(() => resolve())\n })\n }\n\n await storeAuthToken(authToken, previousToken, output)\n\n trace.complete()\n}\n\nasync function storeAuthToken(\n authToken: string,\n previousToken: string | undefined,\n output: Output,\n) {\n setCliUserConfig('authToken', authToken)\n getUserConfig().delete('telemetryConsent')\n\n // If we had a session previously, attempt to clear it\n if (previousToken && previousToken !== authToken) {\n await invalidateAuthToken(previousToken, output)\n }\n}\n\nasync function invalidateAuthToken(token: string, output: Output) {\n try {\n if (await isSanityApiToken(token)) return\n } catch (err) {\n if (isHttpError(err) && err.statusCode === 401) return\n }\n\n try {\n await logout(token)\n } catch (err) {\n if (!isHttpError(err) || err.statusCode !== 401) {\n output.warn('Failed to invalidate previous session')\n }\n }\n}\n"],"names":["getCliToken","getUserConfig","setCliUserConfig","subdebug","spinner","isHttpError","open","logout","LoginTrace","canLaunchBrowser","startServerForTokenCallback","getProvider","isSanityApiToken","validateToken","debug","login","options","output","telemetry","previousToken","trace","start","token","authToken","storeAuthToken","complete","err","error","provider","experimental","orgSlug","sso","specifiedProvider","ssoProvider","log","name","step","undefined","Error","loginUrl","server","tokenPromise","url","shouldLaunchBrowser","actionText","href","spin","discardStdin","text","stop","Promise","resolve","close","delete","invalidateAuthToken","statusCode","warn"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { getGlobalCliClient } from '@sanity/cli-core';
2
+ import { isHttpError } from '@sanity/client';
3
+ import { USERS_API_VERSION } from '../../../services/user.js';
4
+ import { getErrorMessage } from '../../../util/getErrorMessage.js';
5
+ export async function validateToken(token) {
6
+ const trimmedToken = token.trim();
7
+ if (!trimmedToken) {
8
+ throw new Error('Token is required on standard input. Run `sanity login --with-token < token.txt`.');
9
+ }
10
+ try {
11
+ await getTokenUser(trimmedToken);
12
+ } catch (error) {
13
+ if (isHttpError(error) && (error.statusCode === 401 || error.statusCode === 403)) {
14
+ throw new Error('Token is invalid or expired. Check the token and try again.', {
15
+ cause: error
16
+ });
17
+ }
18
+ throw new Error(`Could not verify token: ${getErrorMessage(error)}`, {
19
+ cause: error
20
+ });
21
+ }
22
+ return trimmedToken;
23
+ }
24
+ export async function isSanityApiToken(token) {
25
+ return isSanityApiTokenUser(await getTokenUser(token));
26
+ }
27
+ async function getTokenUser(token) {
28
+ const client = await getGlobalCliClient({
29
+ apiVersion: USERS_API_VERSION,
30
+ requireUser: true,
31
+ token
32
+ });
33
+ return client.users.getById('me');
34
+ }
35
+ function isSanityApiTokenUser(user) {
36
+ return typeof user === 'object' && user !== null && 'provider' in user && user.provider === 'sanity-token';
37
+ }
38
+
39
+ //# sourceMappingURL=validateToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/actions/auth/login/validateToken.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\nimport {isHttpError} from '@sanity/client'\n\nimport {USERS_API_VERSION} from '../../../services/user.js'\nimport {getErrorMessage} from '../../../util/getErrorMessage.js'\n\nexport async function validateToken(token: string): Promise<string> {\n const trimmedToken = token.trim()\n\n if (!trimmedToken) {\n throw new Error(\n 'Token is required on standard input. Run `sanity login --with-token < token.txt`.',\n )\n }\n\n try {\n await getTokenUser(trimmedToken)\n } catch (error) {\n if (isHttpError(error) && (error.statusCode === 401 || error.statusCode === 403)) {\n throw new Error('Token is invalid or expired. Check the token and try again.', {cause: error})\n }\n\n throw new Error(`Could not verify token: ${getErrorMessage(error)}`, {cause: error})\n }\n\n return trimmedToken\n}\n\nexport async function isSanityApiToken(token: string): Promise<boolean> {\n return isSanityApiTokenUser(await getTokenUser(token))\n}\n\nasync function getTokenUser(token: string): Promise<unknown> {\n const client = await getGlobalCliClient({\n apiVersion: USERS_API_VERSION,\n requireUser: true,\n token,\n })\n\n return client.users.getById('me')\n}\n\nfunction isSanityApiTokenUser(user: unknown): boolean {\n return (\n typeof user === 'object' &&\n user !== null &&\n 'provider' in user &&\n (user as {provider?: unknown}).provider === 'sanity-token'\n )\n}\n"],"names":["getGlobalCliClient","isHttpError","USERS_API_VERSION","getErrorMessage","validateToken","token","trimmedToken","trim","Error","getTokenUser","error","statusCode","cause","isSanityApiToken","isSanityApiTokenUser","client","apiVersion","requireUser","users","getById","user","provider"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mBAAkB;AACnD,SAAQC,WAAW,QAAO,iBAAgB;AAE1C,SAAQC,iBAAiB,QAAO,4BAA2B;AAC3D,SAAQC,eAAe,QAAO,mCAAkC;AAEhE,OAAO,eAAeC,cAAcC,KAAa;IAC/C,MAAMC,eAAeD,MAAME,IAAI;IAE/B,IAAI,CAACD,cAAc;QACjB,MAAM,IAAIE,MACR;IAEJ;IAEA,IAAI;QACF,MAAMC,aAAaH;IACrB,EAAE,OAAOI,OAAO;QACd,IAAIT,YAAYS,UAAWA,CAAAA,MAAMC,UAAU,KAAK,OAAOD,MAAMC,UAAU,KAAK,GAAE,GAAI;YAChF,MAAM,IAAIH,MAAM,+DAA+D;gBAACI,OAAOF;YAAK;QAC9F;QAEA,MAAM,IAAIF,MAAM,CAAC,wBAAwB,EAAEL,gBAAgBO,QAAQ,EAAE;YAACE,OAAOF;QAAK;IACpF;IAEA,OAAOJ;AACT;AAEA,OAAO,eAAeO,iBAAiBR,KAAa;IAClD,OAAOS,qBAAqB,MAAML,aAAaJ;AACjD;AAEA,eAAeI,aAAaJ,KAAa;IACvC,MAAMU,SAAS,MAAMf,mBAAmB;QACtCgB,YAAYd;QACZe,aAAa;QACbZ;IACF;IAEA,OAAOU,OAAOG,KAAK,CAACC,OAAO,CAAC;AAC9B;AAEA,SAASL,qBAAqBM,IAAa;IACzC,OACE,OAAOA,SAAS,YAChBA,SAAS,QACT,cAAcA,QACd,AAACA,KAA8BC,QAAQ,KAAK;AAEhD"}
@@ -1,20 +1,18 @@
1
1
  import { rm } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { styleText } from 'node:util';
4
+ import { AppBuildTrace, buildDebug, buildVendorDependencies } from '@sanity/cli-build/_internal/build';
4
5
  import { getCliTelemetry, getLocalPackageVersion, getTimer, isInteractive } from '@sanity/cli-core';
5
6
  import { confirm, logSymbols, spinner } from '@sanity/cli-core/ux';
6
7
  import { parse as semverParse } from 'semver';
7
- import { AppBuildTrace } from '../../telemetry/build.telemetry.js';
8
8
  import { getAppId } from '../../util/appId.js';
9
9
  import { compareDependencyVersions } from '../../util/compareDependencyVersions.js';
10
10
  import { formatModuleSizes, sortModulesBySize } from '../../util/moduleFormatUtils.js';
11
11
  import { warnAboutMissingAppId } from '../../util/warnAboutMissingAppId.js';
12
- import { buildDebug } from './buildDebug.js';
13
12
  import { buildStaticFiles } from './buildStaticFiles.js';
14
- import { buildVendorDependencies } from './buildVendorDependencies.js';
15
13
  import { determineBasePath } from './determineBasePath.js';
16
- import { getAppEnvVars } from './getAppEnvVars.js';
17
14
  import { getAutoUpdatesCssUrls, getAutoUpdatesImportMap } from './getAutoUpdatesImportMap.js';
15
+ import { getAppEnvironmentVariables } from './getEnvironmentVariables.js';
18
16
  import { handlePrereleaseVersions } from './handlePrereleaseVersions.js';
19
17
  /**
20
18
  * Build the Sanity app.
@@ -45,6 +43,7 @@ import { handlePrereleaseVersions } from './handlePrereleaseVersions.js';
45
43
  * Internal build app that avoids depending on flags for CLI config.
46
44
  * @param options - options for the build
47
45
  */ async function internalBuildApp(options) {
46
+ buildDebug(`Building app`);
48
47
  const { appId, determineBasePath, outDir, output, workDir } = options;
49
48
  let { autoUpdatesEnabled } = options;
50
49
  const unattendedMode = options.unattendedMode;
@@ -139,7 +138,7 @@ import { handlePrereleaseVersions } from './handlePrereleaseVersions.js';
139
138
  }
140
139
  }
141
140
  }
142
- const envVarKeys = getAppEnvVars();
141
+ const envVarKeys = Object.keys(getAppEnvironmentVariables());
143
142
  if (envVarKeys.length > 0) {
144
143
  output.log('\nIncluding the following environment variables as part of the JavaScript bundle:');
145
144
  for (const key of envVarKeys)output.log(`- ${key}`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/buildApp.ts"],"sourcesContent":["import {rm} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {\n type CliConfig,\n getCliTelemetry,\n getLocalPackageVersion,\n getTimer,\n isInteractive,\n type Output,\n UserViteConfig,\n} from '@sanity/cli-core'\nimport {confirm, logSymbols, spinner, type SpinnerInstance} from '@sanity/cli-core/ux'\nimport {parse as semverParse} from 'semver'\n\nimport {AppBuildTrace} from '../../telemetry/build.telemetry.js'\nimport {getAppId} from '../../util/appId.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {formatModuleSizes, sortModulesBySize} from '../../util/moduleFormatUtils.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {buildDebug} from './buildDebug.js'\nimport {buildStaticFiles} from './buildStaticFiles.js'\nimport {buildVendorDependencies} from './buildVendorDependencies.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {getAppEnvVars} from './getAppEnvVars.js'\nimport {getAutoUpdatesCssUrls, getAutoUpdatesImportMap} from './getAutoUpdatesImportMap.js'\nimport {handlePrereleaseVersions} from './handlePrereleaseVersions.js'\nimport {type BuildOptions} from './types.js'\n\ninterface InternalBuildOptions {\n appId: string | undefined\n appTitle: string | undefined\n autoUpdatesEnabled: boolean\n calledFromDeploy: boolean | undefined\n determineBasePath: () => string\n entry: string | undefined\n minify: boolean\n outDir: string | undefined\n output: Output\n reactCompiler: CliConfig['reactCompiler']\n schemaExtraction: CliConfig['schemaExtraction']\n sourceMap: boolean\n stats: boolean\n unattendedMode: boolean\n vite: UserViteConfig | undefined\n workDir: string\n}\n\n/**\n * Build the Sanity app.\n *\n * @internal\n */\nexport async function buildApp(options: BuildOptions): Promise<void> {\n const {cliConfig, flags, outDir, output, workDir} = options\n\n await internalBuildApp({\n appId: getAppId(cliConfig),\n appTitle: cliConfig && 'app' in cliConfig ? cliConfig.app?.title : undefined,\n autoUpdatesEnabled: options.autoUpdatesEnabled,\n calledFromDeploy: options.calledFromDeploy,\n determineBasePath: () => determineBasePath(cliConfig, 'app', output),\n entry: cliConfig && 'app' in cliConfig ? cliConfig.app?.entry : undefined,\n minify: flags.minify,\n outDir,\n output,\n reactCompiler: cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,\n schemaExtraction: cliConfig?.schemaExtraction,\n sourceMap: Boolean(flags['source-maps']),\n stats: flags.stats,\n unattendedMode: flags.yes,\n vite: cliConfig.vite,\n workDir,\n })\n}\n\n/**\n * Internal build app that avoids depending on flags for CLI config.\n * @param options - options for the build\n */\nasync function internalBuildApp(options: InternalBuildOptions): Promise<void> {\n const {appId, determineBasePath, outDir, output, workDir} = options\n let {autoUpdatesEnabled} = options\n const unattendedMode = options.unattendedMode\n const timer = getTimer()\n\n const defaultOutputDir = path.resolve(path.join(workDir, 'dist'))\n const outputDir = path.resolve(outDir || defaultOutputDir)\n\n const installedSdkVersion = await getLocalPackageVersion('@sanity/sdk-react', workDir)\n const installedSanityVersion = await getLocalPackageVersion('sanity', workDir)\n\n if (!installedSdkVersion) {\n output.error(`Failed to find installed @sanity/sdk-react version`, {exit: 1})\n return\n }\n\n let autoUpdatesImports = {}\n let autoUpdatesCssUrls: string[] = []\n\n if (autoUpdatesEnabled) {\n // Get the clean version without build metadata: https://semver.org/#spec-item-10\n const cleanSDKVersion = semverParse(installedSdkVersion)?.version\n if (!cleanSDKVersion) {\n output.error(`Failed to parse installed SDK version: ${installedSdkVersion}`, {exit: 1})\n return\n }\n\n // Sanity might not be installed, but if it is, we want to auto update it.\n const cleanSanityVersion = semverParse(installedSanityVersion)?.version\n\n const autoUpdatedPackages = [\n {name: '@sanity/sdk', version: cleanSDKVersion},\n {name: '@sanity/sdk-react', version: cleanSDKVersion},\n ...(cleanSanityVersion\n ? [{cssFile: 'index.css', name: 'sanity' as const, version: cleanSanityVersion}]\n : []),\n ]\n autoUpdatesImports = getAutoUpdatesImportMap(autoUpdatedPackages, {appId})\n autoUpdatesCssUrls = getAutoUpdatesCssUrls(autoUpdatedPackages, {appId})\n\n output.log(`${logSymbols.info} Building with auto-updates enabled`)\n\n // Warn if auto updates enabled but no appId configured.\n // Skip when called from deploy, since deploy handles appId itself\n // (prompts the user and tells them to add it to config).\n if (!appId && !options.calledFromDeploy) {\n warnAboutMissingAppId({appType: 'app', output})\n }\n\n // Check the versions\n const {mismatched, unresolvedPrerelease} = await compareDependencyVersions(\n autoUpdatedPackages,\n workDir,\n {appId},\n )\n\n if (unresolvedPrerelease.length > 0) {\n await handlePrereleaseVersions({output, unattendedMode, unresolvedPrerelease})\n autoUpdatesImports = {}\n autoUpdatesCssUrls = []\n autoUpdatesEnabled = false\n }\n\n if (mismatched.length > 0 && autoUpdatesEnabled) {\n const versionMismatchWarning =\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 test locally with the same versions before deploying. \\n\\n` +\n `${mismatched.map((mod) => ` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\\n')}`\n\n // If it is non-interactive or in unattended mode, we don't want to prompt\n if (isInteractive() && !unattendedMode) {\n const shouldContinue = await confirm({\n default: false,\n message: styleText('yellow', `${versionMismatchWarning} \\n\\nContinue anyway?`),\n })\n\n if (!shouldContinue) {\n output.error('Declined to continue with build', {exit: 1})\n return\n }\n } else {\n // if non-interactive or unattended, just show the warning\n output.warn(versionMismatchWarning)\n }\n }\n }\n\n const envVarKeys = getAppEnvVars()\n if (envVarKeys.length > 0) {\n output.log('\\nIncluding the following environment variables as part of the JavaScript bundle:')\n for (const key of envVarKeys) output.log(`- ${key}`)\n output.log('')\n }\n\n let shouldClean = true\n if (outputDir !== defaultOutputDir && !unattendedMode && isInteractive()) {\n shouldClean = await confirm({\n default: true,\n message: `Do you want to delete the existing directory (${outputDir}) first?`,\n })\n }\n\n const basePath = determineBasePath()\n\n let spin: SpinnerInstance\n if (shouldClean) {\n timer.start('cleanOutputFolder')\n spin = spinner('Clean output folder').start()\n await rm(outputDir, {force: true, recursive: true})\n const cleanDuration = timer.end('cleanOutputFolder')\n spin.text = `Clean output folder (${cleanDuration.toFixed(0)}ms)`\n spin.succeed()\n }\n\n spin = spinner(`Building Sanity application`).start()\n\n const trace = getCliTelemetry().trace(AppBuildTrace)\n trace.start()\n\n let importMap: {imports?: Record<string, string>} | undefined\n\n if (autoUpdatesEnabled) {\n importMap = {\n imports: {\n ...(await buildVendorDependencies({basePath, cwd: workDir, isApp: true, outputDir})),\n ...autoUpdatesImports,\n },\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n appTitle: options.appTitle,\n autoUpdatesCssUrls: autoUpdatesCssUrls.length > 0 ? autoUpdatesCssUrls : undefined,\n basePath,\n cwd: workDir,\n entry: options.entry,\n importMap,\n isApp: true,\n minify: options.minify,\n outputDir,\n reactCompiler: options.reactCompiler,\n schemaExtraction: options.schemaExtraction,\n sourceMap: options.sourceMap,\n vite: options.vite,\n })\n\n trace.log({\n outputSize: bundle.chunks\n .flatMap((chunk) => chunk.modules.flatMap((mod) => mod.renderedLength))\n .reduce((sum, n) => sum + n, 0),\n })\n const buildDuration = timer.end('bundleStudio')\n\n spin.text = `Build Sanity application (${buildDuration.toFixed(0)}ms)`\n spin.succeed()\n\n if (options.stats) {\n output.log('\\nLargest module files:')\n output.log(formatModuleSizes(sortModulesBySize(bundle.chunks).slice(0, 15)))\n }\n\n trace.complete()\n } catch (error) {\n spin.fail()\n trace.error(error)\n const message = error instanceof Error ? error.message : String(error)\n buildDebug(`Failed to build Sanity application`, {error})\n output.error(`Failed to build Sanity application: ${message}`, {exit: 1})\n }\n}\n"],"names":["rm","path","styleText","getCliTelemetry","getLocalPackageVersion","getTimer","isInteractive","confirm","logSymbols","spinner","parse","semverParse","AppBuildTrace","getAppId","compareDependencyVersions","formatModuleSizes","sortModulesBySize","warnAboutMissingAppId","buildDebug","buildStaticFiles","buildVendorDependencies","determineBasePath","getAppEnvVars","getAutoUpdatesCssUrls","getAutoUpdatesImportMap","handlePrereleaseVersions","buildApp","options","cliConfig","flags","outDir","output","workDir","internalBuildApp","appId","appTitle","app","title","undefined","autoUpdatesEnabled","calledFromDeploy","entry","minify","reactCompiler","schemaExtraction","sourceMap","Boolean","stats","unattendedMode","yes","vite","timer","defaultOutputDir","resolve","join","outputDir","installedSdkVersion","installedSanityVersion","error","exit","autoUpdatesImports","autoUpdatesCssUrls","cleanSDKVersion","version","cleanSanityVersion","autoUpdatedPackages","name","cssFile","log","info","appType","mismatched","unresolvedPrerelease","length","versionMismatchWarning","map","mod","pkg","installed","remote","shouldContinue","default","message","warn","envVarKeys","key","shouldClean","basePath","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","importMap","imports","cwd","isApp","bundle","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","slice","complete","fail","Error","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/build/buildApp.ts"],"sourcesContent":["import {rm} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {AppBuildTrace, buildDebug, buildVendorDependencies} from '@sanity/cli-build/_internal/build'\nimport {\n type CliConfig,\n getCliTelemetry,\n getLocalPackageVersion,\n getTimer,\n isInteractive,\n type Output,\n UserViteConfig,\n} from '@sanity/cli-core'\nimport {confirm, logSymbols, spinner, type SpinnerInstance} from '@sanity/cli-core/ux'\nimport {parse as semverParse} from 'semver'\n\nimport {getAppId} from '../../util/appId.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {formatModuleSizes, sortModulesBySize} from '../../util/moduleFormatUtils.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {buildStaticFiles} from './buildStaticFiles.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {getAutoUpdatesCssUrls, getAutoUpdatesImportMap} from './getAutoUpdatesImportMap.js'\nimport {getAppEnvironmentVariables} from './getEnvironmentVariables.js'\nimport {handlePrereleaseVersions} from './handlePrereleaseVersions.js'\nimport {type BuildOptions} from './types.js'\n\ninterface InternalBuildOptions {\n appId: string | undefined\n appTitle: string | undefined\n autoUpdatesEnabled: boolean\n calledFromDeploy: boolean | undefined\n determineBasePath: () => string\n entry: string | undefined\n minify: boolean\n outDir: string | undefined\n output: Output\n reactCompiler: CliConfig['reactCompiler']\n schemaExtraction: CliConfig['schemaExtraction']\n sourceMap: boolean\n stats: boolean\n unattendedMode: boolean\n vite: UserViteConfig | undefined\n workDir: string\n}\n\n/**\n * Build the Sanity app.\n *\n * @internal\n */\nexport async function buildApp(options: BuildOptions): Promise<void> {\n const {cliConfig, flags, outDir, output, workDir} = options\n\n await internalBuildApp({\n appId: getAppId(cliConfig),\n appTitle: cliConfig && 'app' in cliConfig ? cliConfig.app?.title : undefined,\n autoUpdatesEnabled: options.autoUpdatesEnabled,\n calledFromDeploy: options.calledFromDeploy,\n determineBasePath: () => determineBasePath(cliConfig, 'app', output),\n entry: cliConfig && 'app' in cliConfig ? cliConfig.app?.entry : undefined,\n minify: flags.minify,\n outDir,\n output,\n reactCompiler: cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,\n schemaExtraction: cliConfig?.schemaExtraction,\n sourceMap: Boolean(flags['source-maps']),\n stats: flags.stats,\n unattendedMode: flags.yes,\n vite: cliConfig.vite,\n workDir,\n })\n}\n\n/**\n * Internal build app that avoids depending on flags for CLI config.\n * @param options - options for the build\n */\nasync function internalBuildApp(options: InternalBuildOptions): Promise<void> {\n buildDebug(`Building app`)\n\n const {appId, determineBasePath, outDir, output, workDir} = options\n let {autoUpdatesEnabled} = options\n const unattendedMode = options.unattendedMode\n\n const timer = getTimer()\n\n const defaultOutputDir = path.resolve(path.join(workDir, 'dist'))\n const outputDir = path.resolve(outDir || defaultOutputDir)\n\n const installedSdkVersion = await getLocalPackageVersion('@sanity/sdk-react', workDir)\n const installedSanityVersion = await getLocalPackageVersion('sanity', workDir)\n\n if (!installedSdkVersion) {\n output.error(`Failed to find installed @sanity/sdk-react version`, {exit: 1})\n return\n }\n\n let autoUpdatesImports = {}\n let autoUpdatesCssUrls: string[] = []\n\n if (autoUpdatesEnabled) {\n // Get the clean version without build metadata: https://semver.org/#spec-item-10\n const cleanSDKVersion = semverParse(installedSdkVersion)?.version\n if (!cleanSDKVersion) {\n output.error(`Failed to parse installed SDK version: ${installedSdkVersion}`, {exit: 1})\n return\n }\n\n // Sanity might not be installed, but if it is, we want to auto update it.\n const cleanSanityVersion = semverParse(installedSanityVersion)?.version\n\n const autoUpdatedPackages = [\n {name: '@sanity/sdk', version: cleanSDKVersion},\n {name: '@sanity/sdk-react', version: cleanSDKVersion},\n ...(cleanSanityVersion\n ? [{cssFile: 'index.css', name: 'sanity' as const, version: cleanSanityVersion}]\n : []),\n ]\n autoUpdatesImports = getAutoUpdatesImportMap(autoUpdatedPackages, {appId})\n autoUpdatesCssUrls = getAutoUpdatesCssUrls(autoUpdatedPackages, {appId})\n\n output.log(`${logSymbols.info} Building with auto-updates enabled`)\n\n // Warn if auto updates enabled but no appId configured.\n // Skip when called from deploy, since deploy handles appId itself\n // (prompts the user and tells them to add it to config).\n if (!appId && !options.calledFromDeploy) {\n warnAboutMissingAppId({appType: 'app', output})\n }\n\n // Check the versions\n const {mismatched, unresolvedPrerelease} = await compareDependencyVersions(\n autoUpdatedPackages,\n workDir,\n {appId},\n )\n\n if (unresolvedPrerelease.length > 0) {\n await handlePrereleaseVersions({output, unattendedMode, unresolvedPrerelease})\n autoUpdatesImports = {}\n autoUpdatesCssUrls = []\n autoUpdatesEnabled = false\n }\n\n if (mismatched.length > 0 && autoUpdatesEnabled) {\n const versionMismatchWarning =\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 test locally with the same versions before deploying. \\n\\n` +\n `${mismatched.map((mod) => ` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\\n')}`\n\n // If it is non-interactive or in unattended mode, we don't want to prompt\n if (isInteractive() && !unattendedMode) {\n const shouldContinue = await confirm({\n default: false,\n message: styleText('yellow', `${versionMismatchWarning} \\n\\nContinue anyway?`),\n })\n\n if (!shouldContinue) {\n output.error('Declined to continue with build', {exit: 1})\n return\n }\n } else {\n // if non-interactive or unattended, just show the warning\n output.warn(versionMismatchWarning)\n }\n }\n }\n\n const envVarKeys = Object.keys(getAppEnvironmentVariables())\n if (envVarKeys.length > 0) {\n output.log('\\nIncluding the following environment variables as part of the JavaScript bundle:')\n for (const key of envVarKeys) output.log(`- ${key}`)\n output.log('')\n }\n\n let shouldClean = true\n if (outputDir !== defaultOutputDir && !unattendedMode && isInteractive()) {\n shouldClean = await confirm({\n default: true,\n message: `Do you want to delete the existing directory (${outputDir}) first?`,\n })\n }\n\n const basePath = determineBasePath()\n\n let spin: SpinnerInstance\n if (shouldClean) {\n timer.start('cleanOutputFolder')\n spin = spinner('Clean output folder').start()\n await rm(outputDir, {force: true, recursive: true})\n const cleanDuration = timer.end('cleanOutputFolder')\n spin.text = `Clean output folder (${cleanDuration.toFixed(0)}ms)`\n spin.succeed()\n }\n\n spin = spinner(`Building Sanity application`).start()\n\n const trace = getCliTelemetry().trace(AppBuildTrace)\n trace.start()\n\n let importMap: {imports?: Record<string, string>} | undefined\n\n if (autoUpdatesEnabled) {\n importMap = {\n imports: {\n ...(await buildVendorDependencies({basePath, cwd: workDir, isApp: true, outputDir})),\n ...autoUpdatesImports,\n },\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n appTitle: options.appTitle,\n autoUpdatesCssUrls: autoUpdatesCssUrls.length > 0 ? autoUpdatesCssUrls : undefined,\n basePath,\n cwd: workDir,\n entry: options.entry,\n importMap,\n isApp: true,\n minify: options.minify,\n outputDir,\n reactCompiler: options.reactCompiler,\n schemaExtraction: options.schemaExtraction,\n sourceMap: options.sourceMap,\n vite: options.vite,\n })\n\n trace.log({\n outputSize: bundle.chunks\n .flatMap((chunk) => chunk.modules.flatMap((mod) => mod.renderedLength))\n .reduce((sum, n) => sum + n, 0),\n })\n const buildDuration = timer.end('bundleStudio')\n\n spin.text = `Build Sanity application (${buildDuration.toFixed(0)}ms)`\n spin.succeed()\n\n if (options.stats) {\n output.log('\\nLargest module files:')\n output.log(formatModuleSizes(sortModulesBySize(bundle.chunks).slice(0, 15)))\n }\n\n trace.complete()\n } catch (error) {\n spin.fail()\n trace.error(error)\n const message = error instanceof Error ? error.message : String(error)\n buildDebug(`Failed to build Sanity application`, {error})\n output.error(`Failed to build Sanity application: ${message}`, {exit: 1})\n }\n}\n"],"names":["rm","path","styleText","AppBuildTrace","buildDebug","buildVendorDependencies","getCliTelemetry","getLocalPackageVersion","getTimer","isInteractive","confirm","logSymbols","spinner","parse","semverParse","getAppId","compareDependencyVersions","formatModuleSizes","sortModulesBySize","warnAboutMissingAppId","buildStaticFiles","determineBasePath","getAutoUpdatesCssUrls","getAutoUpdatesImportMap","getAppEnvironmentVariables","handlePrereleaseVersions","buildApp","options","cliConfig","flags","outDir","output","workDir","internalBuildApp","appId","appTitle","app","title","undefined","autoUpdatesEnabled","calledFromDeploy","entry","minify","reactCompiler","schemaExtraction","sourceMap","Boolean","stats","unattendedMode","yes","vite","timer","defaultOutputDir","resolve","join","outputDir","installedSdkVersion","installedSanityVersion","error","exit","autoUpdatesImports","autoUpdatesCssUrls","cleanSDKVersion","version","cleanSanityVersion","autoUpdatedPackages","name","cssFile","log","info","appType","mismatched","unresolvedPrerelease","length","versionMismatchWarning","map","mod","pkg","installed","remote","shouldContinue","default","message","warn","envVarKeys","Object","keys","key","shouldClean","basePath","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","importMap","imports","cwd","isApp","bundle","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","slice","complete","fail","Error","String"],"mappings":"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"}
@@ -1,9 +1,7 @@
1
1
  import path from 'node:path';
2
- import { copyDir, writeFavicons } from '@sanity/cli-build/_internal';
2
+ import { buildDebug, copyDir, extendViteConfigWithUserConfig, finalizeViteConfig, getViteConfig, writeFavicons, writeSanityRuntime } from '@sanity/cli-build/_internal/build';
3
3
  import { build } from 'vite';
4
- import { buildDebug } from './buildDebug.js';
5
- import { extendViteConfigWithUserConfig, finalizeViteConfig, getViteConfig } from './getViteConfig.js';
6
- import { writeSanityRuntime } from './writeSanityRuntime.js';
4
+ import { getAppEnvironmentVariables, getStudioEnvironmentVariables } from './getEnvironmentVariables.js';
7
5
  /**
8
6
  * Builds static files
9
7
  *
@@ -20,12 +18,22 @@ import { writeSanityRuntime } from './writeSanityRuntime.js';
20
18
  reactStrictMode: false,
21
19
  watch: false
22
20
  });
21
+ function getEnvironmentVariables() {
22
+ return isApp ? getAppEnvironmentVariables({
23
+ jsonEncode: true,
24
+ prefix: 'process.env.'
25
+ }) : getStudioEnvironmentVariables({
26
+ jsonEncode: true,
27
+ prefix: 'process.env.'
28
+ });
29
+ }
23
30
  buildDebug('Resolving vite config');
24
31
  const mode = 'production';
25
32
  let viteConfig = await getViteConfig({
26
33
  autoUpdatesCssUrls,
27
34
  basePath,
28
35
  cwd,
36
+ getEnvironmentVariables,
29
37
  importMap,
30
38
  isApp,
31
39
  minify,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/buildStaticFiles.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {copyDir, writeFavicons} from '@sanity/cli-build/_internal'\nimport {type CliConfig, type UserViteConfig} from '@sanity/cli-core'\nimport {type PluginOptions as ReactCompilerConfig} from 'babel-plugin-react-compiler'\nimport {build} from 'vite'\n\nimport {buildDebug} from './buildDebug.js'\nimport {extendViteConfigWithUserConfig, finalizeViteConfig, getViteConfig} from './getViteConfig.js'\nimport {writeSanityRuntime} from './writeSanityRuntime.js'\n\nexport interface ChunkModule {\n name: string\n originalLength: number\n renderedLength: number\n}\n\nexport interface ChunkStats {\n modules: ChunkModule[]\n name: string\n}\n\ninterface StaticBuildOptions {\n basePath: string\n cwd: string\n outputDir: string\n\n appTitle?: string\n autoUpdatesCssUrls?: string[]\n entry?: string\n importMap?: {imports?: Record<string, string>}\n isApp?: boolean\n minify?: boolean\n profile?: boolean\n reactCompiler?: ReactCompilerConfig\n schemaExtraction?: CliConfig['schemaExtraction']\n sourceMap?: boolean\n vite?: UserViteConfig\n}\n\n/**\n * Builds static files\n *\n * @internal\n */\nexport async function buildStaticFiles(\n options: StaticBuildOptions,\n): Promise<{chunks: ChunkStats[]}> {\n const {\n appTitle,\n autoUpdatesCssUrls,\n basePath,\n cwd,\n entry,\n importMap,\n isApp,\n minify = true,\n outputDir,\n reactCompiler,\n schemaExtraction,\n sourceMap = false,\n vite: extendViteConfig,\n } = options\n\n buildDebug('Writing Sanity runtime files')\n await writeSanityRuntime({\n appTitle,\n basePath,\n cwd,\n entry,\n isApp,\n reactStrictMode: false,\n watch: false,\n })\n\n buildDebug('Resolving vite config')\n const mode = 'production'\n let viteConfig = await getViteConfig({\n autoUpdatesCssUrls,\n basePath,\n cwd,\n importMap,\n isApp,\n minify,\n mode,\n outputDir,\n reactCompiler,\n schemaExtraction,\n sourceMap,\n })\n\n if (extendViteConfig) {\n viteConfig = await extendViteConfigWithUserConfig(\n {command: 'build', mode},\n viteConfig,\n extendViteConfig,\n )\n viteConfig = await finalizeViteConfig(viteConfig)\n }\n\n const fromPath = path.join(cwd, 'static')\n // Copy files placed in /static to the built /static\n buildDebug(`Copying static files from ${fromPath} to output dir`)\n const staticPath = path.join(outputDir, 'static')\n await copyDir(fromPath, staticPath)\n\n // Write favicons, not overwriting ones that already exist, to static folder\n buildDebug('Writing favicons to output dir')\n const faviconBasePath = `${basePath.replace(/\\/+$/, '')}/static`\n await writeFavicons(faviconBasePath, staticPath)\n\n buildDebug('Bundling using vite')\n const bundle = await build(viteConfig)\n buildDebug('Bundling complete')\n\n // For typescript only - this shouldn't ever be the case given we're not watching\n if (Array.isArray(bundle) || !('output' in bundle)) {\n return {chunks: []}\n }\n\n const stats: ChunkStats[] = []\n for (const chunk of bundle.output) {\n if (chunk.type !== 'chunk') {\n continue\n }\n\n stats.push({\n modules: Object.entries(chunk.modules).map(([rawFilePath, chunkModule]) => {\n const filePath = rawFilePath.startsWith('\\u0000')\n ? rawFilePath.slice('\\u0000'.length)\n : rawFilePath\n\n return {\n name: path.isAbsolute(filePath) ? path.relative(cwd, filePath) : filePath,\n originalLength: chunkModule.originalLength,\n renderedLength: chunkModule.renderedLength,\n }\n }),\n name: chunk.name,\n })\n }\n\n return {chunks: stats}\n}\n"],"names":["path","copyDir","writeFavicons","build","buildDebug","extendViteConfigWithUserConfig","finalizeViteConfig","getViteConfig","writeSanityRuntime","buildStaticFiles","options","appTitle","autoUpdatesCssUrls","basePath","cwd","entry","importMap","isApp","minify","outputDir","reactCompiler","schemaExtraction","sourceMap","vite","extendViteConfig","reactStrictMode","watch","mode","viteConfig","command","fromPath","join","staticPath","faviconBasePath","replace","bundle","Array","isArray","chunks","stats","chunk","output","type","push","modules","Object","entries","map","rawFilePath","chunkModule","filePath","startsWith","slice","length","name","isAbsolute","relative","originalLength","renderedLength"],"mappings":"AAAA,OAAOA,UAAU,YAAW;AAE5B,SAAQC,OAAO,EAAEC,aAAa,QAAO,8BAA6B;AAGlE,SAAQC,KAAK,QAAO,OAAM;AAE1B,SAAQC,UAAU,QAAO,kBAAiB;AAC1C,SAAQC,8BAA8B,EAAEC,kBAAkB,EAAEC,aAAa,QAAO,qBAAoB;AACpG,SAAQC,kBAAkB,QAAO,0BAAyB;AA+B1D;;;;CAIC,GACD,OAAO,eAAeC,iBACpBC,OAA2B;IAE3B,MAAM,EACJC,QAAQ,EACRC,kBAAkB,EAClBC,QAAQ,EACRC,GAAG,EACHC,KAAK,EACLC,SAAS,EACTC,KAAK,EACLC,SAAS,IAAI,EACbC,SAAS,EACTC,aAAa,EACbC,gBAAgB,EAChBC,YAAY,KAAK,EACjBC,MAAMC,gBAAgB,EACvB,GAAGd;IAEJN,WAAW;IACX,MAAMI,mBAAmB;QACvBG;QACAE;QACAC;QACAC;QACAE;QACAQ,iBAAiB;QACjBC,OAAO;IACT;IAEAtB,WAAW;IACX,MAAMuB,OAAO;IACb,IAAIC,aAAa,MAAMrB,cAAc;QACnCK;QACAC;QACAC;QACAE;QACAC;QACAC;QACAS;QACAR;QACAC;QACAC;QACAC;IACF;IAEA,IAAIE,kBAAkB;QACpBI,aAAa,MAAMvB,+BACjB;YAACwB,SAAS;YAASF;QAAI,GACvBC,YACAJ;QAEFI,aAAa,MAAMtB,mBAAmBsB;IACxC;IAEA,MAAME,WAAW9B,KAAK+B,IAAI,CAACjB,KAAK;IAChC,oDAAoD;IACpDV,WAAW,CAAC,0BAA0B,EAAE0B,SAAS,cAAc,CAAC;IAChE,MAAME,aAAahC,KAAK+B,IAAI,CAACZ,WAAW;IACxC,MAAMlB,QAAQ6B,UAAUE;IAExB,4EAA4E;IAC5E5B,WAAW;IACX,MAAM6B,kBAAkB,GAAGpB,SAASqB,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC;IAChE,MAAMhC,cAAc+B,iBAAiBD;IAErC5B,WAAW;IACX,MAAM+B,SAAS,MAAMhC,MAAMyB;IAC3BxB,WAAW;IAEX,iFAAiF;IACjF,IAAIgC,MAAMC,OAAO,CAACF,WAAW,CAAE,CAAA,YAAYA,MAAK,GAAI;QAClD,OAAO;YAACG,QAAQ,EAAE;QAAA;IACpB;IAEA,MAAMC,QAAsB,EAAE;IAC9B,KAAK,MAAMC,SAASL,OAAOM,MAAM,CAAE;QACjC,IAAID,MAAME,IAAI,KAAK,SAAS;YAC1B;QACF;QAEAH,MAAMI,IAAI,CAAC;YACTC,SAASC,OAAOC,OAAO,CAACN,MAAMI,OAAO,EAAEG,GAAG,CAAC,CAAC,CAACC,aAAaC,YAAY;gBACpE,MAAMC,WAAWF,YAAYG,UAAU,CAAC,YACpCH,YAAYI,KAAK,CAAC,SAASC,MAAM,IACjCL;gBAEJ,OAAO;oBACLM,MAAMtD,KAAKuD,UAAU,CAACL,YAAYlD,KAAKwD,QAAQ,CAAC1C,KAAKoC,YAAYA;oBACjEO,gBAAgBR,YAAYQ,cAAc;oBAC1CC,gBAAgBT,YAAYS,cAAc;gBAC5C;YACF;YACAJ,MAAMd,MAAMc,IAAI;QAClB;IACF;IAEA,OAAO;QAAChB,QAAQC;IAAK;AACvB"}
1
+ {"version":3,"sources":["../../../src/actions/build/buildStaticFiles.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {\n buildDebug,\n copyDir,\n extendViteConfigWithUserConfig,\n finalizeViteConfig,\n getViteConfig,\n writeFavicons,\n writeSanityRuntime,\n} from '@sanity/cli-build/_internal/build'\nimport {type CliConfig, type UserViteConfig} from '@sanity/cli-core'\nimport {type PluginOptions as ReactCompilerConfig} from 'babel-plugin-react-compiler'\nimport {build} from 'vite'\n\nimport {\n getAppEnvironmentVariables,\n getStudioEnvironmentVariables,\n} from './getEnvironmentVariables.js'\n\nexport interface ChunkModule {\n name: string\n originalLength: number\n renderedLength: number\n}\n\nexport interface ChunkStats {\n modules: ChunkModule[]\n name: string\n}\n\ninterface StaticBuildOptions {\n basePath: string\n cwd: string\n outputDir: string\n\n appTitle?: string\n autoUpdatesCssUrls?: string[]\n entry?: string\n importMap?: {imports?: Record<string, string>}\n isApp?: boolean\n minify?: boolean\n profile?: boolean\n reactCompiler?: ReactCompilerConfig\n schemaExtraction?: CliConfig['schemaExtraction']\n sourceMap?: boolean\n vite?: UserViteConfig\n}\n\n/**\n * Builds static files\n *\n * @internal\n */\nexport async function buildStaticFiles(\n options: StaticBuildOptions,\n): Promise<{chunks: ChunkStats[]}> {\n const {\n appTitle,\n autoUpdatesCssUrls,\n basePath,\n cwd,\n entry,\n importMap,\n isApp,\n minify = true,\n outputDir,\n reactCompiler,\n schemaExtraction,\n sourceMap = false,\n vite: extendViteConfig,\n } = options\n\n buildDebug('Writing Sanity runtime files')\n await writeSanityRuntime({\n appTitle,\n basePath,\n cwd,\n entry,\n isApp,\n reactStrictMode: false,\n watch: false,\n })\n\n function getEnvironmentVariables() {\n return isApp\n ? getAppEnvironmentVariables({jsonEncode: true, prefix: 'process.env.'})\n : getStudioEnvironmentVariables({jsonEncode: true, prefix: 'process.env.'})\n }\n\n buildDebug('Resolving vite config')\n const mode = 'production'\n let viteConfig = await getViteConfig({\n autoUpdatesCssUrls,\n basePath,\n cwd,\n getEnvironmentVariables,\n importMap,\n isApp,\n minify,\n mode,\n outputDir,\n reactCompiler,\n schemaExtraction,\n sourceMap,\n })\n\n if (extendViteConfig) {\n viteConfig = await extendViteConfigWithUserConfig(\n {command: 'build', mode},\n viteConfig,\n extendViteConfig,\n )\n viteConfig = await finalizeViteConfig(viteConfig)\n }\n\n const fromPath = path.join(cwd, 'static')\n // Copy files placed in /static to the built /static\n buildDebug(`Copying static files from ${fromPath} to output dir`)\n const staticPath = path.join(outputDir, 'static')\n await copyDir(fromPath, staticPath)\n\n // Write favicons, not overwriting ones that already exist, to static folder\n buildDebug('Writing favicons to output dir')\n const faviconBasePath = `${basePath.replace(/\\/+$/, '')}/static`\n await writeFavicons(faviconBasePath, staticPath)\n\n buildDebug('Bundling using vite')\n const bundle = await build(viteConfig)\n buildDebug('Bundling complete')\n\n // For typescript only - this shouldn't ever be the case given we're not watching\n if (Array.isArray(bundle) || !('output' in bundle)) {\n return {chunks: []}\n }\n\n const stats: ChunkStats[] = []\n for (const chunk of bundle.output) {\n if (chunk.type !== 'chunk') {\n continue\n }\n\n stats.push({\n modules: Object.entries(chunk.modules).map(([rawFilePath, chunkModule]) => {\n const filePath = rawFilePath.startsWith('\\u0000')\n ? rawFilePath.slice('\\u0000'.length)\n : rawFilePath\n\n return {\n name: path.isAbsolute(filePath) ? path.relative(cwd, filePath) : filePath,\n originalLength: chunkModule.originalLength,\n renderedLength: chunkModule.renderedLength,\n }\n }),\n name: chunk.name,\n })\n }\n\n return {chunks: stats}\n}\n"],"names":["path","buildDebug","copyDir","extendViteConfigWithUserConfig","finalizeViteConfig","getViteConfig","writeFavicons","writeSanityRuntime","build","getAppEnvironmentVariables","getStudioEnvironmentVariables","buildStaticFiles","options","appTitle","autoUpdatesCssUrls","basePath","cwd","entry","importMap","isApp","minify","outputDir","reactCompiler","schemaExtraction","sourceMap","vite","extendViteConfig","reactStrictMode","watch","getEnvironmentVariables","jsonEncode","prefix","mode","viteConfig","command","fromPath","join","staticPath","faviconBasePath","replace","bundle","Array","isArray","chunks","stats","chunk","output","type","push","modules","Object","entries","map","rawFilePath","chunkModule","filePath","startsWith","slice","length","name","isAbsolute","relative","originalLength","renderedLength"],"mappings":"AAAA,OAAOA,UAAU,YAAW;AAE5B,SACEC,UAAU,EACVC,OAAO,EACPC,8BAA8B,EAC9BC,kBAAkB,EAClBC,aAAa,EACbC,aAAa,EACbC,kBAAkB,QACb,oCAAmC;AAG1C,SAAQC,KAAK,QAAO,OAAM;AAE1B,SACEC,0BAA0B,EAC1BC,6BAA6B,QACxB,+BAA8B;AA+BrC;;;;CAIC,GACD,OAAO,eAAeC,iBACpBC,OAA2B;IAE3B,MAAM,EACJC,QAAQ,EACRC,kBAAkB,EAClBC,QAAQ,EACRC,GAAG,EACHC,KAAK,EACLC,SAAS,EACTC,KAAK,EACLC,SAAS,IAAI,EACbC,SAAS,EACTC,aAAa,EACbC,gBAAgB,EAChBC,YAAY,KAAK,EACjBC,MAAMC,gBAAgB,EACvB,GAAGd;IAEJX,WAAW;IACX,MAAMM,mBAAmB;QACvBM;QACAE;QACAC;QACAC;QACAE;QACAQ,iBAAiB;QACjBC,OAAO;IACT;IAEA,SAASC;QACP,OAAOV,QACHV,2BAA2B;YAACqB,YAAY;YAAMC,QAAQ;QAAc,KACpErB,8BAA8B;YAACoB,YAAY;YAAMC,QAAQ;QAAc;IAC7E;IAEA9B,WAAW;IACX,MAAM+B,OAAO;IACb,IAAIC,aAAa,MAAM5B,cAAc;QACnCS;QACAC;QACAC;QACAa;QACAX;QACAC;QACAC;QACAY;QACAX;QACAC;QACAC;QACAC;IACF;IAEA,IAAIE,kBAAkB;QACpBO,aAAa,MAAM9B,+BACjB;YAAC+B,SAAS;YAASF;QAAI,GACvBC,YACAP;QAEFO,aAAa,MAAM7B,mBAAmB6B;IACxC;IAEA,MAAME,WAAWnC,KAAKoC,IAAI,CAACpB,KAAK;IAChC,oDAAoD;IACpDf,WAAW,CAAC,0BAA0B,EAAEkC,SAAS,cAAc,CAAC;IAChE,MAAME,aAAarC,KAAKoC,IAAI,CAACf,WAAW;IACxC,MAAMnB,QAAQiC,UAAUE;IAExB,4EAA4E;IAC5EpC,WAAW;IACX,MAAMqC,kBAAkB,GAAGvB,SAASwB,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC;IAChE,MAAMjC,cAAcgC,iBAAiBD;IAErCpC,WAAW;IACX,MAAMuC,SAAS,MAAMhC,MAAMyB;IAC3BhC,WAAW;IAEX,iFAAiF;IACjF,IAAIwC,MAAMC,OAAO,CAACF,WAAW,CAAE,CAAA,YAAYA,MAAK,GAAI;QAClD,OAAO;YAACG,QAAQ,EAAE;QAAA;IACpB;IAEA,MAAMC,QAAsB,EAAE;IAC9B,KAAK,MAAMC,SAASL,OAAOM,MAAM,CAAE;QACjC,IAAID,MAAME,IAAI,KAAK,SAAS;YAC1B;QACF;QAEAH,MAAMI,IAAI,CAAC;YACTC,SAASC,OAAOC,OAAO,CAACN,MAAMI,OAAO,EAAEG,GAAG,CAAC,CAAC,CAACC,aAAaC,YAAY;gBACpE,MAAMC,WAAWF,YAAYG,UAAU,CAAC,YACpCH,YAAYI,KAAK,CAAC,SAASC,MAAM,IACjCL;gBAEJ,OAAO;oBACLM,MAAM3D,KAAK4D,UAAU,CAACL,YAAYvD,KAAK6D,QAAQ,CAAC7C,KAAKuC,YAAYA;oBACjEO,gBAAgBR,YAAYQ,cAAc;oBAC1CC,gBAAgBT,YAAYS,cAAc;gBAC5C;YACF;YACAJ,MAAMd,MAAMc,IAAI;QAClB;IACF;IAEA,OAAO;QAAChB,QAAQC;IAAK;AACvB"}
@@ -1,10 +1,10 @@
1
1
  import { rm } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { styleText } from 'node:util';
4
+ import { buildDebug, buildVendorDependencies, checkStudioDependencyVersions, StudioBuildTrace } from '@sanity/cli-build/_internal/build';
4
5
  import { getCliTelemetry, getLocalPackageVersion, getTimer, isInteractive } from '@sanity/cli-core';
5
6
  import { confirm, logSymbols, select, spinner } from '@sanity/cli-core/ux';
6
7
  import { parse as semverParse } from 'semver';
7
- import { StudioBuildTrace } from '../../telemetry/build.telemetry.js';
8
8
  import { getAppId } from '../../util/appId.js';
9
9
  import { compareDependencyVersions } from '../../util/compareDependencyVersions.js';
10
10
  import { determineIsApp } from '../../util/determineIsApp.js';
@@ -12,27 +12,18 @@ import { formatModuleSizes, sortModulesBySize } from '../../util/moduleFormatUti
12
12
  import { getPackageManagerChoice } from '../../util/packageManager/packageManagerChoice.js';
13
13
  import { upgradePackages } from '../../util/packageManager/upgradePackages.js';
14
14
  import { warnAboutMissingAppId } from '../../util/warnAboutMissingAppId.js';
15
- import { buildDebug } from './buildDebug.js';
16
15
  import { buildStaticFiles } from './buildStaticFiles.js';
17
- import { buildVendorDependencies } from './buildVendorDependencies.js';
18
16
  import { checkRequiredDependencies } from './checkRequiredDependencies.js';
19
- import { checkStudioDependencyVersions } from './checkStudioDependencyVersions.js';
20
17
  import { determineBasePath } from './determineBasePath.js';
21
18
  import { getAutoUpdatesCssUrls, getAutoUpdatesImportMap } from './getAutoUpdatesImportMap.js';
22
- import { getStudioEnvVars } from './getStudioEnvVars.js';
19
+ import { getStudioEnvironmentVariables } from './getEnvironmentVariables.js';
23
20
  import { handlePrereleaseVersions } from './handlePrereleaseVersions.js';
24
- import { shouldAutoUpdate } from './shouldAutoUpdate.js';
25
21
  /**
26
22
  * Build the Sanity Studio.
27
23
  *
28
24
  * @internal
29
25
  */ export async function buildStudio(options) {
30
26
  const { calledFromDeploy, cliConfig, flags, outDir, output, workDir } = options;
31
- const autoUpdatesEnabled = options.calledFromDeploy ? options.autoUpdatesEnabled : shouldAutoUpdate({
32
- cliConfig,
33
- flags,
34
- output
35
- });
36
27
  const upgradePkgs = async (options)=>{
37
28
  await upgradePackages({
38
29
  packageManager: (await getPackageManagerChoice(workDir, {
@@ -46,7 +37,7 @@ import { shouldAutoUpdate } from './shouldAutoUpdate.js';
46
37
  };
47
38
  await internalBuildStudio({
48
39
  appId: getAppId(cliConfig),
49
- autoUpdatesEnabled,
40
+ autoUpdatesEnabled: options.autoUpdatesEnabled,
50
41
  calledFromDeploy,
51
42
  determineBasePath: ()=>determineBasePath(cliConfig, 'studio', output),
52
43
  isApp: determineIsApp(cliConfig),
@@ -68,9 +59,9 @@ import { shouldAutoUpdate } from './shouldAutoUpdate.js';
68
59
  * Internal build studio that avoids depending on flags for CLI config.
69
60
  * @param options - options for the build
70
61
  */ async function internalBuildStudio(options) {
62
+ buildDebug(`Building studio`);
71
63
  const timer = getTimer();
72
64
  const { appId, determineBasePath, isApp, minify, outDir, output, projectId, reactCompiler, schemaExtraction, sourceMap, stats, unattendedMode, upgradePackages, vite, workDir } = options;
73
- let autoUpdatesEnabled = options.autoUpdatesEnabled;
74
65
  const defaultOutputDir = path.resolve(path.join(workDir, 'dist'));
75
66
  const outputDir = path.resolve(outDir || defaultOutputDir);
76
67
  await checkStudioDependencyVersions(workDir, output);
@@ -81,6 +72,7 @@ import { shouldAutoUpdate } from './shouldAutoUpdate.js';
81
72
  output,
82
73
  workDir
83
74
  });
75
+ let autoUpdatesEnabled = options.autoUpdatesEnabled;
84
76
  let autoUpdatesImports = {};
85
77
  let autoUpdatesCssUrls = [];
86
78
  if (autoUpdatesEnabled) {
@@ -190,7 +182,7 @@ import { shouldAutoUpdate } from './shouldAutoUpdate.js';
190
182
  }
191
183
  }
192
184
  }
193
- const envVarKeys = getStudioEnvVars();
185
+ const envVarKeys = Object.keys(getStudioEnvironmentVariables());
194
186
  if (envVarKeys.length > 0) {
195
187
  output.log('\nIncluding the following environment variables as part of the JavaScript bundle:');
196
188
  for (const key of envVarKeys){