@ankhorage/navigator 0.1.0 → 1.0.0

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 (42) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/dist/definitions/NavigatorPlan.d.ts +70 -7
  4. package/dist/definitions/NavigatorPlan.d.ts.map +1 -1
  5. package/dist/expo-router/createNavigatorPlan.d.ts +2 -1
  6. package/dist/expo-router/createNavigatorPlan.d.ts.map +1 -1
  7. package/dist/expo-router/createNavigatorPlan.js +174 -41
  8. package/dist/expo-router/createNavigatorPlan.js.map +1 -1
  9. package/dist/expo-router/resolveNavigatorConfig.d.ts +6 -0
  10. package/dist/expo-router/resolveNavigatorConfig.d.ts.map +1 -0
  11. package/dist/expo-router/resolveNavigatorConfig.js +48 -0
  12. package/dist/expo-router/resolveNavigatorConfig.js.map +1 -0
  13. package/dist/expo-router/resolveTabsNavigatorPlan.js +2 -2
  14. package/dist/expo-router/resolveTabsNavigatorPlan.js.map +1 -1
  15. package/dist/generation/generateNavigatorFiles.d.ts +4 -0
  16. package/dist/generation/generateNavigatorFiles.d.ts.map +1 -0
  17. package/dist/generation/generateNavigatorFiles.js +179 -0
  18. package/dist/generation/generateNavigatorFiles.js.map +1 -0
  19. package/dist/index.d.ts +3 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +2 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/metadata/index.d.ts +43 -3
  24. package/dist/metadata/index.d.ts.map +1 -1
  25. package/dist/metadata/index.js +19 -1
  26. package/dist/metadata/index.js.map +1 -1
  27. package/dist/topology/resolveNavigatorPreset.d.ts.map +1 -1
  28. package/dist/topology/resolveNavigatorPreset.js +6 -0
  29. package/dist/topology/resolveNavigatorPreset.js.map +1 -1
  30. package/dist/validation/validateNavigatorManifest.d.ts +5 -0
  31. package/dist/validation/validateNavigatorManifest.d.ts.map +1 -0
  32. package/dist/validation/validateNavigatorManifest.js +201 -0
  33. package/dist/validation/validateNavigatorManifest.js.map +1 -0
  34. package/dist/validation/validatePresetTopology.d.ts +5 -0
  35. package/dist/validation/validatePresetTopology.d.ts.map +1 -0
  36. package/dist/validation/validatePresetTopology.js +47 -0
  37. package/dist/validation/validatePresetTopology.js.map +1 -0
  38. package/package.json +4 -4
  39. package/dist/index.test.d.ts +0 -2
  40. package/dist/index.test.d.ts.map +0 -1
  41. package/dist/index.test.js +0 -107
  42. package/dist/index.test.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @ankhorage/navigator
2
2
 
3
+ ## 1.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - d4026a0: Add validated, deterministic Expo Router planning and file generation for Slot, native and JavaScript Stack, and Drawer navigators.
8
+
9
+ ## 0.1.1
10
+
11
+ ### Patch Changes
12
+
13
+ - 7f21197: Update Ankhorage dependencies: `@ankhorage/contracts`.
14
+
3
15
  ## 0.1.0
4
16
 
5
17
  ### Minor Changes
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  # NAVIGATOR
5
5
 
6
- ![license: MIT](././paradox/badges/license.svg) ![npm: v0.1.0](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
6
+ ![license: MIT](././paradox/badges/license.svg) ![npm: v0.1.1](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
7
7
 
8
8
  Standalone manifest-driven navigator capability for Expo Router across React Native and React Native Web.
9
9
 
@@ -1,8 +1,28 @@
1
- import type { NavigatorType } from '@ankhorage/contracts/navigator';
1
+ import type { CustomNavigatorNode, DrawerNavigatorOptions, NavigatorType, RouteDefinition, StackImplementation, StackScreenOptions } from '@ankhorage/contracts/navigator';
2
2
  export type NavigatorRuntimePlatform = 'android' | 'ios' | 'web';
3
3
  export type NavigatorResponsiveSize = 'compact' | 'medium' | 'expanded';
4
- export type NavigatorApiStability = 'stable' | 'unstable';
5
- export type ExpoRouterNavigatorModule = 'expo-router' | 'expo-router/drawer' | 'expo-router/js-tabs' | 'expo-router/js-top-tabs' | 'expo-router/ui' | 'expo-router/unstable-native-tabs';
4
+ export type NavigatorApiStability = 'stable' | 'alpha';
5
+ export type NavigatorSupportStatus = 'supported' | 'unavailable';
6
+ export type ExpoRouterNavigatorModule = 'expo-router' | 'expo-router/drawer' | 'expo-router/js-stack' | 'expo-router/js-tabs' | 'expo-router/js-top-tabs' | 'expo-router/ui' | 'expo-router/unstable-native-tabs';
7
+ export type NavigatorAdapterId = 'slot' | 'stack.native' | 'stack.javascript' | 'stack.experimental' | 'drawer' | 'tabs.native' | 'tabs.javascript' | 'tabs.custom' | 'split-view' | 'custom';
8
+ export interface NavigatorDiagnostic {
9
+ code: string;
10
+ severity: 'error' | 'warning';
11
+ path: string;
12
+ message: string;
13
+ }
14
+ export interface NavigatorValidationContext {
15
+ platform: NavigatorRuntimePlatform;
16
+ expoRouterVersion: string;
17
+ }
18
+ export interface NavigatorAdapterPlan {
19
+ id: NavigatorAdapterId;
20
+ module?: ExpoRouterNavigatorModule;
21
+ exportName?: string;
22
+ support: NavigatorSupportStatus;
23
+ stability: NavigatorApiStability;
24
+ limitations: readonly string[];
25
+ }
6
26
  export type ResolvedTabsImplementation = 'custom' | 'javascript' | 'native';
7
27
  export type ResolvedTabsPresentation = 'bottom' | 'top' | 'rail' | 'sidebar' | 'custom';
8
28
  export interface TabsNavigatorPlan {
@@ -16,22 +36,65 @@ export interface TabsNavigatorPlan {
16
36
  export interface NavigatorRoutePlan {
17
37
  name: string;
18
38
  path?: string;
39
+ label?: string;
40
+ icon?: RouteDefinition['icon'];
41
+ showInPrimaryNavigation?: boolean;
42
+ guards: readonly string[];
19
43
  screenId?: string;
44
+ stackOptions?: StackScreenOptions;
20
45
  navigator?: NavigatorNodePlan;
21
46
  }
22
47
  export interface NavigatorNodePlan {
23
48
  type: NavigatorType;
24
- module: ExpoRouterNavigatorModule;
25
- exportName: string;
26
- routes: NavigatorRoutePlan[];
49
+ pointer: string;
50
+ adapter: NavigatorAdapterPlan;
51
+ initialRouteName?: string;
52
+ routes: readonly NavigatorRoutePlan[];
53
+ stack?: {
54
+ implementation: StackImplementation;
55
+ options?: StackScreenOptions;
56
+ };
57
+ drawer?: {
58
+ options?: DrawerNavigatorOptions;
59
+ };
27
60
  tabs?: TabsNavigatorPlan;
61
+ splitView?: {
62
+ columns: {
63
+ primary: string;
64
+ supplementary?: string;
65
+ };
66
+ inspector?: string;
67
+ topColumnForCollapsing?: 'primary' | 'secondary' | 'supplementary';
68
+ };
69
+ custom?: {
70
+ navigatorId: string;
71
+ config?: CustomNavigatorNode['config'];
72
+ };
28
73
  }
29
74
  export interface NavigatorPlan {
30
- presetLayers: readonly NavigatorType[];
75
+ context: NavigatorValidationContext;
31
76
  root: NavigatorNodePlan;
77
+ diagnostics: readonly NavigatorDiagnostic[];
78
+ supported: boolean;
32
79
  flows: {
33
80
  onboarding: boolean;
34
81
  authentication: boolean;
35
82
  };
36
83
  }
84
+ export interface NavigatorScreenModule {
85
+ module: string;
86
+ exportName: string;
87
+ }
88
+ export interface NavigatorGenerationBindings {
89
+ screens: Readonly<Record<string, NavigatorScreenModule>>;
90
+ guards: Readonly<Record<string, NavigatorScreenModule>>;
91
+ flows?: {
92
+ onboardingRoute?: string;
93
+ authenticationRoute?: string;
94
+ };
95
+ }
96
+ export interface NavigatorGeneratedFile {
97
+ path: string;
98
+ contents: string;
99
+ }
37
100
  //# sourceMappingURL=NavigatorPlan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NavigatorPlan.d.ts","sourceRoot":"","sources":["../../src/definitions/NavigatorPlan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;AACjE,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AACxE,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE1D,MAAM,MAAM,yBAAyB,GACjC,aAAa,GACb,oBAAoB,GACpB,qBAAqB,GACrB,yBAAyB,GACzB,gBAAgB,GAChB,kCAAkC,CAAC;AAEvC,MAAM,MAAM,0BAA0B,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;AAC5E,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExF,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,0BAA0B,CAAC;IAC3C,MAAM,EAAE,yBAAyB,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,qBAAqB,CAAC;IACjC,YAAY,CAAC,EAAE,wBAAwB,CAAC;IACxC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,yBAAyB,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,SAAS,aAAa,EAAE,CAAC;IACvC,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE;QACL,UAAU,EAAE,OAAO,CAAC;QACpB,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;CACH"}
1
+ {"version":3,"file":"NavigatorPlan.d.ts","sourceRoot":"","sources":["../../src/definitions/NavigatorPlan.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,9 @@ import type { AppNavigatorManifest } from '@ankhorage/contracts/navigator';
2
2
  import type { NavigatorPlan, NavigatorResponsiveSize, NavigatorRuntimePlatform } from '../definitions/NavigatorPlan';
3
3
  export interface CreateNavigatorPlanOptions {
4
4
  platform: NavigatorRuntimePlatform;
5
+ expoRouterVersion: string;
5
6
  responsiveSize?: NavigatorResponsiveSize;
6
7
  }
7
- /*** Create the complete standalone Navigator plan from only the navigator desired-state slice. */
8
+ /*** Create a disposable, provider-aware plan from only the navigator desired-state slice. */
8
9
  export declare function createNavigatorPlan(manifest: AppNavigatorManifest, options: CreateNavigatorPlanOptions): NavigatorPlan;
9
10
  //# sourceMappingURL=createNavigatorPlan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createNavigatorPlan.d.ts","sourceRoot":"","sources":["../../src/expo-router/createNavigatorPlan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EAKrB,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAEV,aAAa,EACb,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,8BAA8B,CAAC;AAItC,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,cAAc,CAAC,EAAE,uBAAuB,CAAC;CAC1C;AA0ED,kGAAkG;AAClG,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,0BAA0B,GAClC,aAAa,CAUf"}
1
+ {"version":3,"file":"createNavigatorPlan.d.ts","sourceRoot":"","sources":["../../src/expo-router/createNavigatorPlan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EAIrB,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAGV,aAAa,EACb,uBAAuB,EAEvB,wBAAwB,EAEzB,MAAM,8BAA8B,CAAC;AAStC,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,uBAAuB,CAAC;CAC1C;AAoOD,6FAA6F;AAC7F,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,0BAA0B,GAClC,aAAa,CAmBf"}
@@ -1,59 +1,192 @@
1
- import { resolveNavigatorPreset } from '../topology/resolveNavigatorPreset';
1
+ import { validateNavigatorManifest } from '../validation/validateNavigatorManifest';
2
+ import { parseExpoRouterMajor, resolveEffectiveStackConfig, resolveEffectiveTabsConfig, } from './resolveNavigatorConfig';
2
3
  import { resolveTabsNavigatorPlan } from './resolveTabsNavigatorPlan';
3
- /*** Return node-local tabs configuration only when the node explicitly authors one. */
4
- function resolveNodeTabsConfig(node) {
5
- if (node.implementation !== undefined)
6
- return node;
7
- return node.native !== undefined || node.web !== undefined ? node : undefined;
8
- }
9
- /*** Resolve a platform-specific tabs override without dynamic object access. */
10
- function resolvePlatformTabsConfig(platforms, platform) {
11
- switch (platform) {
12
- case 'android':
13
- return platforms?.android?.tabs;
14
- case 'ios':
15
- return platforms?.ios?.tabs;
16
- case 'web':
17
- return platforms?.web?.tabs;
4
+ function createStackAdapter(stack, routerMajor) {
5
+ const implementation = stack?.implementation ?? 'native';
6
+ if (implementation === 'javascript') {
7
+ return {
8
+ id: 'stack.javascript',
9
+ module: 'expo-router/js-stack',
10
+ exportName: 'Stack',
11
+ support: routerMajor !== undefined && routerMajor >= 56 ? 'supported' : 'unavailable',
12
+ stability: 'stable',
13
+ limitations: ['Requires Expo Router 56.0.0 or newer.'],
14
+ };
18
15
  }
16
+ if (implementation === 'experimental') {
17
+ return {
18
+ id: 'stack.experimental',
19
+ support: 'unavailable',
20
+ stability: 'alpha',
21
+ limitations: ['Owned by the optional Experimental Stack adapter.'],
22
+ };
23
+ }
24
+ return {
25
+ id: 'stack.native',
26
+ module: 'expo-router',
27
+ exportName: 'Stack',
28
+ support: 'supported',
29
+ stability: 'stable',
30
+ limitations: [],
31
+ };
32
+ }
33
+ function createTabsAdapter(tabs) {
34
+ return {
35
+ id: `tabs.${tabs.implementation}`,
36
+ module: tabs.module,
37
+ exportName: tabs.exportName,
38
+ support: 'unavailable',
39
+ stability: tabs.stability,
40
+ limitations: tabs.implementation === 'native'
41
+ ? [
42
+ 'Owned by the optional Tabs adapter.',
43
+ 'Alpha API; unavailable on web and requires Expo Router 54.0.0 or newer.',
44
+ ]
45
+ : ['Owned by the optional Tabs adapter.'],
46
+ };
47
+ }
48
+ function createAdapter(node, stack, tabs, routerMajor) {
49
+ switch (node.type) {
50
+ case 'slot':
51
+ return {
52
+ id: 'slot',
53
+ module: 'expo-router',
54
+ exportName: 'Slot',
55
+ support: 'supported',
56
+ stability: 'stable',
57
+ limitations: [],
58
+ };
59
+ case 'stack':
60
+ return createStackAdapter(stack, routerMajor);
61
+ case 'drawer':
62
+ return {
63
+ id: 'drawer',
64
+ module: 'expo-router/drawer',
65
+ exportName: 'Drawer',
66
+ support: 'supported',
67
+ stability: 'stable',
68
+ limitations: [],
69
+ };
70
+ case 'tabs':
71
+ if (tabs === undefined)
72
+ throw new Error('Tabs planning did not resolve an adapter.');
73
+ return createTabsAdapter(tabs);
74
+ case 'split-view':
75
+ return {
76
+ id: 'split-view',
77
+ support: 'unavailable',
78
+ stability: 'alpha',
79
+ limitations: ['Owned by the optional Split View adapter.'],
80
+ };
81
+ case 'custom':
82
+ return {
83
+ id: 'custom',
84
+ support: 'unavailable',
85
+ stability: 'stable',
86
+ limitations: ['Requires an explicitly composed custom adapter.'],
87
+ };
88
+ }
89
+ }
90
+ function resolveTabsPlan(config, platform, responsiveSize) {
91
+ if (config?.implementation === 'native' && platform === 'web') {
92
+ return {
93
+ implementation: 'native',
94
+ module: 'expo-router/unstable-native-tabs',
95
+ exportName: 'NativeTabs',
96
+ stability: 'alpha',
97
+ };
98
+ }
99
+ return resolveTabsNavigatorPlan(config, platform, responsiveSize);
19
100
  }
20
- /*** Resolve effective tabs configuration using platform, node, default, then adaptive fallback. */
21
- function resolveEffectiveTabsConfig(manifest, node, platform) {
22
- return (resolvePlatformTabsConfig(manifest.platforms, platform) ??
23
- resolveNodeTabsConfig(node) ??
24
- manifest.defaults?.tabs);
101
+ function createNodeDetails(node, stack, tabs) {
102
+ switch (node.type) {
103
+ case 'stack':
104
+ return {
105
+ stack: {
106
+ implementation: stack?.implementation ?? 'native',
107
+ ...(stack?.options === undefined ? {} : { options: stack.options }),
108
+ },
109
+ };
110
+ case 'drawer':
111
+ return { drawer: { ...(node.options === undefined ? {} : { options: node.options }) } };
112
+ case 'tabs':
113
+ return tabs === undefined ? {} : { tabs };
114
+ case 'split-view':
115
+ return {
116
+ splitView: {
117
+ columns: {
118
+ primary: node.columns.primary.screenId,
119
+ ...(node.columns.supplementary === undefined
120
+ ? {}
121
+ : { supplementary: node.columns.supplementary.screenId }),
122
+ },
123
+ ...(node.inspector === undefined ? {} : { inspector: node.inspector.screenId }),
124
+ ...(node.topColumnForCollapsing === undefined
125
+ ? {}
126
+ : { topColumnForCollapsing: node.topColumnForCollapsing }),
127
+ },
128
+ };
129
+ case 'custom':
130
+ return {
131
+ custom: {
132
+ navigatorId: node.navigatorId,
133
+ ...(node.config === undefined ? {} : { config: node.config }),
134
+ },
135
+ };
136
+ case 'slot':
137
+ return {};
138
+ }
25
139
  }
26
- /*** Convert one navigator node into a provider-aware Expo Router generation plan. */
27
- function createNodePlan(manifest, node, platform, responsiveSize) {
28
- const routes = node.routes.map((route) => ({
140
+ function createRoutePlan(manifest, route, pointer, options, responsiveSize) {
141
+ return {
29
142
  name: route.name,
30
143
  ...(route.path === undefined ? {} : { path: route.path }),
144
+ ...(route.label === undefined ? {} : { label: route.label }),
145
+ ...(route.icon === undefined ? {} : { icon: route.icon }),
146
+ ...(route.showInPrimaryNavigation === undefined
147
+ ? {}
148
+ : { showInPrimaryNavigation: route.showInPrimaryNavigation }),
149
+ guards: route.guards ?? [],
31
150
  ...(route.screenId === undefined ? {} : { screenId: route.screenId }),
151
+ ...(route.stackOptions === undefined ? {} : { stackOptions: route.stackOptions }),
32
152
  ...(route.navigator === undefined
33
153
  ? {}
34
- : { navigator: createNodePlan(manifest, route.navigator, platform, responsiveSize) }),
35
- }));
36
- if (node.type === 'stack') {
37
- return { type: 'stack', module: 'expo-router', exportName: 'Stack', routes };
38
- }
39
- if (node.type === 'drawer') {
40
- return { type: 'drawer', module: 'expo-router/drawer', exportName: 'Drawer', routes };
41
- }
42
- const tabs = resolveTabsNavigatorPlan(resolveEffectiveTabsConfig(manifest, node, platform), platform, responsiveSize);
154
+ : {
155
+ navigator: createNodePlan(manifest, route.navigator, `${pointer}/navigator`, options, responsiveSize),
156
+ }),
157
+ };
158
+ }
159
+ function createNodePlan(manifest, node, pointer, options, responsiveSize) {
160
+ const stack = node.type === 'stack'
161
+ ? resolveEffectiveStackConfig(manifest, node, options.platform)
162
+ : undefined;
163
+ const tabs = node.type === 'tabs'
164
+ ? resolveTabsPlan(resolveEffectiveTabsConfig(manifest, node, options.platform), options.platform, responsiveSize)
165
+ : undefined;
166
+ const routes = node.routes.map((route, index) => createRoutePlan(manifest, route, `${pointer}/routes/${index}`, options, responsiveSize));
43
167
  return {
44
- type: 'tabs',
45
- module: tabs.module,
46
- exportName: tabs.exportName,
168
+ type: node.type,
169
+ pointer,
170
+ adapter: createAdapter(node, stack, tabs, parseExpoRouterMajor(options.expoRouterVersion)),
171
+ ...(node.initialRouteName === undefined ? {} : { initialRouteName: node.initialRouteName }),
47
172
  routes,
48
- tabs,
173
+ ...createNodeDetails(node, stack, tabs),
49
174
  };
50
175
  }
51
- /*** Create the complete standalone Navigator plan from only the navigator desired-state slice. */
176
+ /*** Create a disposable, provider-aware plan from only the navigator desired-state slice. */
52
177
  export function createNavigatorPlan(manifest, options) {
53
- const responsiveSize = options.responsiveSize ?? 'compact';
178
+ const context = {
179
+ platform: options.platform,
180
+ expoRouterVersion: options.expoRouterVersion,
181
+ };
182
+ const diagnostics = validateNavigatorManifest(manifest, context);
183
+ const root = createNodePlan(manifest, manifest, '', options, options.responsiveSize ?? 'compact');
54
184
  return {
55
- presetLayers: resolveNavigatorPreset(manifest.preset, manifest.type),
56
- root: createNodePlan(manifest, manifest, options.platform, responsiveSize),
185
+ context,
186
+ root,
187
+ diagnostics,
188
+ supported: diagnostics.every((diagnostic) => diagnostic.severity !== 'error') &&
189
+ root.adapter.support === 'supported',
57
190
  flows: {
58
191
  onboarding: manifest.flows?.onboarding ?? false,
59
192
  authentication: manifest.flows?.authentication ?? false,
@@ -1 +1 @@
1
- {"version":3,"file":"createNavigatorPlan.js","sourceRoot":"","sources":["../../src/expo-router/createNavigatorPlan.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAOtE,uFAAuF;AACvF,SAAS,qBAAqB,CAAC,IAAuB;IACpD,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnD,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAChF,CAAC;AAED,gFAAgF;AAChF,SAAS,yBAAyB,CAChC,SAAyC,EACzC,QAAkC;IAElC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;QAClC,KAAK,KAAK;YACR,OAAO,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC;QAC9B,KAAK,KAAK;YACR,OAAO,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC;IAChC,CAAC;AACH,CAAC;AAED,mGAAmG;AACnG,SAAS,0BAA0B,CACjC,QAA8B,EAC9B,IAAuB,EACvB,QAAkC;IAElC,OAAO,CACL,yBAAyB,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;QACvD,qBAAqB,CAAC,IAAI,CAAC;QAC3B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CACxB,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,SAAS,cAAc,CACrB,QAA8B,EAC9B,IAAmB,EACnB,QAAkC,EAClC,cAAuC;IAEvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QACzD,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrE,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS;YAC/B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,CAAC;KACxF,CAAC,CAAC,CAAC;IAEJ,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/E,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,oBAAoB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACxF,CAAC;IAED,MAAM,IAAI,GAAG,wBAAwB,CACnC,0BAA0B,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,EACpD,QAAQ,EACR,cAAc,CACf,CAAC;IACF,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,MAAM;QACN,IAAI;KACL,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,mBAAmB,CACjC,QAA8B,EAC9B,OAAmC;IAEnC,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,SAAS,CAAC;IAC3D,OAAO;QACL,YAAY,EAAE,sBAAsB,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC;QACpE,IAAI,EAAE,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC;QAC1E,KAAK,EAAE;YACL,UAAU,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,IAAI,KAAK;YAC/C,cAAc,EAAE,QAAQ,CAAC,KAAK,EAAE,cAAc,IAAI,KAAK;SACxD;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"createNavigatorPlan.js","sourceRoot":"","sources":["../../src/expo-router/createNavigatorPlan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { AppNavigatorManifest, StackImplementationConfig, StackNavigatorNode, TabsImplementationConfig, TabsNavigatorNode } from '@ankhorage/contracts/navigator';
2
+ import type { NavigatorRuntimePlatform } from '../definitions/NavigatorPlan';
3
+ export declare function parseExpoRouterMajor(version: string): number | undefined;
4
+ export declare function resolveEffectiveStackConfig(manifest: AppNavigatorManifest, node: StackNavigatorNode, platform: NavigatorRuntimePlatform): StackImplementationConfig;
5
+ export declare function resolveEffectiveTabsConfig(manifest: AppNavigatorManifest, node: TabsNavigatorNode, platform: NavigatorRuntimePlatform): TabsImplementationConfig | undefined;
6
+ //# sourceMappingURL=resolveNavigatorConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveNavigatorConfig.d.ts","sourceRoot":"","sources":["../../src/expo-router/resolveNavigatorConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EAEpB,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAE7E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxE;AA2CD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,oBAAoB,EAC9B,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,wBAAwB,GACjC,yBAAyB,CAM3B;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,oBAAoB,EAC9B,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,wBAAwB,GACjC,wBAAwB,GAAG,SAAS,CAMtC"}
@@ -0,0 +1,48 @@
1
+ export function parseExpoRouterMajor(version) {
2
+ const match = /^(\d+)\.\d+\.\d+(?:[-+].*)?$/u.exec(version);
3
+ return match?.[1] === undefined ? undefined : Number(match[1]);
4
+ }
5
+ function resolveNodeStackConfig(node) {
6
+ if (node.implementation === undefined && node.options === undefined)
7
+ return undefined;
8
+ return {
9
+ implementation: node.implementation ?? 'native',
10
+ ...(node.options === undefined ? {} : { options: node.options }),
11
+ };
12
+ }
13
+ function resolveNodeTabsConfig(node) {
14
+ if (node.implementation !== undefined)
15
+ return node;
16
+ return node.native !== undefined || node.web !== undefined ? node : undefined;
17
+ }
18
+ function resolvePlatformStackConfig(platforms, platform) {
19
+ switch (platform) {
20
+ case 'android':
21
+ return platforms?.android?.stack;
22
+ case 'ios':
23
+ return platforms?.ios?.stack;
24
+ case 'web':
25
+ return platforms?.web?.stack;
26
+ }
27
+ }
28
+ function resolvePlatformTabsConfig(platforms, platform) {
29
+ switch (platform) {
30
+ case 'android':
31
+ return platforms?.android?.tabs;
32
+ case 'ios':
33
+ return platforms?.ios?.tabs;
34
+ case 'web':
35
+ return platforms?.web?.tabs;
36
+ }
37
+ }
38
+ export function resolveEffectiveStackConfig(manifest, node, platform) {
39
+ return (resolvePlatformStackConfig(manifest.platforms, platform) ??
40
+ resolveNodeStackConfig(node) ??
41
+ manifest.defaults?.stack ?? { implementation: 'native' });
42
+ }
43
+ export function resolveEffectiveTabsConfig(manifest, node, platform) {
44
+ return (resolvePlatformTabsConfig(manifest.platforms, platform) ??
45
+ resolveNodeTabsConfig(node) ??
46
+ manifest.defaults?.tabs);
47
+ }
48
+ //# sourceMappingURL=resolveNavigatorConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveNavigatorConfig.js","sourceRoot":"","sources":["../../src/expo-router/resolveNavigatorConfig.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,KAAK,GAAG,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5D,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAwB;IACtD,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACtF,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,QAAQ;QAC/C,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;KACpC,CAAC;AACjC,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAuB;IACpD,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnD,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAChF,CAAC;AAED,SAAS,0BAA0B,CACjC,SAAyC,EACzC,QAAkC;IAElC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC;QACnC,KAAK,KAAK;YACR,OAAO,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC;QAC/B,KAAK,KAAK;YACR,OAAO,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC;IACjC,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAChC,SAAyC,EACzC,QAAkC;IAElC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;QAClC,KAAK,KAAK;YACR,OAAO,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC;QAC9B,KAAK,KAAK;YACR,OAAO,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC;IAChC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,QAA8B,EAC9B,IAAwB,EACxB,QAAkC;IAElC,OAAO,CACL,0BAA0B,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;QACxD,sBAAsB,CAAC,IAAI,CAAC;QAC5B,QAAQ,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CACzD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,QAA8B,EAC9B,IAAuB,EACvB,QAAkC;IAElC,OAAO,CACL,yBAAyB,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;QACvD,qBAAqB,CAAC,IAAI,CAAC;QAC3B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CACxB,CAAC;AACJ,CAAC"}
@@ -10,7 +10,7 @@ function resolveAdaptiveConfig(config) {
10
10
  ? config
11
11
  : undefined;
12
12
  }
13
- /*** Create the SDK 57 native-tabs plan and reject unsupported Web usage. */
13
+ /*** Create the alpha native-tabs plan and reject unsupported Web usage. */
14
14
  function createNativeTabsPlan(platform) {
15
15
  if (platform === 'web') {
16
16
  throw new Error('Native tabs are not available for the Web navigator plan.');
@@ -19,7 +19,7 @@ function createNativeTabsPlan(platform) {
19
19
  implementation: 'native',
20
20
  module: 'expo-router/unstable-native-tabs',
21
21
  exportName: 'NativeTabs',
22
- stability: 'unstable',
22
+ stability: 'alpha',
23
23
  };
24
24
  }
25
25
  /*** Create the stable JavaScript tabs plan for bottom or top presentation. */
@@ -1 +1 @@
1
- {"version":3,"file":"resolveTabsNavigatorPlan.js","sourceRoot":"","sources":["../../src/expo-router/resolveTabsNavigatorPlan.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,6BAA6B,EAAE,MAAM,+CAA+C,CAAC;AAE9F,MAAM,uBAAuB,GAAG;IAC9B,YAAY,EAAE,YAAY;CAClB,CAAC;AAEX,mFAAmF;AACnF,SAAS,qBAAqB,CAC5B,MAA4C;IAE5C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,MAAM,CAAC,cAAc,KAAK,SAAS,IAAI,MAAM,CAAC,cAAc,KAAK,UAAU;QAChF,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,4EAA4E;AAC5E,SAAS,oBAAoB,CAAC,QAAkC;IAC9D,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO;QACL,cAAc,EAAE,QAAQ;QACxB,MAAM,EAAE,kCAAkC;QAC1C,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE,UAAU;KACtB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAS,wBAAwB,CAAC,MAA4B;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,KAAK,KAAK,CAAC;IAC1C,OAAO;QACL,cAAc,EAAE,YAAY;QAC5B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,qBAAqB;QAC/D,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;QACpC,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;KACrC,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,SAAS,oBAAoB,CAC3B,MAAgD,EAChD,IAA6B;IAE7B,OAAO;QACL,cAAc,EAAE,QAAQ;QACxB,MAAM,EAAE,gBAAgB;QACxB,UAAU,EAAE,MAAM;QAClB,SAAS,EAAE,QAAQ;QACnB,GAAG,6BAA6B,CAAC,MAAM,EAAE,IAAI,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,SAAS,sBAAsB,CAC7B,MAA4C,EAC5C,QAAkC,EAClC,IAA6B;IAE7B,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC9D,OAAO,oBAAoB,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,uBAAuB,EAAE,IAAI,CAAC,CAAC;AACnG,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,wBAAwB,CACtC,MAA4C,EAC5C,QAAkC,EAClC,IAA6B;IAE7B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAEhF,QAAQ,MAAM,CAAC,cAAc,EAAE,CAAC;QAC9B,KAAK,SAAS,CAAC;QACf,KAAK,UAAU;YACb,OAAO,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACxC,KAAK,YAAY;YACf,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAC1C,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"resolveTabsNavigatorPlan.js","sourceRoot":"","sources":["../../src/expo-router/resolveTabsNavigatorPlan.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,6BAA6B,EAAE,MAAM,+CAA+C,CAAC;AAE9F,MAAM,uBAAuB,GAAG;IAC9B,YAAY,EAAE,YAAY;CAClB,CAAC;AAEX,mFAAmF;AACnF,SAAS,qBAAqB,CAC5B,MAA4C;IAE5C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,MAAM,CAAC,cAAc,KAAK,SAAS,IAAI,MAAM,CAAC,cAAc,KAAK,UAAU;QAChF,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,2EAA2E;AAC3E,SAAS,oBAAoB,CAAC,QAAkC;IAC9D,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO;QACL,cAAc,EAAE,QAAQ;QACxB,MAAM,EAAE,kCAAkC;QAC1C,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE,OAAO;KACnB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAS,wBAAwB,CAAC,MAA4B;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,KAAK,KAAK,CAAC;IAC1C,OAAO;QACL,cAAc,EAAE,YAAY;QAC5B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,qBAAqB;QAC/D,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;QACpC,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;KACrC,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,SAAS,oBAAoB,CAC3B,MAAgD,EAChD,IAA6B;IAE7B,OAAO;QACL,cAAc,EAAE,QAAQ;QACxB,MAAM,EAAE,gBAAgB;QACxB,UAAU,EAAE,MAAM;QAClB,SAAS,EAAE,QAAQ;QACnB,GAAG,6BAA6B,CAAC,MAAM,EAAE,IAAI,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,SAAS,sBAAsB,CAC7B,MAA4C,EAC5C,QAAkC,EAClC,IAA6B;IAE7B,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC9D,OAAO,oBAAoB,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,uBAAuB,EAAE,IAAI,CAAC,CAAC;AACnG,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,wBAAwB,CACtC,MAA4C,EAC5C,QAAkC,EAClC,IAA6B;IAE7B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAEhF,QAAQ,MAAM,CAAC,cAAc,EAAE,CAAC;QAC9B,KAAK,SAAS,CAAC;QACf,KAAK,UAAU;YACb,OAAO,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACxC,KAAK,YAAY;YACf,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAC1C,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { NavigatorGeneratedFile, NavigatorGenerationBindings, NavigatorPlan } from '../definitions/NavigatorPlan';
2
+ /*** Generate deterministic Expo Router files from a validated disposable plan and narrow bindings. */
3
+ export declare function generateNavigatorFiles(plan: NavigatorPlan, bindings: NavigatorGenerationBindings): readonly NavigatorGeneratedFile[];
4
+ //# sourceMappingURL=generateNavigatorFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateNavigatorFiles.d.ts","sourceRoot":"","sources":["../../src/generation/generateNavigatorFiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,2BAA2B,EAE3B,aAAa,EAGd,MAAM,8BAA8B,CAAC;AAuNtC,sGAAsG;AACtG,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,2BAA2B,GACpC,SAAS,sBAAsB,EAAE,CAkBnC"}