one 1.15.2 → 1.15.4
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/Root.cjs +17 -0
- package/dist/cjs/Root.native.js +18 -0
- package/dist/cjs/Root.native.js.map +1 -1
- package/dist/cjs/fork/useLinking.cjs +7 -1
- package/dist/cjs/hooks.cjs +15 -1
- package/dist/cjs/hooks.native.js +16 -1
- package/dist/cjs/hooks.native.js.map +1 -1
- package/dist/cjs/router/useScreens.cjs +7 -4
- package/dist/cjs/router/useScreens.native.js +8 -5
- package/dist/cjs/router/useScreens.native.js.map +1 -1
- package/dist/cjs/server/oneServe.cjs +16 -6
- package/dist/cjs/server/oneServe.native.js +36 -6
- package/dist/cjs/server/oneServe.native.js.map +1 -1
- package/dist/cjs/vite/one-server-only.cjs +7 -0
- package/dist/cjs/vite/one-server-only.test.cjs +92 -0
- package/dist/cjs/vite/one-server-only.test.native.js +95 -0
- package/dist/cjs/vite/one-server-only.test.native.js.map +1 -0
- package/dist/cjs/vite/resolveResponse.cjs +2 -1
- package/dist/cjs/vite/resolveResponse.native.js +2 -1
- package/dist/cjs/vite/resolveResponse.native.js.map +1 -1
- package/dist/esm/Root.mjs +17 -0
- package/dist/esm/Root.mjs.map +1 -1
- package/dist/esm/Root.native.js +18 -0
- package/dist/esm/Root.native.js.map +1 -1
- package/dist/esm/fork/useLinking.mjs +7 -1
- package/dist/esm/fork/useLinking.mjs.map +1 -1
- package/dist/esm/hooks.mjs +14 -1
- package/dist/esm/hooks.mjs.map +1 -1
- package/dist/esm/hooks.native.js +15 -1
- package/dist/esm/hooks.native.js.map +1 -1
- package/dist/esm/router/useScreens.mjs +7 -4
- package/dist/esm/router/useScreens.mjs.map +1 -1
- package/dist/esm/router/useScreens.native.js +8 -5
- package/dist/esm/router/useScreens.native.js.map +1 -1
- package/dist/esm/server/oneServe.mjs +16 -6
- package/dist/esm/server/oneServe.mjs.map +1 -1
- package/dist/esm/server/oneServe.native.js +36 -6
- package/dist/esm/server/oneServe.native.js.map +1 -1
- package/dist/esm/vite/one-server-only.mjs +7 -0
- package/dist/esm/vite/one-server-only.mjs.map +1 -1
- package/dist/esm/vite/one-server-only.test.mjs +93 -0
- package/dist/esm/vite/one-server-only.test.mjs.map +1 -0
- package/dist/esm/vite/one-server-only.test.native.js +93 -0
- package/dist/esm/vite/one-server-only.test.native.js.map +1 -0
- package/dist/esm/vite/resolveResponse.mjs +2 -1
- package/dist/esm/vite/resolveResponse.mjs.map +1 -1
- package/dist/esm/vite/resolveResponse.native.js +2 -1
- package/dist/esm/vite/resolveResponse.native.js.map +1 -1
- package/package.json +9 -9
- package/src/Root.tsx +26 -1
- package/src/fork/useLinking.ts +12 -1
- package/src/hooks.tsx +19 -1
- package/src/router/useScreens.tsx +10 -8
- package/src/server/oneServe.ts +17 -6
- package/src/vite/one-server-only.test.ts +95 -0
- package/src/vite/one-server-only.tsx +11 -0
- package/src/vite/resolveResponse.ts +2 -1
- package/types/Root.d.ts.map +1 -1
- package/types/fork/useLinking.d.ts.map +1 -1
- package/types/hooks.d.ts.map +1 -1
- package/types/router/useScreens.d.ts.map +1 -1
- package/types/server/oneServe.d.ts.map +1 -1
- package/types/vite/one-server-only.d.ts.map +1 -1
- package/types/vite/one-server-only.test.d.ts +2 -0
- package/types/vite/one-server-only.test.d.ts.map +1 -0
- package/dist/cjs/utils/platform.cjs +0 -28
- package/dist/cjs/utils/platform.native.js +0 -31
- package/dist/cjs/utils/platform.native.js.map +0 -1
- package/dist/esm/utils/platform.mjs +0 -3
- package/dist/esm/utils/platform.mjs.map +0 -1
- package/dist/esm/utils/platform.native.js +0 -3
- package/dist/esm/utils/platform.native.js.map +0 -1
- package/src/utils/platform.ts +0 -5
- package/types/utils/platform.d.ts +0 -2
- package/types/utils/platform.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SERVER_CONTEXT_KEY","AsyncLocalStorage","_ctxKey","Symbol","for","key","read","globalThis","ASYNC_LOCAL_STORE","current","_","requestAsyncLocalStore","process","env","VITE_ENVIRONMENT","newCache","WeakMap","asyncHeadersCache","runWithAsyncLocalContext","cb","id","_id","Math","random","store","out","run","setResponseHeaders","ensureAsyncLocalID","cache","headers","get","Headers","set","mergeHeaders","onto","from","forEach","value","key2","delete","globalId","GLOBAL_ID_KEY","globalIdKey","VERCEL","getStore","Error","SERVER_CONTEXTS_KEY","serverContexts","setServerContext","data","context","Object","assign","getServerContext","useServerContext","useContext","setServerData","postRenderData","getServerData"],"sources":["../../../src/vite/one-server-only.tsx"],"sourcesContent":[null],"mappings":"AAQA,SAASA,kBAAA,QAA0B;AAYnC,SAASC,iBAAA,QAAyB;AARlC,MAAMC,OAAA,GAAUC,MAAA,CAAOC,GAAA,CAAI,UAAU;AAYrC,MAAMC,GAAA,GAAM;AACZ,MAAMC,IAAA,GAAOA,CAAA,KAAMC,UAAA,CAAWF,GAAG;AAEjC,MAAMG,iBAAA,GAAoB;EACxB,IAAIC,QAAA,EAAU;IACZ,IAAIH,IAAA,CAAK,GAAG,OAAOA,IAAA,CAAK;IACxB,MAAMI,CAAA,GAAI,IAAIT,iBAAA,CAAyB;IACvCM,UAAA,CAAWF,GAAG,IAAIK,CAAA;IAClB,OAAOA,CAAA;EACT;AACF;AAEO,MAAMC,sBAAA,GACXC,OAAA,CAAQC,GAAA,CAAIC,gBAAA,KAAqB,QAAQN,iBAAA,CAAkBC,OAAA,GAAU;AAEvE,MAAMM,QAAA,GAAW,mBAAIC,OAAA,CAAsB;AAEpC,MAAMC,iBAAA,GACVV,UAAA,CAAW,yBAAyB,KAAyBQ,QAAA;AAEhER,UAAA,CAAW,yBAAyB,MAAMU,iBAAA;AAE1C,eAAsBC,yBACpBC,EAAA,EACY;EACZ,MAAMC,EAAA,GAAY;IAAEC,GAAA,EAAKC,IAAA,CAAKC,MAAA,CAAO;EAAE;EACvC,MAAMC,KAAA,GAAQhB,iBAAA,CAAkBC,OAAA;EAChC,IAAI,CAACe,KAAA,EAAO;IAEV,OAAOL,EAAA,CAAGC,EAAE;EACd;EACA,IAAIK,GAAA,GAAS;EACb,MAAMD,KAAA,CAAME,GAAA,CAAIN,EAAA,EAAI,YAAY;IAC9BK,GAAA,GAAM,MAAMN,EAAA,CAAGC,EAAE;EACnB,CAAC;EACD,OAAOK,GAAA;AACT;AAEA,eAAsBE,mBAAmBR,EAAA,EAAgC;EACvE,MAAMC,EAAA,GAAKQ,kBAAA,CAAmB;EAG9B,MAAMC,KAAA,GACJtB,UAAA,CAAW,yBAAyB,KAAKU,iBAAA;EAC3C,MAAMa,OAAA,GAAUD,KAAA,CAAME,GAAA,CAAIX,EAAE,KAAK,IAAIY,OAAA,CAAQ;EAC7CH,KAAA,CAAMI,GAAA,CAAIb,EAAA,EAAIU,OAAO;EACrBX,EAAA,CAAGW,OAAO;AACZ;AAEO,SAASI,aAAaC,IAAA,EAAeC,IAAA,EAAe;
|
|
1
|
+
{"version":3,"names":["SERVER_CONTEXT_KEY","AsyncLocalStorage","_ctxKey","Symbol","for","key","read","globalThis","ASYNC_LOCAL_STORE","current","_","requestAsyncLocalStore","process","env","VITE_ENVIRONMENT","newCache","WeakMap","asyncHeadersCache","runWithAsyncLocalContext","cb","id","_id","Math","random","store","out","run","setResponseHeaders","ensureAsyncLocalID","cache","headers","get","Headers","set","mergeHeaders","onto","from","setCookies","getSetCookie","length","cookie","append","forEach","value","key2","delete","globalId","GLOBAL_ID_KEY","globalIdKey","VERCEL","getStore","Error","SERVER_CONTEXTS_KEY","serverContexts","setServerContext","data","context","Object","assign","getServerContext","useServerContext","useContext","setServerData","postRenderData","getServerData"],"sources":["../../../src/vite/one-server-only.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { mergeHeaders } from "./one-server-only.mjs";
|
|
3
|
+
describe("mergeHeaders", () => {
|
|
4
|
+
it("merges regular headers", () => {
|
|
5
|
+
const onto = new Headers({
|
|
6
|
+
"content-type": "text/html"
|
|
7
|
+
});
|
|
8
|
+
const from = new Headers({
|
|
9
|
+
"x-custom": "value"
|
|
10
|
+
});
|
|
11
|
+
mergeHeaders(onto, from);
|
|
12
|
+
expect(onto.get("content-type")).toBe("text/html");
|
|
13
|
+
expect(onto.get("x-custom")).toBe("value");
|
|
14
|
+
});
|
|
15
|
+
it("overrides existing headers with set()", () => {
|
|
16
|
+
const onto = new Headers({
|
|
17
|
+
"cache-control": "no-cache"
|
|
18
|
+
});
|
|
19
|
+
const from = new Headers({
|
|
20
|
+
"cache-control": "max-age=3600"
|
|
21
|
+
});
|
|
22
|
+
mergeHeaders(onto, from);
|
|
23
|
+
expect(onto.get("cache-control")).toBe("max-age=3600");
|
|
24
|
+
});
|
|
25
|
+
it("deletes headers when value is undefined", () => {
|
|
26
|
+
const onto = new Headers({
|
|
27
|
+
"x-remove": "present"
|
|
28
|
+
});
|
|
29
|
+
const from = new Headers();
|
|
30
|
+
from.set("x-remove", "undefined");
|
|
31
|
+
mergeHeaders(onto, from);
|
|
32
|
+
expect(onto.has("x-remove")).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
it("preserves multiple set-cookie headers from source", () => {
|
|
35
|
+
const onto = new Headers();
|
|
36
|
+
const from = new Headers();
|
|
37
|
+
from.append("set-cookie", "session=abc123; Path=/; HttpOnly");
|
|
38
|
+
from.append("set-cookie", "theme=dark; Path=/");
|
|
39
|
+
mergeHeaders(onto, from);
|
|
40
|
+
const cookies = onto.getSetCookie();
|
|
41
|
+
expect(cookies).toHaveLength(2);
|
|
42
|
+
expect(cookies).toContain("session=abc123; Path=/; HttpOnly");
|
|
43
|
+
expect(cookies).toContain("theme=dark; Path=/");
|
|
44
|
+
});
|
|
45
|
+
it("preserves existing set-cookie headers on target when merging", () => {
|
|
46
|
+
const onto = new Headers();
|
|
47
|
+
onto.append("set-cookie", "existing=keep; Path=/");
|
|
48
|
+
const from = new Headers();
|
|
49
|
+
from.append("set-cookie", "new=added; Path=/");
|
|
50
|
+
mergeHeaders(onto, from);
|
|
51
|
+
const cookies = onto.getSetCookie();
|
|
52
|
+
expect(cookies).toHaveLength(2);
|
|
53
|
+
expect(cookies).toContain("existing=keep; Path=/");
|
|
54
|
+
expect(cookies).toContain("new=added; Path=/");
|
|
55
|
+
});
|
|
56
|
+
it("handles three or more set-cookie headers", () => {
|
|
57
|
+
const onto = new Headers();
|
|
58
|
+
const from = new Headers();
|
|
59
|
+
from.append("set-cookie", "a=1; Path=/");
|
|
60
|
+
from.append("set-cookie", "b=2; Path=/");
|
|
61
|
+
from.append("set-cookie", "c=3; Path=/");
|
|
62
|
+
mergeHeaders(onto, from);
|
|
63
|
+
const cookies = onto.getSetCookie();
|
|
64
|
+
expect(cookies).toHaveLength(3);
|
|
65
|
+
expect(cookies).toContain("a=1; Path=/");
|
|
66
|
+
expect(cookies).toContain("b=2; Path=/");
|
|
67
|
+
expect(cookies).toContain("c=3; Path=/");
|
|
68
|
+
});
|
|
69
|
+
it("merges set-cookie alongside regular headers", () => {
|
|
70
|
+
const onto = new Headers();
|
|
71
|
+
const from = new Headers({
|
|
72
|
+
"content-type": "text/html"
|
|
73
|
+
});
|
|
74
|
+
from.append("set-cookie", "session=abc; Path=/");
|
|
75
|
+
from.append("set-cookie", "csrf=xyz; Path=/");
|
|
76
|
+
mergeHeaders(onto, from);
|
|
77
|
+
expect(onto.get("content-type")).toBe("text/html");
|
|
78
|
+
const cookies = onto.getSetCookie();
|
|
79
|
+
expect(cookies).toHaveLength(2);
|
|
80
|
+
expect(cookies).toContain("session=abc; Path=/");
|
|
81
|
+
expect(cookies).toContain("csrf=xyz; Path=/");
|
|
82
|
+
});
|
|
83
|
+
it("handles source with no set-cookie headers", () => {
|
|
84
|
+
const onto = new Headers();
|
|
85
|
+
const from = new Headers({
|
|
86
|
+
"x-foo": "bar"
|
|
87
|
+
});
|
|
88
|
+
mergeHeaders(onto, from);
|
|
89
|
+
expect(onto.getSetCookie()).toHaveLength(0);
|
|
90
|
+
expect(onto.get("x-foo")).toBe("bar");
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=one-server-only.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","mergeHeaders","onto","Headers","from","get","toBe","set","has","append","cookies","getSetCookie","toHaveLength","toContain"],"sources":["../../../src/vite/one-server-only.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAA,EAAUC,MAAA,EAAQC,EAAA,QAAU;AACrC,SAASC,YAAA,QAAoB;AAE7BH,QAAA,CAAS,gBAAgB,MAAM;EAC7BE,EAAA,CAAG,0BAA0B,MAAM;IACjC,MAAME,IAAA,GAAO,IAAIC,OAAA,CAAQ;MAAE,gBAAgB;IAAY,CAAC;IACxD,MAAMC,IAAA,GAAO,IAAID,OAAA,CAAQ;MAAE,YAAY;IAAQ,CAAC;IAChDF,YAAA,CAAaC,IAAA,EAAME,IAAI;IACvBL,MAAA,CAAOG,IAAA,CAAKG,GAAA,CAAI,cAAc,CAAC,EAAEC,IAAA,CAAK,WAAW;IACjDP,MAAA,CAAOG,IAAA,CAAKG,GAAA,CAAI,UAAU,CAAC,EAAEC,IAAA,CAAK,OAAO;EAC3C,CAAC;EAEDN,EAAA,CAAG,yCAAyC,MAAM;IAChD,MAAME,IAAA,GAAO,IAAIC,OAAA,CAAQ;MAAE,iBAAiB;IAAW,CAAC;IACxD,MAAMC,IAAA,GAAO,IAAID,OAAA,CAAQ;MAAE,iBAAiB;IAAe,CAAC;IAC5DF,YAAA,CAAaC,IAAA,EAAME,IAAI;IACvBL,MAAA,CAAOG,IAAA,CAAKG,GAAA,CAAI,eAAe,CAAC,EAAEC,IAAA,CAAK,cAAc;EACvD,CAAC;EAEDN,EAAA,CAAG,2CAA2C,MAAM;IAClD,MAAME,IAAA,GAAO,IAAIC,OAAA,CAAQ;MAAE,YAAY;IAAU,CAAC;IAClD,MAAMC,IAAA,GAAO,IAAID,OAAA,CAAQ;IACzBC,IAAA,CAAKG,GAAA,CAAI,YAAY,WAAW;IAChCN,YAAA,CAAaC,IAAA,EAAME,IAAI;IACvBL,MAAA,CAAOG,IAAA,CAAKM,GAAA,CAAI,UAAU,CAAC,EAAEF,IAAA,CAAK,KAAK;EACzC,CAAC;EAEDN,EAAA,CAAG,qDAAqD,MAAM;IAC5D,MAAME,IAAA,GAAO,IAAIC,OAAA,CAAQ;IACzB,MAAMC,IAAA,GAAO,IAAID,OAAA,CAAQ;IACzBC,IAAA,CAAKK,MAAA,CAAO,cAAc,kCAAkC;IAC5DL,IAAA,CAAKK,MAAA,CAAO,cAAc,oBAAoB;IAE9CR,YAAA,CAAaC,IAAA,EAAME,IAAI;IAEvB,MAAMM,OAAA,GAAUR,IAAA,CAAKS,YAAA,CAAa;IAClCZ,MAAA,CAAOW,OAAO,EAAEE,YAAA,CAAa,CAAC;IAC9Bb,MAAA,CAAOW,OAAO,EAAEG,SAAA,CAAU,kCAAkC;IAC5Dd,MAAA,CAAOW,OAAO,EAAEG,SAAA,CAAU,oBAAoB;EAChD,CAAC;EAEDb,EAAA,CAAG,gEAAgE,MAAM;IACvE,MAAME,IAAA,GAAO,IAAIC,OAAA,CAAQ;IACzBD,IAAA,CAAKO,MAAA,CAAO,cAAc,uBAAuB;IAEjD,MAAML,IAAA,GAAO,IAAID,OAAA,CAAQ;IACzBC,IAAA,CAAKK,MAAA,CAAO,cAAc,mBAAmB;IAE7CR,YAAA,CAAaC,IAAA,EAAME,IAAI;IAEvB,MAAMM,OAAA,GAAUR,IAAA,CAAKS,YAAA,CAAa;IAClCZ,MAAA,CAAOW,OAAO,EAAEE,YAAA,CAAa,CAAC;IAC9Bb,MAAA,CAAOW,OAAO,EAAEG,SAAA,CAAU,uBAAuB;IACjDd,MAAA,CAAOW,OAAO,EAAEG,SAAA,CAAU,mBAAmB;EAC/C,CAAC;EAEDb,EAAA,CAAG,4CAA4C,MAAM;IACnD,MAAME,IAAA,GAAO,IAAIC,OAAA,CAAQ;IACzB,MAAMC,IAAA,GAAO,IAAID,OAAA,CAAQ;IACzBC,IAAA,CAAKK,MAAA,CAAO,cAAc,aAAa;IACvCL,IAAA,CAAKK,MAAA,CAAO,cAAc,aAAa;IACvCL,IAAA,CAAKK,MAAA,CAAO,cAAc,aAAa;IAEvCR,YAAA,CAAaC,IAAA,EAAME,IAAI;IAEvB,MAAMM,OAAA,GAAUR,IAAA,CAAKS,YAAA,CAAa;IAClCZ,MAAA,CAAOW,OAAO,EAAEE,YAAA,CAAa,CAAC;IAC9Bb,MAAA,CAAOW,OAAO,EAAEG,SAAA,CAAU,aAAa;IACvCd,MAAA,CAAOW,OAAO,EAAEG,SAAA,CAAU,aAAa;IACvCd,MAAA,CAAOW,OAAO,EAAEG,SAAA,CAAU,aAAa;EACzC,CAAC;EAEDb,EAAA,CAAG,+CAA+C,MAAM;IACtD,MAAME,IAAA,GAAO,IAAIC,OAAA,CAAQ;IACzB,MAAMC,IAAA,GAAO,IAAID,OAAA,CAAQ;MAAE,gBAAgB;IAAY,CAAC;IACxDC,IAAA,CAAKK,MAAA,CAAO,cAAc,qBAAqB;IAC/CL,IAAA,CAAKK,MAAA,CAAO,cAAc,kBAAkB;IAE5CR,YAAA,CAAaC,IAAA,EAAME,IAAI;IAEvBL,MAAA,CAAOG,IAAA,CAAKG,GAAA,CAAI,cAAc,CAAC,EAAEC,IAAA,CAAK,WAAW;IACjD,MAAMI,OAAA,GAAUR,IAAA,CAAKS,YAAA,CAAa;IAClCZ,MAAA,CAAOW,OAAO,EAAEE,YAAA,CAAa,CAAC;IAC9Bb,MAAA,CAAOW,OAAO,EAAEG,SAAA,CAAU,qBAAqB;IAC/Cd,MAAA,CAAOW,OAAO,EAAEG,SAAA,CAAU,kBAAkB;EAC9C,CAAC;EAEDb,EAAA,CAAG,6CAA6C,MAAM;IACpD,MAAME,IAAA,GAAO,IAAIC,OAAA,CAAQ;IACzB,MAAMC,IAAA,GAAO,IAAID,OAAA,CAAQ;MAAE,SAAS;IAAM,CAAC;IAC3CF,YAAA,CAAaC,IAAA,EAAME,IAAI;IACvBL,MAAA,CAAOG,IAAA,CAAKS,YAAA,CAAa,CAAC,EAAEC,YAAA,CAAa,CAAC;IAC1Cb,MAAA,CAAOG,IAAA,CAAKG,GAAA,CAAI,OAAO,CAAC,EAAEC,IAAA,CAAK,KAAK;EACtC,CAAC;AACH,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { mergeHeaders } from "./one-server-only.native.js";
|
|
3
|
+
describe("mergeHeaders", function () {
|
|
4
|
+
it("merges regular headers", function () {
|
|
5
|
+
var onto = new Headers({
|
|
6
|
+
"content-type": "text/html"
|
|
7
|
+
});
|
|
8
|
+
var from = new Headers({
|
|
9
|
+
"x-custom": "value"
|
|
10
|
+
});
|
|
11
|
+
mergeHeaders(onto, from);
|
|
12
|
+
expect(onto.get("content-type")).toBe("text/html");
|
|
13
|
+
expect(onto.get("x-custom")).toBe("value");
|
|
14
|
+
});
|
|
15
|
+
it("overrides existing headers with set()", function () {
|
|
16
|
+
var onto = new Headers({
|
|
17
|
+
"cache-control": "no-cache"
|
|
18
|
+
});
|
|
19
|
+
var from = new Headers({
|
|
20
|
+
"cache-control": "max-age=3600"
|
|
21
|
+
});
|
|
22
|
+
mergeHeaders(onto, from);
|
|
23
|
+
expect(onto.get("cache-control")).toBe("max-age=3600");
|
|
24
|
+
});
|
|
25
|
+
it("deletes headers when value is undefined", function () {
|
|
26
|
+
var onto = new Headers({
|
|
27
|
+
"x-remove": "present"
|
|
28
|
+
});
|
|
29
|
+
var from = new Headers();
|
|
30
|
+
from.set("x-remove", "undefined");
|
|
31
|
+
mergeHeaders(onto, from);
|
|
32
|
+
expect(onto.has("x-remove")).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
it("preserves multiple set-cookie headers from source", function () {
|
|
35
|
+
var onto = new Headers();
|
|
36
|
+
var from = new Headers();
|
|
37
|
+
from.append("set-cookie", "session=abc123; Path=/; HttpOnly");
|
|
38
|
+
from.append("set-cookie", "theme=dark; Path=/");
|
|
39
|
+
mergeHeaders(onto, from);
|
|
40
|
+
var cookies = onto.getSetCookie();
|
|
41
|
+
expect(cookies).toHaveLength(2);
|
|
42
|
+
expect(cookies).toContain("session=abc123; Path=/; HttpOnly");
|
|
43
|
+
expect(cookies).toContain("theme=dark; Path=/");
|
|
44
|
+
});
|
|
45
|
+
it("preserves existing set-cookie headers on target when merging", function () {
|
|
46
|
+
var onto = new Headers();
|
|
47
|
+
onto.append("set-cookie", "existing=keep; Path=/");
|
|
48
|
+
var from = new Headers();
|
|
49
|
+
from.append("set-cookie", "new=added; Path=/");
|
|
50
|
+
mergeHeaders(onto, from);
|
|
51
|
+
var cookies = onto.getSetCookie();
|
|
52
|
+
expect(cookies).toHaveLength(2);
|
|
53
|
+
expect(cookies).toContain("existing=keep; Path=/");
|
|
54
|
+
expect(cookies).toContain("new=added; Path=/");
|
|
55
|
+
});
|
|
56
|
+
it("handles three or more set-cookie headers", function () {
|
|
57
|
+
var onto = new Headers();
|
|
58
|
+
var from = new Headers();
|
|
59
|
+
from.append("set-cookie", "a=1; Path=/");
|
|
60
|
+
from.append("set-cookie", "b=2; Path=/");
|
|
61
|
+
from.append("set-cookie", "c=3; Path=/");
|
|
62
|
+
mergeHeaders(onto, from);
|
|
63
|
+
var cookies = onto.getSetCookie();
|
|
64
|
+
expect(cookies).toHaveLength(3);
|
|
65
|
+
expect(cookies).toContain("a=1; Path=/");
|
|
66
|
+
expect(cookies).toContain("b=2; Path=/");
|
|
67
|
+
expect(cookies).toContain("c=3; Path=/");
|
|
68
|
+
});
|
|
69
|
+
it("merges set-cookie alongside regular headers", function () {
|
|
70
|
+
var onto = new Headers();
|
|
71
|
+
var from = new Headers({
|
|
72
|
+
"content-type": "text/html"
|
|
73
|
+
});
|
|
74
|
+
from.append("set-cookie", "session=abc; Path=/");
|
|
75
|
+
from.append("set-cookie", "csrf=xyz; Path=/");
|
|
76
|
+
mergeHeaders(onto, from);
|
|
77
|
+
expect(onto.get("content-type")).toBe("text/html");
|
|
78
|
+
var cookies = onto.getSetCookie();
|
|
79
|
+
expect(cookies).toHaveLength(2);
|
|
80
|
+
expect(cookies).toContain("session=abc; Path=/");
|
|
81
|
+
expect(cookies).toContain("csrf=xyz; Path=/");
|
|
82
|
+
});
|
|
83
|
+
it("handles source with no set-cookie headers", function () {
|
|
84
|
+
var onto = new Headers();
|
|
85
|
+
var from = new Headers({
|
|
86
|
+
"x-foo": "bar"
|
|
87
|
+
});
|
|
88
|
+
mergeHeaders(onto, from);
|
|
89
|
+
expect(onto.getSetCookie()).toHaveLength(0);
|
|
90
|
+
expect(onto.get("x-foo")).toBe("bar");
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=one-server-only.test.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","mergeHeaders","onto","Headers","from","get","toBe","set","has","append","cookies","getSetCookie","toHaveLength","toContain"],"sources":["../../../src/vite/one-server-only.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -66,7 +66,8 @@ async function getResponseWithAddedHeaders(response, id) {
|
|
|
66
66
|
try {
|
|
67
67
|
if (response instanceof Response) {
|
|
68
68
|
const cloned = response.clone();
|
|
69
|
-
const headers = new Headers(
|
|
69
|
+
const headers = new Headers();
|
|
70
|
+
mergeHeaders(headers, cloned.headers);
|
|
70
71
|
mergeHeaders(headers, asyncHeaders);
|
|
71
72
|
response = new Response(cloned.body, {
|
|
72
73
|
status: cloned.status,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isResponse","asyncHeadersCache","mergeHeaders","requestAsyncLocalStore","runWithAsyncLocalContext","_nextId","createId","_id","resolveResponse","getResponse","store","globalThis","id","response","run","getResponseWithAddedHeaders","err","withRequestContext","fn","resolveAPIEndpoint","runEndpoint","request","params","imported","requestType","method","handler","default","console","warn","cache","asyncHeaders","get","Response","cloned","clone","headers","Headers","body","status","statusText","json","has","set","error"],"sources":["../../../src/vite/resolveResponse.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,UAAA,QAAkB;AAC3B,SAEEC,iBAAA,EACAC,YAAA,EACAC,sBAAA,EACAC,wBAAA,QACK;AAGP,IAAIC,OAAA,GAAU;AACd,SAASC,SAAA,EAAkB;EACzB,OAAO;IAAEC,GAAA,EAAKF,OAAA;EAAU;AAC1B;AAEA,eAAsBG,gBAAgBC,WAAA,EAAsC;EAE1E,MAAMC,KAAA,GACJP,sBAAA,IACCQ,UAAA,CAAW,8BAA8B;EAC5C,IAAID,KAAA,EAAO;IACT,MAAME,EAAA,GAAKN,QAAA,CAAS;IACpB,IAAIO,QAAA;IACJ,MAAMH,KAAA,CAAMI,GAAA,CAAIF,EAAA,EAAI,YAAY;MAC9B,IAAI;QACFC,QAAA,GAAW,MAAMJ,WAAA,CAAY;QAC7BI,QAAA,GAAW,MAAME,2BAAA,CAA4BF,QAAA,EAAWD,EAAE;MAC5D,SAASI,GAAA,EAAK;QACZ,IAAIhB,UAAA,CAAWgB,GAAG,GAAG;UACnBH,QAAA,GAAWG,GAAA;QACb,OAAO;UACL,MAAMA,GAAA;QACR;MACF;IACF,CAAC;IACD,OAAOH,QAAA;EACT;EAEA,OAAOT,wBAAA,CAAyB,MAAOQ,EAAA,IAAO;IAC5C,IAAI;MACF,MAAMC,QAAA,GAAW,MAAMJ,WAAA,CAAY;MACnC,OAAO,MAAMM,2BAAA,CAA4BF,QAAA,EAAUD,EAAE;IACvD,SAASI,GAAA,EAAK;MACZ,IAAIhB,UAAA,CAAWgB,GAAG,GAAG;QACnB,OAAOA,GAAA;MACT;MACA,MAAMA,GAAA;IACR;EACF,CAAC;AACH;AAKO,SAASC,mBAAsBC,EAAA,EAAkC;EACtE,MAAMR,KAAA,GAAQP,sBAAA;EACd,IAAIO,KAAA,EAAO;IACT,MAAME,EAAA,GAAKN,QAAA,CAAS;IACpB,OAAOI,KAAA,CAAMI,GAAA,CAAIF,EAAA,EAAIM,EAAE;EACzB;EACA,OAAOA,EAAA,CAAG;AACZ;AAEO,SAASC,mBAEdC,WAAA,EACAC,OAAA,EACAC,MAAA,EACA;EACA,OAAOd,eAAA,CAAgB,YAAY;IACjC,MAAMe,QAAA,GAAW,MAAMH,WAAA,CAAY;IACnC,MAAMI,WAAA,GAAcH,OAAA,CAAQI,MAAA,IAAU;IACtC,MAAMC,OAAA,GAAUH,QAAA,CAASC,WAAW,KAAKD,QAAA,CAASI,OAAA;IAClD,IAAI,CAACD,OAAA,EAAS;MACZE,OAAA,CAAQC,IAAA,CAAK,gCAAgCL,WAAW,EAAE;MAC1D;IACF;IACA,OAAO,MAAME,OAAA,CAAQL,OAAA,EAAS;MAAEC;IAAO,CAAC;EAC1C,CAAC;AACH;AAEA,eAAeP,4BAA4BF,QAAA,EAAeD,EAAA,EAAY;EAEpE,MAAMkB,KAAA,GACJnB,UAAA,CAAW,yBAAyB,KAAKV,iBAAA;EAC3C,MAAM8B,YAAA,GAAeD,KAAA,CAAME,GAAA,CAAIpB,EAAE;EAEjC,IAAImB,YAAA,EAAc;IAChB,IAAI;MACF,IAAIlB,QAAA,YAAoBoB,QAAA,EAAU;QAMhC,MAAMC,MAAA,GAASrB,QAAA,CAASsB,KAAA,CAAM;QAC9B,MAAMC,OAAA,GAAU,IAAIC,OAAA,
|
|
1
|
+
{"version":3,"names":["isResponse","asyncHeadersCache","mergeHeaders","requestAsyncLocalStore","runWithAsyncLocalContext","_nextId","createId","_id","resolveResponse","getResponse","store","globalThis","id","response","run","getResponseWithAddedHeaders","err","withRequestContext","fn","resolveAPIEndpoint","runEndpoint","request","params","imported","requestType","method","handler","default","console","warn","cache","asyncHeaders","get","Response","cloned","clone","headers","Headers","body","status","statusText","json","has","set","error"],"sources":["../../../src/vite/resolveResponse.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -79,7 +79,8 @@ async function getResponseWithAddedHeaders(response, id) {
|
|
|
79
79
|
try {
|
|
80
80
|
if (_instanceof(response, Response)) {
|
|
81
81
|
var cloned = response.clone();
|
|
82
|
-
var headers = new Headers(
|
|
82
|
+
var headers = new Headers();
|
|
83
|
+
mergeHeaders(headers, cloned.headers);
|
|
83
84
|
mergeHeaders(headers, asyncHeaders);
|
|
84
85
|
response = new Response(cloned.body, {
|
|
85
86
|
status: cloned.status,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isResponse","asyncHeadersCache","mergeHeaders","requestAsyncLocalStore","runWithAsyncLocalContext","_instanceof","left","right","Symbol","hasInstance","_type_of","obj","constructor","_nextId","createId","_id","resolveResponse","getResponse","store","globalThis","id","response","run","getResponseWithAddedHeaders","err","id2","response2","withRequestContext","fn","resolveAPIEndpoint","runEndpoint","request","params","imported","requestType","method","handler","default","console","warn","_globalThis___vxrnasyncHeadersCache","cache","asyncHeaders","get","Response","cloned","clone","headers","Headers","body","status","statusText","json"],"sources":["../../../src/vite/resolveResponse.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,UAAA,QAAkB;AAC3B,SAAAC,iBAAA,EAAAC,YAAA,EAAAC,sBAAA,EAAAC,wBAAA;AAAA,SAEEC,YAAAC,IAAA,EAAAC,KAAA;EACA,IAAAA,KAAA,mBAAAC,MAAA,oBAAAD,KAAA,CAAAC,MAAA,CAAAC,WAAA;IACA,SAAAF,KAAA,CAAAC,MAAA,CAAAC,WAAA,EAAAH,IAAA;EACA;IAAA,OACKA,IAAA,YAAAC,KAAA;EAGP;AACA;AACE,SAAOG,QAAOA,CAAAC,GAAA;EAChB;;EAEA,OAAAA,GAAA,IAAsB,OAAAH,MAAA,KAAgB,WAAsC,IAAAG,GAAA,CAAAC,WAAA,KAAAJ,MAAA,qBAAAG,GAAA;AAE1E;AAGA,IAAAE,OAAI,GAAO;AACT,SAAAC,QAAWA,CAAA;EACX,OAAI;IACJC,GAAA,EAAAF,OAAY;EACV;AACE;AACA,eAAAG,eAAiBA,CAAAC,WAAA;EAAyC,IAC5DC,KAAA,GAAAf,sBAAc,aAAAA,sBAAA,cAAAA,sBAAA,GAAAgB,UAAA;EACZ,IAAAD,KAAA,EAAI;IACF,IAAAE,EAAA,GAAAN,QAAW;IAAA,IACbO,QAAO;IACL,MAAAH,KAAA,CAAMI,GAAA,CAAAF,EAAA;MAAA,IACR;QACFC,QAAA,SAAAJ,WAAA;QACDI,QAAA,SAAAE,2BAAA,CAAAF,QAAA,EAAAD,EAAA;MACD,SAAOI,GAAA;QACT,IAAAxB,UAAA,CAAAwB,GAAA;UAEOH,QAAA,GAAAG,GAAA;QACD;UACF,MAAMA,GAAA;QACN;MACF;IACE;IACE,OAAAH,QAAO;EAAA;EAET,OAAAjB,wBAAM,iBAAAqB,GAAA;IACR;MACD,IAAAC,SAAA,SAAAT,WAAA;MACH,aAAAM,2BAAA,CAAAG,SAAA,EAAAD,GAAA;IAKO,SAASD,GAAA;MACd,IAAMxB,UAAQ,CAAAwB,GAAA;QACV,OAAOA,GAAA;MACT;MACA,MAAOA,GAAA;IACT;EACA;AACF;AAEO,SAASG,mBAEdC,EAAA;EAIA,IAAAV,KAAO,GAAAf,sBAAgB;EACrB,IAAAe,KAAM;IACN,IAAAE,EAAM,GAAAN,QAAA;IACN,OAAMI,KAAA,CAAAI,GAAU,CAAAF,EAAA,EAAAQ,EAAA;EAChB;EACE,OAAAA,EAAA;AACA;AAAA,SACFC,mBAAAC,WAAA,EAAAC,OAAA,EAAAC,MAAA;EACA,OAAAhB,eAAa,CAAQ,kBAAW;IACjC,IAAAiB,QAAA,SAAAH,WAAA;IACH,IAAAI,WAAA,GAAAH,OAAA,CAAAI,MAAA;IAEA,IAAAC,OAAe,GAAAH,QAAA,CAAAC,WAAA,KAA4BD,QAAA,CAAAI,OAA2B;IAEpE,IAAM,CAAAD,OACJ;MACFE,OAAM,CAAAC,IAAA,iCAA2BL,WAAA;MAE7B;IACF;IACE,OAAI,MAAAE,OAAA,CAAAL,OAAoB;MAMtBC;IACA;EACA;AACA;
|
|
1
|
+
{"version":3,"names":["isResponse","asyncHeadersCache","mergeHeaders","requestAsyncLocalStore","runWithAsyncLocalContext","_instanceof","left","right","Symbol","hasInstance","_type_of","obj","constructor","_nextId","createId","_id","resolveResponse","getResponse","store","globalThis","id","response","run","getResponseWithAddedHeaders","err","id2","response2","withRequestContext","fn","resolveAPIEndpoint","runEndpoint","request","params","imported","requestType","method","handler","default","console","warn","_globalThis___vxrnasyncHeadersCache","cache","asyncHeaders","get","Response","cloned","clone","headers","Headers","body","status","statusText","json"],"sources":["../../../src/vite/resolveResponse.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.15.
|
|
3
|
+
"version": "1.15.4",
|
|
4
4
|
"license": "BSD-3-Clause",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"setup.mjs",
|
|
@@ -165,17 +165,17 @@
|
|
|
165
165
|
"@react-navigation/routers": "~7.5.3",
|
|
166
166
|
"@swc/core": "^1.14.0",
|
|
167
167
|
"@ungap/structured-clone": "^1.2.0",
|
|
168
|
-
"@vxrn/color-scheme": "1.15.
|
|
169
|
-
"@vxrn/compiler": "1.15.
|
|
170
|
-
"@vxrn/resolve": "1.15.
|
|
171
|
-
"@vxrn/tslib-lite": "1.15.
|
|
172
|
-
"@vxrn/use-isomorphic-layout-effect": "1.15.
|
|
173
|
-
"@vxrn/vite-plugin-metro": "1.15.
|
|
168
|
+
"@vxrn/color-scheme": "1.15.4",
|
|
169
|
+
"@vxrn/compiler": "1.15.4",
|
|
170
|
+
"@vxrn/resolve": "1.15.4",
|
|
171
|
+
"@vxrn/tslib-lite": "1.15.4",
|
|
172
|
+
"@vxrn/use-isomorphic-layout-effect": "1.15.4",
|
|
173
|
+
"@vxrn/vite-plugin-metro": "1.15.4",
|
|
174
174
|
"babel-dead-code-elimination": "1.0.10",
|
|
175
175
|
"babel-plugin-module-resolver": "^5.0.2",
|
|
176
176
|
"citty": "^0.1.6",
|
|
177
177
|
"core-js": "^3.38.1",
|
|
178
|
-
"create-vxrn": "1.15.
|
|
178
|
+
"create-vxrn": "1.15.4",
|
|
179
179
|
"escape-string-regexp": "^5.0.0",
|
|
180
180
|
"expo-linking": "~55.0.7",
|
|
181
181
|
"expo-modules-core": "~55.0.16",
|
|
@@ -195,7 +195,7 @@
|
|
|
195
195
|
"ts-pattern": "^5.6.2",
|
|
196
196
|
"use-latest-callback": "^0.2.3",
|
|
197
197
|
"vite": "^8.0.0",
|
|
198
|
-
"vxrn": "1.15.
|
|
198
|
+
"vxrn": "1.15.4",
|
|
199
199
|
"ws": "^8.18.0",
|
|
200
200
|
"xxhashjs": "^0.2.2"
|
|
201
201
|
},
|
package/src/Root.tsx
CHANGED
|
@@ -187,7 +187,9 @@ export function Root(props: RootProps) {
|
|
|
187
187
|
}
|
|
188
188
|
|
|
189
189
|
if (serverMode === 'spa-shell') {
|
|
190
|
-
// hydrate
|
|
190
|
+
// hydrate matching server placeholder, then flip to render real content.
|
|
191
|
+
// the flip happens in useLayoutEffect (synchronous, before paint) so the
|
|
192
|
+
// first client render matches the server (no hydration mismatch).
|
|
191
193
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
192
194
|
const [isSpaShell, setIsSpaShell] = useState(true)
|
|
193
195
|
|
|
@@ -196,6 +198,29 @@ export function Root(props: RootProps) {
|
|
|
196
198
|
setIsSpaShell(false)
|
|
197
199
|
}, [])
|
|
198
200
|
|
|
201
|
+
// after the flip, re-resolve navigation state from the URL so that
|
|
202
|
+
// late-mounting navigators (inside SPA layouts) get their params.
|
|
203
|
+
// the onStateChange handler in useLinking preserves query params
|
|
204
|
+
// from the URL when the focused route has no params yet.
|
|
205
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
206
|
+
useLayoutEffect(() => {
|
|
207
|
+
if (!isSpaShell) {
|
|
208
|
+
const initialPath = window.location.pathname + window.location.search
|
|
209
|
+
requestAnimationFrame(() => {
|
|
210
|
+
if (window.location.pathname + window.location.search !== initialPath) return
|
|
211
|
+
const nav = store.navigationRef?.current
|
|
212
|
+
if (!nav) return
|
|
213
|
+
const linking = getLinking()
|
|
214
|
+
if (linking?.getStateFromPath) {
|
|
215
|
+
const freshState = linking.getStateFromPath(initialPath, linking.config)
|
|
216
|
+
if (freshState) {
|
|
217
|
+
nav.resetRoot(freshState)
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
})
|
|
221
|
+
}
|
|
222
|
+
}, [isSpaShell])
|
|
223
|
+
|
|
199
224
|
return (
|
|
200
225
|
<SpaShellContext.Provider value={isSpaShell}>{contents}</SpaShellContext.Provider>
|
|
201
226
|
)
|
package/src/fork/useLinking.ts
CHANGED
|
@@ -566,7 +566,18 @@ export function useLinking(
|
|
|
566
566
|
|
|
567
567
|
const pendingPath = pendingPopStatePathRef.current
|
|
568
568
|
const route = findFocusedRoute(state)
|
|
569
|
-
|
|
569
|
+
let path = getPathForRoute(route, state)
|
|
570
|
+
|
|
571
|
+
// when navigators mount late (e.g. during spa-shell hydration), the
|
|
572
|
+
// focused route may have no params yet. if the pathname matches the
|
|
573
|
+
// current URL but search params were lost, preserve them so query
|
|
574
|
+
// params like ?disableZero aren't stripped during the transition.
|
|
575
|
+
if (typeof window !== 'undefined' && !route?.params) {
|
|
576
|
+
const currentSearch = window.location.search
|
|
577
|
+
if (currentSearch && !path.includes('?') && window.location.pathname === path) {
|
|
578
|
+
path = path + currentSearch
|
|
579
|
+
}
|
|
580
|
+
}
|
|
570
581
|
|
|
571
582
|
// @modified - extract mask from linkOptions for route masking
|
|
572
583
|
const maskOptions = (state as any).linkOptions?.mask
|
package/src/hooks.tsx
CHANGED
|
@@ -4,6 +4,7 @@ import { router } from './router/imperative-api'
|
|
|
4
4
|
import { RouteParamsContext, useRouteNode } from './router/Route'
|
|
5
5
|
import { RouteInfoContext } from './router/RouteInfoContext'
|
|
6
6
|
import { navigationRef, useStoreRootState, useStoreRouteInfo } from './router/router'
|
|
7
|
+
import { getServerContext } from './vite/one-server-only'
|
|
7
8
|
|
|
8
9
|
type SearchParams = OneRouter.SearchParams
|
|
9
10
|
|
|
@@ -117,7 +118,24 @@ export function useSegments<TSegments extends string[] = string[]>(): TSegments
|
|
|
117
118
|
* ```
|
|
118
119
|
*/
|
|
119
120
|
export function usePathname(): string {
|
|
120
|
-
|
|
121
|
+
const routeInfoPathname = useRouteInfo().pathname
|
|
122
|
+
if (import.meta.env.SSR) {
|
|
123
|
+
// on server, prefer path from per-request async local storage
|
|
124
|
+
// to avoid stale module-level routeInfo between SSR renders
|
|
125
|
+
try {
|
|
126
|
+
const ctx = getServerContext()
|
|
127
|
+
if (ctx?.loaderProps?.path) {
|
|
128
|
+
return stripTrailingSlash(ctx.loaderProps.path)
|
|
129
|
+
}
|
|
130
|
+
} catch {
|
|
131
|
+
// no ALS context available, fall through
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return stripTrailingSlash(routeInfoPathname)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function stripTrailingSlash(path: string): string {
|
|
138
|
+
return path.length > 1 && path.endsWith('/') ? path.slice(0, -1) : path
|
|
121
139
|
}
|
|
122
140
|
|
|
123
141
|
/**
|
|
@@ -379,16 +379,18 @@ export function getQualifiedRouteComponent(value: RouteNode) {
|
|
|
379
379
|
}, [])
|
|
380
380
|
}
|
|
381
381
|
|
|
382
|
-
// in spa-shell mode, only
|
|
383
|
-
// layouts
|
|
384
|
-
//
|
|
385
|
-
// without this, navigators remount when SpaShellContext flips
|
|
386
|
-
// and react navigation loses url-matched state, causing
|
|
387
|
-
// redirects like /beta/signup -> /admin -> /app/undefined
|
|
382
|
+
// in spa-shell mode, only SSG/SSR layouts render on the server.
|
|
383
|
+
// SPA layouts and leaf pages get a placeholder, swapped for real
|
|
384
|
+
// content after hydration.
|
|
388
385
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
389
386
|
const isSpaShell = useContext(SpaShellContext)
|
|
390
|
-
if (isSpaShell && props.segment !== ''
|
|
391
|
-
|
|
387
|
+
if (isSpaShell && props.segment !== '') {
|
|
388
|
+
const isServerRenderedLayout =
|
|
389
|
+
value.children?.length &&
|
|
390
|
+
(value.layoutRenderMode === 'ssg' || value.layoutRenderMode === 'ssr')
|
|
391
|
+
if (!isServerRenderedLayout) {
|
|
392
|
+
return <div data-one-spa-content="" />
|
|
393
|
+
}
|
|
392
394
|
}
|
|
393
395
|
|
|
394
396
|
const res = value.loadRoute()
|
package/src/server/oneServe.ts
CHANGED
|
@@ -24,6 +24,21 @@ import { getFetchStaticHtml } from './staticHtmlFetcher'
|
|
|
24
24
|
|
|
25
25
|
const debugRouter = process.env.ONE_DEBUG_ROUTER
|
|
26
26
|
|
|
27
|
+
// forwards response headers to a hono context, preserving individual
|
|
28
|
+
// set-cookie values (Headers.forEach joins them into one unparseable string)
|
|
29
|
+
function forwardHeaders(response: Response, context: { header: Function }) {
|
|
30
|
+
const setCookies = (response.headers as any).getSetCookie?.() as string[] | undefined
|
|
31
|
+
if (setCookies?.length) {
|
|
32
|
+
for (const cookie of setCookies) {
|
|
33
|
+
context.header('set-cookie', cookie, { append: true })
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
response.headers.forEach((value: string, key: string) => {
|
|
37
|
+
if (key === 'set-cookie') return
|
|
38
|
+
context.header(key, value)
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
|
|
27
42
|
async function readStaticHtml(htmlPath: string, outDir = 'dist'): Promise<string | null> {
|
|
28
43
|
const fetchStaticHtml = getFetchStaticHtml()
|
|
29
44
|
if (fetchStaticHtml) {
|
|
@@ -777,9 +792,7 @@ url: ${url}`)
|
|
|
777
792
|
if (isResponse(response)) {
|
|
778
793
|
if (isStatusRedirect(response.status)) {
|
|
779
794
|
const location = `${response.headers.get('location') || ''}`
|
|
780
|
-
response
|
|
781
|
-
context.header(key, value)
|
|
782
|
-
})
|
|
795
|
+
forwardHeaders(response, context)
|
|
783
796
|
return context.redirect(location, response.status)
|
|
784
797
|
}
|
|
785
798
|
// cache-control is already set in ssrHtmlHeaders for SSR responses
|
|
@@ -845,9 +858,7 @@ url: ${url}`)
|
|
|
845
858
|
|
|
846
859
|
if (isStatusRedirect(response.status)) {
|
|
847
860
|
const location = `${response.headers.get('location') || ''}`
|
|
848
|
-
response
|
|
849
|
-
context.header(key, value)
|
|
850
|
-
})
|
|
861
|
+
forwardHeaders(response, context)
|
|
851
862
|
return context.redirect(location, response.status)
|
|
852
863
|
}
|
|
853
864
|
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { mergeHeaders } from './one-server-only'
|
|
3
|
+
|
|
4
|
+
describe('mergeHeaders', () => {
|
|
5
|
+
it('merges regular headers', () => {
|
|
6
|
+
const onto = new Headers({ 'content-type': 'text/html' })
|
|
7
|
+
const from = new Headers({ 'x-custom': 'value' })
|
|
8
|
+
mergeHeaders(onto, from)
|
|
9
|
+
expect(onto.get('content-type')).toBe('text/html')
|
|
10
|
+
expect(onto.get('x-custom')).toBe('value')
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
it('overrides existing headers with set()', () => {
|
|
14
|
+
const onto = new Headers({ 'cache-control': 'no-cache' })
|
|
15
|
+
const from = new Headers({ 'cache-control': 'max-age=3600' })
|
|
16
|
+
mergeHeaders(onto, from)
|
|
17
|
+
expect(onto.get('cache-control')).toBe('max-age=3600')
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('deletes headers when value is undefined', () => {
|
|
21
|
+
const onto = new Headers({ 'x-remove': 'present' })
|
|
22
|
+
const from = new Headers()
|
|
23
|
+
from.set('x-remove', 'undefined')
|
|
24
|
+
mergeHeaders(onto, from)
|
|
25
|
+
expect(onto.has('x-remove')).toBe(false)
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
it('preserves multiple set-cookie headers from source', () => {
|
|
29
|
+
const onto = new Headers()
|
|
30
|
+
const from = new Headers()
|
|
31
|
+
from.append('set-cookie', 'session=abc123; Path=/; HttpOnly')
|
|
32
|
+
from.append('set-cookie', 'theme=dark; Path=/')
|
|
33
|
+
|
|
34
|
+
mergeHeaders(onto, from)
|
|
35
|
+
|
|
36
|
+
const cookies = onto.getSetCookie()
|
|
37
|
+
expect(cookies).toHaveLength(2)
|
|
38
|
+
expect(cookies).toContain('session=abc123; Path=/; HttpOnly')
|
|
39
|
+
expect(cookies).toContain('theme=dark; Path=/')
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
it('preserves existing set-cookie headers on target when merging', () => {
|
|
43
|
+
const onto = new Headers()
|
|
44
|
+
onto.append('set-cookie', 'existing=keep; Path=/')
|
|
45
|
+
|
|
46
|
+
const from = new Headers()
|
|
47
|
+
from.append('set-cookie', 'new=added; Path=/')
|
|
48
|
+
|
|
49
|
+
mergeHeaders(onto, from)
|
|
50
|
+
|
|
51
|
+
const cookies = onto.getSetCookie()
|
|
52
|
+
expect(cookies).toHaveLength(2)
|
|
53
|
+
expect(cookies).toContain('existing=keep; Path=/')
|
|
54
|
+
expect(cookies).toContain('new=added; Path=/')
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('handles three or more set-cookie headers', () => {
|
|
58
|
+
const onto = new Headers()
|
|
59
|
+
const from = new Headers()
|
|
60
|
+
from.append('set-cookie', 'a=1; Path=/')
|
|
61
|
+
from.append('set-cookie', 'b=2; Path=/')
|
|
62
|
+
from.append('set-cookie', 'c=3; Path=/')
|
|
63
|
+
|
|
64
|
+
mergeHeaders(onto, from)
|
|
65
|
+
|
|
66
|
+
const cookies = onto.getSetCookie()
|
|
67
|
+
expect(cookies).toHaveLength(3)
|
|
68
|
+
expect(cookies).toContain('a=1; Path=/')
|
|
69
|
+
expect(cookies).toContain('b=2; Path=/')
|
|
70
|
+
expect(cookies).toContain('c=3; Path=/')
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it('merges set-cookie alongside regular headers', () => {
|
|
74
|
+
const onto = new Headers()
|
|
75
|
+
const from = new Headers({ 'content-type': 'text/html' })
|
|
76
|
+
from.append('set-cookie', 'session=abc; Path=/')
|
|
77
|
+
from.append('set-cookie', 'csrf=xyz; Path=/')
|
|
78
|
+
|
|
79
|
+
mergeHeaders(onto, from)
|
|
80
|
+
|
|
81
|
+
expect(onto.get('content-type')).toBe('text/html')
|
|
82
|
+
const cookies = onto.getSetCookie()
|
|
83
|
+
expect(cookies).toHaveLength(2)
|
|
84
|
+
expect(cookies).toContain('session=abc; Path=/')
|
|
85
|
+
expect(cookies).toContain('csrf=xyz; Path=/')
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
it('handles source with no set-cookie headers', () => {
|
|
89
|
+
const onto = new Headers()
|
|
90
|
+
const from = new Headers({ 'x-foo': 'bar' })
|
|
91
|
+
mergeHeaders(onto, from)
|
|
92
|
+
expect(onto.getSetCookie()).toHaveLength(0)
|
|
93
|
+
expect(onto.get('x-foo')).toBe('bar')
|
|
94
|
+
})
|
|
95
|
+
})
|
|
@@ -72,7 +72,18 @@ export async function setResponseHeaders(cb: (headers: Headers) => void) {
|
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
export function mergeHeaders(onto: Headers, from: Headers) {
|
|
75
|
+
// set-cookie must be handled specially: Headers.forEach joins multiple
|
|
76
|
+
// set-cookie values into one string, which browsers can't parse.
|
|
77
|
+
// use getSetCookie() to get individual values and append each one.
|
|
78
|
+
const setCookies = from.getSetCookie?.()
|
|
79
|
+
if (setCookies?.length) {
|
|
80
|
+
for (const cookie of setCookies) {
|
|
81
|
+
onto.append('set-cookie', cookie)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
75
85
|
from.forEach((value, key) => {
|
|
86
|
+
if (key === 'set-cookie') return // already handled above
|
|
76
87
|
if (value === undefined || value === 'undefined') {
|
|
77
88
|
onto.delete(key)
|
|
78
89
|
} else {
|
|
@@ -94,7 +94,8 @@ async function getResponseWithAddedHeaders(response: any, id: object) {
|
|
|
94
94
|
// clone first so the original body stream isn't locked/consumed
|
|
95
95
|
// (Response.json() bodies are single-use ReadableStreams)
|
|
96
96
|
const cloned = response.clone()
|
|
97
|
-
const headers = new Headers(
|
|
97
|
+
const headers = new Headers()
|
|
98
|
+
mergeHeaders(headers, cloned.headers)
|
|
98
99
|
mergeHeaders(headers, asyncHeaders)
|
|
99
100
|
response = new Response(cloned.body, {
|
|
100
101
|
status: cloned.status,
|
package/types/Root.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Root.d.ts","sourceRoot":"","sources":["../src/Root.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,SAAS,EAMf,MAAM,OAAO,CAAA;AAYd,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAMlD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAcvC,KAAK,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG;IAC7C,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,mBAAmB,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,GAAG,CAAC,YAAY,CAAA;IAC/B,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,CAAA;CAClB,CAAA;AAED,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,GAAG,CAAC,YAAY,CAAA;IACzB,QAAQ,CAAC,EAAE,GAAG,CAAA;IACd,OAAO,CAAC,EAAE,iBAAiB,CAAC;QAAE,QAAQ,EAAE,SAAS,CAAA;KAAE,CAAC,CAAA;IACpD,wBAAwB,CAAC,EAAE,wBAAwB,GAAG;QACpD,KAAK,CAAC,EAAE;YACN,IAAI,EAAE,OAAO,CAAA;YACb,MAAM,EAAE;gBACN,OAAO,EAAE,MAAM,CAAA;gBACf,UAAU,EAAE,MAAM,CAAA;gBAClB,IAAI,EAAE,MAAM,CAAA;gBACZ,IAAI,EAAE,MAAM,CAAA;gBACZ,MAAM,EAAE,MAAM,CAAA;gBACd,YAAY,EAAE,MAAM,CAAA;aACrB,CAAA;SACF,CAAA;KACF,CAAA;CACF,CAAA;AAQD,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"Root.d.ts","sourceRoot":"","sources":["../src/Root.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,SAAS,EAMf,MAAM,OAAO,CAAA;AAYd,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAMlD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAcvC,KAAK,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG;IAC7C,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,mBAAmB,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,GAAG,CAAC,YAAY,CAAA;IAC/B,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,CAAA;CAClB,CAAA;AAED,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,GAAG,CAAC,YAAY,CAAA;IACzB,QAAQ,CAAC,EAAE,GAAG,CAAA;IACd,OAAO,CAAC,EAAE,iBAAiB,CAAC;QAAE,QAAQ,EAAE,SAAS,CAAA;KAAE,CAAC,CAAA;IACpD,wBAAwB,CAAC,EAAE,wBAAwB,GAAG;QACpD,KAAK,CAAC,EAAE;YACN,IAAI,EAAE,OAAO,CAAA;YACb,MAAM,EAAE;gBACN,OAAO,EAAE,MAAM,CAAA;gBACf,UAAU,EAAE,MAAM,CAAA;gBAClB,IAAI,EAAE,MAAM,CAAA;gBACZ,IAAI,EAAE,MAAM,CAAA;gBACZ,MAAM,EAAE,MAAM,CAAA;gBACd,YAAY,EAAE,MAAM,CAAA;aACrB,CAAA;SACF,CAAA;KACF,CAAA;CACF,CAAA;AAQD,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,kDAyJpC"}
|