@sanity/cli-build 0.1.0 → 0.2.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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/dist/_exports/_internal/build.d.ts +2418 -0
  3. package/dist/_exports/_internal/build.js +10 -0
  4. package/dist/_exports/_internal/build.js.map +1 -0
  5. package/dist/_exports/_internal/extract.d.ts +120 -0
  6. package/dist/_exports/_internal/extract.js +9 -0
  7. package/dist/_exports/_internal/extract.js.map +1 -0
  8. package/dist/actions/build/buildDebug.js +4 -0
  9. package/dist/actions/build/buildDebug.js.map +1 -0
  10. package/dist/actions/build/buildVendorDependencies.js +149 -0
  11. package/dist/actions/build/buildVendorDependencies.js.map +1 -0
  12. package/dist/actions/build/checkStudioDependencyVersions.js +155 -0
  13. package/dist/actions/build/checkStudioDependencyVersions.js.map +1 -0
  14. package/dist/actions/build/createExternalFromImportMap.js +11 -0
  15. package/dist/actions/build/createExternalFromImportMap.js.map +1 -0
  16. package/dist/actions/build/decorateIndexWithAutoGeneratedWarning.js +13 -0
  17. package/dist/actions/build/decorateIndexWithAutoGeneratedWarning.js.map +1 -0
  18. package/dist/actions/build/decorateIndexWithBridgeScript.js +17 -0
  19. package/dist/actions/build/decorateIndexWithBridgeScript.js.map +1 -0
  20. package/dist/actions/build/decorateIndexWithStagingScript.js +16 -0
  21. package/dist/actions/build/decorateIndexWithStagingScript.js.map +1 -0
  22. package/dist/actions/build/getEntryModule.js +46 -0
  23. package/dist/actions/build/getEntryModule.js.map +1 -0
  24. package/dist/actions/build/getPossibleDocumentComponentLocations.js +11 -0
  25. package/dist/actions/build/getPossibleDocumentComponentLocations.js.map +1 -0
  26. package/dist/actions/build/getViteConfig.js +204 -0
  27. package/dist/actions/build/getViteConfig.js.map +1 -0
  28. package/dist/actions/build/normalizeBasePath.js +9 -0
  29. package/dist/actions/build/normalizeBasePath.js.map +1 -0
  30. package/dist/actions/build/renderDocument.js +50 -0
  31. package/dist/actions/build/renderDocument.js.map +1 -0
  32. package/dist/actions/build/renderDocument.worker.js +9 -0
  33. package/dist/actions/build/renderDocument.worker.js.map +1 -0
  34. package/dist/actions/build/renderDocumentWorker/addTimestampImportMapScriptToHtml.js +79 -0
  35. package/dist/actions/build/renderDocumentWorker/addTimestampImportMapScriptToHtml.js.map +1 -0
  36. package/dist/actions/build/renderDocumentWorker/components/BasicDocument.js +61 -0
  37. package/dist/actions/build/renderDocumentWorker/components/BasicDocument.js.map +1 -0
  38. package/dist/actions/build/renderDocumentWorker/components/DefaultDocument.js +165 -0
  39. package/dist/actions/build/renderDocumentWorker/components/DefaultDocument.js.map +1 -0
  40. package/dist/actions/build/renderDocumentWorker/components/Favicons.js +28 -0
  41. package/dist/actions/build/renderDocumentWorker/components/Favicons.js.map +1 -0
  42. package/dist/actions/build/renderDocumentWorker/components/GlobalErrorHandler.js +178 -0
  43. package/dist/actions/build/renderDocumentWorker/components/GlobalErrorHandler.js.map +1 -0
  44. package/dist/actions/build/renderDocumentWorker/components/NoJavascript.js +51 -0
  45. package/dist/actions/build/renderDocumentWorker/components/NoJavascript.js.map +1 -0
  46. package/dist/actions/build/renderDocumentWorker/getDocumentComponent.js +41 -0
  47. package/dist/actions/build/renderDocumentWorker/getDocumentComponent.js.map +1 -0
  48. package/dist/actions/build/renderDocumentWorker/getDocumentHtml.js +55 -0
  49. package/dist/actions/build/renderDocumentWorker/getDocumentHtml.js.map +1 -0
  50. package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js +31 -0
  51. package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js.map +1 -0
  52. package/dist/actions/build/renderDocumentWorker/tryLoadDocumentComponent.js +30 -0
  53. package/dist/actions/build/renderDocumentWorker/tryLoadDocumentComponent.js.map +1 -0
  54. package/dist/actions/build/renderDocumentWorker/types.js +5 -0
  55. package/dist/actions/build/renderDocumentWorker/types.js.map +1 -0
  56. package/dist/actions/build/vite/plugin-sanity-build-entries.js +67 -0
  57. package/dist/actions/build/vite/plugin-sanity-build-entries.js.map +1 -0
  58. package/dist/actions/build/vite/plugin-sanity-favicons.js +72 -0
  59. package/dist/actions/build/vite/plugin-sanity-favicons.js.map +1 -0
  60. package/dist/actions/build/vite/plugin-sanity-runtime-rewrite.js +18 -0
  61. package/dist/actions/build/vite/plugin-sanity-runtime-rewrite.js.map +1 -0
  62. package/dist/actions/build/writeSanityRuntime.js +66 -0
  63. package/dist/actions/build/writeSanityRuntime.js.map +1 -0
  64. package/dist/actions/schema/extractSanitySchema.worker.js +32 -0
  65. package/dist/actions/schema/extractSanitySchema.worker.js.map +1 -0
  66. package/dist/actions/schema/formatSchemaValidation.js +78 -0
  67. package/dist/actions/schema/formatSchemaValidation.js.map +1 -0
  68. package/dist/actions/schema/getExtractOptions.js +23 -0
  69. package/dist/actions/schema/getExtractOptions.js.map +1 -0
  70. package/dist/actions/schema/matchSchemaPattern.js +21 -0
  71. package/dist/actions/schema/matchSchemaPattern.js.map +1 -0
  72. package/dist/actions/schema/runSchemaExtraction.js +39 -0
  73. package/dist/actions/schema/runSchemaExtraction.js.map +1 -0
  74. package/dist/actions/schema/types.js +9 -0
  75. package/dist/actions/schema/types.js.map +1 -0
  76. package/dist/actions/schema/utils/SchemaExtractionError.js +10 -0
  77. package/dist/actions/schema/utils/SchemaExtractionError.js.map +1 -0
  78. package/dist/actions/schema/utils/extractValidationFromSchemaError.js +12 -0
  79. package/dist/actions/schema/utils/extractValidationFromSchemaError.js.map +1 -0
  80. package/dist/actions/schema/vite/plugin-schema-extraction.js +201 -0
  81. package/dist/actions/schema/vite/plugin-schema-extraction.js.map +1 -0
  82. package/dist/constants.js +8 -0
  83. package/dist/constants.js.map +1 -0
  84. package/dist/telemetry/build.telemetry.js +13 -0
  85. package/dist/telemetry/build.telemetry.js.map +1 -0
  86. package/dist/telemetry/extractSchema.telemetry.js +18 -0
  87. package/dist/telemetry/extractSchema.telemetry.js.map +1 -0
  88. package/package.json +58 -29
  89. package/dist/_exports/_internal.d.ts +0 -45
  90. package/dist/_exports/_internal.js +0 -5
  91. package/dist/_exports/_internal.js.map +0 -1
@@ -0,0 +1,10 @@
1
+ export { buildDebug } from '../../actions/build/buildDebug.js';
2
+ export { buildVendorDependencies } from '../../actions/build/buildVendorDependencies.js';
3
+ export { checkStudioDependencyVersions } from '../../actions/build/checkStudioDependencyVersions.js';
4
+ export { extendViteConfigWithUserConfig, finalizeViteConfig, getViteConfig } from '../../actions/build/getViteConfig.js';
5
+ export { writeFavicons } from '../../actions/build/writeFavicons.js';
6
+ export { writeSanityRuntime } from '../../actions/build/writeSanityRuntime.js';
7
+ export { AppBuildTrace, StudioBuildTrace } from '../../telemetry/build.telemetry.js';
8
+ export { copyDir } from '../../util/copyDir.js';
9
+
10
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/_exports/_internal/build.ts"],"sourcesContent":["export {buildDebug} from '../../actions/build/buildDebug.js'\nexport {buildVendorDependencies} from '../../actions/build/buildVendorDependencies.js'\nexport {checkStudioDependencyVersions} from '../../actions/build/checkStudioDependencyVersions.js'\nexport {\n extendViteConfigWithUserConfig,\n finalizeViteConfig,\n getViteConfig,\n} from '../../actions/build/getViteConfig.js'\nexport {writeFavicons} from '../../actions/build/writeFavicons.js'\nexport {writeSanityRuntime} from '../../actions/build/writeSanityRuntime.js'\nexport {AppBuildTrace, StudioBuildTrace} from '../../telemetry/build.telemetry.js'\nexport {copyDir} from '../../util/copyDir.js'\n"],"names":["buildDebug","buildVendorDependencies","checkStudioDependencyVersions","extendViteConfigWithUserConfig","finalizeViteConfig","getViteConfig","writeFavicons","writeSanityRuntime","AppBuildTrace","StudioBuildTrace","copyDir"],"mappings":"AAAA,SAAQA,UAAU,QAAO,oCAAmC;AAC5D,SAAQC,uBAAuB,QAAO,iDAAgD;AACtF,SAAQC,6BAA6B,QAAO,uDAAsD;AAClG,SACEC,8BAA8B,EAC9BC,kBAAkB,EAClBC,aAAa,QACR,uCAAsC;AAC7C,SAAQC,aAAa,QAAO,uCAAsC;AAClE,SAAQC,kBAAkB,QAAO,4CAA2C;AAC5E,SAAQC,aAAa,EAAEC,gBAAgB,QAAO,qCAAoC;AAClF,SAAQC,OAAO,QAAO,wBAAuB"}
@@ -0,0 +1,120 @@
1
+ import { DefinedTelemetryTrace } from "@sanity/telemetry";
2
+ import { extractSchema } from "@sanity/schema/_internal";
3
+ import { ProjectRootResult } from "@sanity/cli-core";
4
+ import { SchemaValidationProblemGroup } from "@sanity/types";
5
+
6
+ /**
7
+ * Creates a pattern matcher function for schema watch patterns.
8
+ * Normalizes file paths to forward slashes and makes them relative before matching.
9
+ *
10
+ * @param patterns - Array of glob patterns to match against
11
+ * @returns Function that takes a file path and workDir, returns true if file matches any pattern
12
+ * @internal
13
+ */
14
+ export declare function createSchemaPatternMatcher(patterns: string[]): {
15
+ isMatch: (filePath: string, workDir: string) => boolean;
16
+ };
17
+
18
+ export declare interface ExtractOptions {
19
+ configPath: string;
20
+ enforceRequiredFields: boolean;
21
+ format: string;
22
+ outputPath: string;
23
+ watchPatterns: string[];
24
+ workspace: string | undefined;
25
+ }
26
+
27
+ /** @internal */
28
+ export declare interface ExtractSchemaWorkerError {
29
+ error: string;
30
+ type: "error";
31
+ validation?: SchemaValidationProblemGroup[];
32
+ }
33
+
34
+ /**
35
+ * Extracts validation problem groups from a SchemaError.
36
+ */
37
+ export declare function extractValidationFromSchemaError(
38
+ error: unknown,
39
+ workDir: string,
40
+ ): Promise<SchemaValidationProblemGroup[] | undefined>;
41
+
42
+ export declare function formatSchemaValidation(
43
+ validation: SchemaValidationProblemGroup[],
44
+ ): string;
45
+
46
+ export declare function getAggregatedSeverity(
47
+ groupOrGroups: SchemaValidationProblemGroup | SchemaValidationProblemGroup[],
48
+ ): "error" | "warning";
49
+
50
+ declare interface GetExtractOptions {
51
+ enforceRequiredFields: boolean | undefined;
52
+ format: string | undefined;
53
+ path: string | undefined;
54
+ projectRoot: ProjectRootResult;
55
+ watchPatterns: string[] | undefined;
56
+ workspace: string | undefined;
57
+ }
58
+
59
+ export declare function getExtractOptions(
60
+ options: GetExtractOptions,
61
+ ): ExtractOptions;
62
+
63
+ /**
64
+ * Core schema extraction logic.
65
+ * Performs the extraction via worker and writes to file.
66
+ * Throws SchemaExtractionError on failure.
67
+ */
68
+ export declare function runSchemaExtraction(
69
+ extractOptions: Omit<ExtractOptions, "watchPatterns">,
70
+ ): Promise<ReturnType<typeof extractSchema>>;
71
+
72
+ export declare const SchemaDeploy: DefinedTelemetryTrace<
73
+ SchemaDeployTraceData,
74
+ void
75
+ >;
76
+
77
+ declare interface SchemaDeployTraceData {
78
+ manifestDir: string;
79
+ schemaRequired: boolean;
80
+ extractManifest?: boolean;
81
+ }
82
+
83
+ export declare const SchemaExtractedTrace: DefinedTelemetryTrace<
84
+ SchemaExtractedTraceAttributes,
85
+ void
86
+ >;
87
+
88
+ declare interface SchemaExtractedTraceAttributes {
89
+ enforceRequiredFields: boolean;
90
+ schemaAllTypesCount: number;
91
+ schemaDocumentTypesCount: number;
92
+ schemaFormat: string;
93
+ schemaTypesCount: number;
94
+ }
95
+
96
+ export declare class SchemaExtractionError extends Error {
97
+ validation?: SchemaValidationProblemGroup[];
98
+ constructor(message: string, validation?: SchemaValidationProblemGroup[]);
99
+ }
100
+
101
+ declare type SchemaExtractionWatchModeAttributes =
102
+ | {
103
+ averageExtractionDuration: number;
104
+ extractionFailedCount: number;
105
+ extractionSuccessfulCount: number;
106
+ step: "stopped";
107
+ watcherDuration: number;
108
+ }
109
+ | {
110
+ enforceRequiredFields: boolean;
111
+ schemaFormat: string;
112
+ step: "started";
113
+ };
114
+
115
+ export declare const SchemaExtractionWatchModeTrace: DefinedTelemetryTrace<
116
+ SchemaExtractionWatchModeAttributes,
117
+ void
118
+ >;
119
+
120
+ export {};
@@ -0,0 +1,9 @@
1
+ export { formatSchemaValidation, getAggregatedSeverity } from '../../actions/schema/formatSchemaValidation.js';
2
+ export { getExtractOptions } from '../../actions/schema/getExtractOptions.js';
3
+ export { createSchemaPatternMatcher } from '../../actions/schema/matchSchemaPattern.js';
4
+ export { runSchemaExtraction } from '../../actions/schema/runSchemaExtraction.js';
5
+ export { extractValidationFromSchemaError } from '../../actions/schema/utils/extractValidationFromSchemaError.js';
6
+ export { SchemaExtractionError } from '../../actions/schema/utils/SchemaExtractionError.js';
7
+ export { SchemaDeploy, SchemaExtractedTrace, SchemaExtractionWatchModeTrace } from '../../telemetry/extractSchema.telemetry.js';
8
+
9
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/_exports/_internal/extract.ts"],"sourcesContent":["export {\n formatSchemaValidation,\n getAggregatedSeverity,\n} from '../../actions/schema/formatSchemaValidation.js'\nexport {type ExtractOptions, getExtractOptions} from '../../actions/schema/getExtractOptions.js'\nexport {createSchemaPatternMatcher} from '../../actions/schema/matchSchemaPattern.js'\nexport {runSchemaExtraction} from '../../actions/schema/runSchemaExtraction.js'\nexport {type ExtractSchemaWorkerError} from '../../actions/schema/types.js'\nexport {extractValidationFromSchemaError} from '../../actions/schema/utils/extractValidationFromSchemaError.js'\nexport {SchemaExtractionError} from '../../actions/schema/utils/SchemaExtractionError.js'\nexport {\n SchemaDeploy,\n SchemaExtractedTrace,\n SchemaExtractionWatchModeTrace,\n} from '../../telemetry/extractSchema.telemetry.js'\n"],"names":["formatSchemaValidation","getAggregatedSeverity","getExtractOptions","createSchemaPatternMatcher","runSchemaExtraction","extractValidationFromSchemaError","SchemaExtractionError","SchemaDeploy","SchemaExtractedTrace","SchemaExtractionWatchModeTrace"],"mappings":"AAAA,SACEA,sBAAsB,EACtBC,qBAAqB,QAChB,iDAAgD;AACvD,SAA6BC,iBAAiB,QAAO,4CAA2C;AAChG,SAAQC,0BAA0B,QAAO,6CAA4C;AACrF,SAAQC,mBAAmB,QAAO,8CAA6C;AAE/E,SAAQC,gCAAgC,QAAO,iEAAgE;AAC/G,SAAQC,qBAAqB,QAAO,sDAAqD;AACzF,SACEC,YAAY,EACZC,oBAAoB,EACpBC,8BAA8B,QACzB,6CAA4C"}
@@ -0,0 +1,4 @@
1
+ import { subdebug } from '@sanity/cli-core';
2
+ export const buildDebug = subdebug('build');
3
+
4
+ //# sourceMappingURL=buildDebug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/build/buildDebug.ts"],"sourcesContent":["import {subdebug} from '@sanity/cli-core'\n\nexport const buildDebug = subdebug('build')\n"],"names":["subdebug","buildDebug"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,mBAAkB;AAEzC,OAAO,MAAMC,aAAaD,SAAS,SAAQ"}
@@ -0,0 +1,149 @@
1
+ import path from 'node:path';
2
+ import { getLocalPackageDir, getLocalPackageVersion } from '@sanity/cli-core';
3
+ import { gt, minVersion, rcompare, satisfies } from 'semver';
4
+ import { build } from 'vite';
5
+ import { SANITY_CACHE_DIR } from '../../constants.js';
6
+ import { createExternalFromImportMap } from './createExternalFromImportMap.js';
7
+ // Directory where vendor packages will be stored
8
+ const VENDOR_DIR = 'vendor';
9
+ // Define the vendor packages and their corresponding versions and entry points
10
+ const VENDOR_IMPORTS = {
11
+ react: {
12
+ '^19.2.0': {
13
+ '.': './cjs/react.production.js',
14
+ './compiler-runtime': './cjs/react-compiler-runtime.production.js',
15
+ './jsx-dev-runtime': './cjs/react-jsx-dev-runtime.production.js',
16
+ './jsx-runtime': './cjs/react-jsx-runtime.production.js',
17
+ './package.json': './package.json'
18
+ }
19
+ },
20
+ 'react-dom': {
21
+ '^19.2.0': {
22
+ '.': './cjs/react-dom.production.js',
23
+ './client': './cjs/react-dom-client.production.js',
24
+ './package.json': './package.json',
25
+ './server': './cjs/react-dom-server-legacy.browser.production.js',
26
+ './server.browser': './cjs/react-dom-server-legacy.browser.production.js',
27
+ './static': './cjs/react-dom-server.browser.production.js',
28
+ './static.browser': './cjs/react-dom-server.browser.production.js'
29
+ }
30
+ }
31
+ };
32
+ const STYLED_COMPONENTS_IMPORTS = {
33
+ 'styled-components': {
34
+ '^6.1.0': {
35
+ '.': './dist/styled-components.browser.esm.js',
36
+ './package.json': './package.json'
37
+ }
38
+ }
39
+ };
40
+ /**
41
+ * Builds the ESM browser compatible versions of the vendor packages
42
+ * specified in VENDOR_IMPORTS. Returns the `imports` object of an import map.
43
+ */ export async function buildVendorDependencies({ basePath, cwd, isApp, outputDir }) {
44
+ const entry = {};
45
+ const imports = {};
46
+ // If we're building an app, we don't need to build the styled-components package
47
+ const vendorImports = isApp ? VENDOR_IMPORTS : {
48
+ ...VENDOR_IMPORTS,
49
+ ...STYLED_COMPONENTS_IMPORTS
50
+ };
51
+ // Iterate over each package and its version ranges in VENDOR_IMPORTS
52
+ for (const [packageName, ranges] of Object.entries(vendorImports)){
53
+ const version = await getLocalPackageVersion(packageName, cwd);
54
+ if (!version) {
55
+ throw new Error(`Could not get version for '${packageName}'`);
56
+ }
57
+ // Sort version ranges in descending order
58
+ const sortedRanges = Object.keys(ranges).toSorted((range1, range2)=>{
59
+ const min1 = minVersion(range1);
60
+ const min2 = minVersion(range2);
61
+ if (!min1) throw new Error(`Could not parse range '${range1}'`);
62
+ if (!min2) throw new Error(`Could not parse range '${range2}'`);
63
+ // sort them in reverse so we can rely on array `.find` below
64
+ return rcompare(min1.version, min2.version);
65
+ });
66
+ // Find the first version range that satisfies the package version
67
+ const matchedRange = sortedRanges.find((range)=>satisfies(version, range));
68
+ if (!matchedRange) {
69
+ const min = minVersion(sortedRanges.at(-1));
70
+ if (!min) {
71
+ throw new Error(`Could not find a minimum version for package '${packageName}'`);
72
+ }
73
+ if (gt(min.version, version)) {
74
+ throw new Error(`Package '${packageName}' requires at least ${min.version}.`);
75
+ }
76
+ throw new Error(`Version '${version}' of package '${packageName}' is not supported yet.`);
77
+ }
78
+ const subpaths = ranges[matchedRange];
79
+ // Resolve the actual package directory using Node module resolution,
80
+ // so that hoisted packages in monorepos/workspaces are found correctly
81
+ const packageDir = getLocalPackageDir(packageName, cwd);
82
+ // Iterate over each subpath and its corresponding entry point
83
+ for (const [subpath, relativeEntryPoint] of Object.entries(subpaths)){
84
+ const specifier = path.posix.join(packageName, subpath);
85
+ const chunkName = path.posix.join(packageName, path.relative(packageName, specifier) || 'index');
86
+ entry[chunkName] = path.join(packageDir, relativeEntryPoint);
87
+ imports[specifier] = path.posix.join('/', basePath, VENDOR_DIR, `${chunkName}.mjs`);
88
+ }
89
+ }
90
+ // Use Vite to build the packages into the output directory
91
+ let buildResult = await build({
92
+ appType: 'custom',
93
+ build: {
94
+ commonjsOptions: {
95
+ strictRequires: 'auto'
96
+ },
97
+ emptyOutDir: false,
98
+ lib: {
99
+ entry,
100
+ formats: [
101
+ 'es'
102
+ ]
103
+ },
104
+ minify: true,
105
+ outDir: path.join(outputDir, VENDOR_DIR),
106
+ rollupOptions: {
107
+ external: createExternalFromImportMap({
108
+ imports
109
+ }),
110
+ output: {
111
+ chunkFileNames: '[name]-[hash].mjs',
112
+ entryFileNames: '[name]-[hash].mjs',
113
+ exports: 'named',
114
+ format: 'es'
115
+ },
116
+ treeshake: {
117
+ preset: 'recommended'
118
+ }
119
+ }
120
+ },
121
+ // Define a custom cache directory so that sanity's vite cache
122
+ // does not conflict with any potential local vite projects
123
+ cacheDir: `${SANITY_CACHE_DIR}/vite-vendor`,
124
+ configFile: false,
125
+ define: {
126
+ 'process.env.NODE_ENV': JSON.stringify('production')
127
+ },
128
+ logLevel: 'silent',
129
+ mode: 'production',
130
+ root: cwd
131
+ });
132
+ buildResult = Array.isArray(buildResult) ? buildResult : [
133
+ buildResult
134
+ ];
135
+ // Create a map of the original import specifiers to their hashed filenames
136
+ const hashedImports = {};
137
+ const output = buildResult.flatMap((i)=>i.output);
138
+ for (const chunk of output){
139
+ if (chunk.type === 'asset') continue;
140
+ for (const [specifier, originalPath] of Object.entries(imports)){
141
+ if (originalPath.endsWith(`${chunk.name}.mjs`)) {
142
+ hashedImports[specifier] = path.posix.join('/', basePath, VENDOR_DIR, chunk.fileName);
143
+ }
144
+ }
145
+ }
146
+ return hashedImports;
147
+ }
148
+
149
+ //# sourceMappingURL=buildVendorDependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/build/buildVendorDependencies.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {getLocalPackageDir, getLocalPackageVersion} from '@sanity/cli-core'\nimport {gt, minVersion, rcompare, satisfies} from 'semver'\nimport {build} from 'vite'\n\nimport {SANITY_CACHE_DIR} from '../../constants.js'\nimport {createExternalFromImportMap} from './createExternalFromImportMap.js'\n\n// Directory where vendor packages will be stored\nconst VENDOR_DIR = 'vendor'\n\n/**\n * A type representing the imports of vendor packages, defining specific entry\n * points for various versions and subpaths of the packages.\n *\n * The `VendorImports` object is used to build ESM browser-compatible versions\n * of the specified packages. This approach ensures that the appropriate version\n * and entry points are used for each package, enabling compatibility and proper\n * functionality in the browser environment.\n *\n * ## Rationale\n *\n * The rationale for this structure is to handle different versions of the\n * packages carefully, especially major versions. Major version bumps often\n * introduce breaking changes, so the module scheme for the package needs to be\n * checked when there is a major version update. However, minor and patch\n * versions are generally backward compatible, so they are handled more\n * leniently. By assuming that new minor versions are compatible, we avoid\n * unnecessary warnings and streamline the update process.\n *\n * If a new minor version introduces an additional subpath export within the\n * package of this version range, the corresponding package can add a more\n * specific version range that includes the new subpath. This design allows for\n * flexibility and ease of maintenance, ensuring that the latest features and\n * fixes are incorporated without extensive manual intervention.\n *\n * An additional subpath export within the package of this version range that\n * could cause the build to break if that new export is used, can be treated as\n * a bug fix. It might make more sense to our users that this new subpath isn't\n * supported yet until we address it as a bug fix. This approach helps maintain\n * stability and prevents unexpected issues during the build process.\n *\n * ## Structure\n * The `VendorImports` type is a nested object where:\n * - The keys at the first level represent the package names.\n * - The keys at the second level represent the version ranges (e.g., `^19.0.0`).\n * - The keys at the third level represent the subpaths within the package (e.g., `.` for the main entry point).\n * - The values at the third level are the relative paths to the corresponding entry points within the package.\n *\n * This structure allows for precise specification of the entry points for\n * different versions and subpaths, ensuring that the correct files are used\n * during the build process.\n */\ntype VendorImports = {\n [packageName: string]: {\n [versionRange: string]: {\n [subpath: string]: string\n }\n }\n}\n\n// Define the vendor packages and their corresponding versions and entry points\nconst VENDOR_IMPORTS: VendorImports = {\n react: {\n '^19.2.0': {\n '.': './cjs/react.production.js',\n './compiler-runtime': './cjs/react-compiler-runtime.production.js',\n './jsx-dev-runtime': './cjs/react-jsx-dev-runtime.production.js',\n './jsx-runtime': './cjs/react-jsx-runtime.production.js',\n './package.json': './package.json',\n },\n },\n 'react-dom': {\n '^19.2.0': {\n '.': './cjs/react-dom.production.js',\n './client': './cjs/react-dom-client.production.js',\n './package.json': './package.json',\n './server': './cjs/react-dom-server-legacy.browser.production.js',\n './server.browser': './cjs/react-dom-server-legacy.browser.production.js',\n './static': './cjs/react-dom-server.browser.production.js',\n './static.browser': './cjs/react-dom-server.browser.production.js',\n },\n },\n}\n\nconst STYLED_COMPONENTS_IMPORTS = {\n 'styled-components': {\n '^6.1.0': {\n '.': './dist/styled-components.browser.esm.js',\n './package.json': './package.json',\n },\n },\n}\n\ninterface VendorBuildOptions {\n basePath: string\n cwd: string\n isApp: boolean\n outputDir: string\n}\n\n/**\n * Builds the ESM browser compatible versions of the vendor packages\n * specified in VENDOR_IMPORTS. Returns the `imports` object of an import map.\n */\nexport async function buildVendorDependencies({\n basePath,\n cwd,\n isApp,\n outputDir,\n}: VendorBuildOptions): Promise<Record<string, string>> {\n const entry: Record<string, string> = {}\n const imports: Record<string, string> = {}\n\n // If we're building an app, we don't need to build the styled-components package\n const vendorImports = isApp ? VENDOR_IMPORTS : {...VENDOR_IMPORTS, ...STYLED_COMPONENTS_IMPORTS}\n\n // Iterate over each package and its version ranges in VENDOR_IMPORTS\n for (const [packageName, ranges] of Object.entries(vendorImports)) {\n const version = await getLocalPackageVersion(packageName, cwd)\n if (!version) {\n throw new Error(`Could not get version for '${packageName}'`)\n }\n\n // Sort version ranges in descending order\n const sortedRanges = Object.keys(ranges).toSorted((range1, range2) => {\n const min1 = minVersion(range1)\n const min2 = minVersion(range2)\n\n if (!min1) throw new Error(`Could not parse range '${range1}'`)\n if (!min2) throw new Error(`Could not parse range '${range2}'`)\n\n // sort them in reverse so we can rely on array `.find` below\n return rcompare(min1.version, min2.version)\n })\n\n // Find the first version range that satisfies the package version\n const matchedRange = sortedRanges.find((range) => satisfies(version, range))\n\n if (!matchedRange) {\n const min = minVersion(sortedRanges.at(-1)!)\n if (!min) {\n throw new Error(`Could not find a minimum version for package '${packageName}'`)\n }\n\n if (gt(min.version, version)) {\n throw new Error(`Package '${packageName}' requires at least ${min.version}.`)\n }\n\n throw new Error(`Version '${version}' of package '${packageName}' is not supported yet.`)\n }\n\n const subpaths = ranges[matchedRange]\n\n // Resolve the actual package directory using Node module resolution,\n // so that hoisted packages in monorepos/workspaces are found correctly\n const packageDir = getLocalPackageDir(packageName, cwd)\n\n // Iterate over each subpath and its corresponding entry point\n for (const [subpath, relativeEntryPoint] of Object.entries(subpaths)) {\n const specifier = path.posix.join(packageName, subpath)\n const chunkName = path.posix.join(\n packageName,\n path.relative(packageName, specifier) || 'index',\n )\n\n entry[chunkName] = path.join(packageDir, relativeEntryPoint)\n imports[specifier] = path.posix.join('/', basePath, VENDOR_DIR, `${chunkName}.mjs`)\n }\n }\n\n // removes the `RollupWatcher` type\n type BuildResult = Exclude<Awaited<ReturnType<typeof build>>, {close: unknown}>\n\n // Use Vite to build the packages into the output directory\n let buildResult = (await build({\n appType: 'custom',\n build: {\n commonjsOptions: {strictRequires: 'auto'},\n emptyOutDir: false, // Rely on CLI to do this\n lib: {entry, formats: ['es']},\n minify: true,\n outDir: path.join(outputDir, VENDOR_DIR),\n rollupOptions: {\n external: createExternalFromImportMap({imports}),\n output: {\n chunkFileNames: '[name]-[hash].mjs',\n entryFileNames: '[name]-[hash].mjs',\n exports: 'named',\n format: 'es',\n },\n treeshake: {preset: 'recommended'},\n },\n },\n // Define a custom cache directory so that sanity's vite cache\n // does not conflict with any potential local vite projects\n cacheDir: `${SANITY_CACHE_DIR}/vite-vendor`,\n configFile: false,\n define: {'process.env.NODE_ENV': JSON.stringify('production')},\n logLevel: 'silent',\n mode: 'production',\n root: cwd,\n })) as BuildResult\n\n buildResult = Array.isArray(buildResult) ? buildResult : [buildResult]\n\n // Create a map of the original import specifiers to their hashed filenames\n const hashedImports: Record<string, string> = {}\n const output = buildResult.flatMap((i) => i.output)\n\n for (const chunk of output) {\n if (chunk.type === 'asset') continue\n\n for (const [specifier, originalPath] of Object.entries(imports)) {\n if (originalPath.endsWith(`${chunk.name}.mjs`)) {\n hashedImports[specifier] = path.posix.join('/', basePath, VENDOR_DIR, chunk.fileName)\n }\n }\n }\n\n return hashedImports\n}\n"],"names":["path","getLocalPackageDir","getLocalPackageVersion","gt","minVersion","rcompare","satisfies","build","SANITY_CACHE_DIR","createExternalFromImportMap","VENDOR_DIR","VENDOR_IMPORTS","react","STYLED_COMPONENTS_IMPORTS","buildVendorDependencies","basePath","cwd","isApp","outputDir","entry","imports","vendorImports","packageName","ranges","Object","entries","version","Error","sortedRanges","keys","toSorted","range1","range2","min1","min2","matchedRange","find","range","min","at","subpaths","packageDir","subpath","relativeEntryPoint","specifier","posix","join","chunkName","relative","buildResult","appType","commonjsOptions","strictRequires","emptyOutDir","lib","formats","minify","outDir","rollupOptions","external","output","chunkFileNames","entryFileNames","exports","format","treeshake","preset","cacheDir","configFile","define","JSON","stringify","logLevel","mode","root","Array","isArray","hashedImports","flatMap","i","chunk","type","originalPath","endsWith","name","fileName"],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ import path from 'node:path';
2
+ import { getLocalPackageVersion, readPackageJson } from '@sanity/cli-core';
3
+ import { coerce, gtr, ltr, rcompare, satisfies } from 'semver';
4
+ // NOTE: when doing changes here, also remember to update versions in help docs at
5
+ // https://sanity.io/admin/structure/docs;helpArticle;upgrade-packages
6
+ const DEFAULT_PACKAGES = [
7
+ {
8
+ deprecatedBelow: null,
9
+ name: 'react',
10
+ supported: [
11
+ '^19.2.2'
12
+ ]
13
+ },
14
+ {
15
+ deprecatedBelow: null,
16
+ name: 'react-dom',
17
+ supported: [
18
+ '^19.2.2'
19
+ ]
20
+ },
21
+ {
22
+ deprecatedBelow: null,
23
+ name: 'styled-components',
24
+ supported: [
25
+ '^6'
26
+ ]
27
+ },
28
+ {
29
+ deprecatedBelow: '^3',
30
+ name: '@sanity/ui',
31
+ supported: [
32
+ '^2',
33
+ '^3'
34
+ ]
35
+ }
36
+ ];
37
+ export async function checkStudioDependencyVersions(workDir, output, { packages = DEFAULT_PACKAGES } = {}) {
38
+ const manifest = await readPackageJson(path.join(workDir, 'package.json'), {
39
+ skipSchemaValidation: true
40
+ });
41
+ const dependencies = {
42
+ ...manifest?.dependencies,
43
+ ...manifest?.devDependencies
44
+ };
45
+ const packageInfo = packages.map(async (pkg)=>{
46
+ const dependency = dependencies[pkg.name];
47
+ if (!dependency) {
48
+ return false;
49
+ }
50
+ const packageVersion = await getLocalPackageVersion(pkg.name, workDir);
51
+ const installed = coerce(packageVersion ?? dependency.replaceAll(/[\D.]/g, ''));
52
+ if (!installed) {
53
+ return false;
54
+ }
55
+ const supported = pkg.supported.join(' || ');
56
+ // "Untested" is usually the case where we have not upgraded the React version requirements
57
+ // before a release, but given that is usually works in a backwards-compatible way, we want
58
+ // to indicate that it's _untested_, not necessarily _unsupported_
59
+ // Ex: Installed is react@20.0.0, but we've only _tested_ with react@^19
60
+ const isUntested = !satisfies(installed, supported) && gtr(installed, supported);
61
+ // "Unsupported" in that the installed version is _lower than_ the minimum version
62
+ // Ex: Installed is react@18.0.0, but we require react@^19.2
63
+ const isUnsupported = !satisfies(installed, supported) && !isUntested;
64
+ // "Deprecated" in that we will stop supporting it at some point in the near future,
65
+ // so users should be prompted to upgrade
66
+ const isDeprecated = pkg.deprecatedBelow ? ltr(installed, pkg.deprecatedBelow) : false;
67
+ return {
68
+ ...pkg,
69
+ installed,
70
+ isDeprecated,
71
+ isUnsupported,
72
+ isUntested
73
+ };
74
+ });
75
+ const installedPackages = (await Promise.all(packageInfo)).filter((inp)=>inp !== false);
76
+ const unsupported = installedPackages.filter((pkg)=>pkg.isUnsupported);
77
+ const deprecated = installedPackages.filter((pkg)=>!pkg.isUnsupported && pkg.isDeprecated);
78
+ const untested = installedPackages.filter((pkg)=>pkg.isUntested);
79
+ if (deprecated.length > 0) {
80
+ output.warn(`The following package versions have been deprecated and should be upgraded:
81
+
82
+ ${listPackages(deprecated)}
83
+
84
+ Support for these will be removed in a future release!
85
+
86
+ ${getUpgradeInstructions(deprecated)}
87
+ `);
88
+ }
89
+ if (untested.length > 0) {
90
+ output.warn(`The following package versions have not yet been marked as supported:
91
+
92
+ ${listPackages(untested)}
93
+
94
+ You _may_ encounter bugs while using these versions.
95
+
96
+ ${getDowngradeInstructions(untested)}
97
+ `);
98
+ }
99
+ if (unsupported.length > 0) {
100
+ output.error(`The following package versions are no longer supported and needs to be upgraded:
101
+
102
+ ${listPackages(unsupported)}
103
+
104
+ ${getUpgradeInstructions(unsupported)}
105
+ `, {
106
+ exit: 1
107
+ });
108
+ }
109
+ }
110
+ function listPackages(pkgs) {
111
+ return pkgs.map((pkg)=>`${pkg.name} (installed: ${pkg.installed}, want: ${pkg.deprecatedBelow || pkg.supported.join(' || ')})`).join('\n ');
112
+ }
113
+ function getUpgradeInstructions(pkgs) {
114
+ const inst = pkgs.map((pkg)=>{
115
+ const [highestSupported] = pkg.supported.map((version)=>(coerce(version) || {
116
+ version: ''
117
+ }).version).toSorted(rcompare);
118
+ return `"${pkg.name}@^${highestSupported}"`;
119
+ }).join(' ');
120
+ return `To upgrade, run either:
121
+
122
+ npm install ${inst}
123
+
124
+ or
125
+
126
+ yarn add ${inst}
127
+
128
+ or
129
+
130
+ pnpm add ${inst}
131
+
132
+
133
+ Read more at https://www.sanity.io/docs/help/upgrade-packages`;
134
+ }
135
+ function getDowngradeInstructions(pkgs) {
136
+ const inst = pkgs.map((pkg)=>{
137
+ const [highestSupported] = pkg.supported.map((version)=>(coerce(version) || {
138
+ version: ''
139
+ }).version).toSorted(rcompare);
140
+ return `"${pkg.name}@^${highestSupported}"`;
141
+ }).join(' ');
142
+ return `To downgrade, run either:
143
+
144
+ yarn add ${inst}
145
+
146
+ or
147
+
148
+ npm install ${inst}
149
+
150
+ or
151
+
152
+ pnpm install ${inst}`;
153
+ }
154
+
155
+ //# sourceMappingURL=checkStudioDependencyVersions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/build/checkStudioDependencyVersions.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {getLocalPackageVersion, type Output, readPackageJson} from '@sanity/cli-core'\nimport {coerce, gtr, ltr, rcompare, satisfies, type SemVer} from 'semver'\n\ninterface PackageInfo {\n deprecatedBelow: string | null\n installed: SemVer\n isDeprecated: boolean\n isUnsupported: boolean\n isUntested: boolean\n name: string\n supported: string[]\n}\n\ninterface TrackedPackage {\n deprecatedBelow: string | null\n name: string\n supported: string[]\n}\n\n// NOTE: when doing changes here, also remember to update versions in help docs at\n// https://sanity.io/admin/structure/docs;helpArticle;upgrade-packages\nconst DEFAULT_PACKAGES: TrackedPackage[] = [\n {deprecatedBelow: null, name: 'react', supported: ['^19.2.2']},\n {deprecatedBelow: null, name: 'react-dom', supported: ['^19.2.2']},\n {deprecatedBelow: null, name: 'styled-components', supported: ['^6']},\n {deprecatedBelow: '^3', name: '@sanity/ui', supported: ['^2', '^3']},\n]\n\nexport async function checkStudioDependencyVersions(\n workDir: string,\n output: Output,\n {packages = DEFAULT_PACKAGES}: {packages?: TrackedPackage[]} = {},\n): Promise<void> {\n const manifest = await readPackageJson(path.join(workDir, 'package.json'), {\n skipSchemaValidation: true,\n })\n const dependencies = {...manifest?.dependencies, ...manifest?.devDependencies}\n\n const packageInfo = packages.map(async (pkg): Promise<false | PackageInfo> => {\n const dependency = dependencies[pkg.name]\n if (!dependency) {\n return false\n }\n\n const packageVersion = await getLocalPackageVersion(pkg.name, workDir)\n const installed = coerce(packageVersion ?? dependency.replaceAll(/[\\D.]/g, ''))\n\n if (!installed) {\n return false\n }\n\n const supported = pkg.supported.join(' || ')\n\n // \"Untested\" is usually the case where we have not upgraded the React version requirements\n // before a release, but given that is usually works in a backwards-compatible way, we want\n // to indicate that it's _untested_, not necessarily _unsupported_\n // Ex: Installed is react@20.0.0, but we've only _tested_ with react@^19\n const isUntested = !satisfies(installed, supported) && gtr(installed, supported)\n\n // \"Unsupported\" in that the installed version is _lower than_ the minimum version\n // Ex: Installed is react@18.0.0, but we require react@^19.2\n const isUnsupported = !satisfies(installed, supported) && !isUntested\n\n // \"Deprecated\" in that we will stop supporting it at some point in the near future,\n // so users should be prompted to upgrade\n const isDeprecated = pkg.deprecatedBelow ? ltr(installed, pkg.deprecatedBelow) : false\n\n return {\n ...pkg,\n installed,\n isDeprecated,\n isUnsupported,\n isUntested,\n }\n })\n\n const installedPackages = (await Promise.all(packageInfo)).filter(\n (inp): inp is PackageInfo => inp !== false,\n )\n const unsupported = installedPackages.filter((pkg) => pkg.isUnsupported)\n const deprecated = installedPackages.filter((pkg) => !pkg.isUnsupported && pkg.isDeprecated)\n const untested = installedPackages.filter((pkg) => pkg.isUntested)\n\n if (deprecated.length > 0) {\n output.warn(`The following package versions have been deprecated and should be upgraded:\n\n ${listPackages(deprecated)}\n\nSupport for these will be removed in a future release!\n\n ${getUpgradeInstructions(deprecated)}\n`)\n }\n\n if (untested.length > 0) {\n output.warn(`The following package versions have not yet been marked as supported:\n\n ${listPackages(untested)}\n\nYou _may_ encounter bugs while using these versions.\n\n ${getDowngradeInstructions(untested)}\n`)\n }\n\n if (unsupported.length > 0) {\n output.error(\n `The following package versions are no longer supported and needs to be upgraded:\n\n ${listPackages(unsupported)}\n\n ${getUpgradeInstructions(unsupported)}\n`,\n {exit: 1},\n )\n }\n}\n\nfunction listPackages(pkgs: PackageInfo[]) {\n return pkgs\n .map(\n (pkg) =>\n `${pkg.name} (installed: ${pkg.installed}, want: ${\n pkg.deprecatedBelow || pkg.supported.join(' || ')\n })`,\n )\n .join('\\n ')\n}\n\nfunction getUpgradeInstructions(pkgs: PackageInfo[]) {\n const inst = pkgs\n .map((pkg) => {\n const [highestSupported] = pkg.supported\n .map((version) => (coerce(version) || {version: ''}).version)\n .toSorted(rcompare)\n\n return `\"${pkg.name}@^${highestSupported}\"`\n })\n .join(' ')\n\n return `To upgrade, run either:\n\n npm install ${inst}\n\n or\n\n yarn add ${inst}\n\n or\n\n pnpm add ${inst}\n\n\nRead more at https://www.sanity.io/docs/help/upgrade-packages`\n}\n\nfunction getDowngradeInstructions(pkgs: PackageInfo[]) {\n const inst = pkgs\n .map((pkg) => {\n const [highestSupported] = pkg.supported\n .map((version) => (coerce(version) || {version: ''}).version)\n .toSorted(rcompare)\n\n return `\"${pkg.name}@^${highestSupported}\"`\n })\n .join(' ')\n\n return `To downgrade, run either:\n\n yarn add ${inst}\n\n or\n\n npm install ${inst}\n\n or\n\n pnpm install ${inst}`\n}\n"],"names":["path","getLocalPackageVersion","readPackageJson","coerce","gtr","ltr","rcompare","satisfies","DEFAULT_PACKAGES","deprecatedBelow","name","supported","checkStudioDependencyVersions","workDir","output","packages","manifest","join","skipSchemaValidation","dependencies","devDependencies","packageInfo","map","pkg","dependency","packageVersion","installed","replaceAll","isUntested","isUnsupported","isDeprecated","installedPackages","Promise","all","filter","inp","unsupported","deprecated","untested","length","warn","listPackages","getUpgradeInstructions","getDowngradeInstructions","error","exit","pkgs","inst","highestSupported","version","toSorted"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import escapeRegExp from 'lodash-es/escapeRegExp.js';
2
+ /**
3
+ * Generates a Rollup `external` configuration array based on the provided
4
+ * import map. We derive externals from the import map because this ensures that
5
+ * modules listed in the import map are not bundled into the Rollup output so
6
+ * the browser can load these bare specifiers according to the import map.
7
+ */ export function createExternalFromImportMap({ imports = {} } = {}) {
8
+ return Object.keys(imports).map((specifier)=>specifier.endsWith('/') ? new RegExp(`^${escapeRegExp(specifier)}.+`) : specifier);
9
+ }
10
+
11
+ //# sourceMappingURL=createExternalFromImportMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/build/createExternalFromImportMap.ts"],"sourcesContent":["import escapeRegExp from 'lodash-es/escapeRegExp.js'\n\ntype ImportMap = {imports?: Record<string, string>}\n\n/**\n * Generates a Rollup `external` configuration array based on the provided\n * import map. We derive externals from the import map because this ensures that\n * modules listed in the import map are not bundled into the Rollup output so\n * the browser can load these bare specifiers according to the import map.\n */\nexport function createExternalFromImportMap({imports = {}}: ImportMap = {}): (RegExp | string)[] {\n return Object.keys(imports).map((specifier) =>\n specifier.endsWith('/') ? new RegExp(`^${escapeRegExp(specifier)}.+`) : specifier,\n )\n}\n"],"names":["escapeRegExp","createExternalFromImportMap","imports","Object","keys","map","specifier","endsWith","RegExp"],"mappings":"AAAA,OAAOA,kBAAkB,4BAA2B;AAIpD;;;;;CAKC,GACD,OAAO,SAASC,4BAA4B,EAACC,UAAU,CAAC,CAAC,EAAY,GAAG,CAAC,CAAC;IACxE,OAAOC,OAAOC,IAAI,CAACF,SAASG,GAAG,CAAC,CAACC,YAC/BA,UAAUC,QAAQ,CAAC,OAAO,IAAIC,OAAO,CAAC,CAAC,EAAER,aAAaM,WAAW,EAAE,CAAC,IAAIA;AAE5E"}
@@ -0,0 +1,13 @@
1
+ const autoGeneratedWarning = `
2
+ This file is auto-generated from "sanity dev".
3
+ Modifications to this file are automatically discarded.
4
+ `.trim();
5
+ /**
6
+ * Adds a warning about file being auto generated
7
+ *
8
+ * @internal
9
+ */ export function decorateIndexWithAutoGeneratedWarning(template) {
10
+ return template.replace(/<head/, `\n<!--\n${autoGeneratedWarning}\n-->\n<head`);
11
+ }
12
+
13
+ //# sourceMappingURL=decorateIndexWithAutoGeneratedWarning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/build/decorateIndexWithAutoGeneratedWarning.ts"],"sourcesContent":["const autoGeneratedWarning = `\nThis file is auto-generated from \"sanity dev\".\nModifications to this file are automatically discarded.\n`.trim()\n\n/**\n * Adds a warning about file being auto generated\n *\n * @internal\n */\nexport function decorateIndexWithAutoGeneratedWarning(template: string): string {\n return template.replace(/<head/, `\\n<!--\\n${autoGeneratedWarning}\\n-->\\n<head`)\n}\n"],"names":["autoGeneratedWarning","trim","decorateIndexWithAutoGeneratedWarning","template","replace"],"mappings":"AAAA,MAAMA,uBAAuB,CAAC;;;AAG9B,CAAC,CAACC,IAAI;AAEN;;;;CAIC,GACD,OAAO,SAASC,sCAAsCC,QAAgB;IACpE,OAAOA,SAASC,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAEJ,qBAAqB,YAAY,CAAC;AAChF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Decorates the given HTML template with a script
3
+ * tag that loads the bridge component to communicate
4
+ * with core-ui.
5
+ *
6
+ * @internal
7
+ */ export function decorateIndexWithBridgeScript(template) {
8
+ const sanityEnv = process.env.SANITY_INTERNAL_ENV || 'production';
9
+ /**
10
+ * The URL to the bridge script is determined by the
11
+ * `SANITY_INTERNAL_ENV` environment variable. So if you deploy
12
+ * a studio to the staging ENV then you'll get the correct script.
13
+ */ const scriptURL = sanityEnv === 'production' ? 'https://core.sanity-cdn.com/bridge.js' : 'https://core.sanity-cdn.work/bridge.js';
14
+ return template.replace('</head>', `<script src="${scriptURL}" async type="module" data-sanity-core></script>\n</head>`);
15
+ }
16
+
17
+ //# sourceMappingURL=decorateIndexWithBridgeScript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/build/decorateIndexWithBridgeScript.ts"],"sourcesContent":["/**\n * Decorates the given HTML template with a script\n * tag that loads the bridge component to communicate\n * with core-ui.\n *\n * @internal\n */\nexport function decorateIndexWithBridgeScript(template: string): string {\n const sanityEnv = process.env.SANITY_INTERNAL_ENV || 'production'\n\n /**\n * The URL to the bridge script is determined by the\n * `SANITY_INTERNAL_ENV` environment variable. So if you deploy\n * a studio to the staging ENV then you'll get the correct script.\n */\n const scriptURL =\n sanityEnv === 'production'\n ? 'https://core.sanity-cdn.com/bridge.js'\n : 'https://core.sanity-cdn.work/bridge.js'\n\n return template.replace(\n '</head>',\n `<script src=\"${scriptURL}\" async type=\"module\" data-sanity-core></script>\\n</head>`,\n )\n}\n"],"names":["decorateIndexWithBridgeScript","template","sanityEnv","process","env","SANITY_INTERNAL_ENV","scriptURL","replace"],"mappings":"AAAA;;;;;;CAMC,GACD,OAAO,SAASA,8BAA8BC,QAAgB;IAC5D,MAAMC,YAAYC,QAAQC,GAAG,CAACC,mBAAmB,IAAI;IAErD;;;;GAIC,GACD,MAAMC,YACJJ,cAAc,eACV,0CACA;IAEN,OAAOD,SAASM,OAAO,CACrB,WACA,CAAC,aAAa,EAAED,UAAU,yDAAyD,CAAC;AAExF"}
@@ -0,0 +1,16 @@
1
+ import { isStaging } from '@sanity/cli-core';
2
+ /**
3
+ * Decorates the given HTML template with a script tag that sets
4
+ * `globalThis.__SANITY_STAGING__` to `true` when building in a
5
+ * staging environment. The script is injected as the first child
6
+ * of `<head>` so it runs before any module scripts.
7
+ *
8
+ * @internal
9
+ */ export function decorateIndexWithStagingScript(template) {
10
+ if (!isStaging()) {
11
+ return template;
12
+ }
13
+ return template.replace(/<head([^>]*)>/, '<head$1>\n<script>globalThis.__SANITY_STAGING__ = true</script>');
14
+ }
15
+
16
+ //# sourceMappingURL=decorateIndexWithStagingScript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/build/decorateIndexWithStagingScript.ts"],"sourcesContent":["import {isStaging} from '@sanity/cli-core'\n\n/**\n * Decorates the given HTML template with a script tag that sets\n * `globalThis.__SANITY_STAGING__` to `true` when building in a\n * staging environment. The script is injected as the first child\n * of `<head>` so it runs before any module scripts.\n *\n * @internal\n */\nexport function decorateIndexWithStagingScript(template: string): string {\n if (!isStaging()) {\n return template\n }\n\n return template.replace(\n /<head([^>]*)>/,\n '<head$1>\\n<script>globalThis.__SANITY_STAGING__ = true</script>',\n )\n}\n"],"names":["isStaging","decorateIndexWithStagingScript","template","replace"],"mappings":"AAAA,SAAQA,SAAS,QAAO,mBAAkB;AAE1C;;;;;;;CAOC,GACD,OAAO,SAASC,+BAA+BC,QAAgB;IAC7D,IAAI,CAACF,aAAa;QAChB,OAAOE;IACT;IAEA,OAAOA,SAASC,OAAO,CACrB,iBACA;AAEJ"}