@sanity/cli-build 5.2.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_exports/_internal/build.d.ts +214 -272
- package/dist/_exports/_internal/env.d.ts +32 -40
- package/dist/_exports/_internal/extract.d.ts +53 -91
- package/dist/actions/build/buildApp.js +5 -4
- package/dist/actions/build/buildApp.js.map +1 -1
- package/dist/actions/build/buildStaticFiles.js.map +1 -1
- package/dist/actions/build/checkStudioDependencyVersions.js +8 -3
- package/dist/actions/build/checkStudioDependencyVersions.js.map +1 -1
- package/dist/actions/build/getViteConfig.js +38 -11
- package/dist/actions/build/getViteConfig.js.map +1 -1
- package/dist/util/compareDependencyVersions.js +6 -11
- package/dist/util/compareDependencyVersions.js.map +1 -1
- package/package.json +15 -12
|
@@ -1,21 +1,10 @@
|
|
|
1
|
-
import { DefinedTelemetryTrace } from "@sanity/telemetry";
|
|
2
|
-
import { extractSchema } from "@sanity/schema/_internal";
|
|
3
1
|
import { ProjectRootResult } from "@sanity/cli-core/types";
|
|
4
2
|
import { SchemaValidationProblemGroup } from "@sanity/types";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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 {
|
|
3
|
+
import { extractSchema } from "@sanity/schema/_internal";
|
|
4
|
+
import "zod/mini";
|
|
5
|
+
declare function getAggregatedSeverity(groupOrGroups: SchemaValidationProblemGroup | SchemaValidationProblemGroup[]): 'error' | 'warning';
|
|
6
|
+
declare function formatSchemaValidation(validation: SchemaValidationProblemGroup[]): string;
|
|
7
|
+
interface ExtractOptions {
|
|
19
8
|
configPath: string;
|
|
20
9
|
enforceRequiredFields: boolean;
|
|
21
10
|
format: string;
|
|
@@ -23,31 +12,7 @@ export declare interface ExtractOptions {
|
|
|
23
12
|
watchPatterns: string[];
|
|
24
13
|
workspace: string | undefined;
|
|
25
14
|
}
|
|
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 {
|
|
15
|
+
interface GetExtractOptions {
|
|
51
16
|
enforceRequiredFields: boolean | undefined;
|
|
52
17
|
format: string | undefined;
|
|
53
18
|
path: string | undefined;
|
|
@@ -55,66 +20,63 @@ declare interface GetExtractOptions {
|
|
|
55
20
|
watchPatterns: string[] | undefined;
|
|
56
21
|
workspace: string | undefined;
|
|
57
22
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
23
|
+
declare function getExtractOptions(options: GetExtractOptions): ExtractOptions;
|
|
24
|
+
/**
|
|
25
|
+
* Creates a pattern matcher function for schema watch patterns.
|
|
26
|
+
* Normalizes file paths to forward slashes and makes them relative before matching.
|
|
27
|
+
*
|
|
28
|
+
* @param patterns - Array of glob patterns to match against
|
|
29
|
+
* @returns Function that takes a file path and workDir, returns true if file matches any pattern
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
declare function createSchemaPatternMatcher(patterns: string[]): {
|
|
33
|
+
isMatch: (filePath: string, workDir: string) => boolean;
|
|
34
|
+
};
|
|
63
35
|
/**
|
|
64
36
|
* Core schema extraction logic.
|
|
65
37
|
* Performs the extraction via worker and writes to file.
|
|
66
38
|
* Throws SchemaExtractionError on failure.
|
|
67
39
|
*/
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
40
|
+
declare function runSchemaExtraction(extractOptions: Omit<ExtractOptions, 'watchPatterns'>): Promise<ReturnType<typeof extractSchema>>;
|
|
41
|
+
/** @internal */
|
|
42
|
+
interface ExtractSchemaWorkerError {
|
|
43
|
+
error: string;
|
|
44
|
+
type: 'error';
|
|
45
|
+
validation?: SchemaValidationProblemGroup[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Extracts validation problem groups from a SchemaError.
|
|
49
|
+
*/
|
|
50
|
+
declare function extractValidationFromSchemaError(error: unknown, workDir: string): Promise<SchemaValidationProblemGroup[] | undefined>;
|
|
51
|
+
declare class SchemaExtractionError extends Error {
|
|
52
|
+
validation?: SchemaValidationProblemGroup[];
|
|
53
|
+
constructor(message: string, validation?: SchemaValidationProblemGroup[]);
|
|
81
54
|
}
|
|
82
|
-
|
|
83
|
-
export declare const SchemaExtractedTrace: DefinedTelemetryTrace<
|
|
84
|
-
SchemaExtractedTraceAttributes,
|
|
85
|
-
void
|
|
86
|
-
>;
|
|
87
|
-
|
|
88
|
-
declare interface SchemaExtractedTraceAttributes {
|
|
55
|
+
interface SchemaExtractedTraceAttributes {
|
|
89
56
|
enforceRequiredFields: boolean;
|
|
90
57
|
schemaAllTypesCount: number;
|
|
91
58
|
schemaDocumentTypesCount: number;
|
|
92
59
|
schemaFormat: string;
|
|
93
60
|
schemaTypesCount: number;
|
|
94
61
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
62
|
+
type SchemaExtractionWatchModeAttributes = {
|
|
63
|
+
averageExtractionDuration: number;
|
|
64
|
+
extractionFailedCount: number;
|
|
65
|
+
extractionSuccessfulCount: number;
|
|
66
|
+
step: 'stopped';
|
|
67
|
+
watcherDuration: number;
|
|
68
|
+
} | {
|
|
69
|
+
enforceRequiredFields: boolean;
|
|
70
|
+
schemaFormat: string;
|
|
71
|
+
step: 'started';
|
|
72
|
+
};
|
|
73
|
+
interface SchemaDeployTraceData {
|
|
74
|
+
manifestDir: string;
|
|
75
|
+
schemaRequired: boolean;
|
|
76
|
+
extractManifest?: boolean;
|
|
99
77
|
}
|
|
100
|
-
|
|
101
|
-
declare
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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 {};
|
|
78
|
+
declare const SchemaExtractedTrace: import("@sanity/telemetry").DefinedTelemetryTrace<SchemaExtractedTraceAttributes, void>;
|
|
79
|
+
declare const SchemaExtractionWatchModeTrace: import("@sanity/telemetry").DefinedTelemetryTrace<SchemaExtractionWatchModeAttributes, void>;
|
|
80
|
+
declare const SchemaDeploy: import("@sanity/telemetry").DefinedTelemetryTrace<SchemaDeployTraceData, void>;
|
|
81
|
+
export { type ExtractOptions, type ExtractSchemaWorkerError, SchemaDeploy, SchemaExtractedTrace, SchemaExtractionError, SchemaExtractionWatchModeTrace, createSchemaPatternMatcher, extractValidationFromSchemaError, formatSchemaValidation, getAggregatedSeverity, getExtractOptions, runSchemaExtraction };
|
|
82
|
+
//# sourceMappingURL=extract.d.ts.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { rm } from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { styleText } from 'node:util';
|
|
4
|
+
import { exitCodes } from '@sanity/cli-core/ExitCodes';
|
|
4
5
|
import { getLocalPackageVersion } from '@sanity/cli-core/package-manager';
|
|
5
6
|
import { getCliTelemetry } from '@sanity/cli-core/telemetry';
|
|
6
7
|
import { isInteractive } from '@sanity/cli-core/util';
|
|
@@ -29,7 +30,7 @@ import { resolveVendorBuildConfig } from './resolveVendorBuildConfig.js';
|
|
|
29
30
|
const installedSanityVersion = await getLocalPackageVersion('sanity', workDir);
|
|
30
31
|
if (!installedSdkVersion) {
|
|
31
32
|
output.error(`Failed to find installed @sanity/sdk-react version`, {
|
|
32
|
-
exit:
|
|
33
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
33
34
|
});
|
|
34
35
|
return;
|
|
35
36
|
}
|
|
@@ -40,7 +41,7 @@ import { resolveVendorBuildConfig } from './resolveVendorBuildConfig.js';
|
|
|
40
41
|
const cleanSDKVersion = semverParse(installedSdkVersion)?.version;
|
|
41
42
|
if (!cleanSDKVersion) {
|
|
42
43
|
output.error(`Failed to parse installed SDK version: ${installedSdkVersion}`, {
|
|
43
|
-
exit:
|
|
44
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
44
45
|
});
|
|
45
46
|
return;
|
|
46
47
|
}
|
|
@@ -95,7 +96,7 @@ import { resolveVendorBuildConfig } from './resolveVendorBuildConfig.js';
|
|
|
95
96
|
});
|
|
96
97
|
if (!shouldContinue) {
|
|
97
98
|
output.error('Declined to continue with build', {
|
|
98
|
-
exit:
|
|
99
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
99
100
|
});
|
|
100
101
|
return;
|
|
101
102
|
}
|
|
@@ -183,7 +184,7 @@ import { resolveVendorBuildConfig } from './resolveVendorBuildConfig.js';
|
|
|
183
184
|
error
|
|
184
185
|
});
|
|
185
186
|
output.error(`Failed to build Sanity application: ${message}`, {
|
|
186
|
-
exit:
|
|
187
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
187
188
|
});
|
|
188
189
|
}
|
|
189
190
|
}
|
|
@@ -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 {getLocalPackageVersion} from '@sanity/cli-core/package-manager'\nimport {getCliTelemetry} from '@sanity/cli-core/telemetry'\nimport {type CliConfig, type Output, type UserViteConfig} from '@sanity/cli-core/types'\nimport {isInteractive} from '@sanity/cli-core/util'\nimport {confirm, getTimer, logSymbols, spinner, type SpinnerInstance} from '@sanity/cli-core/ux'\nimport {type WorkbenchExposes} from '@sanity/workbench-cli/build'\nimport {parse as semverParse} from 'semver'\n\nimport {AppBuildTrace} from '../../telemetry/build.telemetry.js'\nimport {CompareDependencyVersionsResult} from '../../util/compareDependencyVersions.js'\nimport {formatModuleSizes, sortModulesBySize} from '../../util/moduleFormatUtils.js'\nimport {buildDebug} from './buildDebug.js'\nimport {buildStaticFiles} from './buildStaticFiles.js'\nimport {BuildEventListener} from './eventListener.js'\nimport {getAutoUpdatesCssUrls, getAutoUpdatesImportMap} from './getAutoUpdatesImportMap.js'\nimport {getAppEnvironmentVariables} from './getEnvironmentVariables.js'\nimport {handlePrereleaseVersions} from './handlePrereleaseVersions.js'\nimport {resolveVendorBuildConfig} from './resolveVendorBuildConfig.js'\n\nexport type BuildAppEventListener = BuildEventListener\nexport interface BuildOptions {\n appId: string | undefined\n appTitle: string | undefined\n autoUpdatesEnabled: boolean\n checkAppId: () => void\n compareDependencyVersions: (\n packages: {name: string; version: string}[],\n ) => Promise<CompareDependencyVersionsResult>\n determineBasePath: () => string\n entry: string | undefined\n eventListener: Partial<BuildAppEventListener>\n isWorkbenchApp: boolean\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 exposes?: WorkbenchExposes\n\n /** The workbench app's bus identity (`__SANITY_APP_ID__`). */\n workbenchAppId?: string\n}\n\n/**\n * Internal build app that avoids depending on flags for CLI config.\n * @param options - options for the build\n */\nexport async function buildApp(options: BuildOptions): Promise<void> {\n buildDebug(`Building app`)\n\n const {appId, determineBasePath, eventListener, 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 options.checkAppId()\n\n // Check the versions\n const {mismatched, unresolvedPrerelease} =\n await options.compareDependencyVersions(autoUpdatedPackages)\n\n if (unresolvedPrerelease.length > 0) {\n await handlePrereleaseVersions({\n onPreReleaseInInteractiveAutoUpdate: eventListener.onPreReleaseInInteractiveAutoUpdate,\n onPreReleaseInNonInteractiveAutoUpdate:\n eventListener.onPreReleaseInNonInteractiveAutoUpdate,\n unattendedMode,\n unresolvedPrerelease,\n })\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 autoUpdates\n if (autoUpdatesEnabled && !options.isWorkbenchApp) {\n autoUpdates = {\n cssUrls: autoUpdatesCssUrls,\n imports: autoUpdatesImports,\n vendor: await resolveVendorBuildConfig({cwd: workDir, isApp: true}),\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n appTitle: options.appTitle,\n autoUpdates,\n basePath,\n cwd: workDir,\n entry: options.entry,\n exposes: options.exposes,\n isApp: true,\n isWorkbenchApp: options.isWorkbenchApp,\n minify: options.minify,\n outputDir,\n reactCompiler: options.reactCompiler,\n schemaExtraction: options.schemaExtraction,\n sourceMap: options.sourceMap,\n vite: options.vite,\n workbenchAppId: options.workbenchAppId,\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","getLocalPackageVersion","getCliTelemetry","isInteractive","confirm","getTimer","logSymbols","spinner","parse","semverParse","AppBuildTrace","formatModuleSizes","sortModulesBySize","buildDebug","buildStaticFiles","getAutoUpdatesCssUrls","getAutoUpdatesImportMap","getAppEnvironmentVariables","handlePrereleaseVersions","resolveVendorBuildConfig","buildApp","options","appId","determineBasePath","eventListener","outDir","output","workDir","autoUpdatesEnabled","unattendedMode","timer","defaultOutputDir","resolve","join","outputDir","installedSdkVersion","installedSanityVersion","error","exit","autoUpdatesImports","autoUpdatesCssUrls","cleanSDKVersion","version","cleanSanityVersion","autoUpdatedPackages","name","cssFile","log","info","checkAppId","mismatched","unresolvedPrerelease","compareDependencyVersions","length","onPreReleaseInInteractiveAutoUpdate","onPreReleaseInNonInteractiveAutoUpdate","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","autoUpdates","isWorkbenchApp","cssUrls","imports","vendor","cwd","isApp","bundle","appTitle","entry","exposes","minify","reactCompiler","schemaExtraction","sourceMap","vite","workbenchAppId","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","stats","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 {exitCodes} from '@sanity/cli-core/ExitCodes'\nimport {getLocalPackageVersion} from '@sanity/cli-core/package-manager'\nimport {getCliTelemetry} from '@sanity/cli-core/telemetry'\nimport {type CliConfig, type Output, type UserViteConfig} from '@sanity/cli-core/types'\nimport {isInteractive} from '@sanity/cli-core/util'\nimport {confirm, getTimer, logSymbols, spinner, type SpinnerInstance} from '@sanity/cli-core/ux'\nimport {type WorkbenchExposes} from '@sanity/workbench-cli/build'\nimport {parse as semverParse} from 'semver'\n\nimport {AppBuildTrace} from '../../telemetry/build.telemetry.js'\nimport {CompareDependencyVersionsResult} from '../../util/compareDependencyVersions.js'\nimport {formatModuleSizes, sortModulesBySize} from '../../util/moduleFormatUtils.js'\nimport {buildDebug} from './buildDebug.js'\nimport {buildStaticFiles} from './buildStaticFiles.js'\nimport {BuildEventListener} from './eventListener.js'\nimport {getAutoUpdatesCssUrls, getAutoUpdatesImportMap} from './getAutoUpdatesImportMap.js'\nimport {getAppEnvironmentVariables} from './getEnvironmentVariables.js'\nimport {handlePrereleaseVersions} from './handlePrereleaseVersions.js'\nimport {resolveVendorBuildConfig} from './resolveVendorBuildConfig.js'\n\nexport type BuildAppEventListener = BuildEventListener\nexport interface BuildOptions {\n appId: string | undefined\n appTitle: string | undefined\n autoUpdatesEnabled: boolean\n checkAppId: () => void\n compareDependencyVersions: (\n packages: {name: string; version: string}[],\n ) => Promise<CompareDependencyVersionsResult>\n determineBasePath: () => string\n entry: string | undefined\n eventListener: Partial<BuildAppEventListener>\n isWorkbenchApp: boolean\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 exposes?: WorkbenchExposes\n\n /** The workbench app's bus identity (`__SANITY_APP_ID__`). */\n workbenchAppId?: string\n}\n\n/**\n * Internal build app that avoids depending on flags for CLI config.\n * @param options - options for the build\n */\nexport async function buildApp(options: BuildOptions): Promise<void> {\n buildDebug(`Building app`)\n\n const {appId, determineBasePath, eventListener, 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`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\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}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\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 options.checkAppId()\n\n // Check the versions\n const {mismatched, unresolvedPrerelease} =\n await options.compareDependencyVersions(autoUpdatedPackages)\n\n if (unresolvedPrerelease.length > 0) {\n await handlePrereleaseVersions({\n onPreReleaseInInteractiveAutoUpdate: eventListener.onPreReleaseInInteractiveAutoUpdate,\n onPreReleaseInNonInteractiveAutoUpdate:\n eventListener.onPreReleaseInNonInteractiveAutoUpdate,\n unattendedMode,\n unresolvedPrerelease,\n })\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: exitCodes.RUNTIME_ERROR})\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 autoUpdates\n if (autoUpdatesEnabled && !options.isWorkbenchApp) {\n autoUpdates = {\n cssUrls: autoUpdatesCssUrls,\n imports: autoUpdatesImports,\n vendor: await resolveVendorBuildConfig({cwd: workDir, isApp: true}),\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n appTitle: options.appTitle,\n autoUpdates,\n basePath,\n cwd: workDir,\n entry: options.entry,\n exposes: options.exposes,\n isApp: true,\n isWorkbenchApp: options.isWorkbenchApp,\n minify: options.minify,\n outputDir,\n reactCompiler: options.reactCompiler,\n schemaExtraction: options.schemaExtraction,\n sourceMap: options.sourceMap,\n vite: options.vite,\n workbenchAppId: options.workbenchAppId,\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: exitCodes.RUNTIME_ERROR})\n }\n}\n"],"names":["rm","path","styleText","exitCodes","getLocalPackageVersion","getCliTelemetry","isInteractive","confirm","getTimer","logSymbols","spinner","parse","semverParse","AppBuildTrace","formatModuleSizes","sortModulesBySize","buildDebug","buildStaticFiles","getAutoUpdatesCssUrls","getAutoUpdatesImportMap","getAppEnvironmentVariables","handlePrereleaseVersions","resolveVendorBuildConfig","buildApp","options","appId","determineBasePath","eventListener","outDir","output","workDir","autoUpdatesEnabled","unattendedMode","timer","defaultOutputDir","resolve","join","outputDir","installedSdkVersion","installedSanityVersion","error","exit","RUNTIME_ERROR","autoUpdatesImports","autoUpdatesCssUrls","cleanSDKVersion","version","cleanSanityVersion","autoUpdatedPackages","name","cssFile","log","info","checkAppId","mismatched","unresolvedPrerelease","compareDependencyVersions","length","onPreReleaseInInteractiveAutoUpdate","onPreReleaseInNonInteractiveAutoUpdate","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","autoUpdates","isWorkbenchApp","cssUrls","imports","vendor","cwd","isApp","bundle","appTitle","entry","exposes","minify","reactCompiler","schemaExtraction","sourceMap","vite","workbenchAppId","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","stats","slice","complete","fail","Error","String"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/build/buildStaticFiles.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {type CliConfig, type UserViteConfig} from '@sanity/cli-core/types'\nimport {type WorkbenchExposes} from '@sanity/workbench-cli/build'\nimport {type PluginOptions as ReactCompilerConfig} from 'babel-plugin-react-compiler'\nimport {build, createBuilder} from 'vite'\n\nimport {copyDir} from '../../util/copyDir.js'\nimport {type AutoUpdatesBuildConfig} from './autoUpdates.js'\nimport {buildDebug} from './buildDebug.js'\nimport {\n getAppEnvironmentVariables,\n getStudioEnvironmentVariables,\n} from './getEnvironmentVariables.js'\nimport {extendViteConfigWithUserConfig, finalizeViteConfig, getViteConfig} from './getViteConfig.js'\nimport {writeFavicons} from './writeFavicons.js'\nimport {resolveEntries, writeSanityRuntime} from './writeSanityRuntime.js'\n\nexport interface ChunkModule {\n name: string\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 autoUpdates?: AutoUpdatesBuildConfig\n entry?: string\n exposes?: WorkbenchExposes\n isApp?: boolean\n /** Workbench app (opted in via `unstable_defineApp`) — drives the federation build. */\n isWorkbenchApp?: boolean\n minify?: boolean\n profile?: boolean\n reactCompiler?: boolean | ReactCompilerConfig\n schemaExtraction?: CliConfig['schemaExtraction']\n sourceMap?: boolean\n vite?: UserViteConfig\n /** The workbench app's bus identity (`__SANITY_APP_ID__`). */\n workbenchAppId?: string\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 autoUpdates,\n basePath,\n cwd,\n entry,\n exposes,\n isApp,\n isWorkbenchApp,\n minify = true,\n outputDir,\n reactCompiler,\n schemaExtraction,\n sourceMap = false,\n vite: extendViteConfig,\n workbenchAppId,\n } = options\n\n const mode = 'production'\n\n /* Federation builds only produce the federation environment\n * (remote-entry, mf-manifest) — skip client-specific steps like\n * runtime generation, static file copies, and favicons.\n */\n if (isWorkbenchApp) {\n // A workbench remote can also serve itself standalone. When\n // `SANITY_INTERNAL_IS_WORKBENCH_REMOTE` is set, emit an SPA (index.html +\n // bootstrap + favicons) into the same `dist` as the federation output via a\n // dedicated `client` environment (see plugin-sanity-environment). Skipped for\n // a dock-only app (no `./App` to mount), matching `exposesApp` in plugin.ts.\n const emitSpa = process.env.SANITY_INTERNAL_IS_WORKBENCH_REMOTE === 'true' && !(isApp && !entry)\n\n let entries: Awaited<ReturnType<typeof resolveEntries>>\n if (emitSpa) {\n buildDebug('Writing Sanity runtime files (workbench remote SPA)')\n ;({entries} = await writeSanityRuntime({\n appTitle,\n basePath,\n cwd,\n entry,\n isApp,\n isWorkbenchApp,\n reactStrictMode: false,\n watch: false,\n }))\n } else {\n buildDebug('Resolving entries for federation build')\n entries = await resolveEntries({cwd, entry, isApp, isWorkbenchApp})\n }\n\n buildDebug('Resolving vite config (federation)')\n let viteConfig = await getViteConfig({\n basePath,\n cwd,\n entries,\n exposes,\n getEnvironmentVariables,\n isApp,\n isWorkbenchApp,\n minify,\n mode,\n outputDir,\n reactCompiler,\n // Schema extraction is a build-time artifact, not a client-specific step,\n // so a federated studio extracts its schema like the legacy studio build.\n schemaExtraction,\n sourceMap,\n workbenchAppId,\n })\n\n // Apply the user's Vite config so plugins like `@vanilla-extract/vite-plugin`\n // transform source files before the federation environment is bundled.\n // `finalizeViteConfig` is intentionally skipped: the federation environment\n // has its own entry and does not use `.sanity/runtime/app.js`.\n if (extendViteConfig) {\n viteConfig = await extendViteConfigWithUserConfig(\n {command: 'build', mode},\n viteConfig,\n extendViteConfig,\n )\n }\n\n if (emitSpa) {\n const fromPath = path.join(cwd, 'static')\n const staticPath = path.join(outputDir, 'static')\n buildDebug(`Copying static files from ${fromPath} to output dir`)\n await copyDir(fromPath, staticPath)\n buildDebug('Writing favicons to output dir')\n const faviconBasePath = `${basePath.replace(/\\/+$/, '')}/static`\n await writeFavicons(faviconBasePath, staticPath)\n }\n\n buildDebug('Bundling federation environment')\n const builder = await createBuilder(viteConfig)\n await builder.buildApp()\n buildDebug('Bundling complete')\n // TODO: add stats here\n return {chunks: []}\n }\n\n buildDebug('Writing Sanity runtime files')\n const {entries} = await writeSanityRuntime({\n appTitle,\n basePath,\n cwd,\n entry,\n isApp,\n isWorkbenchApp,\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 let viteConfig = await getViteConfig({\n autoUpdates,\n basePath,\n cwd,\n entries,\n getEnvironmentVariables,\n isApp,\n isWorkbenchApp,\n minify,\n mode,\n outputDir,\n reactCompiler,\n schemaExtraction,\n sourceMap,\n })\n\n if (extendViteConfig) {\n const defaultViteConfig = viteConfig\n viteConfig = await extendViteConfigWithUserConfig(\n {command: 'build', mode},\n viteConfig,\n extendViteConfig,\n )\n viteConfig = await finalizeViteConfig(viteConfig, defaultViteConfig)\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 renderedLength: chunkModule.renderedLength,\n }\n }),\n name: chunk.name,\n })\n }\n\n return {chunks: stats}\n}\n"],"names":["path","build","createBuilder","copyDir","buildDebug","getAppEnvironmentVariables","getStudioEnvironmentVariables","extendViteConfigWithUserConfig","finalizeViteConfig","getViteConfig","writeFavicons","resolveEntries","writeSanityRuntime","buildStaticFiles","options","appTitle","autoUpdates","basePath","cwd","entry","exposes","isApp","isWorkbenchApp","minify","outputDir","reactCompiler","schemaExtraction","sourceMap","vite","extendViteConfig","workbenchAppId","mode","emitSpa","process","env","SANITY_INTERNAL_IS_WORKBENCH_REMOTE","entries","reactStrictMode","watch","viteConfig","getEnvironmentVariables","command","fromPath","join","staticPath","faviconBasePath","replace","builder","buildApp","chunks","jsonEncode","prefix","defaultViteConfig","bundle","Array","isArray","stats","chunk","output","type","push","modules","Object","map","rawFilePath","chunkModule","filePath","startsWith","slice","length","name","isAbsolute","relative","renderedLength"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/build/buildStaticFiles.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {type CliConfig, type UserViteConfig} from '@sanity/cli-core/types'\nimport {type WorkbenchExposes} from '@sanity/workbench-cli/build'\nimport {build, createBuilder} from 'vite'\n\nimport {copyDir} from '../../util/copyDir.js'\nimport {type AutoUpdatesBuildConfig} from './autoUpdates.js'\nimport {buildDebug} from './buildDebug.js'\nimport {\n getAppEnvironmentVariables,\n getStudioEnvironmentVariables,\n} from './getEnvironmentVariables.js'\nimport {extendViteConfigWithUserConfig, finalizeViteConfig, getViteConfig} from './getViteConfig.js'\nimport {writeFavicons} from './writeFavicons.js'\nimport {resolveEntries, writeSanityRuntime} from './writeSanityRuntime.js'\n\nexport interface ChunkModule {\n name: string\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 autoUpdates?: AutoUpdatesBuildConfig\n entry?: string\n exposes?: WorkbenchExposes\n isApp?: boolean\n /** Workbench app (opted in via `unstable_defineApp`) — drives the federation build. */\n isWorkbenchApp?: boolean\n minify?: boolean\n profile?: boolean\n reactCompiler?: CliConfig['reactCompiler']\n schemaExtraction?: CliConfig['schemaExtraction']\n sourceMap?: boolean\n vite?: UserViteConfig\n /** The workbench app's bus identity (`__SANITY_APP_ID__`). */\n workbenchAppId?: string\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 autoUpdates,\n basePath,\n cwd,\n entry,\n exposes,\n isApp,\n isWorkbenchApp,\n minify = true,\n outputDir,\n reactCompiler,\n schemaExtraction,\n sourceMap = false,\n vite: extendViteConfig,\n workbenchAppId,\n } = options\n\n const mode = 'production'\n\n /* Federation builds only produce the federation environment\n * (remote-entry, mf-manifest) — skip client-specific steps like\n * runtime generation, static file copies, and favicons.\n */\n if (isWorkbenchApp) {\n // A workbench remote can also serve itself standalone. When\n // `SANITY_INTERNAL_IS_WORKBENCH_REMOTE` is set, emit an SPA (index.html +\n // bootstrap + favicons) into the same `dist` as the federation output via a\n // dedicated `client` environment (see plugin-sanity-environment). Skipped for\n // a dock-only app (no `./App` to mount), matching `exposesApp` in plugin.ts.\n const emitSpa = process.env.SANITY_INTERNAL_IS_WORKBENCH_REMOTE === 'true' && !(isApp && !entry)\n\n let entries: Awaited<ReturnType<typeof resolveEntries>>\n if (emitSpa) {\n buildDebug('Writing Sanity runtime files (workbench remote SPA)')\n ;({entries} = await writeSanityRuntime({\n appTitle,\n basePath,\n cwd,\n entry,\n isApp,\n isWorkbenchApp,\n reactStrictMode: false,\n watch: false,\n }))\n } else {\n buildDebug('Resolving entries for federation build')\n entries = await resolveEntries({cwd, entry, isApp, isWorkbenchApp})\n }\n\n buildDebug('Resolving vite config (federation)')\n let viteConfig = await getViteConfig({\n basePath,\n cwd,\n entries,\n exposes,\n getEnvironmentVariables,\n isApp,\n isWorkbenchApp,\n minify,\n mode,\n outputDir,\n reactCompiler,\n // Schema extraction is a build-time artifact, not a client-specific step,\n // so a federated studio extracts its schema like the legacy studio build.\n schemaExtraction,\n sourceMap,\n workbenchAppId,\n })\n\n // Apply the user's Vite config so plugins like `@vanilla-extract/vite-plugin`\n // transform source files before the federation environment is bundled.\n // `finalizeViteConfig` is intentionally skipped: the federation environment\n // has its own entry and does not use `.sanity/runtime/app.js`.\n if (extendViteConfig) {\n viteConfig = await extendViteConfigWithUserConfig(\n {command: 'build', mode},\n viteConfig,\n extendViteConfig,\n )\n }\n\n if (emitSpa) {\n const fromPath = path.join(cwd, 'static')\n const staticPath = path.join(outputDir, 'static')\n buildDebug(`Copying static files from ${fromPath} to output dir`)\n await copyDir(fromPath, staticPath)\n buildDebug('Writing favicons to output dir')\n const faviconBasePath = `${basePath.replace(/\\/+$/, '')}/static`\n await writeFavicons(faviconBasePath, staticPath)\n }\n\n buildDebug('Bundling federation environment')\n const builder = await createBuilder(viteConfig)\n await builder.buildApp()\n buildDebug('Bundling complete')\n // TODO: add stats here\n return {chunks: []}\n }\n\n buildDebug('Writing Sanity runtime files')\n const {entries} = await writeSanityRuntime({\n appTitle,\n basePath,\n cwd,\n entry,\n isApp,\n isWorkbenchApp,\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 let viteConfig = await getViteConfig({\n autoUpdates,\n basePath,\n cwd,\n entries,\n getEnvironmentVariables,\n isApp,\n isWorkbenchApp,\n minify,\n mode,\n outputDir,\n reactCompiler,\n schemaExtraction,\n sourceMap,\n })\n\n if (extendViteConfig) {\n const defaultViteConfig = viteConfig\n viteConfig = await extendViteConfigWithUserConfig(\n {command: 'build', mode},\n viteConfig,\n extendViteConfig,\n )\n viteConfig = await finalizeViteConfig(viteConfig, defaultViteConfig)\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 renderedLength: chunkModule.renderedLength,\n }\n }),\n name: chunk.name,\n })\n }\n\n return {chunks: stats}\n}\n"],"names":["path","build","createBuilder","copyDir","buildDebug","getAppEnvironmentVariables","getStudioEnvironmentVariables","extendViteConfigWithUserConfig","finalizeViteConfig","getViteConfig","writeFavicons","resolveEntries","writeSanityRuntime","buildStaticFiles","options","appTitle","autoUpdates","basePath","cwd","entry","exposes","isApp","isWorkbenchApp","minify","outputDir","reactCompiler","schemaExtraction","sourceMap","vite","extendViteConfig","workbenchAppId","mode","emitSpa","process","env","SANITY_INTERNAL_IS_WORKBENCH_REMOTE","entries","reactStrictMode","watch","viteConfig","getEnvironmentVariables","command","fromPath","join","staticPath","faviconBasePath","replace","builder","buildApp","chunks","jsonEncode","prefix","defaultViteConfig","bundle","Array","isArray","stats","chunk","output","type","push","modules","Object","map","rawFilePath","chunkModule","filePath","startsWith","slice","length","name","isAbsolute","relative","renderedLength"],"mappings":"AAAA,OAAOA,UAAU,YAAW;AAI5B,SAAQC,KAAK,EAAEC,aAAa,QAAO,OAAM;AAEzC,SAAQC,OAAO,QAAO,wBAAuB;AAE7C,SAAQC,UAAU,QAAO,kBAAiB;AAC1C,SACEC,0BAA0B,EAC1BC,6BAA6B,QACxB,+BAA8B;AACrC,SAAQC,8BAA8B,EAAEC,kBAAkB,EAAEC,aAAa,QAAO,qBAAoB;AACpG,SAAQC,aAAa,QAAO,qBAAoB;AAChD,SAAQC,cAAc,EAAEC,kBAAkB,QAAO,0BAAyB;AAkC1E;;;;CAIC,GACD,OAAO,eAAeC,iBACpBC,OAA2B;IAE3B,MAAM,EACJC,QAAQ,EACRC,WAAW,EACXC,QAAQ,EACRC,GAAG,EACHC,KAAK,EACLC,OAAO,EACPC,KAAK,EACLC,cAAc,EACdC,SAAS,IAAI,EACbC,SAAS,EACTC,aAAa,EACbC,gBAAgB,EAChBC,YAAY,KAAK,EACjBC,MAAMC,gBAAgB,EACtBC,cAAc,EACf,GAAGhB;IAEJ,MAAMiB,OAAO;IAEb;;;GAGC,GACD,IAAIT,gBAAgB;QAClB,4DAA4D;QAC5D,0EAA0E;QAC1E,4EAA4E;QAC5E,8EAA8E;QAC9E,6EAA6E;QAC7E,MAAMU,UAAUC,QAAQC,GAAG,CAACC,mCAAmC,KAAK,UAAU,CAAEd,CAAAA,SAAS,CAACF,KAAI;QAE9F,IAAIiB;QACJ,IAAIJ,SAAS;YACX5B,WAAW;YACT,CAAA,EAACgC,OAAO,EAAC,GAAG,MAAMxB,mBAAmB;gBACrCG;gBACAE;gBACAC;gBACAC;gBACAE;gBACAC;gBACAe,iBAAiB;gBACjBC,OAAO;YACT,EAAC;QACH,OAAO;YACLlC,WAAW;YACXgC,UAAU,MAAMzB,eAAe;gBAACO;gBAAKC;gBAAOE;gBAAOC;YAAc;QACnE;QAEAlB,WAAW;QACX,IAAImC,aAAa,MAAM9B,cAAc;YACnCQ;YACAC;YACAkB;YACAhB;YACAoB;YACAnB;YACAC;YACAC;YACAQ;YACAP;YACAC;YACA,0EAA0E;YAC1E,0EAA0E;YAC1EC;YACAC;YACAG;QACF;QAEA,8EAA8E;QAC9E,uEAAuE;QACvE,4EAA4E;QAC5E,+DAA+D;QAC/D,IAAID,kBAAkB;YACpBU,aAAa,MAAMhC,+BACjB;gBAACkC,SAAS;gBAASV;YAAI,GACvBQ,YACAV;QAEJ;QAEA,IAAIG,SAAS;YACX,MAAMU,WAAW1C,KAAK2C,IAAI,CAACzB,KAAK;YAChC,MAAM0B,aAAa5C,KAAK2C,IAAI,CAACnB,WAAW;YACxCpB,WAAW,CAAC,0BAA0B,EAAEsC,SAAS,cAAc,CAAC;YAChE,MAAMvC,QAAQuC,UAAUE;YACxBxC,WAAW;YACX,MAAMyC,kBAAkB,GAAG5B,SAAS6B,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC;YAChE,MAAMpC,cAAcmC,iBAAiBD;QACvC;QAEAxC,WAAW;QACX,MAAM2C,UAAU,MAAM7C,cAAcqC;QACpC,MAAMQ,QAAQC,QAAQ;QACtB5C,WAAW;QACX,uBAAuB;QACvB,OAAO;YAAC6C,QAAQ,EAAE;QAAA;IACpB;IAEA7C,WAAW;IACX,MAAM,EAACgC,OAAO,EAAC,GAAG,MAAMxB,mBAAmB;QACzCG;QACAE;QACAC;QACAC;QACAE;QACAC;QACAe,iBAAiB;QACjBC,OAAO;IACT;IAEA,SAASE;QACP,OAAOnB,QACHhB,2BAA2B;YAAC6C,YAAY;YAAMC,QAAQ;QAAc,KACpE7C,8BAA8B;YAAC4C,YAAY;YAAMC,QAAQ;QAAc;IAC7E;IAEA/C,WAAW;IACX,IAAImC,aAAa,MAAM9B,cAAc;QACnCO;QACAC;QACAC;QACAkB;QACAI;QACAnB;QACAC;QACAC;QACAQ;QACAP;QACAC;QACAC;QACAC;IACF;IAEA,IAAIE,kBAAkB;QACpB,MAAMuB,oBAAoBb;QAC1BA,aAAa,MAAMhC,+BACjB;YAACkC,SAAS;YAASV;QAAI,GACvBQ,YACAV;QAEFU,aAAa,MAAM/B,mBAAmB+B,YAAYa;IACpD;IAEA,MAAMV,WAAW1C,KAAK2C,IAAI,CAACzB,KAAK;IAChC,oDAAoD;IACpDd,WAAW,CAAC,0BAA0B,EAAEsC,SAAS,cAAc,CAAC;IAChE,MAAME,aAAa5C,KAAK2C,IAAI,CAACnB,WAAW;IACxC,MAAMrB,QAAQuC,UAAUE;IAExB,4EAA4E;IAC5ExC,WAAW;IACX,MAAMyC,kBAAkB,GAAG5B,SAAS6B,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC;IAChE,MAAMpC,cAAcmC,iBAAiBD;IAErCxC,WAAW;IACX,MAAMiD,SAAS,MAAMpD,MAAMsC;IAC3BnC,WAAW;IAEX,iFAAiF;IACjF,IAAIkD,MAAMC,OAAO,CAACF,WAAW,CAAE,CAAA,YAAYA,MAAK,GAAI;QAClD,OAAO;YAACJ,QAAQ,EAAE;QAAA;IACpB;IAEA,MAAMO,QAAsB,EAAE;IAC9B,KAAK,MAAMC,SAASJ,OAAOK,MAAM,CAAE;QACjC,IAAID,MAAME,IAAI,KAAK,SAAS;YAC1B;QACF;QAEAH,MAAMI,IAAI,CAAC;YACTC,SAASC,OAAO1B,OAAO,CAACqB,MAAMI,OAAO,EAAEE,GAAG,CAAC,CAAC,CAACC,aAAaC,YAAY;gBACpE,MAAMC,WAAWF,YAAYG,UAAU,CAAC,YACpCH,YAAYI,KAAK,CAAC,SAASC,MAAM,IACjCL;gBAEJ,OAAO;oBACLM,MAAMtE,KAAKuE,UAAU,CAACL,YAAYlE,KAAKwE,QAAQ,CAACtD,KAAKgD,YAAYA;oBACjEO,gBAAgBR,YAAYQ,cAAc;gBAC5C;YACF;YACAH,MAAMb,MAAMa,IAAI;QAClB;IACF;IAEA,OAAO;QAACrB,QAAQO;IAAK;AACvB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
+
import { exitCodes } from '@sanity/cli-core/ExitCodes';
|
|
2
3
|
import { getLocalPackageVersion, readPackageJson } from '@sanity/cli-core/package-manager';
|
|
3
4
|
import { coerce, gtr, ltr, rcompare, satisfies } from 'semver';
|
|
4
5
|
// NOTE: when doing changes here, also remember to update versions in help docs at
|
|
@@ -30,7 +31,8 @@ const DEFAULT_PACKAGES = [
|
|
|
30
31
|
name: '@sanity/ui',
|
|
31
32
|
supported: [
|
|
32
33
|
'^2',
|
|
33
|
-
'^3'
|
|
34
|
+
'^3',
|
|
35
|
+
'^4'
|
|
34
36
|
]
|
|
35
37
|
}
|
|
36
38
|
];
|
|
@@ -103,12 +105,15 @@ You _may_ encounter bugs while using these versions.
|
|
|
103
105
|
|
|
104
106
|
${getUpgradeInstructions(unsupported)}
|
|
105
107
|
`, {
|
|
106
|
-
exit:
|
|
108
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
107
109
|
});
|
|
108
110
|
}
|
|
109
111
|
}
|
|
110
112
|
function listPackages(pkgs) {
|
|
111
|
-
return pkgs.map((pkg)
|
|
113
|
+
return pkgs.map((pkg)=>{
|
|
114
|
+
const want = pkg.isDeprecated && !pkg.isUnsupported && !pkg.isUntested ? pkg.deprecatedBelow : pkg.supported.join(' || ');
|
|
115
|
+
return `${pkg.name} (installed: ${pkg.installed}, want: ${want})`;
|
|
116
|
+
}).join('\n ');
|
|
112
117
|
}
|
|
113
118
|
function getUpgradeInstructions(pkgs) {
|
|
114
119
|
const inst = pkgs.map((pkg)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/build/checkStudioDependencyVersions.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {getLocalPackageVersion, readPackageJson} from '@sanity/cli-core/package-manager'\nimport {type Output} from '@sanity/cli-core/types'\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
|
+
{"version":3,"sources":["../../../src/actions/build/checkStudioDependencyVersions.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {exitCodes} from '@sanity/cli-core/ExitCodes'\nimport {getLocalPackageVersion, readPackageJson} from '@sanity/cli-core/package-manager'\nimport {type Output} from '@sanity/cli-core/types'\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', '^4']},\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: exitCodes.RUNTIME_ERROR},\n )\n }\n}\n\nfunction listPackages(pkgs: PackageInfo[]) {\n return pkgs\n .map((pkg) => {\n const want =\n pkg.isDeprecated && !pkg.isUnsupported && !pkg.isUntested\n ? pkg.deprecatedBelow\n : pkg.supported.join(' || ')\n\n return `${pkg.name} (installed: ${pkg.installed}, want: ${want})`\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","exitCodes","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","RUNTIME_ERROR","pkgs","want","inst","highestSupported","version","toSorted"],"mappings":"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"}
|
|
@@ -5,10 +5,10 @@ import { getCliTelemetry } from '@sanity/cli-core/telemetry';
|
|
|
5
5
|
import { isStaging } from '@sanity/cli-core/util';
|
|
6
6
|
import { workbenchOptimizeDeps, workbenchVitePlugins } from '@sanity/workbench-cli/build';
|
|
7
7
|
import viteReact, { reactCompilerPreset } from '@vitejs/plugin-react';
|
|
8
|
-
import debug from 'debug';
|
|
9
8
|
import { esmExternalRequirePlugin, mergeConfig } from 'vite';
|
|
10
9
|
import { SANITY_CACHE_DIR } from '../../constants.js';
|
|
11
10
|
import { sanitySchemaExtractionPlugin } from '../schema/vite/plugin-schema-extraction.js';
|
|
11
|
+
import { buildDebug } from './buildDebug.js';
|
|
12
12
|
import { VENDOR_DIR } from './constants.js';
|
|
13
13
|
import { createExternalFromImportMap } from './createExternalFromImportMap.js';
|
|
14
14
|
import { normalizeBasePath } from './normalizeBasePath.js';
|
|
@@ -31,14 +31,7 @@ import { getDefaultFaviconsPath } from './writeFavicons.js';
|
|
|
31
31
|
const staticPath = `${basePath}static`;
|
|
32
32
|
const envVars = options.getEnvironmentVariables();
|
|
33
33
|
const sharedPlugins = [
|
|
34
|
-
|
|
35
|
-
...reactCompiler ? [
|
|
36
|
-
babel({
|
|
37
|
-
presets: [
|
|
38
|
-
reactCompilerPreset(reactCompiler === true ? {} : reactCompiler)
|
|
39
|
-
]
|
|
40
|
-
})
|
|
41
|
-
] : [],
|
|
34
|
+
...getReactPlugins(reactCompiler),
|
|
42
35
|
...schemaExtraction?.enabled ? [
|
|
43
36
|
sanitySchemaExtractionPlugin({
|
|
44
37
|
additionalPatterns: schemaExtraction.watchPatterns,
|
|
@@ -233,6 +226,40 @@ import { getDefaultFaviconsPath } from './writeFavicons.js';
|
|
|
233
226
|
}
|
|
234
227
|
return viteConfig;
|
|
235
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* The React plugin(s) for the given `reactCompiler` configuration.
|
|
231
|
+
*
|
|
232
|
+
* With the (default) babel transform the compiler runs as a babel preset
|
|
233
|
+
* next to a plain `viteReact()`. With the experimental oxc transform,
|
|
234
|
+
* `viteReact`'s `compiler` option lets `oxc-transform-react` own the React
|
|
235
|
+
* Compiler, TypeScript/JSX and Fast Refresh transforms in one pass. The
|
|
236
|
+
* `transform` discriminator is stripped so neither compiler receives an
|
|
237
|
+
* option it does not know.
|
|
238
|
+
*/ function getReactPlugins(reactCompiler) {
|
|
239
|
+
const config = reactCompiler === true ? {} : reactCompiler || undefined;
|
|
240
|
+
if (!config) {
|
|
241
|
+
return [
|
|
242
|
+
viteReact()
|
|
243
|
+
];
|
|
244
|
+
}
|
|
245
|
+
if (config.transform === 'oxc') {
|
|
246
|
+
const { transform, ...compilerOptions } = config;
|
|
247
|
+
return [
|
|
248
|
+
viteReact({
|
|
249
|
+
compiler: compilerOptions
|
|
250
|
+
})
|
|
251
|
+
];
|
|
252
|
+
}
|
|
253
|
+
const { transform, ...compilerOptions } = config;
|
|
254
|
+
return [
|
|
255
|
+
viteReact(),
|
|
256
|
+
babel({
|
|
257
|
+
presets: [
|
|
258
|
+
reactCompilerPreset(compilerOptions)
|
|
259
|
+
]
|
|
260
|
+
})
|
|
261
|
+
];
|
|
262
|
+
}
|
|
236
263
|
function onRolldownWarn(warning, warn) {
|
|
237
264
|
if (suppressUnusedImport(warning)) {
|
|
238
265
|
return;
|
|
@@ -294,10 +321,10 @@ function suppressUnusedImport(warning) {
|
|
|
294
321
|
*/ export async function extendViteConfigWithUserConfig(env, defaultConfig, userConfig) {
|
|
295
322
|
let config = defaultConfig;
|
|
296
323
|
if (typeof userConfig === 'function') {
|
|
297
|
-
|
|
324
|
+
buildDebug('Extending vite config using user-specified function');
|
|
298
325
|
config = await userConfig(config, env);
|
|
299
326
|
} else if (typeof userConfig === 'object') {
|
|
300
|
-
|
|
327
|
+
buildDebug('Merging vite config using user-specified object');
|
|
301
328
|
config = mergeConfig(config, userConfig);
|
|
302
329
|
}
|
|
303
330
|
return config;
|