one 1.25.8 → 1.25.10

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.
@@ -355,9 +355,11 @@ if (typeof document === 'undefined') globalThis.document = {}
355
355
  recordTiming('ssrRender', performance.now() - t0)
356
356
 
357
357
  // Apply after-LCP script loading if enabled
358
- // Load all preloads (not just critical) to ensure good TTI after first paint
359
358
  if (useAfterLCP) {
360
- html = applyAfterLCPScriptLoad(html, preloads)
359
+ html = applyAfterLCPScriptLoad(
360
+ html,
361
+ useAfterLCPAggressive ? criticalPreloads || preloads : preloads
362
+ )
361
363
  }
362
364
 
363
365
  t0 = performance.now()
@@ -400,7 +402,10 @@ if (typeof document === 'undefined') globalThis.document = {}
400
402
  recordTiming('spaShellRender', performance.now() - t0)
401
403
 
402
404
  if (useAfterLCP) {
403
- html = applyAfterLCPScriptLoad(html, preloads)
405
+ html = applyAfterLCPScriptLoad(
406
+ html,
407
+ useAfterLCPAggressive ? criticalPreloads || preloads : preloads
408
+ )
404
409
  }
405
410
 
406
411
  t0 = performance.now()
@@ -0,0 +1,153 @@
1
+ import type { NavigationState } from '@react-navigation/core'
2
+ import React from 'react'
3
+ import TestRenderer, { act } from 'react-test-renderer'
4
+ import { afterEach, describe, expect, it, vi } from 'vitest'
5
+ import { getLinkingConfig } from '../router/getLinkingConfig'
6
+ import { getRoutes } from '../router/getRoutes'
7
+ import { getMockContext } from '../testing-utils'
8
+ import { getStateFromPath } from './getStateFromPath'
9
+ import { useLinking } from './useLinking.native'
10
+
11
+ ;(globalThis as any).IS_REACT_ACT_ENVIRONMENT = true
12
+
13
+ const linking = getLinkingConfig(
14
+ getRoutes(
15
+ getMockContext([
16
+ '_layout.tsx',
17
+ 'home/_layout.tsx',
18
+ 'home/[projectId]/_layout.tsx',
19
+ 'home/[projectId]/index.tsx',
20
+ 'settings.tsx',
21
+ ])
22
+ )!
23
+ )
24
+ const config = linking.config!
25
+
26
+ const currentState: NavigationState = {
27
+ stale: false,
28
+ type: 'stack',
29
+ key: 'root-stack',
30
+ index: 1,
31
+ routeNames: ['home', 'settings'],
32
+ routes: [
33
+ {
34
+ name: 'home',
35
+ key: 'home-travelo',
36
+ params: { projectId: 'proj_example_travelo' },
37
+ state: {
38
+ stale: false,
39
+ type: 'stack',
40
+ key: 'home-stack',
41
+ index: 0,
42
+ routeNames: ['[projectId]'],
43
+ routes: [
44
+ {
45
+ name: '[projectId]',
46
+ key: 'project-travelo',
47
+ params: { projectId: 'proj_example_travelo' },
48
+ },
49
+ ],
50
+ },
51
+ },
52
+ { name: 'settings', key: 'settings' },
53
+ ],
54
+ }
55
+
56
+ type LinkingOverrides = Partial<Parameters<typeof useLinking>[1]>
57
+
58
+ async function captureIncomingAction(overrides: LinkingOverrides = {}) {
59
+ const linkedState = getStateFromPath('/home/proj_example_pennywise?tab=design', config)!
60
+ const dispatch = vi.fn()
61
+ let listener: ((url: string) => void) | undefined
62
+ const navigation = {
63
+ dispatch,
64
+ getRootState: () => currentState,
65
+ }
66
+ const ref = { current: navigation }
67
+
68
+ function Harness() {
69
+ useLinking(
70
+ ref as any,
71
+ {
72
+ ...linking,
73
+ enabled: true,
74
+ prefixes: ['contrast:///'],
75
+ getInitialURL: () => null,
76
+ getStateFromPath: () => linkedState,
77
+ subscribe: (nextListener) => {
78
+ listener = nextListener
79
+ return () => {}
80
+ },
81
+ ...overrides,
82
+ },
83
+ () => {}
84
+ )
85
+ return null
86
+ }
87
+
88
+ let renderer: TestRenderer.ReactTestRenderer
89
+ await act(async () => {
90
+ renderer = TestRenderer.create(<Harness />)
91
+ })
92
+ act(() => listener!('contrast:///home/proj_example_pennywise?tab=design'))
93
+
94
+ return {
95
+ action: dispatch.mock.calls[0]?.[0],
96
+ linkedState,
97
+ renderer: renderer!,
98
+ }
99
+ }
100
+
101
+ afterEach(() => {
102
+ vi.restoreAllMocks()
103
+ })
104
+
105
+ describe('native incoming links', () => {
106
+ it('applies every nested dynamic param when leaving a sibling route', async () => {
107
+ const { action, renderer } = await captureIncomingAction()
108
+
109
+ expect(action).toStrictEqual({
110
+ type: 'NAVIGATE',
111
+ target: 'root-stack',
112
+ payload: {
113
+ key: undefined,
114
+ name: 'home',
115
+ params: {
116
+ projectId: 'proj_example_pennywise',
117
+ screen: '[projectId]',
118
+ params: {
119
+ projectId: 'proj_example_pennywise',
120
+ tab: 'design',
121
+ screen: 'index',
122
+ params: {
123
+ projectId: 'proj_example_pennywise',
124
+ tab: 'design',
125
+ },
126
+ },
127
+ },
128
+ },
129
+ })
130
+
131
+ act(() => renderer.unmount())
132
+ })
133
+
134
+ it('keeps a configured getActionFromState in control', async () => {
135
+ const customAction = { type: 'NAVIGATE', payload: { name: 'custom' } } as const
136
+ const getActionFromState = vi.fn(
137
+ (_state: Parameters<NonNullable<LinkingOverrides['getActionFromState']>>[0]) =>
138
+ customAction
139
+ )
140
+ const { action, linkedState, renderer } = await captureIncomingAction({
141
+ getActionFromState,
142
+ })
143
+
144
+ expect(action).toBe(customAction)
145
+ expect(getActionFromState).toHaveBeenCalledOnce()
146
+ expect(getActionFromState.mock.calls[0]![0]).toEqual({
147
+ ...linkedState,
148
+ routes: [expect.not.objectContaining({ key: expect.anything() })],
149
+ })
150
+
151
+ act(() => renderer.unmount())
152
+ })
153
+ })
@@ -16,6 +16,7 @@ import {
16
16
  import type { LinkingOptions } from '@react-navigation/native' // @modified: import from @react-navigation/native
17
17
  import * as React from 'react'
18
18
  import { Linking, Platform } from 'react-native'
19
+ import { getNavigateAction } from '../router/utils/getNavigateAction' // @modified
19
20
  import { extractPathFromURL } from './extractPathFromURL'
20
21
 
21
22
  type ResultState = ReturnType<typeof getStateFromPathDefault>
@@ -24,13 +25,9 @@ type Options = LinkingOptions<ParamListBase>
24
25
 
25
26
  const linkingHandlers: symbol[] = []
26
27
 
27
- // @modified: our fork of getStateFromPath assigns deterministic route keys
28
- // (SSR/hydration stability), but upstream getActionFromState only produces a
29
- // nested NAVIGATE for keyless routes — keyed routes degrade to a whole-tree
30
- // RESET that the One router store immediately reverts, so incoming Linking
31
- // 'url' events never navigated on native. Strip the keys before deriving the
32
- // action; hydration keys only matter for web SSR, never for a live native
33
- // deep link.
28
+ // @modified: custom getActionFromState functions have received keyless routes
29
+ // since One added deterministic hydration keys. preserve that contract; the
30
+ // default native path uses getNavigateAction directly.
34
31
  type LinkingResultState = NonNullable<ResultState>
35
32
 
36
33
  function stripRouteKeys(state: LinkingResultState): LinkingResultState {
@@ -218,11 +215,12 @@ export function useLinking(
218
215
  return
219
216
  }
220
217
 
221
- // @modified: keys stripped so getActionFromState can produce NAVIGATE
222
- const action = getActionFromStateRef.current(
223
- stripRouteKeys(state),
224
- configRef.current
225
- )
218
+ // @modified: use One's action builder for the default path so incoming
219
+ // links get the same nested param propagation as imperative navigation.
220
+ const action =
221
+ getActionFromStateRef.current === getActionFromStateDefault
222
+ ? getNavigateAction(state, rootState)
223
+ : getActionFromStateRef.current(stripRouteKeys(state), configRef.current)
226
224
 
227
225
  if (action !== undefined) {
228
226
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"buildPage.d.ts","sourceRoot":"","sources":["../../src/cli/buildPage.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAkBnD,wBAAgB,iBAAiB,SAUhC;AAED,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,GAAG,EACX,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,EAC7B,mBAAmB,EAAE,GAAG,EACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACxC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,EAAE,MAAM,EAAE,EACnB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAC3B,WAAW,CAAC,EAAE,OAAO,EACrB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CA6a7B"}
1
+ {"version":3,"file":"buildPage.d.ts","sourceRoot":"","sources":["../../src/cli/buildPage.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAkBnD,wBAAgB,iBAAiB,SAUhC;AAED,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,GAAG,EACX,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,EAC7B,mBAAmB,EAAE,GAAG,EACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACxC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,EAAE,MAAM,EAAE,EACnB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAC3B,WAAW,CAAC,EAAE,OAAO,EACrB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAkb7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"useLinking.native.d.ts","sourceRoot":"","sources":["../../src/fork/useLinking.native.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAEnB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,KAAK,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAA;AAyB5C,wBAAgB,UAAU,CACxB,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,EAC3D,EACE,OAAc,EACd,QAAQ,EACR,MAAM,EACN,MAAM,EACN,aAQI,EACJ,SAmBC,EACD,gBAA0C,EAC1C,kBAA8C,GAC/C,EAAE,OAAO,EACV,kBAAkB,EAAE,CAAC,mBAAmB,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;EAoKtE"}
1
+ {"version":3,"file":"useLinking.native.d.ts","sourceRoot":"","sources":["../../src/fork/useLinking.native.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAEnB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,KAAK,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAA;AAqB5C,wBAAgB,UAAU,CACxB,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,EAC3D,EACE,OAAc,EACd,QAAQ,EACR,MAAM,EACN,MAAM,EACN,aAQI,EACJ,SAmBC,EACD,gBAA0C,EAC1C,kBAA8C,GAC/C,EAAE,OAAO,EACV,kBAAkB,EAAE,CAAC,mBAAmB,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;EAqKtE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useLinking.native.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLinking.native.test.d.ts","sourceRoot":"","sources":["../../src/fork/useLinking.native.test.tsx"],"names":[],"mappings":""}