(config: ResolvedConfig)
| 17 | * @server-only |
| 18 | */ |
| 19 | export function clientInjectionsPlugin(config: ResolvedConfig): Plugin { |
| 20 | let injectConfigValues: (code: string) => string |
| 21 | |
| 22 | const getDefineReplacer = perEnvironmentState((environment) => { |
| 23 | const userDefine: Record<string, any> = {} |
| 24 | for (const key in environment.config.define) { |
| 25 | // import.meta.env.* is handled in `importAnalysis` plugin |
| 26 | if (!key.startsWith('import.meta.env.')) { |
| 27 | userDefine[key] = environment.config.define[key] |
| 28 | } |
| 29 | } |
| 30 | const serializedDefines = serializeDefine(userDefine) |
| 31 | const definesReplacement = () => serializedDefines |
| 32 | return (code: string) => code.replace(`__DEFINES__`, definesReplacement) |
| 33 | }) |
| 34 | |
| 35 | return { |
| 36 | name: 'vite:client-inject', |
| 37 | applyToEnvironment(environment) { |
| 38 | return !environment.config.isBundled |
| 39 | }, |
| 40 | async buildStart() { |
| 41 | injectConfigValues = await createClientConfigValueReplacer(config) |
| 42 | }, |
| 43 | transform(code, id) { |
| 44 | const ssr = this.environment.config.consumer === 'server' |
| 45 | const cleanId = cleanUrl(id) |
| 46 | if (cleanId === normalizedClientEntry || cleanId === normalizedEnvEntry) { |
| 47 | const defineReplacer = getDefineReplacer(this) |
| 48 | return defineReplacer(injectConfigValues(code)) |
| 49 | } else if (!ssr && code.includes('process.env.NODE_ENV')) { |
| 50 | // replace process.env.NODE_ENV instead of defining a global |
| 51 | // for it to avoid shimming a `process` object during dev, |
| 52 | // avoiding inconsistencies between dev and build |
| 53 | const nodeEnv = |
| 54 | this.environment.config.define?.['process.env.NODE_ENV'] || |
| 55 | JSON.stringify(process.env.NODE_ENV || config.mode) |
| 56 | return replaceDefine(this.environment, code, id, { |
| 57 | 'process.env.NODE_ENV': nodeEnv, |
| 58 | 'global.process.env.NODE_ENV': nodeEnv, |
| 59 | 'globalThis.process.env.NODE_ENV': nodeEnv, |
| 60 | }) |
| 61 | } |
| 62 | }, |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | function escapeReplacement(value: string | number | boolean | null) { |
| 67 | const jsonValue = JSON.stringify(value) |
no test coverage detected