@vxrn/vite-plugin-metro 1.27.0 → 1.27.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.
Files changed (27) hide show
  1. package/dist/cjs/metro-config/getMetroConfigFromViteConfig.cjs +18 -4
  2. package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.js +18 -4
  3. package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.js.map +1 -1
  4. package/dist/cjs/transformer/loadBabelConfig.cjs +1 -1
  5. package/dist/cjs/transformer/loadBabelConfig.native.js +1 -1
  6. package/dist/cjs/transformer/loadBabelConfig.native.js.map +1 -1
  7. package/dist/cjs/transformer/metroNativeWorker.test.cjs +132 -0
  8. package/dist/cjs/transformer/metroNativeWorker.test.native.js +139 -0
  9. package/dist/cjs/transformer/metroNativeWorker.test.native.js.map +1 -1
  10. package/dist/esm/metro-config/getMetroConfigFromViteConfig.mjs +18 -4
  11. package/dist/esm/metro-config/getMetroConfigFromViteConfig.mjs.map +1 -1
  12. package/dist/esm/metro-config/getMetroConfigFromViteConfig.native.js +18 -4
  13. package/dist/esm/metro-config/getMetroConfigFromViteConfig.native.js.map +1 -1
  14. package/dist/esm/transformer/loadBabelConfig.mjs +1 -1
  15. package/dist/esm/transformer/loadBabelConfig.mjs.map +1 -1
  16. package/dist/esm/transformer/loadBabelConfig.native.js +1 -1
  17. package/dist/esm/transformer/loadBabelConfig.native.js.map +1 -1
  18. package/dist/esm/transformer/metroNativeWorker.test.mjs +130 -1
  19. package/dist/esm/transformer/metroNativeWorker.test.mjs.map +1 -1
  20. package/dist/esm/transformer/metroNativeWorker.test.native.js +137 -1
  21. package/dist/esm/transformer/metroNativeWorker.test.native.js.map +1 -1
  22. package/package.json +4 -4
  23. package/src/metro-config/getMetroConfigFromViteConfig.ts +43 -30
  24. package/src/transformer/loadBabelConfig.ts +2 -0
  25. package/src/transformer/metroNativeWorker.test.ts +154 -1
  26. package/types/metro-config/getMetroConfigFromViteConfig.d.ts.map +1 -1
  27. package/types/transformer/loadBabelConfig.d.ts.map +1 -1
@@ -19,7 +19,10 @@ import {
19
19
  applyEnvironmentGuard,
20
20
  getRemoveServerCodeRouterRoot,
21
21
  } from './metroNativeWorker'
22
- import { buildMetroConfigInputFromViteConfig } from '../metro-config/getMetroConfigFromViteConfig'
22
+ import {
23
+ buildMetroConfigInputFromViteConfig,
24
+ getMetroConfigFromViteConfig,
25
+ } from '../metro-config/getMetroConfigFromViteConfig'
23
26
 
24
27
  const babelCalls = {
25
28
  transform: 0,
@@ -533,6 +536,117 @@ describe('metroNativeWorker', () => {
533
536
  }
534
537
  })
535
538
 
539
+ it('warns naming the ignored user babel config when native transforms are forced', async () => {
540
+ const tempDir = fs.realpathSync(
541
+ fs.mkdtempSync(path.join(process.cwd(), '.tmp-metro-test-'))
542
+ )
543
+ fs.writeFileSync(path.join(tempDir, 'package.json'), '{}')
544
+ const babelConfigPath = path.join(tempDir, 'babel.config.js')
545
+ fs.writeFileSync(babelConfigPath, 'module.exports = { plugins: [] }')
546
+ try {
547
+ delete process.env.ONE_METRO_NATIVE_TRANSFORMS
548
+ const mockViteConfig = { root: tempDir } as any
549
+ const warnsWithConfig = (spy: any) =>
550
+ spy.mock.calls.some((args: any[]) =>
551
+ args.join(' ').includes(babelConfigPath)
552
+ )
553
+
554
+ // explicit option force still uses the worker, but names the dropped config
555
+ const optionWarn = vi.spyOn(console, 'warn').mockImplementation(() => {})
556
+ try {
557
+ const forced = await buildMetroConfigInputFromViteConfig(mockViteConfig, {
558
+ nativeTransforms: true,
559
+ })
560
+ expect(forced.defaultConfig.transformerPath).toContain('metroNativeWorker')
561
+ expect(warnsWithConfig(optionWarn)).toBe(true)
562
+ } finally {
563
+ optionWarn.mockRestore()
564
+ }
565
+
566
+ // env var force warns the same way
567
+ const envWarn = vi.spyOn(console, 'warn').mockImplementation(() => {})
568
+ try {
569
+ process.env.ONE_METRO_NATIVE_TRANSFORMS = '1'
570
+ const envForced = await buildMetroConfigInputFromViteConfig(mockViteConfig, {})
571
+ expect(envForced.defaultConfig.transformerPath).toContain('metroNativeWorker')
572
+ expect(warnsWithConfig(envWarn)).toBe(true)
573
+ } finally {
574
+ envWarn.mockRestore()
575
+ delete process.env.ONE_METRO_NATIVE_TRANSFORMS
576
+ }
577
+
578
+ // default (no force) respects the config silently: babel fallback, no warning
579
+ const respectedWarn = vi.spyOn(console, 'warn').mockImplementation(() => {})
580
+ try {
581
+ const respected = await buildMetroConfigInputFromViteConfig(mockViteConfig, {})
582
+ expect(respected.defaultConfig.transformerPath).not.toContain(
583
+ 'metroNativeWorker'
584
+ )
585
+ expect(warnsWithConfig(respectedWarn)).toBe(false)
586
+ } finally {
587
+ respectedWarn.mockRestore()
588
+ }
589
+ } finally {
590
+ delete process.env.ONE_METRO_NATIVE_TRANSFORMS
591
+ fs.rmSync(tempDir, { recursive: true, force: true })
592
+ }
593
+ })
594
+
595
+ it('selects the same transformer in both metro config builders', async () => {
596
+ const tempDir = fs.realpathSync(
597
+ fs.mkdtempSync(path.join(process.cwd(), '.tmp-metro-test-'))
598
+ )
599
+ fs.writeFileSync(path.join(tempDir, 'package.json'), '{}')
600
+ try {
601
+ delete process.env.ONE_METRO_NATIVE_TRANSFORMS
602
+ const mockViteConfig = { root: tempDir } as any
603
+
604
+ // no user config: both builders default to the native worker
605
+ const nativeInput = await buildMetroConfigInputFromViteConfig(mockViteConfig, {})
606
+ const nativeFull = await getMetroConfigFromViteConfig(mockViteConfig, {})
607
+ expect(nativeInput.defaultConfig.transformerPath).toContain('metroNativeWorker')
608
+ expect((nativeFull as any).transformerPath).toContain('metroNativeWorker')
609
+
610
+ // user config: both builders fall back to the babel transformer
611
+ const babelConfigPath = path.join(tempDir, 'babel.config.js')
612
+ fs.writeFileSync(babelConfigPath, 'module.exports = { plugins: [] }')
613
+ const fallbackInput = await buildMetroConfigInputFromViteConfig(
614
+ mockViteConfig,
615
+ {}
616
+ )
617
+ const fallbackFull = await getMetroConfigFromViteConfig(mockViteConfig, {})
618
+ expect(fallbackInput.defaultConfig.transformerPath).not.toContain(
619
+ 'metroNativeWorker'
620
+ )
621
+ expect((fallbackFull as any).transformerPath).not.toContain('metroNativeWorker')
622
+
623
+ // forced with a user config: both builders warn naming the ignored file
624
+ const forcedWarn = vi.spyOn(console, 'warn').mockImplementation(() => {})
625
+ try {
626
+ const forcedInput = await buildMetroConfigInputFromViteConfig(mockViteConfig, {
627
+ nativeTransforms: true,
628
+ })
629
+ const forcedFull = await getMetroConfigFromViteConfig(mockViteConfig, {
630
+ nativeTransforms: true,
631
+ })
632
+ expect(forcedInput.defaultConfig.transformerPath).toContain(
633
+ 'metroNativeWorker'
634
+ )
635
+ expect((forcedFull as any).transformerPath).toContain('metroNativeWorker')
636
+ expect(
637
+ forcedWarn.mock.calls.some((args: any[]) =>
638
+ args.join(' ').includes(babelConfigPath)
639
+ )
640
+ ).toBe(true)
641
+ } finally {
642
+ forcedWarn.mockRestore()
643
+ }
644
+ } finally {
645
+ delete process.env.ONE_METRO_NATIVE_TRANSFORMS
646
+ fs.rmSync(tempDir, { recursive: true, force: true })
647
+ }
648
+ })
649
+
536
650
  it('transforms and executes a real 2-module Metro bundle through metro-runtime require polyfill', async () => {
537
651
  // Probe 1 verification:
538
652
  // Module 2 (dep.js): exports a value
@@ -1302,3 +1416,42 @@ export const all = { ...import.meta.env };`,
1302
1416
  )
1303
1417
  })
1304
1418
  })
1419
+
1420
+ describe('metro babel fallback config names', () => {
1421
+ it('extends json babel configs just like the compiler detection does', async () => {
1422
+ // loadBabelConfig memoizes a singleton, so each case gets a fresh module
1423
+ for (const name of ['babel.config.json', '.babelrc.json']) {
1424
+ vi.resetModules()
1425
+ const { loadBabelConfig } = await import('./loadBabelConfig')
1426
+ const tempDir = fs.realpathSync(
1427
+ fs.mkdtempSync(path.join(os.tmpdir(), 'vxrn-babel-json-'))
1428
+ )
1429
+ try {
1430
+ fs.writeFileSync(path.join(tempDir, name), JSON.stringify({ plugins: [] }))
1431
+ expect(loadBabelConfig({ projectRoot: tempDir })).toEqual({
1432
+ extends: path.join(tempDir, name),
1433
+ })
1434
+ } finally {
1435
+ fs.rmSync(tempDir, { recursive: true, force: true })
1436
+ }
1437
+ }
1438
+
1439
+ // control: js configs keep loading
1440
+ vi.resetModules()
1441
+ const { loadBabelConfig } = await import('./loadBabelConfig')
1442
+ const tempDir = fs.realpathSync(
1443
+ fs.mkdtempSync(path.join(os.tmpdir(), 'vxrn-babel-json-'))
1444
+ )
1445
+ try {
1446
+ fs.writeFileSync(
1447
+ path.join(tempDir, 'babel.config.js'),
1448
+ 'module.exports = { plugins: [] }'
1449
+ )
1450
+ expect(loadBabelConfig({ projectRoot: tempDir })).toEqual({
1451
+ extends: path.join(tempDir, 'babel.config.js'),
1452
+ })
1453
+ } finally {
1454
+ fs.rmSync(tempDir, { recursive: true, force: true })
1455
+ }
1456
+ })
1457
+ })
@@ -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;AAmE/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,CAsKhF;AAED,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,cAAc,EACtB,kBAAkB,EAAE,kBAAkB,GACrC,OAAO,CAAC,mBAAmB,CAAC,CA0M9B"}
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;AA4G/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,CAwJhF;AAED,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,cAAc,EACtB,kBAAkB,EAAE,kBAAkB,GACrC,OAAO,CAAC,mBAAmB,CAAC,CA4L9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"loadBabelConfig.d.ts","sourceRoot":"","sources":["../../src/transformer/loadBabelConfig.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEpD;;;;GAIG;AACH,eAAO,MAAM,eAAe,oBAGmB;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,kDAsClE,CAAA"}
1
+ {"version":3,"file":"loadBabelConfig.d.ts","sourceRoot":"","sources":["../../src/transformer/loadBabelConfig.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEpD;;;;GAIG;AACH,eAAO,MAAM,eAAe,oBAGmB;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,kDAwClE,CAAA"}