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.
Files changed (75) hide show
  1. package/dist/cjs/Root.cjs +17 -0
  2. package/dist/cjs/Root.native.js +18 -0
  3. package/dist/cjs/Root.native.js.map +1 -1
  4. package/dist/cjs/fork/useLinking.cjs +7 -1
  5. package/dist/cjs/hooks.cjs +15 -1
  6. package/dist/cjs/hooks.native.js +16 -1
  7. package/dist/cjs/hooks.native.js.map +1 -1
  8. package/dist/cjs/router/useScreens.cjs +7 -4
  9. package/dist/cjs/router/useScreens.native.js +8 -5
  10. package/dist/cjs/router/useScreens.native.js.map +1 -1
  11. package/dist/cjs/server/oneServe.cjs +16 -6
  12. package/dist/cjs/server/oneServe.native.js +36 -6
  13. package/dist/cjs/server/oneServe.native.js.map +1 -1
  14. package/dist/cjs/vite/one-server-only.cjs +7 -0
  15. package/dist/cjs/vite/one-server-only.test.cjs +92 -0
  16. package/dist/cjs/vite/one-server-only.test.native.js +95 -0
  17. package/dist/cjs/vite/one-server-only.test.native.js.map +1 -0
  18. package/dist/cjs/vite/resolveResponse.cjs +2 -1
  19. package/dist/cjs/vite/resolveResponse.native.js +2 -1
  20. package/dist/cjs/vite/resolveResponse.native.js.map +1 -1
  21. package/dist/esm/Root.mjs +17 -0
  22. package/dist/esm/Root.mjs.map +1 -1
  23. package/dist/esm/Root.native.js +18 -0
  24. package/dist/esm/Root.native.js.map +1 -1
  25. package/dist/esm/fork/useLinking.mjs +7 -1
  26. package/dist/esm/fork/useLinking.mjs.map +1 -1
  27. package/dist/esm/hooks.mjs +14 -1
  28. package/dist/esm/hooks.mjs.map +1 -1
  29. package/dist/esm/hooks.native.js +15 -1
  30. package/dist/esm/hooks.native.js.map +1 -1
  31. package/dist/esm/router/useScreens.mjs +7 -4
  32. package/dist/esm/router/useScreens.mjs.map +1 -1
  33. package/dist/esm/router/useScreens.native.js +8 -5
  34. package/dist/esm/router/useScreens.native.js.map +1 -1
  35. package/dist/esm/server/oneServe.mjs +16 -6
  36. package/dist/esm/server/oneServe.mjs.map +1 -1
  37. package/dist/esm/server/oneServe.native.js +36 -6
  38. package/dist/esm/server/oneServe.native.js.map +1 -1
  39. package/dist/esm/vite/one-server-only.mjs +7 -0
  40. package/dist/esm/vite/one-server-only.mjs.map +1 -1
  41. package/dist/esm/vite/one-server-only.test.mjs +93 -0
  42. package/dist/esm/vite/one-server-only.test.mjs.map +1 -0
  43. package/dist/esm/vite/one-server-only.test.native.js +93 -0
  44. package/dist/esm/vite/one-server-only.test.native.js.map +1 -0
  45. package/dist/esm/vite/resolveResponse.mjs +2 -1
  46. package/dist/esm/vite/resolveResponse.mjs.map +1 -1
  47. package/dist/esm/vite/resolveResponse.native.js +2 -1
  48. package/dist/esm/vite/resolveResponse.native.js.map +1 -1
  49. package/package.json +9 -9
  50. package/src/Root.tsx +26 -1
  51. package/src/fork/useLinking.ts +12 -1
  52. package/src/hooks.tsx +19 -1
  53. package/src/router/useScreens.tsx +10 -8
  54. package/src/server/oneServe.ts +17 -6
  55. package/src/vite/one-server-only.test.ts +95 -0
  56. package/src/vite/one-server-only.tsx +11 -0
  57. package/src/vite/resolveResponse.ts +2 -1
  58. package/types/Root.d.ts.map +1 -1
  59. package/types/fork/useLinking.d.ts.map +1 -1
  60. package/types/hooks.d.ts.map +1 -1
  61. package/types/router/useScreens.d.ts.map +1 -1
  62. package/types/server/oneServe.d.ts.map +1 -1
  63. package/types/vite/one-server-only.d.ts.map +1 -1
  64. package/types/vite/one-server-only.test.d.ts +2 -0
  65. package/types/vite/one-server-only.test.d.ts.map +1 -0
  66. package/dist/cjs/utils/platform.cjs +0 -28
  67. package/dist/cjs/utils/platform.native.js +0 -31
  68. package/dist/cjs/utils/platform.native.js.map +0 -1
  69. package/dist/esm/utils/platform.mjs +0 -3
  70. package/dist/esm/utils/platform.mjs.map +0 -1
  71. package/dist/esm/utils/platform.native.js +0 -3
  72. package/dist/esm/utils/platform.native.js.map +0 -1
  73. package/src/utils/platform.ts +0 -5
  74. package/types/utils/platform.d.ts +0 -2
  75. 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":"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","ignoreList":[]}
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":"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","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(cloned.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":"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","ignoreList":[]}
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,CAAQ;QAC5BnC,YAAA,CAAakC,OAAA,EAASF,MAAA,CAAOE,OAAO;QACpClC,YAAA,CAAakC,OAAA,EAASL,YAAY;QAClClB,QAAA,GAAW,IAAIoB,QAAA,CAASC,MAAA,CAAOI,IAAA,EAAM;UACnCC,MAAA,EAAQL,MAAA,CAAOK,MAAA;UACfC,UAAA,EAAYN,MAAA,CAAOM,UAAA;UACnBJ;QACF,CAAC;MACH,OAAO;QACL,IAAIvB,QAAA,IAAY,OAAOA,QAAA,KAAa,UAAU;UAC5CA,QAAA,GAAWoB,QAAA,CAASQ,IAAA,CAAK5B,QAAA,EAAU;YAAEuB,OAAA,EAASL;UAAa,CAAC;QAC9D,OAAO;UAGL,MAAMK,OAAA,GAAU,IAAIC,OAAA,CAAQN,YAAY;UACxC,IAAI,CAACK,OAAA,CAAQM,GAAA,CAAI,cAAc,GAAG;YAGhCN,OAAA,CAAQO,GAAA,CAAI,gBAAgB,WAAW;UACzC;UACA9B,QAAA,GAAW,IAAIoB,QAAA,CAASpB,QAAA,EAAiB;YAAEuB;UAAQ,CAAC;QACtD;MACF;IACF,SAASpB,GAAA,EAAK;MACZY,OAAA,CAAQgB,KAAA,CAAM,gCAAgC5B,GAAG,EAAE;IACrD;EACF;EAEA,OAAOH,QAAA;AACT","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(cloned.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":"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","ignoreList":[]}
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.2",
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.2",
169
- "@vxrn/compiler": "1.15.2",
170
- "@vxrn/resolve": "1.15.2",
171
- "@vxrn/tslib-lite": "1.15.2",
172
- "@vxrn/use-isomorphic-layout-effect": "1.15.2",
173
- "@vxrn/vite-plugin-metro": "1.15.2",
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.2",
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.2",
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 with shell placeholder, then flip to render real page content
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
  )
@@ -566,7 +566,18 @@ export function useLinking(
566
566
 
567
567
  const pendingPath = pendingPopStatePathRef.current
568
568
  const route = findFocusedRoute(state)
569
- const path = getPathForRoute(route, state)
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
- return useRouteInfo().pathname
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 leaf pages render a placeholder.
383
- // layouts (routes with children) must render normally so their
384
- // navigators stay mounted across the hydration transition.
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 !== '' && !value.children?.length) {
391
- return <div data-one-spa-content="" />
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()
@@ -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.headers.forEach((value, key) => {
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.headers.forEach((value, key) => {
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(cloned.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,
@@ -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,kDAgIpC"}
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"}