one 1.21.1 → 1.21.3
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/cli/build.cjs +9 -8
- package/dist/cjs/cli/build.native.js +17 -16
- package/dist/cjs/cli/build.native.js.map +1 -1
- package/dist/cjs/cli/buildPage.cjs +1 -1
- package/dist/cjs/cli/buildPage.native.js +1 -1
- package/dist/cjs/cli/buildPage.native.js.map +1 -1
- package/dist/cjs/daemon/ipc.cjs +21 -3
- package/dist/cjs/daemon/ipc.native.js +21 -3
- package/dist/cjs/daemon/ipc.native.js.map +1 -1
- package/dist/cjs/router/getRoutes.cjs +1 -2
- package/dist/cjs/router/getRoutes.native.js +1 -2
- package/dist/cjs/router/getRoutes.native.js.map +1 -1
- package/dist/cjs/router/hmrImport.native.js +13 -2
- package/dist/cjs/router/hmrImport.native.js.map +1 -1
- package/dist/cjs/router/hmrImport.native.test.cjs +52 -0
- package/dist/cjs/router/hmrImport.native.test.native.js +61 -0
- package/dist/cjs/router/hmrImport.native.test.native.js.map +1 -0
- package/dist/cjs/router/matchers.cjs +7 -0
- package/dist/cjs/router/matchers.native.js +8 -0
- package/dist/cjs/router/matchers.native.js.map +1 -1
- package/dist/cjs/router/routeHmr.cjs +32 -0
- package/dist/cjs/router/routeHmr.native.js +57 -0
- package/dist/cjs/router/routeHmr.native.js.map +1 -0
- package/dist/cjs/router/routeHmr.native.test.cjs +83 -0
- package/dist/cjs/router/routeHmr.native.test.native.js +95 -0
- package/dist/cjs/router/routeHmr.native.test.native.js.map +1 -0
- package/dist/cjs/router/useScreens.cjs +2 -0
- package/dist/cjs/router/useScreens.native.js +2 -0
- package/dist/cjs/router/useScreens.native.js.map +1 -1
- package/dist/cjs/router/useViteRoutes.cjs +7 -17
- package/dist/cjs/router/useViteRoutes.native.js +8 -18
- package/dist/cjs/router/useViteRoutes.native.js.map +1 -1
- package/dist/cjs/router/useViteRoutes.test.cjs +42 -0
- package/dist/cjs/router/useViteRoutes.test.native.js +55 -0
- package/dist/cjs/router/useViteRoutes.test.native.js.map +1 -0
- package/dist/cjs/utils/cleanUrl.cjs +12 -2
- package/dist/cjs/utils/cleanUrl.native.js +15 -3
- package/dist/cjs/utils/cleanUrl.native.js.map +1 -1
- package/dist/cjs/utils/cleanUrl.test.cjs +37 -0
- package/dist/cjs/utils/cleanUrl.test.native.js +37 -0
- package/dist/cjs/utils/cleanUrl.test.native.js.map +1 -1
- package/dist/cjs/vite/plugins/virtualEntryPlugin.cjs +37 -2
- package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js +70 -8
- package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/virtualEntryPlugin.test.cjs +58 -0
- package/dist/cjs/vite/plugins/virtualEntryPlugin.test.native.js +62 -0
- package/dist/cjs/vite/plugins/virtualEntryPlugin.test.native.js.map +1 -1
- package/dist/esm/cli/build.mjs +9 -8
- package/dist/esm/cli/build.mjs.map +1 -1
- package/dist/esm/cli/build.native.js +17 -16
- package/dist/esm/cli/build.native.js.map +1 -1
- package/dist/esm/cli/buildPage.mjs +2 -2
- package/dist/esm/cli/buildPage.mjs.map +1 -1
- package/dist/esm/cli/buildPage.native.js +2 -2
- package/dist/esm/cli/buildPage.native.js.map +1 -1
- package/dist/esm/daemon/ipc.mjs +21 -3
- package/dist/esm/daemon/ipc.mjs.map +1 -1
- package/dist/esm/daemon/ipc.native.js +21 -3
- package/dist/esm/daemon/ipc.native.js.map +1 -1
- package/dist/esm/getURL.native.test.mjs +1 -1
- package/dist/esm/router/getRoutes.mjs +2 -3
- package/dist/esm/router/getRoutes.mjs.map +1 -1
- package/dist/esm/router/getRoutes.native.js +2 -3
- package/dist/esm/router/getRoutes.native.js.map +1 -1
- package/dist/esm/router/hmrImport.native.js +13 -2
- package/dist/esm/router/hmrImport.native.js.map +1 -1
- package/dist/esm/router/hmrImport.native.test.js +51 -0
- package/dist/esm/router/hmrImport.native.test.js.map +6 -0
- package/dist/esm/router/hmrImport.native.test.mjs +53 -0
- package/dist/esm/router/hmrImport.native.test.mjs.map +1 -0
- package/dist/esm/router/hmrImport.native.test.native.js +59 -0
- package/dist/esm/router/hmrImport.native.test.native.js.map +1 -0
- package/dist/esm/router/matchers.mjs +7 -1
- package/dist/esm/router/matchers.mjs.map +1 -1
- package/dist/esm/router/matchers.native.js +8 -1
- package/dist/esm/router/matchers.native.js.map +1 -1
- package/dist/esm/router/routeHmr.mjs +6 -0
- package/dist/esm/router/routeHmr.mjs.map +1 -0
- package/dist/esm/router/routeHmr.native.js +28 -0
- package/dist/esm/router/routeHmr.native.js.map +1 -0
- package/dist/esm/router/routeHmr.native.test.js +58 -0
- package/dist/esm/router/routeHmr.native.test.js.map +6 -0
- package/dist/esm/router/routeHmr.native.test.mjs +60 -0
- package/dist/esm/router/routeHmr.native.test.mjs.map +1 -0
- package/dist/esm/router/routeHmr.native.test.native.js +69 -0
- package/dist/esm/router/routeHmr.native.test.native.js.map +1 -0
- package/dist/esm/router/useScreens.mjs +1 -0
- package/dist/esm/router/useScreens.mjs.map +1 -1
- package/dist/esm/router/useScreens.native.js +2 -0
- package/dist/esm/router/useScreens.native.js.map +1 -1
- package/dist/esm/router/useViteRoutes.mjs +7 -17
- package/dist/esm/router/useViteRoutes.mjs.map +1 -1
- package/dist/esm/router/useViteRoutes.native.js +8 -18
- package/dist/esm/router/useViteRoutes.native.js.map +1 -1
- package/dist/esm/router/useViteRoutes.test.mjs +43 -0
- package/dist/esm/router/useViteRoutes.test.mjs.map +1 -0
- package/dist/esm/router/useViteRoutes.test.native.js +53 -0
- package/dist/esm/router/useViteRoutes.test.native.js.map +1 -0
- package/dist/esm/utils/cleanUrl.mjs +11 -3
- package/dist/esm/utils/cleanUrl.mjs.map +1 -1
- package/dist/esm/utils/cleanUrl.native.js +14 -4
- package/dist/esm/utils/cleanUrl.native.js.map +1 -1
- package/dist/esm/utils/cleanUrl.test.mjs +38 -1
- package/dist/esm/utils/cleanUrl.test.mjs.map +1 -1
- package/dist/esm/utils/cleanUrl.test.native.js +38 -1
- package/dist/esm/utils/cleanUrl.test.native.js.map +1 -1
- package/dist/esm/vite/plugins/virtualEntryPlugin.mjs +26 -2
- package/dist/esm/vite/plugins/virtualEntryPlugin.mjs.map +1 -1
- package/dist/esm/vite/plugins/virtualEntryPlugin.native.js +59 -8
- package/dist/esm/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
- package/dist/esm/vite/plugins/virtualEntryPlugin.test.mjs +58 -0
- package/dist/esm/vite/plugins/virtualEntryPlugin.test.mjs.map +1 -1
- package/dist/esm/vite/plugins/virtualEntryPlugin.test.native.js +62 -0
- package/dist/esm/vite/plugins/virtualEntryPlugin.test.native.js.map +1 -1
- package/package.json +9 -9
- package/src/cli/build.ts +18 -11
- package/src/cli/buildPage.ts +12 -2
- package/src/daemon/ipc.ts +46 -4
- package/src/router/getRoutes.ts +2 -3
- package/src/router/hmrImport.native.test.ts +55 -0
- package/src/router/hmrImport.native.ts +25 -5
- package/src/router/matchers.ts +10 -0
- package/src/router/routeHmr.native.test.ts +71 -0
- package/src/router/routeHmr.native.ts +37 -0
- package/src/router/routeHmr.ts +8 -0
- package/src/router/useScreens.tsx +12 -0
- package/src/router/useViteRoutes.test.ts +49 -0
- package/src/router/useViteRoutes.tsx +12 -21
- package/src/utils/cleanUrl.test.ts +63 -1
- package/src/utils/cleanUrl.ts +25 -3
- package/src/vite/plugins/virtualEntryPlugin.test.ts +70 -0
- package/src/vite/plugins/virtualEntryPlugin.ts +48 -2
- package/src/vite/types.ts +9 -0
- package/types/cli/build.d.ts.map +1 -1
- package/types/cli/buildPage.d.ts.map +1 -1
- package/types/daemon/ipc.d.ts.map +1 -1
- package/types/router/getRoutes.d.ts.map +1 -1
- package/types/router/hmrImport.native.d.ts +8 -3
- package/types/router/hmrImport.native.d.ts.map +1 -1
- package/types/router/hmrImport.native.test.d.ts +2 -0
- package/types/router/hmrImport.native.test.d.ts.map +1 -0
- package/types/router/matchers.d.ts +2 -0
- package/types/router/matchers.d.ts.map +1 -1
- package/types/router/routeHmr.d.ts +3 -0
- package/types/router/routeHmr.d.ts.map +1 -0
- package/types/router/routeHmr.native.d.ts +6 -0
- package/types/router/routeHmr.native.d.ts.map +1 -0
- package/types/router/routeHmr.native.test.d.ts +2 -0
- package/types/router/routeHmr.native.test.d.ts.map +1 -0
- package/types/router/useScreens.d.ts.map +1 -1
- package/types/router/useViteRoutes.d.ts.map +1 -1
- package/types/router/useViteRoutes.test.d.ts +2 -0
- package/types/router/useViteRoutes.test.d.ts.map +1 -0
- package/types/utils/cleanUrl.d.ts +2 -0
- package/types/utils/cleanUrl.d.ts.map +1 -1
- package/types/vite/plugins/virtualEntryPlugin.d.ts.map +1 -1
- package/types/vite/types.d.ts +8 -0
- package/types/vite/types.d.ts.map +1 -1
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { resolve } from "path";
|
|
2
2
|
import { pathToFileURL } from "url";
|
|
3
3
|
import { configuration } from "@vxrn/compiler";
|
|
4
|
+
import Glob from "fast-glob";
|
|
4
5
|
import { isNativeEnvironment } from "vxrn";
|
|
5
6
|
import { API_ROUTE_GLOB_PATTERN, ROUTE_GLOB_PATTERN, ROUTE_NATIVE_EXCLUSION_GLOB_PATTERNS, ROUTE_WEB_EXCLUSION_GLOB_PATTERNS } from "../../router/glob-patterns.native.js";
|
|
7
|
+
import { matchDirectoryRenderMode, matchFileRenderMode } from "../../router/matchers.native.js";
|
|
6
8
|
import { resolvedVirtualEntryId, resolvedVirtualEntryIdNative, virtualEntryId, virtualEntryIdNative } from "./virtualEntryConstants.native.js";
|
|
7
9
|
function normalizeSetupFile(setupFile) {
|
|
8
10
|
if (!setupFile) return {};
|
|
@@ -89,14 +91,62 @@ function createVirtualEntry(options) {
|
|
|
89
91
|
},
|
|
90
92
|
load(id) {
|
|
91
93
|
if (id === resolvedVirtualEntryId) {
|
|
92
|
-
var _options_router2;
|
|
94
|
+
var _options_router2, _options_router1;
|
|
93
95
|
var isNative = isNativeEnvironment(this.environment);
|
|
94
96
|
var isSSR = this.environment.name === "ssr";
|
|
97
|
+
var serverSpaRouteFiles = isSSR ? Glob.sync("**/*.{ts,tsx}", {
|
|
98
|
+
cwd: resolve(viteRoot, options.root),
|
|
99
|
+
ignore: [...ROUTE_WEB_EXCLUSION_GLOB_PATTERNS, ...(((_options_router2 = options.router) === null || _options_router2 === void 0 ? void 0 : _options_router2.ignoredRouteFiles) || [])]
|
|
100
|
+
}).map(function (file) {
|
|
101
|
+
return file.replaceAll("\\", "/");
|
|
102
|
+
}).filter(function (file) {
|
|
103
|
+
var parts = file.split("/");
|
|
104
|
+
var filename = parts.at(-1) || "";
|
|
105
|
+
if (filename.startsWith("_layout") || filename.startsWith("_middleware")) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
var fileMode = matchFileRenderMode(filename);
|
|
109
|
+
if (fileMode) return fileMode === "spa";
|
|
110
|
+
var parentMode;
|
|
111
|
+
var _iteratorNormalCompletion = true,
|
|
112
|
+
_didIteratorError = false,
|
|
113
|
+
_iteratorError = void 0;
|
|
114
|
+
try {
|
|
115
|
+
for (var _iterator = parts.slice(0, -1)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
116
|
+
var directory = _step.value;
|
|
117
|
+
var _ref;
|
|
118
|
+
var _matchDirectoryRenderMode;
|
|
119
|
+
parentMode = (_ref = (_matchDirectoryRenderMode = matchDirectoryRenderMode(directory)) === null || _matchDirectoryRenderMode === void 0 ? void 0 : _matchDirectoryRenderMode.renderMode) !== null && _ref !== void 0 ? _ref : parentMode;
|
|
120
|
+
}
|
|
121
|
+
} catch (err) {
|
|
122
|
+
_didIteratorError = true;
|
|
123
|
+
_iteratorError = err;
|
|
124
|
+
} finally {
|
|
125
|
+
try {
|
|
126
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
127
|
+
_iterator.return();
|
|
128
|
+
}
|
|
129
|
+
} finally {
|
|
130
|
+
if (_didIteratorError) {
|
|
131
|
+
throw _iteratorError;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return parentMode === "spa";
|
|
136
|
+
}) : [];
|
|
137
|
+
var serverSpaRouteStubs = serverSpaRouteFiles.map(function (file) {
|
|
138
|
+
return `${JSON.stringify(`/${options.root}/${file}`)}: () => Promise.resolve({})`;
|
|
139
|
+
}).join(",\n ");
|
|
140
|
+
var webRouteGlobs = [...routeGlobs, ...ROUTE_WEB_EXCLUSION_GLOB_PATTERNS.map(function (pattern) {
|
|
141
|
+
return `!${pattern}`;
|
|
142
|
+
}), ...serverSpaRouteFiles.map(function (file) {
|
|
143
|
+
return `!/${options.root}/${file}`;
|
|
144
|
+
})];
|
|
95
145
|
var useStaticImport = isNative || isSSR && isDevMode;
|
|
96
146
|
var setupResult = getSetupFileImport(this.environment.name, setupFiles, useStaticImport, viteRoot);
|
|
97
147
|
var nativewindImport = configuration.enableNativewind ? `import 'react-native-css-interop/dist/runtime/components'` : "";
|
|
98
148
|
var setupPromiseArg = setupResult.promiseVarName ? `getSetupPromise: ${setupResult.promiseVarName},` : "";
|
|
99
|
-
var linkingArg = ((
|
|
149
|
+
var linkingArg = ((_options_router1 = options.router) === null || _options_router1 === void 0 ? void 0 : _options_router1.linking) ? `linking: ${JSON.stringify(options.router.linking)},` : "";
|
|
100
150
|
return `
|
|
101
151
|
${setupResult.promiseDeclaration}
|
|
102
152
|
${nativewindImport}
|
|
@@ -115,12 +165,13 @@ if (typeof window !== 'undefined') {
|
|
|
115
165
|
window.__oneRegisterPreloadedRoute = registerPreloadedRoute
|
|
116
166
|
}
|
|
117
167
|
|
|
118
|
-
// globbing ${JSON.stringify(
|
|
168
|
+
// globbing ${JSON.stringify(webRouteGlobs)}
|
|
119
169
|
export default createApp({
|
|
120
170
|
${setupPromiseArg}
|
|
121
|
-
routes:
|
|
122
|
-
|
|
123
|
-
|
|
171
|
+
routes: {
|
|
172
|
+
...import.meta.glob(${JSON.stringify(webRouteGlobs)}, { exhaustive: true }),
|
|
173
|
+
${serverSpaRouteStubs}
|
|
174
|
+
},
|
|
124
175
|
routerRoot: ${JSON.stringify(options.root)},
|
|
125
176
|
flags: ${JSON.stringify(options.flags)},
|
|
126
177
|
${linkingArg}
|
|
@@ -128,10 +179,10 @@ export default createApp({
|
|
|
128
179
|
`;
|
|
129
180
|
}
|
|
130
181
|
if (id === resolvedVirtualEntryIdNative) {
|
|
131
|
-
var
|
|
182
|
+
var _options_router22;
|
|
132
183
|
var isNative1 = isNativeEnvironment(this.environment);
|
|
133
184
|
var setupResult1 = getSetupFileImport(this.environment.name, setupFiles, isNative1, viteRoot);
|
|
134
|
-
var linkingArg1 = ((
|
|
185
|
+
var linkingArg1 = ((_options_router22 = options.router) === null || _options_router22 === void 0 ? void 0 : _options_router22.linking) ? `linking: ${JSON.stringify(options.router.linking)},` : "";
|
|
135
186
|
return `
|
|
136
187
|
import { createApp } from 'one'
|
|
137
188
|
${setupResult1.importStatement}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["resolve","pathToFileURL","configuration","isNativeEnvironment","API_ROUTE_GLOB_PATTERN","ROUTE_GLOB_PATTERN","ROUTE_NATIVE_EXCLUSION_GLOB_PATTERNS","ROUTE_WEB_EXCLUSION_GLOB_PATTERNS","resolvedVirtualEntryId","resolvedVirtualEntryIdNative","virtualEntryId","virtualEntryIdNative","normalizeSetupFile","setupFile","client","server","ios","android","native","sf","getSetupFileImport","environmentName","setupFiles","useStaticImport","root","envMap","ssr","key","importStatement","promiseDeclaration","promiseVarName","resolvedSetupFile","href","JSON","stringify","createVirtualEntry","options","_options_router_ignoredRouteFiles","_options_router","routeGlobs","router","ignoredRouteFiles","map","pattern","apiRouteGlobs","viteRoot","isDevMode","name","enforce","configResolved","config","command","resolveId","id","load","_options_router2","isNative","environment","isSSR","setupResult","nativewindImport","enableNativewind","setupPromiseArg","linkingArg","linking","
|
|
1
|
+
{"version":3,"names":["resolve","pathToFileURL","configuration","Glob","isNativeEnvironment","API_ROUTE_GLOB_PATTERN","ROUTE_GLOB_PATTERN","ROUTE_NATIVE_EXCLUSION_GLOB_PATTERNS","ROUTE_WEB_EXCLUSION_GLOB_PATTERNS","matchDirectoryRenderMode","matchFileRenderMode","resolvedVirtualEntryId","resolvedVirtualEntryIdNative","virtualEntryId","virtualEntryIdNative","normalizeSetupFile","setupFile","client","server","ios","android","native","sf","getSetupFileImport","environmentName","setupFiles","useStaticImport","root","envMap","ssr","key","importStatement","promiseDeclaration","promiseVarName","resolvedSetupFile","href","JSON","stringify","createVirtualEntry","options","_options_router_ignoredRouteFiles","_options_router","routeGlobs","router","ignoredRouteFiles","map","pattern","apiRouteGlobs","viteRoot","isDevMode","name","enforce","configResolved","config","command","resolveId","id","load","_options_router2","_options_router1","isNative","environment","isSSR","serverSpaRouteFiles","sync","cwd","ignore","file","replaceAll","filter","parts","split","filename","at","startsWith","fileMode","parentMode","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","slice","Symbol","iterator","_step","next","done","directory","value","_ref","_matchDirectoryRenderMode","renderMode","err","return","serverSpaRouteStubs","join","webRouteGlobs","setupResult","nativewindImport","enableNativewind","setupPromiseArg","linkingArg","linking","flags","_options_router22","isNative1","setupResult1","linkingArg1"],"sources":["../../../../src/vite/plugins/virtualEntryPlugin.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,OAAA,QAAe;AACxB,SAASC,aAAA,QAAqB;AAC9B,SAASC,aAAA,QAAqB;AAC9B,OAAOC,IAAA,MAAU;AAEjB,SAASC,mBAAA,QAA2B;AACpC,SAAAC,sBAAA,EAAAC,kBAAA,EAAAC,oCAAA,EAAAC,iCAAA;AAAA,SACEC,wBAAA,EAAAC,mBAAA;AAAA,SACAC,sBAAA,EAAAC,4BAAA,EAAAC,cAAA,EAAAC,oBAAA;AAAA,SACAC,mBAAAC,SAAA;EACA,KAAAA,SAAA;EAAA,WACKA,SAAA;IACP,OAAS;MAETC,MAAA,EAAAD,SAAA;MACEE,MAAA,EAAAF,SAAA;MACAG,GAAA,EAAAH,SAAA;MACAI,OAAA,EAAAJ;IACA;EAAA;EAUF,YAAS,IAAAA,SAAA,EACP;IAEA,OAAK;MACDC,MAAA,EAAOD,SAAA,CAAAC,MAAc;MACvBC,MAAO,EAAAF,SAAA,CAAAE,MAAA;MACLC,GAAA,EAAAH,SAAQ,CAAAK,MAAA;MACRD,OAAA,EAAQJ,SAAA,CAAAK;IAAA;EACH;EACI,IACXC,EAAA,GAAAN,SAAA;EACF;IACAC,MAAI,EAAAK,EAAA,CAAAL,MAAY;IACdC,MAAA,EAAOI,EAAA,CAAAJ,MAAA;IAAAC,GACL,EAAAG,EAAA,CAAAH,GAAQ;IAAUC,OAClB,EAAAE,EAAQ,CAAAF;EAAU;AACH;AACI,SACrBG,mBAAAC,eAAA,EAAAC,UAAA,EAAAC,eAAA,EAAAC,IAAA;EACF,IAAAC,MAAA;IACAX,MAAM,UAAK;IAMXY,GAAA,EAAO;IACLV,GAAA,OAAQ;IACRC,OAAA,EAAQ;EAAG;EACH,IACRU,GAAA,GAAAF,MAAY,CAAAJ,eAAA;EACd,KAAAM,GAAA;IACFC,eAAA;IAWAC,kBAAS;IAMPC,cAA2D;EAAA;EACjD,IACRjB,SAAK,GAAAS,UAAA,CAAAK,GAAA;EAAA,IACL,CAAAd,SAAK;IACLe,eAAS;IACXC,kBAAA;IAEAC,cAAY;EACZ;EAEA,IAAAC,iBAAkB,GAAAP,IAAA,GAAW1B,aAAG,CAAAD,OAAA,CAAA2B,IAAA,EAAAX,SAAA,GAAAmB,IAAA,GAAAnB,SAAA;EAChC,IAAIU,eAAC;IACH,OAAO;MAGTK,eAAM,YAAoBK,IACtB,CAAAC,SAAA,CAAAH,iBAA4B;MAI5BF,kBAAiB;MACnBC,cAAO;IAAA;EACuD;EACxC,OACpB;IACFF,eAAA;IACFC,kBAAA,+CAAAI,IAAA,CAAAC,SAAA,CAAAH,iBAAA;IAKAD,cAAO;EAAA;AACY;AACiF,SAClGK,kBAAgBA,CAAAC,OAAA;EAClB,IAAAC,iCAAA,EAAAC,eAAA;EACF,IAAAC,UAAA,IAEO,IAAAH,OAAS,CAAAZ,IAAA,IAAArB,kBAKL,IACT,KAAM,CAAAmC,eAAa,GAAAF,OAAA,CAAAI,MAAA,cAAAF,eAAA,wBAAAD,iCAAA,GAAAC,eAAA,CAAAG,iBAAA,cAAAJ,iCAAA,uBAAAA,iCAAA,CAAAK,GAAA,WAAAC,OAAA;IACjB,OAAI,KAAQP,OAAQ,CAAAZ,IAAA,IAAAmB,OAAA,EAAkB;EACtC,OAAI,IAAmC;EACI,IAC3CC,aAAM,OAAAR,OAAA,CAAAZ,IAAA,IAAAtB,sBAAA;EACR,IAAAoB,UAAA,GAAAV,kBAAA,CAAAwB,OAAA,CAAAvB,SAAA;EACA,IAAAgC,QAAM;EAEN,IAAAC,SAAM,QAAa;EACnB,OAAI;IACJC,IAAI,qBAAY;IAEhBC,OAAO;IACLC,cAAMA,CAAAC,MAAA;MACNL,QAAS,GAAAK,MAAA,CAAA1B,IAAA;MAETsB,SAAA,GAAAI,MAAe,CAAAC,OAAQ;IACrB;IACAC,UAAAC,EAAA,EAAY;MACd,IAAAA,EAAA,KAAA3C,cAAA;QAEA,OAAUF,sBAAI;MACZ;MACE,IAAA6C,EAAA,KAAO1C,oBAAA;QACT,OAAAF,4BAAA;MACA;IACE;IAAO6C,IACTA,CAAAD,EAAA;MACF,IAAAA,EAAA,KAAA7C,sBAAA;QAEA,IAAK+C,gBAAI,EAAAC,gBAAA;QACP,IAAIC,QAAO,GAAAxD,mBAAwB,MAAAyD,WAAA;QACjC,IAAAC,KAAM,QAAWD,WAAA,CAAAX,IAAA,KAAoB,KAAK;QAC1C,IAAAa,mBAAmB,GAAAD,KAAY,GAAA3D,IAAA,CAAA6D,IAAS;UACxCC,GAAA,EAAMjE,OAAA,CAAAgD,QAAA,EAAAT,OAAsB,CAAAZ,IACxB;UACEuC,MAAK,GACL,GAAA1D,iCAAQ,EACN,IAAG,EAAAkD,gBAAA,GAAAnB,OAAA,CAAAI,MAAA,cAAAe,gBAAA,uBAAAA,gBAAA,CAAAd,iBAAA;QACuC,EAC5C,CAAAC,GAAA,WAAAsB,IAAA;UACD,OACOA,IAAA,CAAAC,UAAc,UAAW;QAE7B,GAAAC,MAAM,WAAQF,IAAK;UACnB,IAAAG,KAAM,GAAAH,IAAA,CAAWI,KAAA,CAAM,GAAG;UAC1B,IACEC,QAAA,GAASF,KAAA,CAAAG,EAAA,CAAW,SAAS;UAG7B,IAAAD,QAAO,CAAAE,UAAA,eAAAF,QAAA,CAAAE,UAAA;YACT;UAEA;UACA,IAAIC,QAAA,GAAUjE,mBAAoB,CAAA8D,QAAA;UAElC,IAAIG,QAAA,SAAAA,QAAA;UACJ,IAAAC,UAAW;UACT,IAAAC,yBACE;YAAAC,iBAAqC;YAAAC,cAAc;UACvD;YACA,KAAO,IAAAC,SAAA,GAAeV,KAAA,CAAAW,KAAA,QAAAC,MAAA,CAAAC,QAAA,KAAAC,KAAA,IAAAP,yBAAA,IAAAO,KAAA,GAAAJ,SAAA,CAAAK,IAAA,IAAAC,IAAA,GAAAT,yBAAA;cAEzB,IAAAU,SAAA,GAAAH,KAAA,CAAAI,KAAA;cACC,IAAAC,IAAA;cAED,IAAAC,yBACuB;cAEzBd,UAAc,IAAAa,IAAA,IAAAC,yBAAA,GAAAjF,wBAAA,CAAA8E,SAAA,eAAAG,yBAAA,uBAAAA,yBAAA,CAAAC,UAAA,cAAAF,IAAA,cAAAA,IAAA,GAAAb,UAAA;YACjB;UACE,SAAGgB,GAAA;YACHd,iBAAG;YACHC,cAAG,GAAAa,GAAA;UACL;YAKA,IAAM;cACA,KAAAf,yBAAc,IAAAG,SAAA,CAAAa,MAAA;gBACbb,SAAA,CAAAa,MAAY;cACjB;YACA;cACA,IAAAf,iBAAA;gBACF,MAAAC,cAAA;cAEM;YAIN;UAGA;UAGA,OAAOH,UAAA;QACb,OAAY;QACZ,IAAAkB,mBAAgB,GAAA/B,mBAAA,CAAAlB,GAAA,WAAAsB,IAAA;UAAA,UAAA/B,IAAA,CAAAC,SAAA,KAAAE,OAAA,CAAAZ,IAAA,IAAAwC,IAAA;QAAA,GAAA4B,IAAA;QAGhB,IAAAC,aAAY,IAAe,GAAAtD,UAAA,KAAAlC,iCAAA,CAAAqC,GAAA,WAAAC,OAAA;UAAA,WAAAA,OAAA;QAAA,OAAAiB,mBAAA,CAAAlB,GAAA,WAAAsB,IAAA;UAAA,YAAA5B,OAAA,CAAAZ,IAAA,IAAAwC,IAAA;QAAA;QAAA,IAAAzC,eAAA,GAAAkC,QAAA,IAAAE,KAAA,IAAAb,SAAA;QAAA,IAAAgD,WAAA,GAAA1E,kBAAA,MAAAsC,WAAA,CAAAX,IAAA,EAAAzB,UAAA,EAAAC,eAAA,EAAAsB,QAAA;QAAA,IAAAkD,gBAAA,GAAAhG,aAAA,CAAAiG,gBAAA;QAAA,IAAAC,eAAA,GAAAH,WAAA,CAAAhE,cAAA,uBAAAgE,WAAA,CAAAhE,cAAA;QAAA,IAAAoE,UAaV,KAAA1C,gBAAwB,GAAApB,OAAA,CAAAI,MAAA,cAAAgB,gBAAA,uBAAAA,gBAAA,CAAA2C,OAAA,gBAAAlE,IAAA,CAAAC,SAAA,CAAAE,OAAA,CAAAI,MAAA,CAAA2D,OAAA;QAAA;AAAA,EAAAL,WAEvC,CAAAjE,kBAAe;AAAA,EAAAkE,gBAAA;AAAA;AAEoC;AAC9B,EAAAD,WAAA,CAAAlE,eAAA;AAAA;AAEmB;AACJ;AAC1B;AAAA;AAAA;AAKR;AACE;AACA;AAAoB;AACD;AACjB;AACA,cACAK,IAAA,CAAAC,SAAA,CAAA2D,aAAA;AAAA;AAEF,IAAAI,eAAM;AAGN;AAAO,0BAAAhE,IAAA,CAAAC,SAAA,CAAA2D,aAAA;AAAA,MAEbF,mBAAY;AAAe;AAAA,gBAEf1D,IAAK,CAAAC,SAAU,CAAAE,OAAA,CAAUZ,IAAC;AAAA,WAAAS,IAAA,CAAAC,SAAA,CAAAE,OAAA,CAAAgE,KAAA;AAAA,IAAAF,UAAA;AAEsG;AAClG;MAExC;MAAU,IAAA7C,EAAA,KAAA5C,4BAAA;QAAA,IAAA4F,iBAAA;QAGR,IAAAC,SAAA,GAAArG,mBAAA,MAAAyD,WAAA;QACF,IAAA6C,YAAA,GAAAnF,kBAAA,MAAAsC,WAAA,CAAAX,IAAA,EAAAzB,UAAA,EAAAgF,SAAA,EAAAzD,QAAA;QACF,IAAA2D,WAAA,KAAAH,iBAAA,GAAAjE,OAAA,CAAAI,MAAA,cAAA6D,iBAAA,uBAAAA,iBAAA,CAAAF,OAAA,gBAAAlE,IAAA,CAAAC,SAAA,CAAAE,OAAA,CAAAI,MAAA,CAAA2D,OAAA;QACF","ignoreList":[]}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join, resolve } from "node:path";
|
|
1
5
|
import { describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { build } from "vite";
|
|
2
7
|
import { createVirtualEntry } from "./virtualEntryPlugin.mjs";
|
|
3
8
|
vi.mock("vxrn", () => ({
|
|
4
9
|
isNativeEnvironment: env => {
|
|
@@ -23,6 +28,59 @@ function loadEntry(plugin, envName, command = "build") {
|
|
|
23
28
|
return plugin.load.call(ctx, "\0virtual:one-entry");
|
|
24
29
|
}
|
|
25
30
|
describe("virtualEntryPlugin", () => {
|
|
31
|
+
it("keeps spa route matching without bundling the client module on the server", async () => {
|
|
32
|
+
const root = mkdtempSync(join(tmpdir(), "one-spa-server-"));
|
|
33
|
+
const appDir = join(root, "app");
|
|
34
|
+
mkdirSync(appDir);
|
|
35
|
+
const spaRoute = join(appDir, "client-only+spa.tsx");
|
|
36
|
+
writeFileSync(spaRoute, `export const browserPayload = 'must-not-enter-server-graph'
|
|
37
|
+
export default function ClientOnlyPage() { return null }
|
|
38
|
+
`);
|
|
39
|
+
try {
|
|
40
|
+
const result = await build({
|
|
41
|
+
root,
|
|
42
|
+
configFile: false,
|
|
43
|
+
logLevel: "silent",
|
|
44
|
+
plugins: [{
|
|
45
|
+
name: "test-one-entry",
|
|
46
|
+
enforce: "pre",
|
|
47
|
+
resolveId(id) {
|
|
48
|
+
if (id === "one") return "\0test-one-entry";
|
|
49
|
+
},
|
|
50
|
+
load(id) {
|
|
51
|
+
if (id === "\0test-one-entry") {
|
|
52
|
+
return `export const createApp = (options) => options
|
|
53
|
+
export const registerPreloadedRoute = () => {}`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}, createVirtualEntry({
|
|
57
|
+
root: "app",
|
|
58
|
+
flags: {}
|
|
59
|
+
})],
|
|
60
|
+
build: {
|
|
61
|
+
ssr: true,
|
|
62
|
+
write: false,
|
|
63
|
+
rolldownOptions: {
|
|
64
|
+
input: "virtual:one-entry"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
if (Array.isArray(result)) throw new Error("expected one server build output");
|
|
69
|
+
if (!("output" in result)) throw new Error("expected completed server build");
|
|
70
|
+
const moduleIds = result.output.flatMap(output => output.type === "chunk" ? output.moduleIds : []);
|
|
71
|
+
expect(moduleIds).not.toContain(resolve(spaRoute));
|
|
72
|
+
const entry = result.output.find(output => output.type === "chunk" && output.isEntry);
|
|
73
|
+
if (!entry || entry.type !== "chunk") throw new Error("missing server entry chunk");
|
|
74
|
+
const built = await import(`data:text/javascript;base64,${Buffer.from(entry.code).toString("base64")}`);
|
|
75
|
+
expect(Object.keys(built.default.routes)).toContain("/app/client-only+spa.tsx");
|
|
76
|
+
await expect(built.default.routes["/app/client-only+spa.tsx"]()).resolves.toEqual({});
|
|
77
|
+
} finally {
|
|
78
|
+
rmSync(root, {
|
|
79
|
+
recursive: true,
|
|
80
|
+
force: true
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
});
|
|
26
84
|
describe("setupFile", () => {
|
|
27
85
|
const base = {
|
|
28
86
|
root: "app",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["describe","expect","it","vi","createVirtualEntry","mock","isNativeEnvironment","env","name","configuration","enableNativewind","loadEntry","plugin","envName","command","configResolved","root","ctx","environment","load","call","
|
|
1
|
+
{"version":3,"names":["Buffer","mkdirSync","mkdtempSync","rmSync","writeFileSync","tmpdir","join","resolve","describe","expect","it","vi","build","createVirtualEntry","mock","isNativeEnvironment","env","name","configuration","enableNativewind","loadEntry","plugin","envName","command","configResolved","root","ctx","environment","load","call","appDir","spaRoute","result","configFile","logLevel","plugins","enforce","resolveId","id","flags","ssr","write","rolldownOptions","input","Array","isArray","Error","moduleIds","output","flatMap","type","not","toContain","entry","find","isEntry","built","from","code","toString","Object","keys","default","routes","resolves","toEqual","recursive","force","base","setupFile","client","server","native","ssrCode","clientCode","iosCode","router","linking","scheme","prefixes"],"sources":["../../../../src/vite/plugins/virtualEntryPlugin.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
+
import { Buffer } from "buffer";
|
|
2
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "fs";
|
|
3
|
+
import { tmpdir } from "os";
|
|
4
|
+
import { join, resolve } from "path";
|
|
1
5
|
import { describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { build } from "vite";
|
|
2
7
|
import { createVirtualEntry } from "./virtualEntryPlugin.native.js";
|
|
3
8
|
vi.mock("vxrn", function () {
|
|
4
9
|
return {
|
|
@@ -29,6 +34,63 @@ function loadEntry(plugin, envName) {
|
|
|
29
34
|
return plugin.load.call(ctx, "\0virtual:one-entry");
|
|
30
35
|
}
|
|
31
36
|
describe("virtualEntryPlugin", function () {
|
|
37
|
+
it("keeps spa route matching without bundling the client module on the server", async function () {
|
|
38
|
+
var root = mkdtempSync(join(tmpdir(), "one-spa-server-"));
|
|
39
|
+
var appDir = join(root, "app");
|
|
40
|
+
mkdirSync(appDir);
|
|
41
|
+
var spaRoute = join(appDir, "client-only+spa.tsx");
|
|
42
|
+
writeFileSync(spaRoute, `export const browserPayload = 'must-not-enter-server-graph'
|
|
43
|
+
export default function ClientOnlyPage() { return null }
|
|
44
|
+
`);
|
|
45
|
+
try {
|
|
46
|
+
var result = await build({
|
|
47
|
+
root,
|
|
48
|
+
configFile: false,
|
|
49
|
+
logLevel: "silent",
|
|
50
|
+
plugins: [{
|
|
51
|
+
name: "test-one-entry",
|
|
52
|
+
enforce: "pre",
|
|
53
|
+
resolveId(id) {
|
|
54
|
+
if (id === "one") return "\0test-one-entry";
|
|
55
|
+
},
|
|
56
|
+
load(id) {
|
|
57
|
+
if (id === "\0test-one-entry") {
|
|
58
|
+
return `export const createApp = (options) => options
|
|
59
|
+
export const registerPreloadedRoute = () => {}`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}, createVirtualEntry({
|
|
63
|
+
root: "app",
|
|
64
|
+
flags: {}
|
|
65
|
+
})],
|
|
66
|
+
build: {
|
|
67
|
+
ssr: true,
|
|
68
|
+
write: false,
|
|
69
|
+
rolldownOptions: {
|
|
70
|
+
input: "virtual:one-entry"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
if (Array.isArray(result)) throw new Error("expected one server build output");
|
|
75
|
+
if (!("output" in result)) throw new Error("expected completed server build");
|
|
76
|
+
var moduleIds = result.output.flatMap(function (output) {
|
|
77
|
+
return output.type === "chunk" ? output.moduleIds : [];
|
|
78
|
+
});
|
|
79
|
+
expect(moduleIds).not.toContain(resolve(spaRoute));
|
|
80
|
+
var entry = result.output.find(function (output) {
|
|
81
|
+
return output.type === "chunk" && output.isEntry;
|
|
82
|
+
});
|
|
83
|
+
if (!entry || entry.type !== "chunk") throw new Error("missing server entry chunk");
|
|
84
|
+
var built = await import(`data:text/javascript;base64,${Buffer.from(entry.code).toString("base64")}`);
|
|
85
|
+
expect(Object.keys(built.default.routes)).toContain("/app/client-only+spa.tsx");
|
|
86
|
+
await expect(built.default.routes["/app/client-only+spa.tsx"]()).resolves.toEqual({});
|
|
87
|
+
} finally {
|
|
88
|
+
rmSync(root, {
|
|
89
|
+
recursive: true,
|
|
90
|
+
force: true
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
});
|
|
32
94
|
describe("setupFile", function () {
|
|
33
95
|
var base = {
|
|
34
96
|
root: "app",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["describe","expect","it","vi","createVirtualEntry","mock","isNativeEnvironment","env","name","configuration","enableNativewind","loadEntry","plugin","envName","command","arguments","length","_plugin_configResolved","configResolved","call","root","ctx","environment","load","
|
|
1
|
+
{"version":3,"names":["Buffer","mkdirSync","mkdtempSync","rmSync","writeFileSync","tmpdir","join","resolve","describe","expect","it","vi","build","createVirtualEntry","mock","isNativeEnvironment","env","name","configuration","enableNativewind","loadEntry","plugin","envName","command","arguments","length","_plugin_configResolved","configResolved","call","root","ctx","environment","load","appDir","spaRoute","result","configFile","logLevel","plugins","enforce","resolveId","id","flags","ssr","write","rolldownOptions","input","Array","isArray","Error","moduleIds","output","flatMap","type","not","toContain","entry","find","isEntry","built","from","code","toString","Object","keys","default","routes","resolves","toEqual","recursive","force","base","setupFile","client","server","native","ssrCode","clientCode","iosCode"],"sources":["../../../../src/vite/plugins/virtualEntryPlugin.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "one",
|
|
3
|
-
"version": "1.21.
|
|
3
|
+
"version": "1.21.3",
|
|
4
4
|
"license": "BSD-3-Clause",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"setup.mjs",
|
|
@@ -181,18 +181,18 @@
|
|
|
181
181
|
"@cloudflare/vite-plugin": "^1.33.1",
|
|
182
182
|
"@swc/core": "^1.14.0",
|
|
183
183
|
"@ungap/structured-clone": "^1.2.0",
|
|
184
|
-
"@vxrn/color-scheme": "1.21.
|
|
185
|
-
"@vxrn/compiler": "1.21.
|
|
186
|
-
"@vxrn/resolve": "1.21.
|
|
187
|
-
"@vxrn/tslib-lite": "1.21.
|
|
188
|
-
"@vxrn/use-isomorphic-layout-effect": "1.21.
|
|
189
|
-
"@vxrn/vite-plugin-metro": "1.21.
|
|
184
|
+
"@vxrn/color-scheme": "1.21.3",
|
|
185
|
+
"@vxrn/compiler": "1.21.3",
|
|
186
|
+
"@vxrn/resolve": "1.21.3",
|
|
187
|
+
"@vxrn/tslib-lite": "1.21.3",
|
|
188
|
+
"@vxrn/use-isomorphic-layout-effect": "1.21.3",
|
|
189
|
+
"@vxrn/vite-plugin-metro": "1.21.3",
|
|
190
190
|
"babel-dead-code-elimination": "1.0.10",
|
|
191
191
|
"babel-plugin-module-resolver": "^5.0.2",
|
|
192
192
|
"babel-preset-expo": "~55.0.0",
|
|
193
193
|
"citty": "^0.1.6",
|
|
194
194
|
"core-js": "^3.38.1",
|
|
195
|
-
"create-vxrn": "1.21.
|
|
195
|
+
"create-vxrn": "1.21.3",
|
|
196
196
|
"escape-string-regexp": "^5.0.0",
|
|
197
197
|
"expo-linking": "~55.0.7",
|
|
198
198
|
"expo-modules-core": "~55.0.16",
|
|
@@ -212,7 +212,7 @@
|
|
|
212
212
|
"tsconfig-paths": "^4",
|
|
213
213
|
"use-latest-callback": "^0.2.3",
|
|
214
214
|
"vite": "^8.0.13",
|
|
215
|
-
"vxrn": "1.21.
|
|
215
|
+
"vxrn": "1.21.3",
|
|
216
216
|
"ws": "^8.21.0",
|
|
217
217
|
"xxhashjs": "^0.2.2"
|
|
218
218
|
},
|
package/src/cli/build.ts
CHANGED
|
@@ -287,16 +287,9 @@ async function getCloudflareProjectName(root: string): Promise<string> {
|
|
|
287
287
|
return 'one-app'
|
|
288
288
|
}
|
|
289
289
|
|
|
290
|
-
// concurrency limit for parallel page builds
|
|
291
|
-
// can be overridden with ONE_BUILD_CONCURRENCY env var
|
|
292
|
-
// default based on CPU count for I/O parallelism benefits
|
|
293
290
|
// ensure worker threads inherit the same CACHE_KEY as the main process
|
|
294
291
|
process.env.ONE_CACHE_KEY = constants.CACHE_KEY
|
|
295
292
|
|
|
296
|
-
const BUILD_CONCURRENCY = process.env.ONE_BUILD_CONCURRENCY
|
|
297
|
-
? Math.max(1, parseInt(process.env.ONE_BUILD_CONCURRENCY, 10))
|
|
298
|
-
: Math.max(1, Math.min(cpus().length, 8))
|
|
299
|
-
|
|
300
293
|
// worker threads enabled by default, can be disabled via config or env var
|
|
301
294
|
function shouldUseWorkers(oneOptions?: { build?: { workers?: boolean } }) {
|
|
302
295
|
// env var takes precedence (ONE_BUILD_WORKERS=0 to disable, =1 to force enable)
|
|
@@ -401,6 +394,20 @@ export async function build(args: {
|
|
|
401
394
|
const { oneOptions, config: viteLoadedConfig } = await loadUserOneOptions('build')
|
|
402
395
|
const routerRoot = getRouterRootFromOneOptions(oneOptions)
|
|
403
396
|
|
|
397
|
+
const configuredBuildConcurrency =
|
|
398
|
+
process.env.ONE_BUILD_CONCURRENCY ?? oneOptions.build?.concurrency
|
|
399
|
+
const buildConcurrency =
|
|
400
|
+
configuredBuildConcurrency === undefined
|
|
401
|
+
? Math.max(1, Math.min(cpus().length, 8))
|
|
402
|
+
: Number(configuredBuildConcurrency)
|
|
403
|
+
if (!Number.isInteger(buildConcurrency) || buildConcurrency < 1) {
|
|
404
|
+
throw new Error(
|
|
405
|
+
`build.concurrency must be a positive integer, received ${JSON.stringify(
|
|
406
|
+
configuredBuildConcurrency
|
|
407
|
+
)}`
|
|
408
|
+
)
|
|
409
|
+
}
|
|
410
|
+
|
|
404
411
|
// Set defaultRenderMode env var so getManifest knows the correct route types
|
|
405
412
|
if (oneOptions.web?.defaultRenderMode) {
|
|
406
413
|
process.env.ONE_DEFAULT_RENDER_MODE = oneOptions.web.defaultRenderMode
|
|
@@ -679,11 +686,11 @@ export async function build(args: {
|
|
|
679
686
|
const criticalCSSOutputPaths = getCriticalCSSOutputPaths(vxrnOutput.clientManifest)
|
|
680
687
|
|
|
681
688
|
// concurrency limiter for parallel page builds
|
|
682
|
-
const limit = pLimit(
|
|
689
|
+
const limit = pLimit(buildConcurrency)
|
|
683
690
|
|
|
684
691
|
// initialize worker pool if enabled (default: true)
|
|
685
692
|
const useWorkers = shouldUseWorkers(oneOptions)
|
|
686
|
-
const workerPool = useWorkers ? getWorkerPool(
|
|
693
|
+
const workerPool = useWorkers ? getWorkerPool(buildConcurrency) : null
|
|
687
694
|
if (workerPool) {
|
|
688
695
|
// strip non-cloneable values so workers skip re-loading vite config
|
|
689
696
|
const serializableOptions = JSON.parse(
|
|
@@ -697,7 +704,7 @@ export async function build(args: {
|
|
|
697
704
|
const staticStartTime = performance.now()
|
|
698
705
|
const modeLabel = useWorkers
|
|
699
706
|
? `workers: ${workerPool?.size}`
|
|
700
|
-
: `concurrency: ${
|
|
707
|
+
: `concurrency: ${buildConcurrency}`
|
|
701
708
|
console.info(`\n 🔨 build static routes (${modeLabel})\n`)
|
|
702
709
|
|
|
703
710
|
const staticDir = join(`${outDir}/static`)
|
|
@@ -1251,7 +1258,7 @@ export async function build(args: {
|
|
|
1251
1258
|
|
|
1252
1259
|
// once done building static we can move it to client dir:
|
|
1253
1260
|
await moveAllFiles(staticDir, clientDir)
|
|
1254
|
-
await FSExtra.
|
|
1261
|
+
await FSExtra.remove(staticDir)
|
|
1255
1262
|
|
|
1256
1263
|
// write out the static paths (pathname => html) for the server
|
|
1257
1264
|
const routeMap: Record<string, string> = {}
|
package/src/cli/buildPage.ts
CHANGED
|
@@ -4,7 +4,12 @@ import { normalizePath } from 'vite'
|
|
|
4
4
|
import * as constants from '../constants'
|
|
5
5
|
import { LOADER_JS_POSTFIX_UNCACHED } from '../constants'
|
|
6
6
|
import type { LoaderProps } from '../types'
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
encodeReservedFilenameChars,
|
|
9
|
+
getLoaderPath,
|
|
10
|
+
getPreloadCSSPath,
|
|
11
|
+
getPreloadPath,
|
|
12
|
+
} from '../utils/cleanUrl'
|
|
8
13
|
import { isResponse } from '../utils/isResponse'
|
|
9
14
|
import { toAbsolute, toAbsoluteUrl } from '../utils/toAbsolute'
|
|
10
15
|
import { replaceLoader } from '../vite/replaceLoader'
|
|
@@ -64,7 +69,12 @@ export async function buildPage(
|
|
|
64
69
|
const render = await getRender(serverEntry)
|
|
65
70
|
recordTiming('getRender', performance.now() - t0)
|
|
66
71
|
|
|
67
|
-
|
|
72
|
+
// encode NTFS-reserved characters (`:` from `/:param` patterns, `*` from
|
|
73
|
+
// catch-alls, hostile param values) so the artifact is writable on Windows;
|
|
74
|
+
// routeMap stores this same string, so serve-side lookups stay consistent
|
|
75
|
+
const htmlPath = encodeReservedFilenameChars(
|
|
76
|
+
`${path.endsWith('/') ? `${removeTrailingSlash(path)}/index` : path}.html`
|
|
77
|
+
)
|
|
68
78
|
// forward-slash for cross-platform manifest hygiene (matches serverJsPath)
|
|
69
79
|
const clientJsPath = clientManifestEntry
|
|
70
80
|
? normalizePath(join(clientDir, clientManifestEntry.file))
|
package/src/daemon/ipc.ts
CHANGED
|
@@ -4,6 +4,7 @@ import * as net from 'node:net'
|
|
|
4
4
|
import * as fs from 'node:fs'
|
|
5
5
|
import * as path from 'node:path'
|
|
6
6
|
import * as os from 'node:os'
|
|
7
|
+
import { createHash } from 'node:crypto'
|
|
7
8
|
import type { IPCMessage, IPCResponse, DaemonState } from './types'
|
|
8
9
|
import {
|
|
9
10
|
registerServer,
|
|
@@ -18,9 +19,32 @@ import {
|
|
|
18
19
|
} from './registry'
|
|
19
20
|
|
|
20
21
|
const SOCKET_DIR = path.join(os.homedir(), '.one')
|
|
21
|
-
const SOCKET_PATH = path.join(SOCKET_DIR, 'daemon.sock')
|
|
22
22
|
const SERVERS_FILE = path.join(SOCKET_DIR, 'servers.json')
|
|
23
23
|
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the daemon IPC endpoint for the current platform.
|
|
26
|
+
*
|
|
27
|
+
* Node's `net` implements local IPC as a Unix domain socket on POSIX and a named
|
|
28
|
+
* pipe on Windows — the same `listen(path)`/`connect(path)` API, but on Windows
|
|
29
|
+
* the name must live under `\\.\pipe\` (a flat, machine-global namespace) rather
|
|
30
|
+
* than the filesystem. So we select each platform's native primitive: an AF_UNIX
|
|
31
|
+
* socket file inside the owner-only `~/.one` dir on POSIX, a named pipe on
|
|
32
|
+
* Windows. The Windows name is a deterministic per-user hash so the daemon and
|
|
33
|
+
* the CLI derive the same pipe independently, and so distinct users on one
|
|
34
|
+
* machine don't collide in the shared pipe namespace.
|
|
35
|
+
*
|
|
36
|
+
* @see https://nodejs.org/api/net.html#identifying-paths-for-ipc-connections
|
|
37
|
+
*/
|
|
38
|
+
function resolveSocketPath(): string {
|
|
39
|
+
if (process.platform === 'win32') {
|
|
40
|
+
const scope = createHash('sha256').update(SOCKET_DIR).digest('hex').slice(0, 8)
|
|
41
|
+
return path.win32.join(String.raw`\\.\pipe`, `one-daemon-${scope}`)
|
|
42
|
+
}
|
|
43
|
+
return path.join(SOCKET_DIR, 'daemon.sock')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const SOCKET_PATH = resolveSocketPath()
|
|
47
|
+
|
|
24
48
|
export function getSocketPath(): string {
|
|
25
49
|
return SOCKET_PATH
|
|
26
50
|
}
|
|
@@ -124,9 +148,24 @@ export function createIPCServer(
|
|
|
124
148
|
})
|
|
125
149
|
})
|
|
126
150
|
|
|
151
|
+
// surface a bind failure as an actionable message rather than an uncaught
|
|
152
|
+
// 'error' event that crashes the process (e.g. another daemon already owns the
|
|
153
|
+
// socket/pipe).
|
|
154
|
+
server.on('error', (err: NodeJS.ErrnoException) => {
|
|
155
|
+
if (err.code === 'EADDRINUSE') {
|
|
156
|
+
console.error(`[daemon] Another daemon is already listening at ${SOCKET_PATH}`)
|
|
157
|
+
} else {
|
|
158
|
+
console.error('[daemon] IPC server error:', err.message)
|
|
159
|
+
}
|
|
160
|
+
process.exit(1)
|
|
161
|
+
})
|
|
162
|
+
|
|
127
163
|
server.listen(SOCKET_PATH, () => {
|
|
128
|
-
// owner-only permissions
|
|
129
|
-
|
|
164
|
+
// owner-only permissions on POSIX; the Windows named pipe is not a filesystem
|
|
165
|
+
// entry, so chmod does not apply there (and would throw).
|
|
166
|
+
if (process.platform !== 'win32') {
|
|
167
|
+
fs.chmodSync(SOCKET_PATH, 0o600)
|
|
168
|
+
}
|
|
130
169
|
})
|
|
131
170
|
|
|
132
171
|
return server
|
|
@@ -205,7 +244,10 @@ function handleMessage(
|
|
|
205
244
|
|
|
206
245
|
export async function isDaemonRunning(): Promise<boolean> {
|
|
207
246
|
return new Promise((resolve) => {
|
|
208
|
-
|
|
247
|
+
// On POSIX a stale socket file may linger, so a cheap existence check avoids a
|
|
248
|
+
// needless connect. On Windows the endpoint is a named pipe — not a filesystem
|
|
249
|
+
// entry — so existsSync is always false there; probe by connecting instead.
|
|
250
|
+
if (process.platform !== 'win32' && !fs.existsSync(SOCKET_PATH)) {
|
|
209
251
|
resolve(false)
|
|
210
252
|
return
|
|
211
253
|
}
|
package/src/router/getRoutes.ts
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
matchArrayGroupName,
|
|
6
6
|
matchDirectoryRenderMode,
|
|
7
7
|
matchDynamicName,
|
|
8
|
+
matchFileRenderMode,
|
|
8
9
|
matchGroupName,
|
|
9
10
|
matchInterceptPrefix,
|
|
10
11
|
matchSlotName,
|
|
@@ -536,9 +537,7 @@ function getFileMeta(
|
|
|
536
537
|
const isLayout = filenameWithoutExtensions.startsWith('_layout')
|
|
537
538
|
const isMiddleware = filenameWithoutExtensions.startsWith('_middleware')
|
|
538
539
|
|
|
539
|
-
const
|
|
540
|
-
filename.match(/\+(api|ssg|ssr|spa)\.(\w+\.)?[jt]sx?$/) || []
|
|
541
|
-
const fileRenderMode = renderModeFound as 'api' | One.RouteRenderMode | undefined
|
|
540
|
+
const fileRenderMode = matchFileRenderMode(filename)
|
|
542
541
|
|
|
543
542
|
// Hierarchical render mode resolution:
|
|
544
543
|
// 1. File suffix (highest priority)
|