@ankhorage/contracts 11.1.0 → 12.0.1
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/CHANGELOG.md +15 -0
- package/README.md +1 -1
- package/dist/appManifest/navigator.d.ts +2 -1
- package/dist/appManifest/navigator.d.ts.map +1 -1
- package/dist/appManifest/navigator.js +11 -11
- package/dist/appManifest/navigator.js.map +1 -1
- package/dist/appManifest/navigatorOptions.d.ts.map +1 -1
- package/dist/appManifest/navigatorOptions.js +27 -29
- package/dist/appManifest/navigatorOptions.js.map +1 -1
- package/dist/navigator/catalog.d.ts +42 -0
- package/dist/navigator/catalog.d.ts.map +1 -0
- package/dist/navigator/catalog.js +2 -0
- package/dist/navigator/catalog.js.map +1 -0
- package/dist/navigator/generation.d.ts +14 -4
- package/dist/navigator/generation.d.ts.map +1 -1
- package/dist/navigator/generation.js.map +1 -1
- package/dist/navigator/planning.d.ts +9 -9
- package/dist/navigator/planning.d.ts.map +1 -1
- package/dist/navigator/planning.js.map +1 -1
- package/dist/navigator.d.ts +21 -24
- package/dist/navigator.d.ts.map +1 -1
- package/dist/navigator.js +10 -9
- package/dist/navigator.js.map +1 -1
- package/package.json +2 -2
- package/src/appManifest/navigator.ts +15 -17
- package/src/appManifest/navigatorOptions.ts +29 -31
- package/src/navigator/catalog.ts +79 -0
- package/src/navigator/generation.ts +22 -4
- package/src/navigator/planning.ts +10 -9
- package/src/navigator-runtime-contracts.test.ts +54 -3
- package/src/navigator-validation.test.ts +31 -4
- package/src/navigator.test.ts +49 -17
- package/src/navigator.ts +41 -30
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @ankhorage/contracts
|
|
2
2
|
|
|
3
|
+
## 12.0.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 4a6a112: Export the standalone AppNavigatorManifest structural type guard from the navigator contract.
|
|
8
|
+
|
|
9
|
+
## 12.0.0
|
|
10
|
+
|
|
11
|
+
### Major Changes
|
|
12
|
+
|
|
13
|
+
- 89dfb46: Align the portable Navigator contract with the standalone catalog lifecycle: remove flow-specific
|
|
14
|
+
manifest and runtime fields, name the headless Tabs implementation explicitly, normalize structural
|
|
15
|
+
preset IDs, and add catalog, capability, dependency, planning, generation, and verification result
|
|
16
|
+
types.
|
|
17
|
+
|
|
3
18
|
## 11.1.0
|
|
4
19
|
|
|
5
20
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
# CONTRACTS
|
|
5
5
|
|
|
6
|
-
         
|
|
7
7
|
|
|
8
8
|
Serializable app, action, theme, auth, and secret-store contracts for Ankhorage.
|
|
9
9
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type AppNavigatorManifest } from '../navigator';
|
|
1
2
|
/*** Validate the complete serialized `AppManifest.navigator` slice. */
|
|
2
|
-
export declare function isAppNavigatorManifest(value: unknown):
|
|
3
|
+
export declare function isAppNavigatorManifest(value: unknown): value is AppNavigatorManifest;
|
|
3
4
|
//# sourceMappingURL=navigator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigator.d.ts","sourceRoot":"","sources":["../../src/appManifest/navigator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"navigator.d.ts","sourceRoot":"","sources":["../../src/appManifest/navigator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,oBAAoB,EAAsC,MAAM,cAAc,CAAC;AAY7F,uEAAuE;AACvE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAUpF"}
|
|
@@ -2,15 +2,13 @@ import { NAVIGATOR_PRESETS, NAVIGATOR_TYPES } from '../navigator';
|
|
|
2
2
|
import { isIconSpec } from './icon';
|
|
3
3
|
import { hasOnlyKeys, isDrawerNavigatorOptions, isNavigatorScreenReference, isStackImplementationConfig, isStackScreenOptions, isTabsImplementationConfig, } from './navigatorOptions';
|
|
4
4
|
import { isOptionalBoolean, isOptionalString, isRecord, isStringArray } from './shared';
|
|
5
|
-
const NAVIGATOR_PRESET_SET = new Set(NAVIGATOR_PRESETS);
|
|
6
|
-
const NAVIGATOR_TYPE_SET = new Set(NAVIGATOR_TYPES);
|
|
7
5
|
/*** Validate the complete serialized `AppManifest.navigator` slice. */
|
|
8
6
|
export function isAppNavigatorManifest(value) {
|
|
9
7
|
return (isRecord(value) &&
|
|
10
8
|
isNavigatorNode(value) &&
|
|
11
9
|
(value.preset === undefined ||
|
|
12
|
-
(typeof value.preset === 'string' &&
|
|
13
|
-
|
|
10
|
+
(typeof value.preset === 'string' && hasNavigatorPreset(value.preset))) &&
|
|
11
|
+
value.flows === undefined &&
|
|
14
12
|
(value.defaults === undefined || isNavigatorDefaults(value.defaults)) &&
|
|
15
13
|
(value.platforms === undefined || isNavigatorPlatforms(value.platforms)));
|
|
16
14
|
}
|
|
@@ -18,7 +16,7 @@ export function isAppNavigatorManifest(value) {
|
|
|
18
16
|
function isNavigatorNode(value) {
|
|
19
17
|
if (!isRecord(value) ||
|
|
20
18
|
typeof value.type !== 'string' ||
|
|
21
|
-
!
|
|
19
|
+
!hasNavigatorType(value.type) ||
|
|
22
20
|
!isOptionalString(value.initialRouteName) ||
|
|
23
21
|
!Array.isArray(value.routes) ||
|
|
24
22
|
!value.routes.every(isRouteDefinition)) {
|
|
@@ -42,6 +40,14 @@ function isNavigatorNode(value) {
|
|
|
42
40
|
return false;
|
|
43
41
|
}
|
|
44
42
|
}
|
|
43
|
+
/*** Check a serialized preset against the public contract without eager cyclic initialization. */
|
|
44
|
+
function hasNavigatorPreset(value) {
|
|
45
|
+
return NAVIGATOR_PRESETS.includes(value);
|
|
46
|
+
}
|
|
47
|
+
/*** Check a serialized topology against the public contract without eager cyclic initialization. */
|
|
48
|
+
function hasNavigatorType(value) {
|
|
49
|
+
return NAVIGATOR_TYPES.includes(value);
|
|
50
|
+
}
|
|
45
51
|
/*** Validate one route and preserve its portable metadata and nested navigator. */
|
|
46
52
|
function isRouteDefinition(value) {
|
|
47
53
|
return (isRecord(value) &&
|
|
@@ -107,12 +113,6 @@ function isNavigatorJsonValue(value, ancestors) {
|
|
|
107
113
|
ancestors.delete(value);
|
|
108
114
|
return isValid;
|
|
109
115
|
}
|
|
110
|
-
/*** Validate optional app-level navigator flow intent. */
|
|
111
|
-
function isNavigatorFlows(value) {
|
|
112
|
-
return (isRecord(value) &&
|
|
113
|
-
isOptionalBoolean(value.onboarding) &&
|
|
114
|
-
isOptionalBoolean(value.authentication));
|
|
115
|
-
}
|
|
116
116
|
/*** Validate package-owned navigator defaults without requiring a navigator node type. */
|
|
117
117
|
function isNavigatorDefaults(value) {
|
|
118
118
|
return (isRecord(value) &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigator.js","sourceRoot":"","sources":["../../src/appManifest/navigator.ts"],"names":[],"mappings":"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","sourcesContent":["import { NAVIGATOR_PRESETS, NAVIGATOR_TYPES } from '../navigator';\nimport { isIconSpec } from './icon';\nimport {\n hasOnlyKeys,\n isDrawerNavigatorOptions,\n isNavigatorScreenReference,\n isStackImplementationConfig,\n isStackScreenOptions,\n isTabsImplementationConfig,\n} from './navigatorOptions';\nimport { isOptionalBoolean, isOptionalString, isRecord, isStringArray } from './shared';\n\nconst NAVIGATOR_PRESET_SET = new Set<string>(NAVIGATOR_PRESETS);\nconst NAVIGATOR_TYPE_SET = new Set<string>(NAVIGATOR_TYPES);\n\n/*** Validate the complete serialized `AppManifest.navigator` slice. */\nexport function isAppNavigatorManifest(value: unknown): boolean {\n return (\n isRecord(value) &&\n isNavigatorNode(value) &&\n (value.preset === undefined ||\n (typeof value.preset === 'string' && NAVIGATOR_PRESET_SET.has(value.preset))) &&\n (value.flows === undefined || isNavigatorFlows(value.flows)) &&\n (value.defaults === undefined || isNavigatorDefaults(value.defaults)) &&\n (value.platforms === undefined || isNavigatorPlatforms(value.platforms))\n );\n}\n\n/*** Validate one nested navigator node independently from app-level authoring metadata. */\nfunction isNavigatorNode(value: unknown): boolean {\n if (\n !isRecord(value) ||\n typeof value.type !== 'string' ||\n !NAVIGATOR_TYPE_SET.has(value.type) ||\n !isOptionalString(value.initialRouteName) ||\n !Array.isArray(value.routes) ||\n !value.routes.every(isRouteDefinition)\n ) {\n return false;\n }\n\n switch (value.type) {\n case 'slot':\n return value.options === undefined && value.implementation === undefined;\n case 'stack':\n return isStackImplementationConfig(value);\n case 'tabs':\n return isTabsImplementationConfig(value);\n case 'drawer':\n return (\n value.implementation === undefined &&\n (value.options === undefined || isDrawerNavigatorOptions(value.options))\n );\n case 'split-view':\n return isSplitViewNavigatorNode(value);\n case 'custom':\n return isCustomNavigatorNode(value);\n default:\n return false;\n }\n}\n\n/*** Validate one route and preserve its portable metadata and nested navigator. */\nfunction isRouteDefinition(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.name === 'string' &&\n isOptionalString(value.path) &&\n isOptionalString(value.label) &&\n (value.icon === undefined || isIconSpec(value.icon)) &&\n isOptionalBoolean(value.showInPrimaryNavigation) &&\n (value.guards === undefined || isStringArray(value.guards)) &&\n isOptionalString(value.screenId) &&\n (value.stackOptions === undefined || isStackScreenOptions(value.stackOptions)) &&\n (value.navigator === undefined || isNavigatorNode(value.navigator))\n );\n}\n\n/*** Validate Split View screen references without duplicating the routed secondary tree. */\nfunction isSplitViewNavigatorNode(value: Record<string, unknown>): boolean {\n return (\n value.implementation === undefined &&\n value.options === undefined &&\n isRecord(value.columns) &&\n hasOnlyKeys(value.columns, ['primary', 'supplementary']) &&\n isNavigatorScreenReference(value.columns.primary) &&\n (value.columns.supplementary === undefined ||\n isNavigatorScreenReference(value.columns.supplementary)) &&\n (value.inspector === undefined || isNavigatorScreenReference(value.inspector)) &&\n (value.topColumnForCollapsing === undefined ||\n value.topColumnForCollapsing === 'primary' ||\n value.topColumnForCollapsing === 'supplementary' ||\n value.topColumnForCollapsing === 'secondary')\n );\n}\n\n/*** Validate a registered custom navigator with JSON-safe configuration only. */\nfunction isCustomNavigatorNode(value: Record<string, unknown>): boolean {\n return (\n value.implementation === undefined &&\n value.options === undefined &&\n typeof value.navigatorId === 'string' &&\n (value.config === undefined || isNavigatorJsonRecord(value.config))\n );\n}\n\n/*** Validate an acyclic, finite JSON object used by a custom navigator adapter. */\nfunction isNavigatorJsonRecord(value: unknown): boolean {\n return isRecord(value) && isNavigatorJsonValue(value, new Set<object>());\n}\n\n/*** Recursively validate the portable manifest value domain and reject cycles. */\nfunction isNavigatorJsonValue(value: unknown, ancestors: Set<object>): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object' || ancestors.has(value)) return false;\n\n if (Array.isArray(value)) {\n if (\n Object.keys(value).length !== value.length ||\n Object.getOwnPropertySymbols(value).length > 0\n ) {\n return false;\n }\n } else {\n const prototype = Object.getPrototypeOf(value) as object | null;\n if (prototype !== Object.prototype && prototype !== null) return false;\n if (Reflect.ownKeys(value).some((key) => typeof key !== 'string')) return false;\n }\n\n ancestors.add(value);\n const isValid = Object.values(value).every((entry) => isNavigatorJsonValue(entry, ancestors));\n ancestors.delete(value);\n return isValid;\n}\n\n/*** Validate optional app-level navigator flow intent. */\nfunction isNavigatorFlows(value: unknown): boolean {\n return (\n isRecord(value) &&\n isOptionalBoolean(value.onboarding) &&\n isOptionalBoolean(value.authentication)\n );\n}\n\n/*** Validate package-owned navigator defaults without requiring a navigator node type. */\nfunction isNavigatorDefaults(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['tabs', 'stack']) &&\n (value.tabs === undefined ||\n (isRecord(value.tabs) && isTabsImplementationConfig(value.tabs))) &&\n (value.stack === undefined ||\n (isRecord(value.stack) && isStackImplementationConfig(value.stack)))\n );\n}\n\n/*** Validate per-platform navigator implementation overrides. */\nfunction isNavigatorPlatforms(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['android', 'ios', 'web']) &&\n (value.android === undefined || isNavigatorPlatformConfig(value.android)) &&\n (value.ios === undefined || isNavigatorPlatformConfig(value.ios)) &&\n (value.web === undefined || isNavigatorPlatformConfig(value.web))\n );\n}\n\n/*** Validate one platform-specific navigator override slice. */\nfunction isNavigatorPlatformConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['tabs', 'stack']) &&\n (value.tabs === undefined ||\n (isRecord(value.tabs) && isTabsImplementationConfig(value.tabs))) &&\n (value.stack === undefined ||\n (isRecord(value.stack) && isStackImplementationConfig(value.stack)))\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"navigator.js","sourceRoot":"","sources":["../../src/appManifest/navigator.ts"],"names":[],"mappings":"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","sourcesContent":["import { type AppNavigatorManifest, NAVIGATOR_PRESETS, NAVIGATOR_TYPES } from '../navigator';\nimport { isIconSpec } from './icon';\nimport {\n hasOnlyKeys,\n isDrawerNavigatorOptions,\n isNavigatorScreenReference,\n isStackImplementationConfig,\n isStackScreenOptions,\n isTabsImplementationConfig,\n} from './navigatorOptions';\nimport { isOptionalBoolean, isOptionalString, isRecord, isStringArray } from './shared';\n\n/*** Validate the complete serialized `AppManifest.navigator` slice. */\nexport function isAppNavigatorManifest(value: unknown): value is AppNavigatorManifest {\n return (\n isRecord(value) &&\n isNavigatorNode(value) &&\n (value.preset === undefined ||\n (typeof value.preset === 'string' && hasNavigatorPreset(value.preset))) &&\n value.flows === undefined &&\n (value.defaults === undefined || isNavigatorDefaults(value.defaults)) &&\n (value.platforms === undefined || isNavigatorPlatforms(value.platforms))\n );\n}\n\n/*** Validate one nested navigator node independently from app-level authoring metadata. */\nfunction isNavigatorNode(value: unknown): boolean {\n if (\n !isRecord(value) ||\n typeof value.type !== 'string' ||\n !hasNavigatorType(value.type) ||\n !isOptionalString(value.initialRouteName) ||\n !Array.isArray(value.routes) ||\n !value.routes.every(isRouteDefinition)\n ) {\n return false;\n }\n\n switch (value.type) {\n case 'slot':\n return value.options === undefined && value.implementation === undefined;\n case 'stack':\n return isStackImplementationConfig(value);\n case 'tabs':\n return isTabsImplementationConfig(value);\n case 'drawer':\n return (\n value.implementation === undefined &&\n (value.options === undefined || isDrawerNavigatorOptions(value.options))\n );\n case 'split-view':\n return isSplitViewNavigatorNode(value);\n case 'custom':\n return isCustomNavigatorNode(value);\n default:\n return false;\n }\n}\n\n/*** Check a serialized preset against the public contract without eager cyclic initialization. */\nfunction hasNavigatorPreset(value: string): boolean {\n return (NAVIGATOR_PRESETS as readonly string[]).includes(value);\n}\n\n/*** Check a serialized topology against the public contract without eager cyclic initialization. */\nfunction hasNavigatorType(value: string): boolean {\n return (NAVIGATOR_TYPES as readonly string[]).includes(value);\n}\n\n/*** Validate one route and preserve its portable metadata and nested navigator. */\nfunction isRouteDefinition(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.name === 'string' &&\n isOptionalString(value.path) &&\n isOptionalString(value.label) &&\n (value.icon === undefined || isIconSpec(value.icon)) &&\n isOptionalBoolean(value.showInPrimaryNavigation) &&\n (value.guards === undefined || isStringArray(value.guards)) &&\n isOptionalString(value.screenId) &&\n (value.stackOptions === undefined || isStackScreenOptions(value.stackOptions)) &&\n (value.navigator === undefined || isNavigatorNode(value.navigator))\n );\n}\n\n/*** Validate Split View screen references without duplicating the routed secondary tree. */\nfunction isSplitViewNavigatorNode(value: Record<string, unknown>): boolean {\n return (\n value.implementation === undefined &&\n value.options === undefined &&\n isRecord(value.columns) &&\n hasOnlyKeys(value.columns, ['primary', 'supplementary']) &&\n isNavigatorScreenReference(value.columns.primary) &&\n (value.columns.supplementary === undefined ||\n isNavigatorScreenReference(value.columns.supplementary)) &&\n (value.inspector === undefined || isNavigatorScreenReference(value.inspector)) &&\n (value.topColumnForCollapsing === undefined ||\n value.topColumnForCollapsing === 'primary' ||\n value.topColumnForCollapsing === 'supplementary' ||\n value.topColumnForCollapsing === 'secondary')\n );\n}\n\n/*** Validate a registered custom navigator with JSON-safe configuration only. */\nfunction isCustomNavigatorNode(value: Record<string, unknown>): boolean {\n return (\n value.implementation === undefined &&\n value.options === undefined &&\n typeof value.navigatorId === 'string' &&\n (value.config === undefined || isNavigatorJsonRecord(value.config))\n );\n}\n\n/*** Validate an acyclic, finite JSON object used by a custom navigator adapter. */\nfunction isNavigatorJsonRecord(value: unknown): boolean {\n return isRecord(value) && isNavigatorJsonValue(value, new Set<object>());\n}\n\n/*** Recursively validate the portable manifest value domain and reject cycles. */\nfunction isNavigatorJsonValue(value: unknown, ancestors: Set<object>): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object' || ancestors.has(value)) return false;\n\n if (Array.isArray(value)) {\n if (\n Object.keys(value).length !== value.length ||\n Object.getOwnPropertySymbols(value).length > 0\n ) {\n return false;\n }\n } else {\n const prototype = Object.getPrototypeOf(value) as object | null;\n if (prototype !== Object.prototype && prototype !== null) return false;\n if (Reflect.ownKeys(value).some((key) => typeof key !== 'string')) return false;\n }\n\n ancestors.add(value);\n const isValid = Object.values(value).every((entry) => isNavigatorJsonValue(entry, ancestors));\n ancestors.delete(value);\n return isValid;\n}\n\n/*** Validate package-owned navigator defaults without requiring a navigator node type. */\nfunction isNavigatorDefaults(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['tabs', 'stack']) &&\n (value.tabs === undefined ||\n (isRecord(value.tabs) && isTabsImplementationConfig(value.tabs))) &&\n (value.stack === undefined ||\n (isRecord(value.stack) && isStackImplementationConfig(value.stack)))\n );\n}\n\n/*** Validate per-platform navigator implementation overrides. */\nfunction isNavigatorPlatforms(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['android', 'ios', 'web']) &&\n (value.android === undefined || isNavigatorPlatformConfig(value.android)) &&\n (value.ios === undefined || isNavigatorPlatformConfig(value.ios)) &&\n (value.web === undefined || isNavigatorPlatformConfig(value.web))\n );\n}\n\n/*** Validate one platform-specific navigator override slice. */\nfunction isNavigatorPlatformConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['tabs', 'stack']) &&\n (value.tabs === undefined ||\n (isRecord(value.tabs) && isTabsImplementationConfig(value.tabs))) &&\n (value.stack === undefined ||\n (isRecord(value.stack) && isStackImplementationConfig(value.stack)))\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigatorOptions.d.ts","sourceRoot":"","sources":["../../src/appManifest/navigatorOptions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"navigatorOptions.d.ts","sourceRoot":"","sources":["../../src/appManifest/navigatorOptions.ts"],"names":[],"mappings":"AAYA,sFAAsF;AACtF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAwBnF;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA2B5D;AAED,8DAA8D;AAC9D,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAYhE;AAED,iGAAiG;AACjG,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAWlF;AAED,gEAAgE;AAChE,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAElE;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,OAAO,CAGT"}
|
|
@@ -1,13 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DRAWER_POSITIONS, DRAWER_TYPES, FIXED_HEADLESS_TABS_PRESENTATIONS, HEADLESS_TABS_PRESENTATIONS, JAVASCRIPT_STACK_PRESENTATIONS, JAVASCRIPT_TABS_PRESENTATIONS, NATIVE_TABS_MINIMIZE_BEHAVIORS, STACK_PRESENTATIONS, } from '../navigator';
|
|
2
2
|
import { isOptionalBoolean, isOptionalString, isRecord } from './shared';
|
|
3
|
-
const CUSTOM_TABS_PRESENTATION_SET = new Set(CUSTOM_TABS_PRESENTATIONS);
|
|
4
|
-
const DRAWER_POSITION_SET = new Set(DRAWER_POSITIONS);
|
|
5
|
-
const DRAWER_TYPE_SET = new Set(DRAWER_TYPES);
|
|
6
|
-
const FIXED_CUSTOM_TABS_PRESENTATION_SET = new Set(FIXED_CUSTOM_TABS_PRESENTATIONS);
|
|
7
|
-
const JAVASCRIPT_STACK_PRESENTATION_SET = new Set(JAVASCRIPT_STACK_PRESENTATIONS);
|
|
8
|
-
const JAVASCRIPT_TABS_PRESENTATION_SET = new Set(JAVASCRIPT_TABS_PRESENTATIONS);
|
|
9
|
-
const NATIVE_TABS_MINIMIZE_BEHAVIOR_SET = new Set(NATIVE_TABS_MINIMIZE_BEHAVIORS);
|
|
10
|
-
const STACK_PRESENTATION_SET = new Set(STACK_PRESENTATIONS);
|
|
11
3
|
/*** Validate stable native, JavaScript, or alpha Experimental Stack desired state. */
|
|
12
4
|
export function isStackImplementationConfig(value) {
|
|
13
5
|
if (!hasNoDefinedKeys(value, [
|
|
@@ -44,7 +36,8 @@ export function isStackScreenOptions(value) {
|
|
|
44
36
|
]) ||
|
|
45
37
|
!isStackHeaderOptionsShape(value) ||
|
|
46
38
|
(value.presentation !== undefined &&
|
|
47
|
-
(typeof value.presentation !== 'string' ||
|
|
39
|
+
(typeof value.presentation !== 'string' ||
|
|
40
|
+
!contains(STACK_PRESENTATIONS, value.presentation)))) {
|
|
48
41
|
return false;
|
|
49
42
|
}
|
|
50
43
|
if (value.presentation !== 'formSheet') {
|
|
@@ -59,9 +52,9 @@ export function isDrawerNavigatorOptions(value) {
|
|
|
59
52
|
hasOnlyKeys(value, ['drawerPosition', 'drawerType', 'swipeEnabled', 'headerShown']) &&
|
|
60
53
|
(value.drawerPosition === undefined ||
|
|
61
54
|
(typeof value.drawerPosition === 'string' &&
|
|
62
|
-
|
|
55
|
+
contains(DRAWER_POSITIONS, value.drawerPosition))) &&
|
|
63
56
|
(value.drawerType === undefined ||
|
|
64
|
-
(typeof value.drawerType === 'string' &&
|
|
57
|
+
(typeof value.drawerType === 'string' && contains(DRAWER_TYPES, value.drawerType))) &&
|
|
65
58
|
isOptionalBoolean(value.swipeEnabled) &&
|
|
66
59
|
isOptionalBoolean(value.headerShown));
|
|
67
60
|
}
|
|
@@ -74,9 +67,9 @@ export function isTabsImplementationConfig(value) {
|
|
|
74
67
|
return isFullNativeTabsConfig(value);
|
|
75
68
|
if (value.implementation === 'javascript')
|
|
76
69
|
return isJavaScriptTabsConfig(value);
|
|
77
|
-
return (value.implementation === '
|
|
70
|
+
return (value.implementation === 'headless' &&
|
|
78
71
|
hasNoDefinedKeys(value, ['options', 'native', 'web', 'minimizeBehavior', 'bottomAccessory']) &&
|
|
79
|
-
|
|
72
|
+
isHeadlessTabsPresentationConfig(value));
|
|
80
73
|
}
|
|
81
74
|
/*** Validate a reference into the app-owned screen registry. */
|
|
82
75
|
export function isNavigatorScreenReference(value) {
|
|
@@ -100,7 +93,7 @@ function isJavaScriptStackScreenOptions(value) {
|
|
|
100
93
|
isStackHeaderOptionsShape(value) &&
|
|
101
94
|
(value.presentation === undefined ||
|
|
102
95
|
(typeof value.presentation === 'string' &&
|
|
103
|
-
|
|
96
|
+
contains(JAVASCRIPT_STACK_PRESENTATIONS, value.presentation))));
|
|
104
97
|
}
|
|
105
98
|
/*** Validate the portable header subset supported by Experimental Stack. */
|
|
106
99
|
function isStackHeaderOptions(value) {
|
|
@@ -138,7 +131,7 @@ function isAdaptiveTabsConfig(value) {
|
|
|
138
131
|
'bottomAccessory',
|
|
139
132
|
]) &&
|
|
140
133
|
(value.native === undefined || isNativeTabsConfig(value.native)) &&
|
|
141
|
-
(value.web === undefined ||
|
|
134
|
+
(value.web === undefined || isHeadlessTabsWebConfig(value.web)));
|
|
142
135
|
}
|
|
143
136
|
/*** Validate the top-level native tabs implementation. */
|
|
144
137
|
function isFullNativeTabsConfig(value) {
|
|
@@ -164,7 +157,7 @@ function isJavaScriptTabsConfig(value) {
|
|
|
164
157
|
]) &&
|
|
165
158
|
(value.presentation === undefined ||
|
|
166
159
|
(typeof value.presentation === 'string' &&
|
|
167
|
-
|
|
160
|
+
contains(JAVASCRIPT_TABS_PRESENTATIONS, value.presentation))));
|
|
168
161
|
}
|
|
169
162
|
/*** Validate the native branch used by adaptive tabs. */
|
|
170
163
|
function isNativeTabsConfig(value) {
|
|
@@ -177,19 +170,19 @@ function isNativeTabsConfig(value) {
|
|
|
177
170
|
function isNativeTabsFields(value) {
|
|
178
171
|
return ((value.minimizeBehavior === undefined ||
|
|
179
172
|
(typeof value.minimizeBehavior === 'string' &&
|
|
180
|
-
|
|
173
|
+
contains(NATIVE_TABS_MINIMIZE_BEHAVIORS, value.minimizeBehavior))) &&
|
|
181
174
|
(value.bottomAccessory === undefined || isNavigatorScreenReference(value.bottomAccessory)));
|
|
182
175
|
}
|
|
183
|
-
/*** Validate the implementation-free
|
|
184
|
-
function
|
|
176
|
+
/*** Validate the implementation-free headless-tabs Web branch inside adaptive tabs. */
|
|
177
|
+
function isHeadlessTabsWebConfig(value) {
|
|
185
178
|
return (isRecord(value) &&
|
|
186
179
|
hasOnlyKeys(value, ['presentation', 'responsive', 'customPresentationId']) &&
|
|
187
|
-
|
|
180
|
+
isHeadlessTabsPresentationConfig(value));
|
|
188
181
|
}
|
|
189
|
-
/*** Validate
|
|
190
|
-
function
|
|
182
|
+
/*** Validate headless-tab presentation and its conditional serializable configuration. */
|
|
183
|
+
function isHeadlessTabsPresentationConfig(value) {
|
|
191
184
|
if (typeof value.presentation !== 'string' ||
|
|
192
|
-
!
|
|
185
|
+
!contains(HEADLESS_TABS_PRESENTATIONS, value.presentation)) {
|
|
193
186
|
return false;
|
|
194
187
|
}
|
|
195
188
|
if (value.responsive !== undefined && !isResponsiveTabsPresentation(value.responsive)) {
|
|
@@ -197,7 +190,7 @@ function isCustomTabsPresentationConfig(value) {
|
|
|
197
190
|
}
|
|
198
191
|
if (!isOptionalString(value.customPresentationId))
|
|
199
192
|
return false;
|
|
200
|
-
if (
|
|
193
|
+
if (contains(FIXED_HEADLESS_TABS_PRESENTATIONS, value.presentation)) {
|
|
201
194
|
return value.responsive === undefined && value.customPresentationId === undefined;
|
|
202
195
|
}
|
|
203
196
|
if (value.presentation === 'responsive') {
|
|
@@ -207,16 +200,21 @@ function isCustomTabsPresentationConfig(value) {
|
|
|
207
200
|
typeof value.customPresentationId === 'string' &&
|
|
208
201
|
value.customPresentationId.length > 0);
|
|
209
202
|
}
|
|
210
|
-
/*** Validate semantic compact/medium/expanded
|
|
203
|
+
/*** Validate semantic compact/medium/expanded headless-tab presentation mapping. */
|
|
211
204
|
function isResponsiveTabsPresentation(value) {
|
|
212
205
|
return (isRecord(value) &&
|
|
213
206
|
hasOnlyKeys(value, ['compact', 'medium', 'expanded']) &&
|
|
214
207
|
typeof value.compact === 'string' &&
|
|
215
|
-
|
|
208
|
+
contains(FIXED_HEADLESS_TABS_PRESENTATIONS, value.compact) &&
|
|
216
209
|
(value.medium === undefined ||
|
|
217
|
-
(typeof value.medium === 'string' &&
|
|
210
|
+
(typeof value.medium === 'string' &&
|
|
211
|
+
contains(FIXED_HEADLESS_TABS_PRESENTATIONS, value.medium))) &&
|
|
218
212
|
typeof value.expanded === 'string' &&
|
|
219
|
-
|
|
213
|
+
contains(FIXED_HEADLESS_TABS_PRESENTATIONS, value.expanded));
|
|
214
|
+
}
|
|
215
|
+
/*** Check a string against a public finite contract without eager cyclic initialization. */
|
|
216
|
+
function contains(values, value) {
|
|
217
|
+
return values.includes(value);
|
|
220
218
|
}
|
|
221
219
|
/*** Check that mutually exclusive branch fields are absent. */
|
|
222
220
|
function hasNoDefinedKeys(value, keys) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigatorOptions.js","sourceRoot":"","sources":["../../src/appManifest/navigatorOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CUSTOM_TABS_PRESENTATIONS,\n DRAWER_POSITIONS,\n DRAWER_TYPES,\n FIXED_CUSTOM_TABS_PRESENTATIONS,\n JAVASCRIPT_STACK_PRESENTATIONS,\n JAVASCRIPT_TABS_PRESENTATIONS,\n NATIVE_TABS_MINIMIZE_BEHAVIORS,\n STACK_PRESENTATIONS,\n} from '../navigator';\nimport { isOptionalBoolean, isOptionalString, isRecord } from './shared';\n\nconst CUSTOM_TABS_PRESENTATION_SET = new Set<string>(CUSTOM_TABS_PRESENTATIONS);\nconst DRAWER_POSITION_SET = new Set<string>(DRAWER_POSITIONS);\nconst DRAWER_TYPE_SET = new Set<string>(DRAWER_TYPES);\nconst FIXED_CUSTOM_TABS_PRESENTATION_SET = new Set<string>(FIXED_CUSTOM_TABS_PRESENTATIONS);\nconst JAVASCRIPT_STACK_PRESENTATION_SET = new Set<string>(JAVASCRIPT_STACK_PRESENTATIONS);\nconst JAVASCRIPT_TABS_PRESENTATION_SET = new Set<string>(JAVASCRIPT_TABS_PRESENTATIONS);\nconst NATIVE_TABS_MINIMIZE_BEHAVIOR_SET = new Set<string>(NATIVE_TABS_MINIMIZE_BEHAVIORS);\nconst STACK_PRESENTATION_SET = new Set<string>(STACK_PRESENTATIONS);\n\n/*** Validate stable native, JavaScript, or alpha Experimental Stack desired state. */\nexport function isStackImplementationConfig(value: Record<string, unknown>): boolean {\n if (\n !hasNoDefinedKeys(value, [\n 'native',\n 'web',\n 'presentation',\n 'responsive',\n 'customPresentationId',\n 'minimizeBehavior',\n 'bottomAccessory',\n ])\n ) {\n return false;\n }\n if (value.implementation === undefined || value.implementation === 'native') {\n return value.options === undefined || isStackScreenOptions(value.options);\n }\n if (value.implementation === 'javascript') {\n return value.options === undefined || isJavaScriptStackScreenOptions(value.options);\n }\n return (\n value.implementation === 'experimental' &&\n (value.options === undefined || isStackHeaderOptions(value.options))\n );\n}\n\n/*** Validate the serializable native-stack screen option subset. */\nexport function isStackScreenOptions(value: unknown): boolean {\n if (\n !isRecord(value) ||\n !hasOnlyKeys(value, [\n 'title',\n 'headerShown',\n 'headerTransparent',\n 'headerBackVisible',\n 'presentation',\n 'sheetAllowedDetents',\n 'sheetGrabberVisible',\n ]) ||\n !isStackHeaderOptionsShape(value) ||\n (value.presentation !== undefined &&\n (typeof value.presentation !== 'string' || !STACK_PRESENTATION_SET.has(value.presentation)))\n ) {\n return false;\n }\n\n if (value.presentation !== 'formSheet') {\n return value.sheetAllowedDetents === undefined && value.sheetGrabberVisible === undefined;\n }\n return (\n (value.sheetAllowedDetents === undefined || isSheetAllowedDetents(value.sheetAllowedDetents)) &&\n isOptionalBoolean(value.sheetGrabberVisible)\n );\n}\n\n/*** Validate the finite serializable Drawer option subset. */\nexport function isDrawerNavigatorOptions(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['drawerPosition', 'drawerType', 'swipeEnabled', 'headerShown']) &&\n (value.drawerPosition === undefined ||\n (typeof value.drawerPosition === 'string' &&\n DRAWER_POSITION_SET.has(value.drawerPosition))) &&\n (value.drawerType === undefined ||\n (typeof value.drawerType === 'string' && DRAWER_TYPE_SET.has(value.drawerType))) &&\n isOptionalBoolean(value.swipeEnabled) &&\n isOptionalBoolean(value.headerShown)\n );\n}\n\n/*** Validate tabs implementation desired state, with omitted implementation meaning adaptive. */\nexport function isTabsImplementationConfig(value: Record<string, unknown>): boolean {\n if (value.implementation === undefined || value.implementation === 'adaptive') {\n return isAdaptiveTabsConfig(value);\n }\n if (value.implementation === 'native') return isFullNativeTabsConfig(value);\n if (value.implementation === 'javascript') return isJavaScriptTabsConfig(value);\n return (\n value.implementation === 'custom' &&\n hasNoDefinedKeys(value, ['options', 'native', 'web', 'minimizeBehavior', 'bottomAccessory']) &&\n isCustomTabsPresentationConfig(value)\n );\n}\n\n/*** Validate a reference into the app-owned screen registry. */\nexport function isNavigatorScreenReference(value: unknown): boolean {\n return isRecord(value) && hasOnlyKeys(value, ['screenId']) && typeof value.screenId === 'string';\n}\n\n/*** Check that a finite configuration object contains no unsupported keys. */\nexport function hasOnlyKeys(\n value: Record<string, unknown>,\n allowedKeys: readonly string[],\n): boolean {\n const allowed = new Set(allowedKeys);\n return Object.keys(value).every((key) => allowed.has(key));\n}\n\n/*** Validate JavaScript Stack options without accepting native-only presentations. */\nfunction isJavaScriptStackScreenOptions(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, [\n 'title',\n 'headerShown',\n 'headerTransparent',\n 'headerBackVisible',\n 'presentation',\n ]) &&\n isStackHeaderOptionsShape(value) &&\n (value.presentation === undefined ||\n (typeof value.presentation === 'string' &&\n JAVASCRIPT_STACK_PRESENTATION_SET.has(value.presentation)))\n );\n}\n\n/*** Validate the portable header subset supported by Experimental Stack. */\nfunction isStackHeaderOptions(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['title', 'headerShown', 'headerTransparent', 'headerBackVisible']) &&\n isStackHeaderOptionsShape(value)\n );\n}\n\n/*** Validate shared stack header field values after branch-specific key filtering. */\nfunction isStackHeaderOptionsShape(value: Record<string, unknown>): boolean {\n return (\n isOptionalString(value.title) &&\n isOptionalBoolean(value.headerShown) &&\n isOptionalBoolean(value.headerTransparent) &&\n isOptionalBoolean(value.headerBackVisible)\n );\n}\n\n/*** Validate sorted, finite native sheet detents or the fit-to-content sentinel. */\nfunction isSheetAllowedDetents(value: unknown): boolean {\n if (value === 'fitToContents') return true;\n if (!Array.isArray(value) || value.length === 0) return false;\n return value.every(\n (detent, index) =>\n typeof detent === 'number' &&\n Number.isFinite(detent) &&\n detent > 0 &&\n detent <= 1 &&\n (index === 0 || detent > value[index - 1]),\n );\n}\n\n/*** Validate an adaptive tabs branch and reject implementation-specific conflicts. */\nfunction isAdaptiveTabsConfig(value: Record<string, unknown>): boolean {\n return (\n hasNoDefinedKeys(value, [\n 'options',\n 'presentation',\n 'responsive',\n 'customPresentationId',\n 'minimizeBehavior',\n 'bottomAccessory',\n ]) &&\n (value.native === undefined || isNativeTabsConfig(value.native)) &&\n (value.web === undefined || isCustomTabsWebConfig(value.web))\n );\n}\n\n/*** Validate the top-level native tabs implementation. */\nfunction isFullNativeTabsConfig(value: Record<string, unknown>): boolean {\n return (\n hasNoDefinedKeys(value, [\n 'options',\n 'native',\n 'web',\n 'presentation',\n 'responsive',\n 'customPresentationId',\n ]) && isNativeTabsFields(value)\n );\n}\n\n/*** Validate the top-level JavaScript tabs implementation. */\nfunction isJavaScriptTabsConfig(value: Record<string, unknown>): boolean {\n return (\n hasNoDefinedKeys(value, [\n 'options',\n 'native',\n 'web',\n 'responsive',\n 'customPresentationId',\n 'minimizeBehavior',\n 'bottomAccessory',\n ]) &&\n (value.presentation === undefined ||\n (typeof value.presentation === 'string' &&\n JAVASCRIPT_TABS_PRESENTATION_SET.has(value.presentation)))\n );\n}\n\n/*** Validate the native branch used by adaptive tabs. */\nfunction isNativeTabsConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['implementation', 'minimizeBehavior', 'bottomAccessory']) &&\n value.implementation === 'native' &&\n isNativeTabsFields(value)\n );\n}\n\n/*** Validate fields supported by the native tabs branch. */\nfunction isNativeTabsFields(value: Record<string, unknown>): boolean {\n return (\n (value.minimizeBehavior === undefined ||\n (typeof value.minimizeBehavior === 'string' &&\n NATIVE_TABS_MINIMIZE_BEHAVIOR_SET.has(value.minimizeBehavior))) &&\n (value.bottomAccessory === undefined || isNavigatorScreenReference(value.bottomAccessory))\n );\n}\n\n/*** Validate the implementation-free custom-tabs Web branch inside adaptive tabs. */\nfunction isCustomTabsWebConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['presentation', 'responsive', 'customPresentationId']) &&\n isCustomTabsPresentationConfig(value)\n );\n}\n\n/*** Validate custom-tab presentation and its conditional serializable configuration. */\nfunction isCustomTabsPresentationConfig(value: Record<string, unknown>): boolean {\n if (\n typeof value.presentation !== 'string' ||\n !CUSTOM_TABS_PRESENTATION_SET.has(value.presentation)\n ) {\n return false;\n }\n if (value.responsive !== undefined && !isResponsiveTabsPresentation(value.responsive)) {\n return false;\n }\n if (!isOptionalString(value.customPresentationId)) return false;\n if (FIXED_CUSTOM_TABS_PRESENTATION_SET.has(value.presentation)) {\n return value.responsive === undefined && value.customPresentationId === undefined;\n }\n if (value.presentation === 'responsive') {\n return value.responsive !== undefined && value.customPresentationId === undefined;\n }\n return (\n value.responsive === undefined &&\n typeof value.customPresentationId === 'string' &&\n value.customPresentationId.length > 0\n );\n}\n\n/*** Validate semantic compact/medium/expanded custom-tab presentation mapping. */\nfunction isResponsiveTabsPresentation(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['compact', 'medium', 'expanded']) &&\n typeof value.compact === 'string' &&\n FIXED_CUSTOM_TABS_PRESENTATION_SET.has(value.compact) &&\n (value.medium === undefined ||\n (typeof value.medium === 'string' && FIXED_CUSTOM_TABS_PRESENTATION_SET.has(value.medium))) &&\n typeof value.expanded === 'string' &&\n FIXED_CUSTOM_TABS_PRESENTATION_SET.has(value.expanded)\n );\n}\n\n/*** Check that mutually exclusive branch fields are absent. */\nfunction hasNoDefinedKeys(value: Record<string, unknown>, keys: readonly string[]): boolean {\n const prohibited = new Set(keys);\n return !Object.entries(value).some(([key, entry]) => prohibited.has(key) && entry !== undefined);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"navigatorOptions.js","sourceRoot":"","sources":["../../src/appManifest/navigatorOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DRAWER_POSITIONS,\n DRAWER_TYPES,\n FIXED_HEADLESS_TABS_PRESENTATIONS,\n HEADLESS_TABS_PRESENTATIONS,\n JAVASCRIPT_STACK_PRESENTATIONS,\n JAVASCRIPT_TABS_PRESENTATIONS,\n NATIVE_TABS_MINIMIZE_BEHAVIORS,\n STACK_PRESENTATIONS,\n} from '../navigator';\nimport { isOptionalBoolean, isOptionalString, isRecord } from './shared';\n\n/*** Validate stable native, JavaScript, or alpha Experimental Stack desired state. */\nexport function isStackImplementationConfig(value: Record<string, unknown>): boolean {\n if (\n !hasNoDefinedKeys(value, [\n 'native',\n 'web',\n 'presentation',\n 'responsive',\n 'customPresentationId',\n 'minimizeBehavior',\n 'bottomAccessory',\n ])\n ) {\n return false;\n }\n if (value.implementation === undefined || value.implementation === 'native') {\n return value.options === undefined || isStackScreenOptions(value.options);\n }\n if (value.implementation === 'javascript') {\n return value.options === undefined || isJavaScriptStackScreenOptions(value.options);\n }\n return (\n value.implementation === 'experimental' &&\n (value.options === undefined || isStackHeaderOptions(value.options))\n );\n}\n\n/*** Validate the serializable native-stack screen option subset. */\nexport function isStackScreenOptions(value: unknown): boolean {\n if (\n !isRecord(value) ||\n !hasOnlyKeys(value, [\n 'title',\n 'headerShown',\n 'headerTransparent',\n 'headerBackVisible',\n 'presentation',\n 'sheetAllowedDetents',\n 'sheetGrabberVisible',\n ]) ||\n !isStackHeaderOptionsShape(value) ||\n (value.presentation !== undefined &&\n (typeof value.presentation !== 'string' ||\n !contains(STACK_PRESENTATIONS, value.presentation)))\n ) {\n return false;\n }\n\n if (value.presentation !== 'formSheet') {\n return value.sheetAllowedDetents === undefined && value.sheetGrabberVisible === undefined;\n }\n return (\n (value.sheetAllowedDetents === undefined || isSheetAllowedDetents(value.sheetAllowedDetents)) &&\n isOptionalBoolean(value.sheetGrabberVisible)\n );\n}\n\n/*** Validate the finite serializable Drawer option subset. */\nexport function isDrawerNavigatorOptions(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['drawerPosition', 'drawerType', 'swipeEnabled', 'headerShown']) &&\n (value.drawerPosition === undefined ||\n (typeof value.drawerPosition === 'string' &&\n contains(DRAWER_POSITIONS, value.drawerPosition))) &&\n (value.drawerType === undefined ||\n (typeof value.drawerType === 'string' && contains(DRAWER_TYPES, value.drawerType))) &&\n isOptionalBoolean(value.swipeEnabled) &&\n isOptionalBoolean(value.headerShown)\n );\n}\n\n/*** Validate tabs implementation desired state, with omitted implementation meaning adaptive. */\nexport function isTabsImplementationConfig(value: Record<string, unknown>): boolean {\n if (value.implementation === undefined || value.implementation === 'adaptive') {\n return isAdaptiveTabsConfig(value);\n }\n if (value.implementation === 'native') return isFullNativeTabsConfig(value);\n if (value.implementation === 'javascript') return isJavaScriptTabsConfig(value);\n return (\n value.implementation === 'headless' &&\n hasNoDefinedKeys(value, ['options', 'native', 'web', 'minimizeBehavior', 'bottomAccessory']) &&\n isHeadlessTabsPresentationConfig(value)\n );\n}\n\n/*** Validate a reference into the app-owned screen registry. */\nexport function isNavigatorScreenReference(value: unknown): boolean {\n return isRecord(value) && hasOnlyKeys(value, ['screenId']) && typeof value.screenId === 'string';\n}\n\n/*** Check that a finite configuration object contains no unsupported keys. */\nexport function hasOnlyKeys(\n value: Record<string, unknown>,\n allowedKeys: readonly string[],\n): boolean {\n const allowed = new Set(allowedKeys);\n return Object.keys(value).every((key) => allowed.has(key));\n}\n\n/*** Validate JavaScript Stack options without accepting native-only presentations. */\nfunction isJavaScriptStackScreenOptions(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, [\n 'title',\n 'headerShown',\n 'headerTransparent',\n 'headerBackVisible',\n 'presentation',\n ]) &&\n isStackHeaderOptionsShape(value) &&\n (value.presentation === undefined ||\n (typeof value.presentation === 'string' &&\n contains(JAVASCRIPT_STACK_PRESENTATIONS, value.presentation)))\n );\n}\n\n/*** Validate the portable header subset supported by Experimental Stack. */\nfunction isStackHeaderOptions(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['title', 'headerShown', 'headerTransparent', 'headerBackVisible']) &&\n isStackHeaderOptionsShape(value)\n );\n}\n\n/*** Validate shared stack header field values after branch-specific key filtering. */\nfunction isStackHeaderOptionsShape(value: Record<string, unknown>): boolean {\n return (\n isOptionalString(value.title) &&\n isOptionalBoolean(value.headerShown) &&\n isOptionalBoolean(value.headerTransparent) &&\n isOptionalBoolean(value.headerBackVisible)\n );\n}\n\n/*** Validate sorted, finite native sheet detents or the fit-to-content sentinel. */\nfunction isSheetAllowedDetents(value: unknown): boolean {\n if (value === 'fitToContents') return true;\n if (!Array.isArray(value) || value.length === 0) return false;\n return value.every(\n (detent, index) =>\n typeof detent === 'number' &&\n Number.isFinite(detent) &&\n detent > 0 &&\n detent <= 1 &&\n (index === 0 || detent > value[index - 1]),\n );\n}\n\n/*** Validate an adaptive tabs branch and reject implementation-specific conflicts. */\nfunction isAdaptiveTabsConfig(value: Record<string, unknown>): boolean {\n return (\n hasNoDefinedKeys(value, [\n 'options',\n 'presentation',\n 'responsive',\n 'customPresentationId',\n 'minimizeBehavior',\n 'bottomAccessory',\n ]) &&\n (value.native === undefined || isNativeTabsConfig(value.native)) &&\n (value.web === undefined || isHeadlessTabsWebConfig(value.web))\n );\n}\n\n/*** Validate the top-level native tabs implementation. */\nfunction isFullNativeTabsConfig(value: Record<string, unknown>): boolean {\n return (\n hasNoDefinedKeys(value, [\n 'options',\n 'native',\n 'web',\n 'presentation',\n 'responsive',\n 'customPresentationId',\n ]) && isNativeTabsFields(value)\n );\n}\n\n/*** Validate the top-level JavaScript tabs implementation. */\nfunction isJavaScriptTabsConfig(value: Record<string, unknown>): boolean {\n return (\n hasNoDefinedKeys(value, [\n 'options',\n 'native',\n 'web',\n 'responsive',\n 'customPresentationId',\n 'minimizeBehavior',\n 'bottomAccessory',\n ]) &&\n (value.presentation === undefined ||\n (typeof value.presentation === 'string' &&\n contains(JAVASCRIPT_TABS_PRESENTATIONS, value.presentation)))\n );\n}\n\n/*** Validate the native branch used by adaptive tabs. */\nfunction isNativeTabsConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['implementation', 'minimizeBehavior', 'bottomAccessory']) &&\n value.implementation === 'native' &&\n isNativeTabsFields(value)\n );\n}\n\n/*** Validate fields supported by the native tabs branch. */\nfunction isNativeTabsFields(value: Record<string, unknown>): boolean {\n return (\n (value.minimizeBehavior === undefined ||\n (typeof value.minimizeBehavior === 'string' &&\n contains(NATIVE_TABS_MINIMIZE_BEHAVIORS, value.minimizeBehavior))) &&\n (value.bottomAccessory === undefined || isNavigatorScreenReference(value.bottomAccessory))\n );\n}\n\n/*** Validate the implementation-free headless-tabs Web branch inside adaptive tabs. */\nfunction isHeadlessTabsWebConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['presentation', 'responsive', 'customPresentationId']) &&\n isHeadlessTabsPresentationConfig(value)\n );\n}\n\n/*** Validate headless-tab presentation and its conditional serializable configuration. */\nfunction isHeadlessTabsPresentationConfig(value: Record<string, unknown>): boolean {\n if (\n typeof value.presentation !== 'string' ||\n !contains(HEADLESS_TABS_PRESENTATIONS, value.presentation)\n ) {\n return false;\n }\n if (value.responsive !== undefined && !isResponsiveTabsPresentation(value.responsive)) {\n return false;\n }\n if (!isOptionalString(value.customPresentationId)) return false;\n if (contains(FIXED_HEADLESS_TABS_PRESENTATIONS, value.presentation)) {\n return value.responsive === undefined && value.customPresentationId === undefined;\n }\n if (value.presentation === 'responsive') {\n return value.responsive !== undefined && value.customPresentationId === undefined;\n }\n return (\n value.responsive === undefined &&\n typeof value.customPresentationId === 'string' &&\n value.customPresentationId.length > 0\n );\n}\n\n/*** Validate semantic compact/medium/expanded headless-tab presentation mapping. */\nfunction isResponsiveTabsPresentation(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['compact', 'medium', 'expanded']) &&\n typeof value.compact === 'string' &&\n contains(FIXED_HEADLESS_TABS_PRESENTATIONS, value.compact) &&\n (value.medium === undefined ||\n (typeof value.medium === 'string' &&\n contains(FIXED_HEADLESS_TABS_PRESENTATIONS, value.medium))) &&\n typeof value.expanded === 'string' &&\n contains(FIXED_HEADLESS_TABS_PRESENTATIONS, value.expanded)\n );\n}\n\n/*** Check a string against a public finite contract without eager cyclic initialization. */\nfunction contains(values: readonly string[], value: string): boolean {\n return values.includes(value);\n}\n\n/*** Check that mutually exclusive branch fields are absent. */\nfunction hasNoDefinedKeys(value: Record<string, unknown>, keys: readonly string[]): boolean {\n const prohibited = new Set(keys);\n return !Object.entries(value).some(([key, entry]) => prohibited.has(key) && entry !== undefined);\n}\n"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { HeadlessTabsPresentation, JavaScriptTabsPresentation, NavigatorPreset, NavigatorType, StackPresentation } from '../navigator';
|
|
2
|
+
import type { NavigatorDependencyRequirement } from './generation';
|
|
3
|
+
import type { NavigatorApiStability, NavigatorCapabilityId, NavigatorRuntimePlatform, NavigatorSupportStatus } from './planning';
|
|
4
|
+
export type NavigatorVerificationKind = 'structural' | 'generation' | 'format' | 'lint' | 'dependency' | 'typescript' | 'install' | 'build' | 'export' | 'browser' | 'simulator' | 'device';
|
|
5
|
+
export type NavigatorVerificationStatus = 'verified' | 'unverified';
|
|
6
|
+
export type NavigatorImplementation = 'native' | 'javascript' | 'headless' | 'experimental';
|
|
7
|
+
export type NavigatorPresentation = StackPresentation | HeadlessTabsPresentation | JavaScriptTabsPresentation | 'two-column' | 'three-column';
|
|
8
|
+
export interface NavigatorCapabilityVerification {
|
|
9
|
+
kind: NavigatorVerificationKind;
|
|
10
|
+
status: NavigatorVerificationStatus;
|
|
11
|
+
}
|
|
12
|
+
export interface NavigatorCapabilityTarget {
|
|
13
|
+
platform: NavigatorRuntimePlatform;
|
|
14
|
+
support: NavigatorSupportStatus;
|
|
15
|
+
verification: readonly NavigatorCapabilityVerification[];
|
|
16
|
+
}
|
|
17
|
+
export interface NavigatorCapabilityRequirement {
|
|
18
|
+
id: string;
|
|
19
|
+
description: string;
|
|
20
|
+
}
|
|
21
|
+
export interface NavigatorCapabilityDescriptor {
|
|
22
|
+
id: NavigatorCapabilityId;
|
|
23
|
+
topology: NavigatorType;
|
|
24
|
+
implementation?: NavigatorImplementation;
|
|
25
|
+
presentation?: NavigatorPresentation;
|
|
26
|
+
stability: NavigatorApiStability;
|
|
27
|
+
targets: readonly NavigatorCapabilityTarget[];
|
|
28
|
+
dependencies: readonly NavigatorDependencyRequirement[];
|
|
29
|
+
requirements: readonly NavigatorCapabilityRequirement[];
|
|
30
|
+
incompatibilities: readonly NavigatorCapabilityId[];
|
|
31
|
+
limitations: readonly string[];
|
|
32
|
+
}
|
|
33
|
+
export interface NavigatorPresetDescriptor {
|
|
34
|
+
id: NavigatorPreset;
|
|
35
|
+
description: string;
|
|
36
|
+
topology: readonly NavigatorType[];
|
|
37
|
+
}
|
|
38
|
+
export interface NavigatorCatalog {
|
|
39
|
+
capabilities: readonly NavigatorCapabilityDescriptor[];
|
|
40
|
+
presets: readonly NavigatorPresetDescriptor[];
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/navigator/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,eAAe,EACf,aAAa,EACb,iBAAiB,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,yBAAyB,GACjC,YAAY,GACZ,YAAY,GACZ,QAAQ,GACR,MAAM,GACN,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,OAAO,GACP,QAAQ,GACR,SAAS,GACT,WAAW,GACX,QAAQ,CAAC;AAEb,MAAM,MAAM,2BAA2B,GAAG,UAAU,GAAG,YAAY,CAAC;AAEpE,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,cAAc,CAAC;AAE5F,MAAM,MAAM,qBAAqB,GAC7B,iBAAiB,GACjB,wBAAwB,GACxB,0BAA0B,GAC1B,YAAY,GACZ,cAAc,CAAC;AAEnB,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,yBAAyB,CAAC;IAChC,MAAM,EAAE,2BAA2B,CAAC;CACrC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,OAAO,EAAE,sBAAsB,CAAC;IAChC,YAAY,EAAE,SAAS,+BAA+B,EAAE,CAAC;CAC1D;AAED,MAAM,WAAW,8BAA8B;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,qBAAqB,CAAC;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,cAAc,CAAC,EAAE,uBAAuB,CAAC;IACzC,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,SAAS,EAAE,qBAAqB,CAAC;IACjC,OAAO,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAC9C,YAAY,EAAE,SAAS,8BAA8B,EAAE,CAAC;IACxD,YAAY,EAAE,SAAS,8BAA8B,EAAE,CAAC;IACxD,iBAAiB,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACpD,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,eAAe,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,SAAS,6BAA6B,EAAE,CAAC;IACvD,OAAO,EAAE,SAAS,yBAAyB,EAAE,CAAC;CAC/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/navigator/catalog.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n HeadlessTabsPresentation,\n JavaScriptTabsPresentation,\n NavigatorPreset,\n NavigatorType,\n StackPresentation,\n} from '../navigator';\nimport type { NavigatorDependencyRequirement } from './generation';\nimport type {\n NavigatorApiStability,\n NavigatorCapabilityId,\n NavigatorRuntimePlatform,\n NavigatorSupportStatus,\n} from './planning';\n\nexport type NavigatorVerificationKind =\n | 'structural'\n | 'generation'\n | 'format'\n | 'lint'\n | 'dependency'\n | 'typescript'\n | 'install'\n | 'build'\n | 'export'\n | 'browser'\n | 'simulator'\n | 'device';\n\nexport type NavigatorVerificationStatus = 'verified' | 'unverified';\n\nexport type NavigatorImplementation = 'native' | 'javascript' | 'headless' | 'experimental';\n\nexport type NavigatorPresentation =\n | StackPresentation\n | HeadlessTabsPresentation\n | JavaScriptTabsPresentation\n | 'two-column'\n | 'three-column';\n\nexport interface NavigatorCapabilityVerification {\n kind: NavigatorVerificationKind;\n status: NavigatorVerificationStatus;\n}\n\nexport interface NavigatorCapabilityTarget {\n platform: NavigatorRuntimePlatform;\n support: NavigatorSupportStatus;\n verification: readonly NavigatorCapabilityVerification[];\n}\n\nexport interface NavigatorCapabilityRequirement {\n id: string;\n description: string;\n}\n\nexport interface NavigatorCapabilityDescriptor {\n id: NavigatorCapabilityId;\n topology: NavigatorType;\n implementation?: NavigatorImplementation;\n presentation?: NavigatorPresentation;\n stability: NavigatorApiStability;\n targets: readonly NavigatorCapabilityTarget[];\n dependencies: readonly NavigatorDependencyRequirement[];\n requirements: readonly NavigatorCapabilityRequirement[];\n incompatibilities: readonly NavigatorCapabilityId[];\n limitations: readonly string[];\n}\n\nexport interface NavigatorPresetDescriptor {\n id: NavigatorPreset;\n description: string;\n topology: readonly NavigatorType[];\n}\n\nexport interface NavigatorCatalog {\n capabilities: readonly NavigatorCapabilityDescriptor[];\n presets: readonly NavigatorPresetDescriptor[];\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { NavigatorCapabilityId, NavigatorDiagnostic, NavigatorPlan, NavigatorSupportStatus } from './planning';
|
|
1
2
|
export interface NavigatorGeneratedFile {
|
|
2
3
|
path: string;
|
|
3
4
|
contents: string;
|
|
@@ -6,12 +7,21 @@ export interface NavigatorGenerationBindings {
|
|
|
6
7
|
screens: Readonly<Record<string, NavigatorScreenModule>>;
|
|
7
8
|
guards: Readonly<Record<string, NavigatorScreenModule>>;
|
|
8
9
|
iconSourceResolver?: NavigatorScreenModule;
|
|
9
|
-
flows?: {
|
|
10
|
-
onboardingRoute?: string;
|
|
11
|
-
authenticationRoute?: string;
|
|
12
|
-
};
|
|
13
10
|
tabPresentations?: Readonly<Record<string, NavigatorScreenModule>>;
|
|
14
11
|
}
|
|
12
|
+
export interface NavigatorDependencyRequirement {
|
|
13
|
+
packageName: string;
|
|
14
|
+
versionRange: string;
|
|
15
|
+
kind: 'dependency' | 'peerDependency';
|
|
16
|
+
}
|
|
17
|
+
export interface NavigatorGenerationResult {
|
|
18
|
+
support: NavigatorSupportStatus;
|
|
19
|
+
capabilityIds: readonly NavigatorCapabilityId[];
|
|
20
|
+
dependencies: readonly NavigatorDependencyRequirement[];
|
|
21
|
+
diagnostics: readonly NavigatorDiagnostic[];
|
|
22
|
+
plan: NavigatorPlan;
|
|
23
|
+
files: readonly NavigatorGeneratedFile[];
|
|
24
|
+
}
|
|
15
25
|
/** Options for placing Navigator-owned files inside a consumer-owned Expo Router app shell. */
|
|
16
26
|
export interface NavigatorGenerationOptions {
|
|
17
27
|
/** Directory that receives the root navigator layout. Must be `src/app` or one of its safe descendants. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generation.d.ts","sourceRoot":"","sources":["../../src/navigator/generation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACzD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACxD,kBAAkB,CAAC,EAAE,qBAAqB,CAAC;IAC3C,
|
|
1
|
+
{"version":3,"file":"generation.d.ts","sourceRoot":"","sources":["../../src/navigator/generation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACzD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACxD,kBAAkB,CAAC,EAAE,qBAAqB,CAAC;IAC3C,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,8BAA8B;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,YAAY,GAAG,gBAAgB,CAAC;CACvC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,sBAAsB,CAAC;IAChC,aAAa,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAChD,YAAY,EAAE,SAAS,8BAA8B,EAAE,CAAC;IACxD,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC5C,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAC1C;AAED,+FAA+F;AAC/F,MAAM,WAAW,0BAA0B;IACzC,2GAA2G;IAC3G,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generation.js","sourceRoot":"","sources":["../../src/navigator/generation.ts"],"names":[],"mappings":"","sourcesContent":["
|
|
1
|
+
{"version":3,"file":"generation.js","sourceRoot":"","sources":["../../src/navigator/generation.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n NavigatorCapabilityId,\n NavigatorDiagnostic,\n NavigatorPlan,\n NavigatorSupportStatus,\n} from './planning';\n\nexport interface NavigatorGeneratedFile {\n path: string;\n contents: string;\n}\n\nexport interface NavigatorGenerationBindings {\n screens: Readonly<Record<string, NavigatorScreenModule>>;\n guards: Readonly<Record<string, NavigatorScreenModule>>;\n iconSourceResolver?: NavigatorScreenModule;\n tabPresentations?: Readonly<Record<string, NavigatorScreenModule>>;\n}\n\nexport interface NavigatorDependencyRequirement {\n packageName: string;\n versionRange: string;\n kind: 'dependency' | 'peerDependency';\n}\n\nexport interface NavigatorGenerationResult {\n support: NavigatorSupportStatus;\n capabilityIds: readonly NavigatorCapabilityId[];\n dependencies: readonly NavigatorDependencyRequirement[];\n diagnostics: readonly NavigatorDiagnostic[];\n plan: NavigatorPlan;\n files: readonly NavigatorGeneratedFile[];\n}\n\n/** Options for placing Navigator-owned files inside a consumer-owned Expo Router app shell. */\nexport interface NavigatorGenerationOptions {\n /** Directory that receives the root navigator layout. Must be `src/app` or one of its safe descendants. */\n rootDirectory?: string;\n /** Emit routed screen re-export modules in addition to layouts. Defaults to true. */\n includeScreenFiles?: boolean;\n}\n\nexport interface NavigatorScreenModule {\n module: string;\n exportName: string;\n}\n"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { CustomNavigatorNode, DrawerNavigatorOptions, NavigatorType, RouteDefinition, StackImplementation, StackScreenOptions } from '../navigator';
|
|
2
2
|
import type { CustomNavigatorRegistry } from './extensions';
|
|
3
|
-
|
|
3
|
+
import type { NavigatorDependencyRequirement } from './generation';
|
|
4
|
+
export interface ResolvedHeadlessTabsPresentation {
|
|
4
5
|
presentation: ResolvedTabsPresentation;
|
|
5
6
|
customPresentationId?: string;
|
|
6
7
|
}
|
|
7
|
-
export type ResolvedTabsImplementation = '
|
|
8
|
+
export type ResolvedTabsImplementation = 'headless' | 'javascript' | 'native';
|
|
8
9
|
export type ResolvedTabsPresentation = 'bottom' | 'top' | 'rail' | 'sidebar' | 'custom';
|
|
9
10
|
/**
|
|
10
11
|
* Disposable adapter plan for a `tabs` topology.
|
|
@@ -30,7 +31,7 @@ export interface CreateNavigatorPlanOptions {
|
|
|
30
31
|
customNavigators?: CustomNavigatorRegistry;
|
|
31
32
|
}
|
|
32
33
|
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-split-view' | 'expo-router/unstable-native-tabs';
|
|
33
|
-
export type NavigatorAdapterId = 'slot' | 'stack.native' | 'stack.javascript' | 'stack.experimental' | 'drawer' | 'tabs.native' | 'tabs.javascript' | 'tabs.
|
|
34
|
+
export type NavigatorAdapterId = 'slot' | 'stack.native' | 'stack.javascript' | 'stack.experimental' | 'drawer' | 'tabs.native' | 'tabs.javascript' | 'tabs.headless' | 'split-view' | 'custom';
|
|
34
35
|
export interface NavigatorAdapterPlan {
|
|
35
36
|
id: NavigatorAdapterId;
|
|
36
37
|
/** Built-in Expo Router entry point or an explicitly registered custom module. */
|
|
@@ -41,6 +42,7 @@ export interface NavigatorAdapterPlan {
|
|
|
41
42
|
limitations: readonly string[];
|
|
42
43
|
}
|
|
43
44
|
export type NavigatorApiStability = 'stable' | 'alpha';
|
|
45
|
+
export type NavigatorCapabilityId = string;
|
|
44
46
|
export interface NavigatorDiagnostic {
|
|
45
47
|
code: string;
|
|
46
48
|
severity: 'error' | 'warning';
|
|
@@ -78,11 +80,9 @@ export interface NavigatorPlan {
|
|
|
78
80
|
context: NavigatorValidationContext;
|
|
79
81
|
root: NavigatorNodePlan;
|
|
80
82
|
diagnostics: readonly NavigatorDiagnostic[];
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
authentication: boolean;
|
|
85
|
-
};
|
|
83
|
+
support: NavigatorSupportStatus;
|
|
84
|
+
capabilityIds: readonly NavigatorCapabilityId[];
|
|
85
|
+
dependencies: readonly NavigatorDependencyRequirement[];
|
|
86
86
|
}
|
|
87
87
|
export type NavigatorResponsiveSize = 'compact' | 'medium' | 'expanded';
|
|
88
88
|
export interface NavigatorRoutePlan {
|
|
@@ -97,7 +97,7 @@ export interface NavigatorRoutePlan {
|
|
|
97
97
|
navigator?: NavigatorNodePlan;
|
|
98
98
|
}
|
|
99
99
|
export type NavigatorRuntimePlatform = 'android' | 'ios' | 'web';
|
|
100
|
-
export type NavigatorSupportStatus = 'supported' | '
|
|
100
|
+
export type NavigatorSupportStatus = 'supported' | 'testing-only' | 'unsupported';
|
|
101
101
|
export interface NavigatorValidationContext {
|
|
102
102
|
platform: NavigatorRuntimePlatform;
|
|
103
103
|
expoRouterVersion: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../src/navigator/planning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../src/navigator/planning.ts"],"names":[],"mappings":"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"}
|