@vxrn/vite-plugin-metro 2.0.0-beta.51.1 → 2.0.0-beta.53.1
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/cjs/env/platformEnv.cjs +2 -0
- package/dist/cjs/env/platformEnv.native.cjs +2 -0
- package/dist/cjs/env/platformEnv.native.js +2 -0
- package/dist/cjs/env/platformEnv.native.js.map +1 -1
- package/dist/cjs/metro-config/getMetroBabelConfigFromViteConfig.cjs +10 -15
- package/dist/cjs/metro-config/getMetroBabelConfigFromViteConfig.native.cjs +27 -48
- package/dist/cjs/metro-config/getMetroBabelConfigFromViteConfig.native.js +27 -48
- package/dist/cjs/metro-config/getMetroBabelConfigFromViteConfig.native.js.map +1 -1
- package/dist/cjs/metro-config/getMetroConfigFromViteConfig.cjs +25 -2
- package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.cjs +26 -2
- package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.js +26 -2
- package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.js.map +1 -1
- package/dist/cjs/transformer/metroNativeWorker.cjs +12 -9
- package/dist/cjs/transformer/metroNativeWorker.native.cjs +16 -10
- package/dist/cjs/transformer/metroNativeWorker.native.js +16 -10
- package/dist/cjs/transformer/metroNativeWorker.native.js.map +1 -1
- package/dist/esm/env/platformEnv.mjs +2 -0
- package/dist/esm/env/platformEnv.mjs.map +1 -1
- package/dist/esm/env/platformEnv.native.js +2 -0
- package/dist/esm/env/platformEnv.native.js.map +1 -1
- package/dist/esm/metro-config/getMetroBabelConfigFromViteConfig.mjs +11 -15
- package/dist/esm/metro-config/getMetroBabelConfigFromViteConfig.mjs.map +1 -1
- package/dist/esm/metro-config/getMetroBabelConfigFromViteConfig.native.js +28 -48
- package/dist/esm/metro-config/getMetroBabelConfigFromViteConfig.native.js.map +1 -1
- package/dist/esm/metro-config/getMetroConfigFromViteConfig.mjs +25 -2
- package/dist/esm/metro-config/getMetroConfigFromViteConfig.mjs.map +1 -1
- package/dist/esm/metro-config/getMetroConfigFromViteConfig.native.js +26 -2
- package/dist/esm/metro-config/getMetroConfigFromViteConfig.native.js.map +1 -1
- package/dist/esm/transformer/metroNativeWorker.mjs +12 -9
- package/dist/esm/transformer/metroNativeWorker.mjs.map +1 -1
- package/dist/esm/transformer/metroNativeWorker.native.js +16 -10
- package/dist/esm/transformer/metroNativeWorker.native.js.map +1 -1
- package/package.json +4 -4
- package/src/babel-plugins/import-meta-env-plugin.ts +1 -1
- package/src/env/platformEnv.test.ts +12 -2
- package/src/env/platformEnv.ts +3 -0
- package/src/metro-config/getMetroBabelConfigFromViteConfig.test.ts +19 -25
- package/src/metro-config/getMetroBabelConfigFromViteConfig.ts +8 -27
- package/src/metro-config/getMetroConfigFromViteConfig.test.ts +55 -0
- package/src/metro-config/getMetroConfigFromViteConfig.ts +40 -2
- package/src/transformer/metroNativeWorker.test.ts +29 -16
- package/src/transformer/metroNativeWorker.ts +31 -18
- package/types/babel-plugins/import-meta-env-plugin.d.ts +1 -1
- package/types/env/platformEnv.d.ts +1 -0
- package/types/env/platformEnv.d.ts.map +1 -1
- package/types/metro-config/getMetroBabelConfigFromViteConfig.d.ts +1 -1
- package/types/metro-config/getMetroBabelConfigFromViteConfig.d.ts.map +1 -1
- package/types/metro-config/getMetroConfigFromViteConfig.d.ts.map +1 -1
- package/types/transformer/metroNativeWorker.d.ts +3 -5
- package/types/transformer/metroNativeWorker.d.ts.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vxrn/vite-plugin-metro",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.53.1",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cjs",
|
|
@@ -74,9 +74,9 @@
|
|
|
74
74
|
"@jridgewell/remapping": "^2.3.0",
|
|
75
75
|
"@jridgewell/trace-mapping": "^0.3.25",
|
|
76
76
|
"@oxc-project/runtime": "^0.112.0",
|
|
77
|
-
"@vxrn/compiler": "2.0.0-beta.
|
|
78
|
-
"@vxrn/debug": "2.0.0-beta.
|
|
79
|
-
"@vxrn/utils": "2.0.0-beta.
|
|
77
|
+
"@vxrn/compiler": "2.0.0-beta.53.1",
|
|
78
|
+
"@vxrn/debug": "2.0.0-beta.53.1",
|
|
79
|
+
"@vxrn/utils": "2.0.0-beta.53.1",
|
|
80
80
|
"babel-preset-expo": "58.0.0-canary-20260909-ea7a89a",
|
|
81
81
|
"esbuild": "^0.25.12",
|
|
82
82
|
"launch-editor": "^2.10.0",
|
|
@@ -9,7 +9,7 @@ type PluginOptions = {
|
|
|
9
9
|
/**
|
|
10
10
|
* Babel plugin to replace `import.meta.env.*` and `process.env.*` with env values.
|
|
11
11
|
*
|
|
12
|
-
* Platform-specific env vars (VITE_ENVIRONMENT, VITE_NATIVE, ONE_PLATFORM, TAMAGUI_ENVIRONMENT)
|
|
12
|
+
* Platform-specific env vars (VITE_ENVIRONMENT, VITE_NATIVE, ONE_PLATFORM, EXPO_OS, TAMAGUI_ENVIRONMENT)
|
|
13
13
|
* are automatically injected based on the babel caller's platform.
|
|
14
14
|
*
|
|
15
15
|
* This plugin is referenced by name since Metro runs transformers in separate workers:
|
|
@@ -13,8 +13,18 @@ describe('one platform env contract', () => {
|
|
|
13
13
|
expect(getPlatformEnv('ssr').ONE_PLATFORM).toBe('web')
|
|
14
14
|
})
|
|
15
15
|
|
|
16
|
-
it('
|
|
17
|
-
for (const environment of ['
|
|
16
|
+
it('defines the Expo platform alias only on native', () => {
|
|
17
|
+
for (const environment of ['ios', 'android'] as const) {
|
|
18
|
+
expect(getPlatformEnv(environment).EXPO_OS).toBe(
|
|
19
|
+
getPlatformEnv(environment).ONE_PLATFORM
|
|
20
|
+
)
|
|
21
|
+
const define = getPlatformEnvDefine(environment)
|
|
22
|
+
expect(define['process.env.EXPO_OS']).toBe(define['process.env.ONE_PLATFORM'])
|
|
23
|
+
expect(define['import.meta.env.EXPO_OS']).toBe(
|
|
24
|
+
define['import.meta.env.ONE_PLATFORM']
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
for (const environment of ['client', 'ssr'] as const) {
|
|
18
28
|
expect(getPlatformEnv(environment)).not.toHaveProperty('EXPO_OS')
|
|
19
29
|
const define = getPlatformEnvDefine(environment)
|
|
20
30
|
expect(define).not.toHaveProperty('process.env.EXPO_OS')
|
package/src/env/platformEnv.ts
CHANGED
|
@@ -5,6 +5,7 @@ export type PlatformEnv = {
|
|
|
5
5
|
VITE_ENVIRONMENT: ViteEnvironment
|
|
6
6
|
VITE_NATIVE: '' | '1'
|
|
7
7
|
ONE_PLATFORM: 'web' | 'ios' | 'android'
|
|
8
|
+
EXPO_OS?: 'ios' | 'android'
|
|
8
9
|
TAMAGUI_TARGET: 'web' | 'native'
|
|
9
10
|
TAMAGUI_ENVIRONMENT: ViteEnvironment
|
|
10
11
|
}
|
|
@@ -28,6 +29,7 @@ const platformEnvMap: Record<ViteEnvironment, PlatformEnv> = {
|
|
|
28
29
|
VITE_ENVIRONMENT: 'ios',
|
|
29
30
|
VITE_NATIVE: '1',
|
|
30
31
|
ONE_PLATFORM: 'ios',
|
|
32
|
+
EXPO_OS: 'ios',
|
|
31
33
|
TAMAGUI_TARGET: 'native',
|
|
32
34
|
TAMAGUI_ENVIRONMENT: 'ios',
|
|
33
35
|
},
|
|
@@ -35,6 +37,7 @@ const platformEnvMap: Record<ViteEnvironment, PlatformEnv> = {
|
|
|
35
37
|
VITE_ENVIRONMENT: 'android',
|
|
36
38
|
VITE_NATIVE: '1',
|
|
37
39
|
ONE_PLATFORM: 'android',
|
|
40
|
+
EXPO_OS: 'android',
|
|
38
41
|
TAMAGUI_TARGET: 'native',
|
|
39
42
|
TAMAGUI_ENVIRONMENT: 'android',
|
|
40
43
|
},
|
|
@@ -18,41 +18,35 @@ function pluginEnv(config: any): Record<string, any> {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
describe('metro babel env contract', () => {
|
|
21
|
-
it('picks up ONE_PUBLIC_ keys by default
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
viteConfig({ env: { ONE_PUBLIC_API: 'https://api.test' } })
|
|
26
|
-
)
|
|
27
|
-
expect(env.ONE_PUBLIC_API).toBe('https://api.test')
|
|
28
|
-
expect(env).not.toHaveProperty('EXPO_OS')
|
|
29
|
-
} finally {
|
|
30
|
-
delete process.env.ONE_PUBLIC_API
|
|
31
|
-
}
|
|
21
|
+
it('picks up ONE_PUBLIC_ keys by default with Expo aliases', () => {
|
|
22
|
+
const env = pluginEnv(viteConfig({ env: { ONE_PUBLIC_API: 'https://api.test' } }))
|
|
23
|
+
expect(env.ONE_PUBLIC_API).toBe('https://api.test')
|
|
24
|
+
expect(env.EXPO_PUBLIC_API).toBe('https://api.test')
|
|
32
25
|
})
|
|
33
26
|
|
|
34
27
|
it('harvests ONE_PLATFORM from defines for parity with rolldown', () => {
|
|
35
|
-
const env = pluginEnv(
|
|
36
|
-
viteConfig({ define: { 'process.env.ONE_PLATFORM': '"ios"' } })
|
|
37
|
-
)
|
|
28
|
+
const env = pluginEnv(viteConfig({ define: { 'process.env.ONE_PLATFORM': '"ios"' } }))
|
|
38
29
|
expect(env.ONE_PLATFORM).toBe('ios')
|
|
39
30
|
})
|
|
40
31
|
|
|
41
|
-
it('
|
|
42
|
-
expect(()
|
|
43
|
-
|
|
44
|
-
)
|
|
32
|
+
it('accepts an Expo env prefix', () => {
|
|
33
|
+
expect(pluginEnv(viteConfig({ envPrefix: ['VITE_', 'EXPO_PUBLIC_'] }))).toMatchObject(
|
|
34
|
+
{ MODE: 'development' }
|
|
35
|
+
)
|
|
45
36
|
})
|
|
46
37
|
|
|
47
|
-
it('
|
|
48
|
-
expect(()
|
|
38
|
+
it('accepts Expo keys without creating One names', () => {
|
|
39
|
+
expect(pluginEnv(viteConfig({ env: { EXPO_PUBLIC_API: 'x' } }))).toMatchObject({
|
|
40
|
+
EXPO_PUBLIC_API: 'x',
|
|
41
|
+
})
|
|
42
|
+
expect(
|
|
49
43
|
pluginEnv(viteConfig({ env: { EXPO_PUBLIC_API: 'x' } }))
|
|
50
|
-
).
|
|
44
|
+
).not.toHaveProperty('ONE_PUBLIC_API')
|
|
51
45
|
})
|
|
52
46
|
|
|
53
|
-
it('
|
|
54
|
-
expect(
|
|
55
|
-
pluginEnv(viteConfig({ define: { 'process.env.EXPO_OS': '"ios"' } }))
|
|
56
|
-
).
|
|
47
|
+
it('accepts Expo platform defines for the platform plugin to override', () => {
|
|
48
|
+
expect(
|
|
49
|
+
pluginEnv(viteConfig({ define: { 'process.env.EXPO_OS': '"ios"' } })).EXPO_OS
|
|
50
|
+
).toBe('ios')
|
|
57
51
|
})
|
|
58
52
|
})
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { ResolvedConfig } from 'vite'
|
|
2
2
|
import type { TransformOptions } from '@babel/core'
|
|
3
|
+
import { withExpoPublicEnvAliases } from '@vxrn/utils/publicEnv'
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Creates babel config for Metro transforms from Vite config.
|
|
6
7
|
*
|
|
7
|
-
* Platform-specific env vars (VITE_ENVIRONMENT, VITE_NATIVE, ONE_PLATFORM, TAMAGUI_ENVIRONMENT)
|
|
8
|
+
* Platform-specific env vars (VITE_ENVIRONMENT, VITE_NATIVE, ONE_PLATFORM, EXPO_OS, TAMAGUI_ENVIRONMENT)
|
|
8
9
|
* are handled by the import-meta-env-plugin based on caller.platform and always take precedence.
|
|
9
10
|
*/
|
|
10
11
|
export function getMetroBabelConfigFromViteConfig(
|
|
@@ -18,48 +19,28 @@ export function getMetroBabelConfigFromViteConfig(
|
|
|
18
19
|
SSR: false,
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
const envPrefix = config.envPrefix || ['VITE_', 'ONE_PUBLIC_']
|
|
22
|
+
const envPrefix = config.envPrefix || ['VITE_', 'ONE_PUBLIC_', 'EXPO_PUBLIC_']
|
|
22
23
|
const prefixes = Array.isArray(envPrefix) ? envPrefix : [envPrefix]
|
|
23
24
|
|
|
24
|
-
// expo-prefixed public vars fail with a migration error instead of being
|
|
25
|
-
// copied, ignored, or aliased into the bundle.
|
|
26
|
-
for (const prefix of prefixes) {
|
|
27
|
-
if (prefix.startsWith('EXPO_')) {
|
|
28
|
-
throw new Error(
|
|
29
|
-
`[vxrn/metro] env prefix "${prefix}" is removed. rename it to ONE_PUBLIC_*`
|
|
30
|
-
)
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
25
|
for (const key of Object.keys(config.env)) {
|
|
35
|
-
if (key.startsWith('EXPO_PUBLIC_')) {
|
|
36
|
-
throw new Error(
|
|
37
|
-
`[vxrn/metro] ${key} uses the removed expo prefix. rename it to ONE_PUBLIC_*`
|
|
38
|
-
)
|
|
39
|
-
}
|
|
40
26
|
if (prefixes.some((p) => key.startsWith(p))) {
|
|
41
|
-
importMetaEnv[key] = process.env[key]
|
|
27
|
+
importMetaEnv[key] = process.env[key] ?? config.env[key]
|
|
42
28
|
}
|
|
43
29
|
}
|
|
44
30
|
|
|
45
31
|
// also harvest keys from config.define (populated by env-defining plugins like one's).
|
|
46
32
|
// we union the user's envPrefix with framework-level defaults so we still pick up
|
|
47
|
-
// VITE_/ONE_PUBLIC_/ONE_ even when another plugin replaces envPrefix wholesale
|
|
33
|
+
// VITE_/ONE_PUBLIC_/EXPO_PUBLIC_/ONE_ even when another plugin replaces envPrefix wholesale
|
|
48
34
|
// (e.g. some plugins set it to a single project-specific prefix).
|
|
49
35
|
const definePrefixes = Array.from(
|
|
50
|
-
new Set([...prefixes, 'VITE_', 'ONE_PUBLIC_', 'ONE_'])
|
|
36
|
+
new Set([...prefixes, 'VITE_', 'ONE_PUBLIC_', 'EXPO_PUBLIC_', 'ONE_'])
|
|
51
37
|
)
|
|
52
38
|
for (const defineKey of Object.keys(config.define || {})) {
|
|
53
39
|
const m = defineKey.match(/^process\.env\.([A-Z][A-Z0-9_]*)$/)
|
|
54
40
|
if (!m) continue
|
|
55
41
|
const key = m[1]
|
|
56
|
-
if (key.startsWith('EXPO_PUBLIC_') || key === 'EXPO_OS') {
|
|
57
|
-
throw new Error(
|
|
58
|
-
`[vxrn/metro] ${key} uses the removed expo contract. rename it to ONE_PUBLIC_* or ONE_PLATFORM`
|
|
59
|
-
)
|
|
60
|
-
}
|
|
61
42
|
if (key in importMetaEnv) continue
|
|
62
|
-
if (!definePrefixes.some((p) => key.startsWith(p))) continue
|
|
43
|
+
if (key !== 'EXPO_OS' && !definePrefixes.some((p) => key.startsWith(p))) continue
|
|
63
44
|
const raw = config.define![defineKey]
|
|
64
45
|
try {
|
|
65
46
|
importMetaEnv[key] = typeof raw === 'string' ? JSON.parse(raw) : raw
|
|
@@ -72,7 +53,7 @@ export function getMetroBabelConfigFromViteConfig(
|
|
|
72
53
|
plugins: [
|
|
73
54
|
[
|
|
74
55
|
'@vxrn/vite-plugin-metro/babel-plugins/import-meta-env-plugin',
|
|
75
|
-
{ env: importMetaEnv },
|
|
56
|
+
{ env: withExpoPublicEnvAliases(importMetaEnv) },
|
|
76
57
|
],
|
|
77
58
|
],
|
|
78
59
|
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import fs from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { afterAll, describe, expect, it } from 'vitest'
|
|
4
|
+
import { buildMetroConfigInputFromViteConfig } from './getMetroConfigFromViteConfig'
|
|
5
|
+
|
|
6
|
+
const tmpDirs: string[] = []
|
|
7
|
+
|
|
8
|
+
afterAll(() => {
|
|
9
|
+
for (const tmpDir of tmpDirs) {
|
|
10
|
+
fs.rmSync(tmpDir, { recursive: true, force: true })
|
|
11
|
+
}
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
describe('bare main module entry', () => {
|
|
15
|
+
it('survives a resolver-replacing defaultConfigOverrides', async () => {
|
|
16
|
+
const workspaceRoot = path.resolve(__dirname, '../../../../')
|
|
17
|
+
const fixtureRoot = fs.mkdtempSync(path.join(workspaceRoot, '.tmp-metro-entry-'))
|
|
18
|
+
tmpDirs.push(fixtureRoot)
|
|
19
|
+
fs.writeFileSync(
|
|
20
|
+
path.join(fixtureRoot, 'package.json'),
|
|
21
|
+
JSON.stringify({ name: 'tmp-metro-entry', private: true })
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
const seen: string[] = []
|
|
25
|
+
const { defaultConfig } = await buildMetroConfigInputFromViteConfig(
|
|
26
|
+
{ root: fixtureRoot } as any,
|
|
27
|
+
{
|
|
28
|
+
mainModuleName: 'one/metro-entry',
|
|
29
|
+
watchman: false,
|
|
30
|
+
defaultConfigOverrides: {
|
|
31
|
+
resolver: {
|
|
32
|
+
sourceExts: ['js'],
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
} as any
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
const context = {
|
|
39
|
+
originModulePath: `${fixtureRoot}/.`,
|
|
40
|
+
resolveRequest: (_ctx: any, name: string) => {
|
|
41
|
+
seen.push(name)
|
|
42
|
+
return { type: 'sourceFile', filePath: name }
|
|
43
|
+
},
|
|
44
|
+
}
|
|
45
|
+
await (defaultConfig as any).resolver.resolveRequest(
|
|
46
|
+
context,
|
|
47
|
+
'./one/metro-entry',
|
|
48
|
+
'ios'
|
|
49
|
+
)
|
|
50
|
+
expect(seen).toEqual(['one/metro-entry'])
|
|
51
|
+
|
|
52
|
+
await (defaultConfig as any).resolver.resolveRequest(context, 'react-native', 'ios')
|
|
53
|
+
expect(seen).toEqual(['one/metro-entry', 'react-native'])
|
|
54
|
+
})
|
|
55
|
+
})
|
|
@@ -52,6 +52,40 @@ function rewriteMainModuleBundleUrl(
|
|
|
52
52
|
return url.replace(rootIndexBundleRequestPattern, `$1/${resolvedMainModulePath}.bundle`)
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
+
function isBareSpecifier(name: string) {
|
|
56
|
+
return name !== '' && !name.startsWith('.') && !name.startsWith('/')
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// metro parses `/one/metro-entry.bundle` to the entry `./one/metro-entry`
|
|
60
|
+
// relative to the server root, which misses node_modules package lookup.
|
|
61
|
+
function bareMainModuleForRequest(
|
|
62
|
+
moduleName: string,
|
|
63
|
+
mainModuleName: string | undefined
|
|
64
|
+
) {
|
|
65
|
+
if (!mainModuleName || !isBareSpecifier(mainModuleName)) return undefined
|
|
66
|
+
if (moduleName === `./${mainModuleName}`) return mainModuleName
|
|
67
|
+
return undefined
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// defaultConfigOverrides and Metro config loading can replace the resolver.
|
|
71
|
+
// enforce package semantics on the final config while leaving every other
|
|
72
|
+
// request on the resolver selected by that composition.
|
|
73
|
+
function enforceBareMainModuleEntry(config: any, mainModuleName: string | undefined) {
|
|
74
|
+
if (!mainModuleName || !isBareSpecifier(mainModuleName)) return config
|
|
75
|
+
const innerResolveRequest = config?.resolver?.resolveRequest
|
|
76
|
+
return {
|
|
77
|
+
...config,
|
|
78
|
+
resolver: {
|
|
79
|
+
...config?.resolver,
|
|
80
|
+
resolveRequest: (context: any, moduleName: string, platform: string) => {
|
|
81
|
+
const bareMain = bareMainModuleForRequest(moduleName, mainModuleName)
|
|
82
|
+
const resolveRequest = innerResolveRequest || context.resolveRequest
|
|
83
|
+
return resolveRequest(context, bareMain ?? moduleName, platform)
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
55
89
|
async function isWatchmanResponsive(projectRoot: string) {
|
|
56
90
|
let probe = watchmanResponsivePromises.get(projectRoot)
|
|
57
91
|
if (probe) {
|
|
@@ -287,7 +321,11 @@ export async function buildMetroConfigInputFromViteConfig(
|
|
|
287
321
|
: defaultConfigOverrides),
|
|
288
322
|
}
|
|
289
323
|
|
|
290
|
-
return {
|
|
324
|
+
return {
|
|
325
|
+
defaultConfig: enforceBareMainModuleEntry(merged, mainModuleName),
|
|
326
|
+
projectRoot,
|
|
327
|
+
extraConfig,
|
|
328
|
+
}
|
|
291
329
|
}
|
|
292
330
|
|
|
293
331
|
export async function getMetroConfigFromViteConfig(
|
|
@@ -468,7 +506,7 @@ export async function getMetroConfigFromViteConfig(
|
|
|
468
506
|
)
|
|
469
507
|
|
|
470
508
|
return {
|
|
471
|
-
...metroConfig,
|
|
509
|
+
...enforceBareMainModuleEntry(metroConfig, mainModuleName),
|
|
472
510
|
...extraConfig,
|
|
473
511
|
} as MetroConfigExtended
|
|
474
512
|
}
|
|
@@ -1518,41 +1518,54 @@ describe('metro babel fallback config names', () => {
|
|
|
1518
1518
|
})
|
|
1519
1519
|
|
|
1520
1520
|
describe('one public env contract in the metro worker', () => {
|
|
1521
|
-
it('inlines
|
|
1521
|
+
it('inlines One and Expo public reads in dev and prod with no virtual module', () => {
|
|
1522
1522
|
for (const isProduction of [false, true]) {
|
|
1523
1523
|
const out = applyInlineEnvVars(
|
|
1524
|
-
|
|
1524
|
+
`export const values = [process.env.ONE_PUBLIC_API, process.env.EXPO_PUBLIC_API, import.meta.env.EXPO_PUBLIC_API];
|
|
1525
|
+
export const all = { ...import.meta.env };`,
|
|
1525
1526
|
'env.ts',
|
|
1526
1527
|
isProduction,
|
|
1527
1528
|
{ ONE_PUBLIC_API: 'https://api.test' }
|
|
1528
1529
|
)
|
|
1529
|
-
expect(out).
|
|
1530
|
+
expect(out).toContain(
|
|
1531
|
+
'export const values = ["https://api.test", "https://api.test", "https://api.test"];'
|
|
1532
|
+
)
|
|
1533
|
+
expect(out).toContain('"EXPO_PUBLIC_API":"https://api.test"')
|
|
1530
1534
|
expect(out).not.toContain('expo/virtual/env')
|
|
1531
1535
|
expect(out).not.toContain('_$$_EXPO_ENV')
|
|
1532
1536
|
}
|
|
1533
1537
|
})
|
|
1534
1538
|
|
|
1535
|
-
it('
|
|
1539
|
+
it('preserves explicit conflicting values', () => {
|
|
1536
1540
|
for (const isProduction of [false, true]) {
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
).toThrow(/rename it to ONE_PUBLIC_\*/)
|
|
1541
|
+
const out = applyInlineEnvVars(
|
|
1542
|
+
'export const values = [process.env.ONE_PUBLIC_API, process.env.EXPO_PUBLIC_API];',
|
|
1543
|
+
'env.ts',
|
|
1544
|
+
isProduction,
|
|
1545
|
+
{ ONE_PUBLIC_API: 'one', EXPO_PUBLIC_API: 'expo' }
|
|
1546
|
+
)
|
|
1547
|
+
expect(out).toBe('export const values = ["one", "expo"];')
|
|
1545
1548
|
}
|
|
1546
1549
|
})
|
|
1547
1550
|
|
|
1548
|
-
it('
|
|
1551
|
+
it('accepts Expo runtime feature flags that are not configured', () => {
|
|
1552
|
+
const out = applyInlineEnvVars(
|
|
1553
|
+
'export const useRnFetch = process.env.EXPO_PUBLIC_USE_RN_FETCH;',
|
|
1554
|
+
'/app/node_modules/expo/build/winter/runtime.native.js',
|
|
1555
|
+
false,
|
|
1556
|
+
{ EXPO_PUBLIC_USE_RN_FETCH: undefined }
|
|
1557
|
+
)
|
|
1558
|
+
expect(out).toBe('export const useRnFetch = undefined;')
|
|
1559
|
+
})
|
|
1560
|
+
|
|
1561
|
+
it('carries public aliases through the whole import.meta.env object', () => {
|
|
1549
1562
|
const out = applyInlineEnvVars(
|
|
1550
1563
|
'export const all = { ...import.meta.env };',
|
|
1551
1564
|
'env.ts',
|
|
1552
1565
|
true,
|
|
1553
|
-
{
|
|
1566
|
+
{ ONE_PUBLIC_API: 'one' }
|
|
1554
1567
|
)
|
|
1555
|
-
expect(out).toContain('"
|
|
1556
|
-
expect(out).
|
|
1568
|
+
expect(out).toContain('"ONE_PUBLIC_API":"one"')
|
|
1569
|
+
expect(out).toContain('"EXPO_PUBLIC_API":"one"')
|
|
1557
1570
|
})
|
|
1558
1571
|
})
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
transformHermesLoops,
|
|
14
14
|
transformReactNativeCodegen,
|
|
15
15
|
} from '@vxrn/compiler'
|
|
16
|
+
import { withExpoPublicEnvAliases } from '@vxrn/utils/publicEnv'
|
|
16
17
|
import { getPlatformEnv, metroPlatformToViteEnvironment } from '../env/platformEnv'
|
|
17
18
|
|
|
18
19
|
/**
|
|
@@ -516,17 +517,15 @@ export function applyModuleResolverAliases(
|
|
|
516
517
|
|
|
517
518
|
/**
|
|
518
519
|
* Native port of one's `babel-plugin-inline-one-server-url` for public env.
|
|
519
|
-
* Every `process.env.ONE_PUBLIC_*` read is
|
|
520
|
+
* Every `process.env.ONE_PUBLIC_*` or `process.env.EXPO_PUBLIC_*` read is
|
|
521
|
+
* inlined as a literal in both modes,
|
|
520
522
|
* matching the rolldown native defines: a native runtime has no `process.env`
|
|
521
523
|
* to read it back out of, and without this the reads survive into the bundle
|
|
522
|
-
* and every
|
|
524
|
+
* and every public value is undefined at runtime.
|
|
523
525
|
*
|
|
524
526
|
* `process.env.ONE_SERVER_URL` is inlined in both modes, matching one's plugin:
|
|
525
527
|
* it is how a native bundle knows where to fetch loader data from.
|
|
526
528
|
*
|
|
527
|
-
* `process.env.EXPO_PUBLIC_*` reads fail with a migration error instead of
|
|
528
|
-
* being copied, ignored, or aliased.
|
|
529
|
-
*
|
|
530
529
|
* Both live in one pass because they are the same rewrite over the same walk,
|
|
531
530
|
* and a second parse of every file is the cost this transformer exists to avoid.
|
|
532
531
|
*/
|
|
@@ -544,6 +543,13 @@ export function applyInlineEnvVars(
|
|
|
544
543
|
}
|
|
545
544
|
if (!parsed?.program) return code
|
|
546
545
|
|
|
546
|
+
const processPublicEnv = Object.fromEntries(
|
|
547
|
+
Object.entries(process.env).filter(
|
|
548
|
+
([key]) => key.startsWith('ONE_PUBLIC_') || key.startsWith('EXPO_PUBLIC_')
|
|
549
|
+
)
|
|
550
|
+
)
|
|
551
|
+
const effectiveEnv = withExpoPublicEnvAliases({ ...processPublicEnv, ...env })
|
|
552
|
+
|
|
547
553
|
const ms = new MagicString(code)
|
|
548
554
|
|
|
549
555
|
// edits are collected rather than written straight through, because a folded
|
|
@@ -597,14 +603,12 @@ export function applyInlineEnvVars(
|
|
|
597
603
|
return
|
|
598
604
|
}
|
|
599
605
|
|
|
600
|
-
if (
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
)
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
if (isProcessEnv && !isAssignmentTarget && key?.startsWith('ONE_PUBLIC_')) {
|
|
607
|
-
replace(node, env[key] ?? process.env[key] ?? undefined)
|
|
606
|
+
if (
|
|
607
|
+
isProcessEnv &&
|
|
608
|
+
!isAssignmentTarget &&
|
|
609
|
+
(key?.startsWith('ONE_PUBLIC_') || key?.startsWith('EXPO_PUBLIC_'))
|
|
610
|
+
) {
|
|
611
|
+
replace(node, effectiveEnv[key] ?? undefined)
|
|
608
612
|
return
|
|
609
613
|
}
|
|
610
614
|
|
|
@@ -617,21 +621,30 @@ export function applyInlineEnvVars(
|
|
|
617
621
|
keyOf(obj.property, obj.computed) === 'env' &&
|
|
618
622
|
key !== undefined
|
|
619
623
|
) {
|
|
620
|
-
replace(node,
|
|
624
|
+
replace(node, effectiveEnv[key])
|
|
621
625
|
return
|
|
622
626
|
}
|
|
623
627
|
|
|
624
628
|
// bare `import.meta.env`, spread or passed around whole.
|
|
625
629
|
if (!isAssignmentTarget && isImportMeta(obj) && key === 'env') {
|
|
626
|
-
edits.push({
|
|
630
|
+
edits.push({
|
|
631
|
+
start: node.start,
|
|
632
|
+
end: node.end,
|
|
633
|
+
text: JSON.stringify(effectiveEnv),
|
|
634
|
+
})
|
|
627
635
|
return
|
|
628
636
|
}
|
|
629
637
|
|
|
630
638
|
// `process.env.X` for anything the vite env map defines. runs after the
|
|
631
|
-
// branches above so ONE_SERVER_URL and
|
|
639
|
+
// branches above so ONE_SERVER_URL and public env keep their own
|
|
632
640
|
// handling.
|
|
633
|
-
if (
|
|
634
|
-
|
|
641
|
+
if (
|
|
642
|
+
isProcessEnv &&
|
|
643
|
+
!isAssignmentTarget &&
|
|
644
|
+
key !== undefined &&
|
|
645
|
+
key in effectiveEnv
|
|
646
|
+
) {
|
|
647
|
+
replace(node, effectiveEnv[key])
|
|
635
648
|
return
|
|
636
649
|
}
|
|
637
650
|
}
|
|
@@ -5,7 +5,7 @@ type PluginOptions = {
|
|
|
5
5
|
/**
|
|
6
6
|
* Babel plugin to replace `import.meta.env.*` and `process.env.*` with env values.
|
|
7
7
|
*
|
|
8
|
-
* Platform-specific env vars (VITE_ENVIRONMENT, VITE_NATIVE, ONE_PLATFORM, TAMAGUI_ENVIRONMENT)
|
|
8
|
+
* Platform-specific env vars (VITE_ENVIRONMENT, VITE_NATIVE, ONE_PLATFORM, EXPO_OS, TAMAGUI_ENVIRONMENT)
|
|
9
9
|
* are automatically injected based on the babel caller's platform.
|
|
10
10
|
*
|
|
11
11
|
* This plugin is referenced by name since Metro runs transformers in separate workers:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platformEnv.d.ts","sourceRoot":"","sources":["../../src/env/platformEnv.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,CAAA;AAChD,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAAA;AAElE,MAAM,MAAM,WAAW,GAAG;IACxB,gBAAgB,EAAE,eAAe,CAAA;IACjC,WAAW,EAAE,EAAE,GAAG,GAAG,CAAA;IACrB,YAAY,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,CAAA;IACvC,cAAc,EAAE,KAAK,GAAG,QAAQ,CAAA;IAChC,mBAAmB,EAAE,eAAe,CAAA;CACrC,CAAA;
|
|
1
|
+
{"version":3,"file":"platformEnv.d.ts","sourceRoot":"","sources":["../../src/env/platformEnv.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,CAAA;AAChD,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAAA;AAElE,MAAM,MAAM,WAAW,GAAG;IACxB,gBAAgB,EAAE,eAAe,CAAA;IACjC,WAAW,EAAE,EAAE,GAAG,GAAG,CAAA;IACrB,YAAY,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,CAAA;IACvC,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,CAAA;IAC3B,cAAc,EAAE,KAAK,GAAG,QAAQ,CAAA;IAChC,mBAAmB,EAAE,eAAe,CAAA;CACrC,CAAA;AAmCD,wBAAgB,cAAc,CAAC,WAAW,EAAE,eAAe,GAAG,WAAW,CAExE;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7C,eAAe,CAIjB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,eAAe,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxB"}
|
|
@@ -3,7 +3,7 @@ import type { TransformOptions } from '@babel/core';
|
|
|
3
3
|
/**
|
|
4
4
|
* Creates babel config for Metro transforms from Vite config.
|
|
5
5
|
*
|
|
6
|
-
* Platform-specific env vars (VITE_ENVIRONMENT, VITE_NATIVE, ONE_PLATFORM, TAMAGUI_ENVIRONMENT)
|
|
6
|
+
* Platform-specific env vars (VITE_ENVIRONMENT, VITE_NATIVE, ONE_PLATFORM, EXPO_OS, TAMAGUI_ENVIRONMENT)
|
|
7
7
|
* are handled by the import-meta-env-plugin based on caller.platform and always take precedence.
|
|
8
8
|
*/
|
|
9
9
|
export declare function getMetroBabelConfigFromViteConfig(config: ResolvedConfig): TransformOptions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getMetroBabelConfigFromViteConfig.d.ts","sourceRoot":"","sources":["../../src/metro-config/getMetroBabelConfigFromViteConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"getMetroBabelConfigFromViteConfig.d.ts","sourceRoot":"","sources":["../../src/metro-config/getMetroBabelConfigFromViteConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAGnD;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,cAAc,GACrB,gBAAgB,CA+ClB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getMetroConfigFromViteConfig.d.ts","sourceRoot":"","sources":["../../src/metro-config/getMetroConfigFromViteConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAe1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"getMetroConfigFromViteConfig.d.ts","sourceRoot":"","sources":["../../src/metro-config/getMetroConfigFromViteConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAe1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAuJ/D;;;;;;;GAOG;AACH,wBAAsB,mCAAmC,CACvD,MAAM,EAAE,cAAc,EACtB,kBAAkB,EAAE,kBAAkB,GACrC,OAAO,CAAC;IAAE,aAAa,EAAE,GAAG,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,CAAC,CAsJhF;AAED,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,cAAc,EACtB,kBAAkB,EAAE,kBAAkB,GACrC,OAAO,CAAC,mBAAmB,CAAC,CAkL9B"}
|
|
@@ -125,17 +125,15 @@ export declare function resolveAliasSpecifier(specifier: string, filename: strin
|
|
|
125
125
|
export declare function applyModuleResolverAliases(code: string, filename: string, projectRoot: string, aliases: Record<string, string>): string;
|
|
126
126
|
/**
|
|
127
127
|
* Native port of one's `babel-plugin-inline-one-server-url` for public env.
|
|
128
|
-
* Every `process.env.ONE_PUBLIC_*` read is
|
|
128
|
+
* Every `process.env.ONE_PUBLIC_*` or `process.env.EXPO_PUBLIC_*` read is
|
|
129
|
+
* inlined as a literal in both modes,
|
|
129
130
|
* matching the rolldown native defines: a native runtime has no `process.env`
|
|
130
131
|
* to read it back out of, and without this the reads survive into the bundle
|
|
131
|
-
* and every
|
|
132
|
+
* and every public value is undefined at runtime.
|
|
132
133
|
*
|
|
133
134
|
* `process.env.ONE_SERVER_URL` is inlined in both modes, matching one's plugin:
|
|
134
135
|
* it is how a native bundle knows where to fetch loader data from.
|
|
135
136
|
*
|
|
136
|
-
* `process.env.EXPO_PUBLIC_*` reads fail with a migration error instead of
|
|
137
|
-
* being copied, ignored, or aliased.
|
|
138
|
-
*
|
|
139
137
|
* Both live in one pass because they are the same rewrite over the same walk,
|
|
140
138
|
* and a second parse of every file is the cost this transformer exists to avoid.
|
|
141
139
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metroNativeWorker.d.ts","sourceRoot":"","sources":["../../src/transformer/metroNativeWorker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metroNativeWorker.d.ts","sourceRoot":"","sources":["../../src/transformer/metroNativeWorker.ts"],"names":[],"mappings":"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"}
|