vxrn 0.1.46 → 0.1.48

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 (85) hide show
  1. package/dist/cjs/cli.js +12 -2
  2. package/dist/cjs/cli.js.map +1 -1
  3. package/dist/cjs/cli.native.js +47 -35
  4. package/dist/cjs/cli.native.js.map +2 -2
  5. package/dist/cjs/constants.js +2 -70
  6. package/dist/cjs/constants.js.map +1 -1
  7. package/dist/cjs/constants.native.js +2 -105
  8. package/dist/cjs/constants.native.js.map +2 -2
  9. package/dist/cjs/exports/build.js +50 -62
  10. package/dist/cjs/exports/build.js.map +1 -1
  11. package/dist/cjs/exports/build.native.js +224 -205
  12. package/dist/cjs/exports/build.native.js.map +2 -2
  13. package/dist/cjs/exports/dev.js +39 -24
  14. package/dist/cjs/exports/dev.js.map +1 -1
  15. package/dist/cjs/exports/dev.native.js +48 -50
  16. package/dist/cjs/exports/dev.native.js.map +2 -2
  17. package/dist/cjs/utils/getHtml.js +9 -6
  18. package/dist/cjs/utils/getHtml.js.map +1 -1
  19. package/dist/cjs/utils/getHtml.native.js +9 -5
  20. package/dist/cjs/utils/getHtml.native.js.map +2 -2
  21. package/dist/cjs/utils/getOptimizeDeps.js +132 -0
  22. package/dist/cjs/utils/getOptimizeDeps.js.map +6 -0
  23. package/dist/cjs/utils/getOptimizeDeps.native.js +171 -0
  24. package/dist/cjs/utils/getOptimizeDeps.native.js.map +6 -0
  25. package/dist/cjs/utils/getVitePath.js +3 -1
  26. package/dist/cjs/utils/getVitePath.js.map +1 -1
  27. package/dist/cjs/utils/getVitePath.native.js +1 -1
  28. package/dist/cjs/utils/getVitePath.native.js.map +1 -1
  29. package/dist/cjs/utils/readVXRNConfig.js +5 -3
  30. package/dist/cjs/utils/readVXRNConfig.js.map +1 -1
  31. package/dist/cjs/utils/readVXRNConfig.native.js +5 -1
  32. package/dist/cjs/utils/readVXRNConfig.native.js.map +2 -2
  33. package/dist/esm/cli.js +12 -2
  34. package/dist/esm/cli.js.map +1 -1
  35. package/dist/esm/cli.mjs +12 -2
  36. package/dist/esm/cli.native.js +47 -35
  37. package/dist/esm/cli.native.js.map +2 -2
  38. package/dist/esm/constants.js +2 -70
  39. package/dist/esm/constants.js.map +1 -1
  40. package/dist/esm/constants.mjs +2 -13
  41. package/dist/esm/constants.native.js +2 -102
  42. package/dist/esm/constants.native.js.map +2 -2
  43. package/dist/esm/exports/build.js +47 -60
  44. package/dist/esm/exports/build.js.map +1 -1
  45. package/dist/esm/exports/build.mjs +64 -63
  46. package/dist/esm/exports/build.native.js +223 -204
  47. package/dist/esm/exports/build.native.js.map +2 -2
  48. package/dist/esm/exports/dev.js +37 -21
  49. package/dist/esm/exports/dev.js.map +1 -1
  50. package/dist/esm/exports/dev.mjs +39 -30
  51. package/dist/esm/exports/dev.native.js +46 -47
  52. package/dist/esm/exports/dev.native.js.map +2 -2
  53. package/dist/esm/utils/getHtml.js +9 -6
  54. package/dist/esm/utils/getHtml.js.map +1 -1
  55. package/dist/esm/utils/getHtml.mjs +11 -4
  56. package/dist/esm/utils/getHtml.native.js +9 -5
  57. package/dist/esm/utils/getHtml.native.js.map +2 -2
  58. package/dist/esm/utils/getOptimizeDeps.js +116 -0
  59. package/dist/esm/utils/getOptimizeDeps.js.map +6 -0
  60. package/dist/esm/utils/getOptimizeDeps.mjs +18 -0
  61. package/dist/esm/utils/getOptimizeDeps.native.js +150 -0
  62. package/dist/esm/utils/getOptimizeDeps.native.js.map +6 -0
  63. package/dist/esm/utils/getVitePath.js +3 -1
  64. package/dist/esm/utils/getVitePath.js.map +1 -1
  65. package/dist/esm/utils/getVitePath.mjs +1 -1
  66. package/dist/esm/utils/getVitePath.native.js +1 -1
  67. package/dist/esm/utils/getVitePath.native.js.map +1 -1
  68. package/dist/esm/utils/readVXRNConfig.js +5 -3
  69. package/dist/esm/utils/readVXRNConfig.js.map +1 -1
  70. package/dist/esm/utils/readVXRNConfig.mjs +5 -1
  71. package/dist/esm/utils/readVXRNConfig.native.js +5 -1
  72. package/dist/esm/utils/readVXRNConfig.native.js.map +2 -2
  73. package/package.json +10 -10
  74. package/src/cli.ts +12 -2
  75. package/src/constants.ts +0 -77
  76. package/src/exports/build.ts +96 -100
  77. package/src/exports/dev.ts +49 -39
  78. package/src/utils/getHtml.ts +21 -6
  79. package/src/utils/getOptimizeDeps.ts +122 -0
  80. package/src/utils/getVitePath.ts +3 -1
  81. package/src/utils/readVXRNConfig.ts +6 -4
  82. package/types/constants.d.ts +0 -10
  83. package/types/exports/build.d.ts +6 -1
  84. package/types/utils/getHtml.d.ts +2 -1
  85. package/types/utils/getOptimizeDeps.d.ts +13 -0
@@ -177,7 +177,11 @@ function _readVXRNConfig() {
177
177
  resolveOptionalAsyncFunction((_userConfig_default1 = userConfig1 == null ? void 0 : userConfig1.default) !== null && _userConfig_default1 !== void 0 ? _userConfig_default1 : {})
178
178
  ];
179
179
  case 6:
180
- throw err = _state.sent(), console.info(" [vxrn] Error loading config via ESM, attempting CJS, set VXRN_CJS=1 to run in cjs mode"), err;
180
+ throw err = _state.sent(), console.info(` [vxrn] Error loading config via ESM:
181
+
182
+ `.concat(err.stack, `
183
+
184
+ To load as CommonJS, set VXRN_CJS=1`)), err;
181
185
  case 7:
182
186
  return [
183
187
  2
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/utils/Users/n8/vxrn/packages/vxrn/src/utils/readVXRNConfig.ts"],
4
- "mappings": "AAAA,OAAOA,aAAa;AAEpB,SAASC,oBAAoB;AAC7B,OAAOC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEjB,SAAsBC,iBAAAA;SAAAA,gBAAAA,MAAAA,MAAAA,SAAAA;;SAAAA,kBAAAA;AAAAA,2BAAf,oBAAA,WAAA;QAMGC,aAGAC,YAC8BA,qBAM9BC,MAKAD,aAK8BA,sBAC7BE;;;;AA1BH,iBAAA;;YAAMP,QAAQQ,WAAW,gBAAA;;;AAA/B,cAAI,CAAE,OAAA,KAAA;AACJ,mBAAA;;cAAO,CAAC;;AAGV,cAAIC,QAAQC,IAAIC;AACRP,iCAAcF,KAAKO,QAAQG,IAAG,GAAI;cACtCC,YAAY;YACd,CAAA,GACMR,aAAaD,YAAY,kBAAA,GAC/B;;cAAOU,8BAA6BT,sBAAAA,cAAAA,OAAAA,SAAAA,WAAYU,aAAO,QAAnBV,wBAAAA,SAAAA,sBAAuB,CAAC,CAAA;;;;;;;;;cAM/C;;YAAMJ,aAAa;cAC9Be,UAAU;cACVC,SAAS;YACX,CAAA;;;AAHMX,wBAAO,OAAA,KAAA,GAKM;;YAAMA,KAAKY,cAAc,oBAAoB;cAC9DC,eAAe;YACjB,CAAA;;;AAFMd,+BAAa,OAAA,KAAA,GAInB;;YAAMC,KAAKc,MAAK;;;AAAhB,wBAAA,KAAA,GACA;;YAAON,8BAA6BT,uBAAAA,eAAAA,OAAAA,SAAAA,YAAYU,aAAO,QAAnBV,yBAAAA,SAAAA,uBAAuB,CAAC,CAAA;;;AACrDE,sBAAAA,OAAAA,KAAAA,GACPc,QAAQC,KACL,yFAAA,GAEGf;;;;;;;EAEV,CAAA,GAjCsBJ,gBAAAA,MAAAA,MAAAA,SAAAA;;SAmCPW,6BAA6BS,OAAU;SAAvCT,8BAAAA,MAAAA,MAAAA,SAAAA;;SAAAA,gCAAAA;AAAAA,yCAAf,oBAAA,SAA4CS,OAAU;;;;iBAChD,OAAOA,SAAU,eACnBA,QAAQA,MAAAA,IAED,YAALA,OAAiBC,OAAAA,IACX;;YAAMD;cADZA;;;;;AACFA,kBAAQ,OAAA,KAAA;;AAEV,iBAAA;;YAAOA;;;;EACT,CAAA,GAReT,8BAAAA,MAAAA,MAAAA,SAAAA;;",
5
- "names": ["FSExtra", "createServer", "jiti", "readVXRNConfig", "requireFile", "userConfig", "vite", "err", "pathExists", "process", "env", "VXRN_CJS", "cwd", "esmResolve", "resolveOptionalAsyncFunction", "default", "logLevel", "appType", "ssrLoadModule", "fixStacktrace", "close", "console", "info", "value", "Promise"]
4
+ "mappings": "AAAA,OAAOA,aAAa;AAEpB,SAASC,oBAAoB;AAC7B,OAAOC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEjB,SAAsBC,iBAAAA;SAAAA,gBAAAA,MAAAA,MAAAA,SAAAA;;SAAAA,kBAAAA;AAAAA,2BAAf,oBAAA,WAAA;QAMGC,aAGAC,YAC8BA,qBAM9BC,MAKAD,aAK8BA,sBAC7BE;;;;AA1BH,iBAAA;;YAAMP,QAAQQ,WAAW,gBAAA;;;AAA/B,cAAI,CAAE,OAAA,KAAA;AACJ,mBAAA;;cAAO,CAAC;;AAGV,cAAIC,QAAQC,IAAIC;AACRP,iCAAcF,KAAKO,QAAQG,IAAG,GAAI;cACtCC,YAAY;YACd,CAAA,GACMR,aAAaD,YAAY,kBAAA,GAC/B;;cAAOU,8BAA6BT,sBAAAA,cAAAA,OAAAA,SAAAA,WAAYU,aAAO,QAAnBV,wBAAAA,SAAAA,sBAAuB,CAAC,CAAA;;;;;;;;;cAM/C;;YAAMJ,aAAa;cAC9Be,UAAU;cACVC,SAAS;YACX,CAAA;;;AAHMX,wBAAO,OAAA,KAAA,GAKM;;YAAMA,KAAKY,cAAc,oBAAoB;cAC9DC,eAAe;YACjB,CAAA;;;AAFMd,+BAAa,OAAA,KAAA,GAInB;;YAAMC,KAAKc,MAAK;;;AAAhB,wBAAA,KAAA,GACA;;YAAON,8BAA6BT,uBAAAA,eAAAA,OAAAA,SAAAA,YAAYU,aAAO,QAAnBV,yBAAAA,SAAAA,uBAAuB,CAAC,CAAA;;;AACrDE,sBAAAA,OAAAA,KAAAA,GACPc,QAAQC,KAAM;;EAEN,OAAVf,IAAIgB,OAAM;;qCAAA,CAAA,GAGFhB;;;;;;;EAEV,CAAA,GAnCsBJ,gBAAAA,MAAAA,MAAAA,SAAAA;;SAqCPW,6BAA6BU,OAAU;SAAvCV,8BAAAA,MAAAA,MAAAA,SAAAA;;SAAAA,gCAAAA;AAAAA,yCAAf,oBAAA,SAA4CU,OAAU;;;;iBAChD,OAAOA,SAAU,eACnBA,QAAQA,MAAAA,IAED,YAALA,OAAiBC,OAAAA,IACX;;YAAMD;cADZA;;;;;AACFA,kBAAQ,OAAA,KAAA;;AAEV,iBAAA;;YAAOA;;;;EACT,CAAA,GAReV,8BAAAA,MAAAA,MAAAA,SAAAA;;",
5
+ "names": ["FSExtra", "createServer", "jiti", "readVXRNConfig", "requireFile", "userConfig", "vite", "err", "pathExists", "process", "env", "VXRN_CJS", "cwd", "esmResolve", "resolveOptionalAsyncFunction", "default", "logLevel", "appType", "ssrLoadModule", "fixStacktrace", "close", "console", "info", "stack", "value", "Promise"]
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vxrn",
3
- "version": "0.1.46",
3
+ "version": "0.1.48",
4
4
  "source": "src/index.ts",
5
5
  "types": "./types/index.d.ts",
6
6
  "type": "module",
@@ -29,13 +29,13 @@
29
29
  "@babel/code-frame": "^7.21.4",
30
30
  "@vitejs/plugin-react": "^4.2.1",
31
31
  "@vitejs/plugin-react-swc": "^3.6.0",
32
- "@vxrn/react-native-prebuilt": "0.1.46",
33
- "@vxrn/router": "0.1.46",
34
- "@vxrn/safe-area": "0.1.46",
35
- "@vxrn/vite-flow": "0.1.46",
36
- "@vxrn/vite-native-client": "0.1.46",
37
- "@vxrn/vite-native-hmr": "0.1.46",
38
- "@vxrn/vite-native-swc": "0.1.46",
32
+ "@vxrn/react-native-prebuilt": "0.1.48",
33
+ "@vxrn/router": "0.1.48",
34
+ "@vxrn/safe-area": "0.1.48",
35
+ "@vxrn/vite-flow": "0.1.48",
36
+ "@vxrn/vite-native-client": "0.1.48",
37
+ "@vxrn/vite-native-hmr": "0.1.48",
38
+ "@vxrn/vite-native-swc": "0.1.48",
39
39
  "citty": "^0.1.6",
40
40
  "crossws": "^0.2.4",
41
41
  "es-module-lexer": "^1.3.0",
@@ -47,7 +47,7 @@
47
47
  "get-port-please": "^3.1.2",
48
48
  "glob": "^10.3.12",
49
49
  "h3": "^1.11.1",
50
- "h3-proxy": "^1.12.0",
50
+ "h3-proxy": "^1.13.0",
51
51
  "import-meta-resolve": "^4.0.0",
52
52
  "jiti": "^1.21.0",
53
53
  "metro-inspector-proxy": "^0.71.0",
@@ -60,7 +60,7 @@
60
60
  "sirv": "^2.0.4",
61
61
  "source-map": "^0.7.3",
62
62
  "url": "^0.11.0",
63
- "vite": "^5.2.10",
63
+ "vite": "^5.2.11",
64
64
  "ws": "^8.7.0"
65
65
  },
66
66
  "devDependencies": {
package/src/cli.ts CHANGED
@@ -59,7 +59,17 @@ const build = defineCommand({
59
59
  version: '0.0.0',
60
60
  description: 'Build your app',
61
61
  },
62
- args: {},
62
+ args: {
63
+ step: {
64
+ type: 'string',
65
+ required: false,
66
+ },
67
+ // always wanted to be able to just generate one-off pages
68
+ // page: {
69
+ // type: 'string',
70
+ // required: false,
71
+ // },
72
+ },
63
73
  async run({ args }) {
64
74
  const userConfig = await readVXRNConfig()
65
75
  const { build } = await import(
@@ -71,7 +81,7 @@ const build = defineCommand({
71
81
  console.error(err?.message || err)
72
82
  })
73
83
 
74
- const results = await build(userConfig)
84
+ const results = await build(userConfig, args)
75
85
 
76
86
  if (process.env.DEBUG) {
77
87
  console.info('results', results)
package/src/constants.ts CHANGED
@@ -1,10 +1,5 @@
1
- import type { UserConfig } from 'vite'
2
-
3
1
  export const DEFAULT_PORT = 8081
4
2
 
5
- // TODO move to router
6
- export const EMPTY_LOADER_STRING = `function loader() {/* ✷✷✷ */};`
7
-
8
3
  export const nativeExtensions = [
9
4
  '.native.tsx',
10
5
  '.native.jsx',
@@ -30,75 +25,3 @@ export const webExtensions = [
30
25
  '.css',
31
26
  '.json',
32
27
  ]
33
-
34
- const needsInterop = [
35
- 'react',
36
- 'react/jsx-runtime',
37
- 'react/jsx-dev-runtime',
38
- 'react-native-web-internals',
39
- 'react-dom',
40
- 'react-native-web',
41
- 'react-dom/server',
42
- 'react-dom/client',
43
-
44
- 'url-parse',
45
- '@vxrn/safe-area',
46
- 'query-string',
47
- 'escape-string-regexp',
48
- 'use-latest-callback',
49
- 'react-is',
50
- 'fast-deep-equal',
51
- '@react-navigation/native',
52
- 'tamagui/linear-gradient',
53
- 'react-native-svg',
54
- '@supabase/auth-helpers-react',
55
- 'parse-numeric-range',
56
- 'use-sync-external-store',
57
- 'use-sync-external-store/shim',
58
- 'swr',
59
- ]
60
-
61
- export const depsToOptimize = [
62
- ...needsInterop,
63
- '@react-native/normalize-color',
64
- '@vxrn/router',
65
- 'expo-modules-core',
66
- 'expo-status-bar',
67
- 'react-native-web',
68
- 'react-native-web-lite',
69
- 'react-native',
70
- '@tamagui/alert-dialog',
71
- '@tamagui/avatar',
72
- '@tamagui/core',
73
- '@tamagui/dialog',
74
- '@tamagui/group',
75
- '@tamagui/helpers-icon',
76
- '@tamagui/helpers',
77
- '@tamagui/image',
78
- '@tamagui/lucide-icons',
79
- '@tamagui/popover',
80
- '@tamagui/popper',
81
- '@tamagui/scroll-view',
82
- '@tamagui/select',
83
- '@tamagui/sheet',
84
- '@tamagui/switch',
85
- '@tamagui/tabs',
86
- '@tamagui/toast',
87
- '@tamagui/toggle-group',
88
- '@tamagui/tooltip',
89
- '@tamagui/use-window-dimensions',
90
- '@tamagui/web',
91
- 'tamagui',
92
- 'react-native-web',
93
- 'react-native-web-lite',
94
- 'reforest',
95
- ]
96
-
97
- export const optimizeDeps = {
98
- include: depsToOptimize,
99
- needsInterop,
100
- exclude: ['util'],
101
- esbuildOptions: {
102
- resolveExtensions: webExtensions,
103
- },
104
- } satisfies UserConfig['optimizeDeps']
@@ -2,16 +2,17 @@ import { build as esbuild } from 'esbuild'
2
2
  import { resolve as importMetaResolve } from 'import-meta-resolve'
3
3
  import fs from 'node:fs'
4
4
  import { tmpdir } from 'node:os'
5
- import path, { dirname, resolve } from 'node:path'
5
+ import path from 'node:path'
6
6
  import { mergeConfig, build as viteBuild, type UserConfig } from 'vite'
7
-
8
7
  import FSExtra from 'fs-extra'
9
8
  import type { OutputAsset, OutputChunk, RollupOutput } from 'rollup'
10
9
  import type { VXRNConfig } from '../types'
11
10
  import { getBaseViteConfig } from '../utils/getBaseViteConfig'
12
11
  import { getHtml } from '../utils/getHtml'
12
+ import { getOptimizeDeps } from '../utils/getOptimizeDeps'
13
13
  import { getOptionsFilled, type VXRNConfigFilled } from '../utils/getOptionsFilled'
14
- import { optimizeDeps } from '../constants'
14
+
15
+ Error.stackTraceLimit = Infinity
15
16
 
16
17
  export const resolveFile = (path: string) => {
17
18
  try {
@@ -23,6 +24,8 @@ export const resolveFile = (path: string) => {
23
24
 
24
25
  const { ensureDir, existsSync, readFile, pathExists } = FSExtra
25
26
 
27
+ type BuildOptions = { step?: string; page?: string }
28
+
26
29
  // web only for now
27
30
 
28
31
  // TODO:
@@ -30,12 +33,14 @@ const { ensureDir, existsSync, readFile, pathExists } = FSExtra
30
33
  // - move router stuff into router package
31
34
  // - generateStaticPages becomes a vite 'post' postbuild callback in router plugin
32
35
 
33
- export const build = async (optionsIn: VXRNConfig) => {
36
+ export const build = async (optionsIn: VXRNConfig, buildOptions: BuildOptions = {}) => {
34
37
  const options = await getOptionsFilled(optionsIn)
35
38
 
36
39
  // TODO?
37
40
  process.env.NODE_ENV = 'production'
38
41
 
42
+ const { optimizeDeps } = getOptimizeDeps('build')
43
+
39
44
  let webBuildConfig = mergeConfig(
40
45
  getBaseViteConfig({
41
46
  mode: 'production',
@@ -51,54 +56,29 @@ export const build = async (optionsIn: VXRNConfig) => {
51
56
  webBuildConfig = mergeConfig(webBuildConfig, options.webConfig) as any
52
57
  }
53
58
 
54
- console.info(`build client`)
55
- await viteBuild(
56
- mergeConfig(webBuildConfig, {
57
- build: {
58
- ssrManifest: true,
59
- outDir: 'dist/client',
60
- },
61
- } satisfies UserConfig)
62
- )
59
+ if (buildOptions.step !== 'generate') {
60
+ console.info(`build client`)
61
+ await viteBuild(
62
+ mergeConfig(webBuildConfig, {
63
+ build: {
64
+ ssrManifest: true,
65
+ outDir: 'dist/client',
66
+ },
67
+ } satisfies UserConfig)
68
+ )
69
+ }
63
70
 
64
71
  console.info(`build server`)
65
72
  const { output } = (await viteBuild(
66
73
  mergeConfig(webBuildConfig, {
67
- plugins: [
68
- {
69
- name: 'test',
70
- enforce: 'pre',
71
- async resolveId(id, importer = '') {
72
- if (id[0] === '.') {
73
- const absolutePath = resolve(dirname(importer), id)
74
- const webPath = absolutePath.replace(/(.m?js)/, '') + '.web.js'
75
- if (webPath === id) return
76
- try {
77
- const directoryPath = absolutePath + '/index.web.js'
78
- if (await pathExists(directoryPath)) {
79
- console.info(`temp fix found ${directoryPath}`)
80
- return directoryPath
81
- }
82
- if (await pathExists(webPath)) {
83
- console.info(`temp fix found ${webPath}`)
84
- return webPath
85
- }
86
- } catch (err) {
87
- console.warn(`error probably fine`, err)
88
- }
89
- }
90
- },
91
- },
92
- ],
93
-
94
- optimizeDeps: {
95
- esbuildOptions: {
96
- format: 'cjs',
97
- },
98
- },
74
+ // optimizeDeps: {
75
+ // esbuildOptions: {
76
+ // format: 'cjs',
77
+ // },
78
+ // },
99
79
 
100
80
  ssr: {
101
- noExternal: true,
81
+ noExternal: optimizeDeps.include,
102
82
  optimizeDeps,
103
83
  },
104
84
 
@@ -111,7 +91,7 @@ export const build = async (optionsIn: VXRNConfig) => {
111
91
  external: [],
112
92
  },
113
93
  },
114
- })
94
+ } satisfies UserConfig)
115
95
  )) as RollupOutput
116
96
 
117
97
  console.info(`generating static pages`)
@@ -137,58 +117,70 @@ async function generateStaticPages(
137
117
 
138
118
  const assets: OutputAsset[] = []
139
119
 
140
- const allRoutes = (
141
- await Promise.all(
142
- serverOutput.flatMap(async (output) => {
143
- if (output.type === 'asset') {
144
- assets.push(output)
145
- return []
146
- }
147
-
148
- const id = output.facadeModuleId || ''
149
- const file = path.basename(id)
150
- const name = file.replace(/\.[^/.]+$/, '')
151
-
152
- if (!id || file[0] === '_' || file.includes('entry-server')) {
153
- return []
154
- }
155
- if (id.includes('+api')) {
156
- return []
157
- }
158
-
159
- const endpointPath = path.join(options.root, 'dist/server', output.fileName)
160
- const exported = await import(endpointPath)
161
-
162
- const paramsList = ((await exported.generateStaticParams?.()) ?? [{}]) as Object[]
163
-
164
- return await Promise.all(
165
- paramsList.map(async (params) => {
166
- const path = getUrl(params)
167
- const loaderData = (await exported.loader?.({ path: getUrl(params), params })) ?? {}
168
- return { path, loaderData }
169
- })
170
- )
171
-
172
- function getUrl(_params = {}) {
173
- return name === 'index'
174
- ? '/'
175
- : `/${name
176
- .split('/')
177
- .map((part) => {
178
- if (part[0] === '[') {
179
- const found = _params[part.slice(1, part.length - 1)]
180
- if (!found) {
181
- console.warn('not found', { _params, part })
182
- }
183
- return found
184
- }
185
- return part
186
- })
187
- .join('/')}`
188
- }
189
- })
190
- )
191
- ).flat()
120
+ const allRoutes: {
121
+ path: string
122
+ params: Object
123
+ loaderData: any
124
+ }[] = []
125
+
126
+ for (const output of serverOutput) {
127
+ if (output.type === 'asset') {
128
+ assets.push(output)
129
+ continue
130
+ }
131
+
132
+ const id = output.facadeModuleId || ''
133
+ const file = path.basename(id)
134
+ const name = file.replace(/\.[^/.]+$/, '')
135
+
136
+ if (!id || file[0] === '_' || file.includes('entry-server')) {
137
+ continue
138
+ }
139
+ if (id.includes('+api')) {
140
+ continue
141
+ }
142
+
143
+ const endpointPath = path.join(options.root, 'dist/server', output.fileName)
144
+
145
+ const exported = await import(endpointPath)
146
+
147
+ const paramsList = ((await exported.generateStaticParams?.()) ?? [{}]) as Object[]
148
+
149
+ for (const params of paramsList) {
150
+ const path = getUrl(params)
151
+ const loaderData = (await exported.loader?.({ path, params })) ?? {}
152
+ allRoutes.push({ path, params, loaderData })
153
+ }
154
+
155
+ function getUrl(_params = {}) {
156
+ if (name === 'index') {
157
+ return '/'
158
+ }
159
+ if (name.startsWith('[...')) {
160
+ const part = name.replace('[...', '').replace(']', '')
161
+ return `/${_params[part]}`
162
+ }
163
+ return `/${name
164
+ .split('/')
165
+ .map((part) => {
166
+ if (part[0] === '[') {
167
+ const found = _params[part.slice(1, part.length - 1)]
168
+ if (!found) {
169
+ console.warn('not found', { _params, part })
170
+ }
171
+ return found
172
+ }
173
+ return part
174
+ })
175
+ .join('/')}`
176
+ }
177
+ }
178
+
179
+ // can build them in parallel
180
+ // const allRoutes = (
181
+ // await Promise.all(
182
+ // )
183
+ // ).flat()
192
184
 
193
185
  // for now just inline
194
186
  const cssStringRaw = assets
@@ -211,7 +203,10 @@ async function generateStaticPages(
211
203
  const cssString = await FSExtra.readFile(tmpCssFile, 'utf-8')
212
204
 
213
205
  // pre-render each route...
214
- for (const { path, loaderData } of allRoutes) {
206
+ for (const { path, loaderData, params } of allRoutes) {
207
+ const loaderProps = { params }
208
+ globalThis['__vxrnLoaderProps__'] = loaderProps
209
+ console.info(`render`, path)
215
210
  const { appHtml, headHtml } = await render({ path })
216
211
  const slashFileName = `${path === '/' ? '/index' : path}.html`
217
212
  const clientHtmlPath = toAbsolute(`dist/client${slashFileName}`)
@@ -221,6 +216,7 @@ async function generateStaticPages(
221
216
  appHtml,
222
217
  headHtml,
223
218
  loaderData,
219
+ loaderProps,
224
220
  css: cssString,
225
221
  })
226
222
  const filePath = toAbsolute(`dist/static${slashFileName}`)
@@ -13,7 +13,6 @@ import { createServer as nodeCreateServer } from 'node:http'
13
13
  import { dirname, join, relative, resolve } from 'node:path'
14
14
  import readline from 'node:readline'
15
15
  import { WebSocket } from 'ws'
16
-
17
16
  import * as babel from '@babel/core'
18
17
  import { buildReact, buildReactJSX, buildReactNative } from '@vxrn/react-native-prebuilt'
19
18
  import viteReactPlugin, { swcTransform, transformForBuild } from '@vxrn/vite-native-swc'
@@ -33,7 +32,7 @@ import {
33
32
  import createViteFlow from '@vxrn/vite-flow'
34
33
  import type { Peer } from 'crossws'
35
34
  import { resolve as importMetaResolve } from 'import-meta-resolve'
36
- import { depsToOptimize, nativeExtensions, optimizeDeps } from '../constants'
35
+ import { nativeExtensions } from '../constants'
37
36
  import { clientInjectionsPlugin } from '../plugins/clientInjectPlugin'
38
37
  import { reactNativeCommonJsPlugin } from '../plugins/reactNativeCommonJsPlugin'
39
38
  import type { VXRNConfig } from '../types'
@@ -41,12 +40,15 @@ import { getBaseViteConfig } from '../utils/getBaseViteConfig'
41
40
  import { getOptionsFilled, type VXRNConfigFilled } from '../utils/getOptionsFilled'
42
41
  import { getVitePath } from '../utils/getVitePath'
43
42
  import { checkPatches } from '../utils/patches'
43
+ import { getOptimizeDeps } from '../utils/getOptimizeDeps'
44
44
 
45
45
  // sorry for the mess, exploring before abstracting
46
46
 
47
47
  let isBuildingNativeBundle: Promise<string> | null = null
48
48
  const hotUpdateCache = new Map<string, string>()
49
49
 
50
+ let connectedNativeClients = 0
51
+
50
52
  export const resolveFile = (path: string) => {
51
53
  try {
52
54
  return importMetaResolve(path, import.meta.url).replace('file://', '')
@@ -176,7 +178,6 @@ export const dev = async ({ clean, ...rest }: VXRNConfig & { clean?: boolean })
176
178
  const { handleUpgrade } = wsAdapter(app.websocket)
177
179
 
178
180
  // vite hmr two way bridge:
179
- // vite hmr:
180
181
  app.use(
181
182
  '/__vxrnhmr',
182
183
  defineEventHandler({
@@ -217,6 +218,7 @@ export const dev = async ({ clean, ...rest }: VXRNConfig & { clean?: boolean })
217
218
  websocket: {
218
219
  open(peer) {
219
220
  console.debug('[hmr] open', peer)
221
+ connectedNativeClients++
220
222
  },
221
223
 
222
224
  message(peer, message) {
@@ -228,6 +230,7 @@ export const dev = async ({ clean, ...rest }: VXRNConfig & { clean?: boolean })
228
230
 
229
231
  close(peer, event) {
230
232
  console.info('[hmr] close', peer, event)
233
+ connectedNativeClients--
231
234
  },
232
235
 
233
236
  error(peer, error) {
@@ -291,11 +294,14 @@ export const dev = async ({ clean, ...rest }: VXRNConfig & { clean?: boolean })
291
294
  )
292
295
 
293
296
  // Define proxy event handler
294
- const proxyEventHandler = createProxyEventHandler({
295
- target: `http://127.0.0.1:${vitePort}`,
296
- enableLogger: !!process.env.DEBUG,
297
- })
298
- app.use(eventHandler(proxyEventHandler))
297
+ app.use(
298
+ eventHandler(
299
+ createProxyEventHandler({
300
+ target: `http://127.0.0.1:${vitePort}`,
301
+ enableLogger: process.env.DEBUG?.startsWith('vxrn'),
302
+ })
303
+ )
304
+ )
299
305
 
300
306
  const server = nodeCreateServer(toNodeListener(app))
301
307
 
@@ -310,21 +316,23 @@ export const dev = async ({ clean, ...rest }: VXRNConfig & { clean?: boolean })
310
316
 
311
317
  console.info(`Server running on http://localhost:${port}`)
312
318
 
313
- // bridge socket between vite
314
- if (vitePort) {
315
- socket = new WebSocket(`ws://localhost:${vitePort}/__vxrnhmr`, 'vite-hmr')
319
+ server.once('listening', () => {
320
+ // bridge socket between vite
321
+ if (vitePort) {
322
+ socket = new WebSocket(`ws://127.0.0.1:${vitePort}/__vxrnhmr`, 'vite-hmr')
316
323
 
317
- socket.on('message', (msg) => {
318
- const message = msg.toString()
319
- for (const listener of [...clients]) {
320
- listener.send(message)
321
- }
322
- })
324
+ socket.on('message', (msg) => {
325
+ const message = msg.toString()
326
+ for (const listener of [...clients]) {
327
+ listener.send(message)
328
+ }
329
+ })
323
330
 
324
- socket.on('error', (err) => {
325
- console.info('error bridging socket to vite', err)
326
- })
327
- }
331
+ socket.on('error', (err) => {
332
+ console.info('error bridging socket to vite', err)
333
+ })
334
+ }
335
+ })
328
336
 
329
337
  return {
330
338
  closePromise: new Promise((res) => viteServer.httpServer?.on('close', res)),
@@ -339,6 +347,7 @@ export const dev = async ({ clean, ...rest }: VXRNConfig & { clean?: boolean })
339
347
 
340
348
  async function getReactNativeBundle(options: VXRNConfigFilled, viteRNClientPlugin: any) {
341
349
  const { root, port, cacheDir } = options
350
+ const { depsToOptimize } = getOptimizeDeps('build')
342
351
 
343
352
  if (process.env.LOAD_TMP_BUNDLE) {
344
353
  // for easier quick testing things:
@@ -765,23 +774,9 @@ function isWithin(outer: string, inner: string) {
765
774
  // used for normalizing hot reloads
766
775
  let entryRoot = ''
767
776
 
768
- // function watchNodeModules(modules: string[]): PluginOption {
769
- // return {
770
- // name: 'watch-node-modules',
771
- // config() {
772
- // return {
773
- // server: {
774
- // watch: {
775
- // ignored: modules.map((m) => `!**/packages/${m}/**`),
776
- // },
777
- // },
778
- // }
779
- // },
780
- // }
781
- // }
782
-
783
777
  async function getViteServerConfig(config: VXRNConfigFilled) {
784
- const { root, host, webConfig, cacheDir } = config
778
+ const { root, host, webConfig } = config
779
+ const { optimizeDeps } = getOptimizeDeps('serve')
785
780
 
786
781
  let serverConfig: UserConfig = mergeConfig(
787
782
  getBaseViteConfig({
@@ -792,7 +787,6 @@ async function getViteServerConfig(config: VXRNConfigFilled) {
792
787
  clearScreen: false,
793
788
  plugins: [
794
789
  reactNativeHMRPlugin(config),
795
- // watchNodeModules(['@tamagui/popper'])
796
790
 
797
791
  {
798
792
  name: 'process-env-ssr',
@@ -804,11 +798,24 @@ async function getViteServerConfig(config: VXRNConfigFilled) {
804
798
  },
805
799
  },
806
800
  ],
801
+
807
802
  optimizeDeps,
803
+
808
804
  ssr: {
809
- noExternal: true,
805
+ // noExternal true causes many incompat issues because we need things on disk to work
806
+ // eg generally node uses .cjs extensions to "switch" back to cjs mode on import, but once bundled
807
+ // this wont happen, breaking many things
808
+ // but we need react related things always so they dont duplicate
809
+ noExternal: [
810
+ ...optimizeDeps.include,
811
+ 'react',
812
+ 'react-dom',
813
+ 'react-dom/server',
814
+ 'react-dom/client',
815
+ ],
810
816
  optimizeDeps,
811
817
  },
818
+
812
819
  server: {
813
820
  hmr: {
814
821
  path: '/__vxrnhmr',
@@ -850,6 +857,9 @@ function reactNativeHMRPlugin({ root }: VXRNConfigFilled) {
850
857
  if (!isWithin(root, file)) {
851
858
  return
852
859
  }
860
+ if (!connectedNativeClients) {
861
+ return
862
+ }
853
863
 
854
864
  const [module] = modules
855
865
  if (!module) return