@ankhorage/contracts 10.0.0 → 11.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.
- package/CHANGELOG.md +15 -0
- package/README.md +1 -1
- package/dist/appManifest/icon.d.ts +3 -0
- package/dist/appManifest/icon.d.ts.map +1 -0
- package/dist/appManifest/icon.js +20 -0
- package/dist/appManifest/icon.js.map +1 -0
- package/dist/appManifest/infra.d.ts.map +1 -1
- package/dist/appManifest/infra.js +1 -9
- package/dist/appManifest/infra.js.map +1 -1
- package/dist/appManifest/navigator.d.ts +3 -0
- package/dist/appManifest/navigator.d.ts.map +1 -0
- package/dist/appManifest/navigator.js +142 -0
- package/dist/appManifest/navigator.js.map +1 -0
- package/dist/appManifest/navigatorOptions.d.ts +13 -0
- package/dist/appManifest/navigatorOptions.d.ts.map +1 -0
- package/dist/appManifest/navigatorOptions.js +226 -0
- package/dist/appManifest/navigatorOptions.js.map +1 -0
- package/dist/appManifest/screens.d.ts +1 -2
- package/dist/appManifest/screens.d.ts.map +1 -1
- package/dist/appManifest/screens.js +2 -124
- package/dist/appManifest/screens.js.map +1 -1
- package/dist/navigator.d.ts +101 -14
- package/dist/navigator.d.ts.map +1 -1
- package/dist/navigator.js +23 -1
- package/dist/navigator.js.map +1 -1
- package/dist/types.d.ts +14 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/src/appManifest/icon.ts +26 -0
- package/src/appManifest/infra.ts +1 -12
- package/src/appManifest/navigator.ts +179 -0
- package/src/appManifest/navigatorOptions.ts +292 -0
- package/src/appManifest/screens.ts +3 -181
- package/src/contracts.test.ts +1 -1
- package/src/navigator-validation.test.ts +153 -0
- package/src/navigator.test.ts +176 -10
- package/src/navigator.ts +149 -13
- package/src/types.ts +16 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @ankhorage/contracts
|
|
2
2
|
|
|
3
|
+
## 11.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 1696309: Add serializable Slot, typed Stack, Drawer, Tabs, Split View, and Custom navigator variants with matching structural validation.
|
|
8
|
+
|
|
9
|
+
This is a breaking contract change: the arbitrary navigator `options` bag is removed, Stack and Drawer options are now finite typed branches, custom tabs use strict presentation discriminants, and invalid or non-JSON custom configuration is rejected. No authored `options` values were found in the current canonical consumers; the major release prevents their existing `^10` ranges from receiving the narrowed contract automatically.
|
|
10
|
+
|
|
11
|
+
## 10.1.0
|
|
12
|
+
|
|
13
|
+
### Minor Changes
|
|
14
|
+
|
|
15
|
+
- 958b0a2: Allow manifest icon specifications to reference SVG media assets through a mutually exclusive
|
|
16
|
+
`source` branch.
|
|
17
|
+
|
|
3
18
|
## 10.0.0
|
|
4
19
|
|
|
5
20
|
### Major 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
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../src/appManifest/icon.ts"],"names":[],"mappings":"AAGA,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAqBlD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { isMediaAssetReference } from '../media';
|
|
2
|
+
import { isOptionalString, isRecord } from './shared';
|
|
3
|
+
/*** Validate a serializable icon as either a named font glyph or an SVG media reference. */
|
|
4
|
+
export function isIconSpec(value) {
|
|
5
|
+
if (!isRecord(value))
|
|
6
|
+
return false;
|
|
7
|
+
const hasValidPresentation = (value.size === undefined ||
|
|
8
|
+
typeof value.size === 'string' ||
|
|
9
|
+
typeof value.size === 'number') &&
|
|
10
|
+
isOptionalString(value.color);
|
|
11
|
+
if (!hasValidPresentation)
|
|
12
|
+
return false;
|
|
13
|
+
if ('source' in value) {
|
|
14
|
+
return (isMediaAssetReference(value.source) &&
|
|
15
|
+
value.name === undefined &&
|
|
16
|
+
value.provider === undefined);
|
|
17
|
+
}
|
|
18
|
+
return (typeof value.name === 'string' && isOptionalString(value.provider) && value.source === undefined);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=icon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon.js","sourceRoot":"","sources":["../../src/appManifest/icon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEtD,4FAA4F;AAC5F,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnC,MAAM,oBAAoB,GACxB,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;QACvB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;QACjC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC,oBAAoB;QAAE,OAAO,KAAK,CAAC;IAExC,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QACtB,OAAO,CACL,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC;YACnC,KAAK,CAAC,IAAI,KAAK,SAAS;YACxB,KAAK,CAAC,QAAQ,KAAK,SAAS,CAC7B,CAAC;IACJ,CAAC;IAED,OAAO,CACL,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,CACjG,CAAC;AACJ,CAAC","sourcesContent":["import { isMediaAssetReference } from '../media';\nimport { isOptionalString, isRecord } from './shared';\n\n/*** Validate a serializable icon as either a named font glyph or an SVG media reference. */\nexport function isIconSpec(value: unknown): boolean {\n if (!isRecord(value)) return false;\n\n const hasValidPresentation =\n (value.size === undefined ||\n typeof value.size === 'string' ||\n typeof value.size === 'number') &&\n isOptionalString(value.color);\n if (!hasValidPresentation) return false;\n\n if ('source' in value) {\n return (\n isMediaAssetReference(value.source) &&\n value.name === undefined &&\n value.provider === undefined\n );\n }\n\n return (\n typeof value.name === 'string' && isOptionalString(value.provider) && value.source === undefined\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"infra.d.ts","sourceRoot":"","sources":["../../src/appManifest/infra.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"infra.d.ts","sourceRoot":"","sources":["../../src/appManifest/infra.ts"],"names":[],"mappings":"AAqCA,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAgBvD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AUTH_OAUTH_PROVIDER_IDS } from '../auth';
|
|
2
2
|
import { AUTH_PROFILE_CREATE_STRATEGIES, AUTH_PROFILE_PRIMARY_KEY_STRATEGIES, AUTH_PROFILE_UPDATE_STRATEGIES, AUTH_SCOPES, AUTH_SIGN_IN_IDENTIFIERS, AUTH_SIGN_UP_POLICIES, AUTHZ_ENGINES, AUTHZ_KINDS, DATABASE_TIERS, STATE_PERSISTENCE_MODES, STORAGE_PROVIDERS, } from '../types';
|
|
3
3
|
import { isApiDefinitionList } from './apis';
|
|
4
|
+
import { isIconSpec } from './icon';
|
|
4
5
|
import { isOptionalBoolean, isOptionalString, isRecord, isStringArray, isStringRecord, } from './shared';
|
|
5
6
|
const AUTH_OAUTH_PROVIDER_SET = new Set(AUTH_OAUTH_PROVIDER_IDS);
|
|
6
7
|
const AUTH_PROFILE_CREATE_STRATEGY_SET = new Set(AUTH_PROFILE_CREATE_STRATEGIES);
|
|
@@ -126,13 +127,4 @@ function isAuthProfileSpec(value) {
|
|
|
126
127
|
(typeof value.updateStrategy === 'string' &&
|
|
127
128
|
AUTH_PROFILE_UPDATE_STRATEGY_SET.has(value.updateStrategy))));
|
|
128
129
|
}
|
|
129
|
-
function isIconSpec(value) {
|
|
130
|
-
return (isRecord(value) &&
|
|
131
|
-
typeof value.name === 'string' &&
|
|
132
|
-
isOptionalString(value.provider) &&
|
|
133
|
-
(value.size === undefined ||
|
|
134
|
-
typeof value.size === 'string' ||
|
|
135
|
-
typeof value.size === 'number') &&
|
|
136
|
-
isOptionalString(value.color));
|
|
137
|
-
}
|
|
138
130
|
//# sourceMappingURL=infra.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"infra.js","sourceRoot":"","sources":["../../src/appManifest/infra.ts"],"names":[],"mappings":"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","sourcesContent":["import { AUTH_OAUTH_PROVIDER_IDS } from '../auth';\nimport {\n AUTH_PROFILE_CREATE_STRATEGIES,\n AUTH_PROFILE_PRIMARY_KEY_STRATEGIES,\n AUTH_PROFILE_UPDATE_STRATEGIES,\n AUTH_SCOPES,\n AUTH_SIGN_IN_IDENTIFIERS,\n AUTH_SIGN_UP_POLICIES,\n AUTHZ_ENGINES,\n AUTHZ_KINDS,\n DATABASE_TIERS,\n STATE_PERSISTENCE_MODES,\n STORAGE_PROVIDERS,\n} from '../types';\nimport { isApiDefinitionList } from './apis';\nimport {\n isOptionalBoolean,\n isOptionalString,\n isRecord,\n isStringArray,\n isStringRecord,\n} from './shared';\n\nconst AUTH_OAUTH_PROVIDER_SET = new Set<string>(AUTH_OAUTH_PROVIDER_IDS);\nconst AUTH_PROFILE_CREATE_STRATEGY_SET = new Set<string>(AUTH_PROFILE_CREATE_STRATEGIES);\nconst AUTH_PROFILE_PRIMARY_KEY_STRATEGY_SET = new Set<string>(AUTH_PROFILE_PRIMARY_KEY_STRATEGIES);\nconst AUTH_PROFILE_UPDATE_STRATEGY_SET = new Set<string>(AUTH_PROFILE_UPDATE_STRATEGIES);\nconst AUTH_SCOPE_SET = new Set<string>(AUTH_SCOPES);\nconst AUTH_SIGN_IN_IDENTIFIER_SET = new Set<string>(AUTH_SIGN_IN_IDENTIFIERS);\nconst AUTH_SIGN_UP_POLICY_SET = new Set<string>(AUTH_SIGN_UP_POLICIES);\nconst AUTHZ_ENGINE_SET = new Set<string>(AUTHZ_ENGINES);\nconst AUTHZ_KIND_SET = new Set<string>(AUTHZ_KINDS);\nconst DATABASE_TIER_SET = new Set<string>(DATABASE_TIERS);\nconst STATE_PERSISTENCE_MODE_SET = new Set<string>(STATE_PERSISTENCE_MODES);\nconst STORAGE_PROVIDER_SET = new Set<string>(STORAGE_PROVIDERS);\n\nexport function isInfraManifest(value: unknown): boolean {\n return (\n isRecord(value) &&\n (value.deployment === undefined || isDeploymentSpec(value.deployment)) &&\n (value.auth === undefined || isAuthSpec(value.auth)) &&\n (value.database === undefined || isDatabaseSpec(value.database)) &&\n (value.storage === undefined || isStorageSpec(value.storage)) &&\n (value.state === undefined || isStateSpec(value.state)) &&\n (value.networking === undefined || isNetworkingSpec(value.networking)) &&\n (value.apis === undefined || isApiDefinitionList(value.apis)) &&\n Array.isArray(value.modules) &&\n value.modules.every((moduleId) => typeof moduleId === 'string') &&\n (value.modulesConfig === undefined || isRecord(value.modulesConfig)) &&\n !('plugins' in value) &&\n !('pluginsConfig' in value)\n );\n}\n\nfunction isDeploymentSpec(value: unknown): boolean {\n return (\n isRecord(value) && typeof value.target === 'string' && typeof value.monitoring === 'boolean'\n );\n}\n\nfunction isDatabaseSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.provider === 'string' &&\n typeof value.tier === 'string' &&\n DATABASE_TIER_SET.has(value.tier)\n );\n}\n\nfunction isStorageSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.provider === 'string' &&\n STORAGE_PROVIDER_SET.has(value.provider) &&\n isStringArray(value.buckets)\n );\n}\n\nfunction isStateSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.provider === 'string' &&\n (value.persistence === undefined ||\n (typeof value.persistence === 'string' && STATE_PERSISTENCE_MODE_SET.has(value.persistence)))\n );\n}\n\nfunction isNetworkingSpec(value: unknown): boolean {\n return isRecord(value) && isOptionalString(value.domain) && typeof value.cdn === 'boolean';\n}\n\nfunction isAuthSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.scope === 'string' &&\n AUTH_SCOPE_SET.has(value.scope) &&\n typeof value.provider === 'string' &&\n (value.authorization === undefined || isAuthzSpec(value.authorization)) &&\n (value.flow === undefined || isAuthFlow(value.flow)) &&\n (value.signIn === undefined || isAuthSignInSpec(value.signIn)) &&\n (value.signUp === undefined || isAuthSignUpSpec(value.signUp)) &&\n (value.oauth === undefined || isAuthOAuthConfig(value.oauth)) &&\n (value.profile === undefined || isAuthProfileSpec(value.profile))\n );\n}\n\nfunction isAuthzSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.kind === 'string' &&\n AUTHZ_KIND_SET.has(value.kind) &&\n typeof value.engine === 'string' &&\n AUTHZ_ENGINE_SET.has(value.engine)\n );\n}\n\nfunction isAuthFlow(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.signInRoute === 'string' &&\n isOptionalString(value.signUpRoute) &&\n isOptionalString(value.signOutRoute) &&\n isOptionalString(value.forgotPasswordRoute) &&\n isOptionalString(value.otpRoute) &&\n typeof value.postSignInRoute === 'string' &&\n isOptionalString(value.unauthorizedRoute)\n );\n}\n\nfunction isAuthSignInSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n Array.isArray(value.identifiers) &&\n value.identifiers.every(\n (identifier) => typeof identifier === 'string' && AUTH_SIGN_IN_IDENTIFIER_SET.has(identifier),\n )\n );\n}\n\nfunction isAuthSignUpSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n isStringArray(value.requiredFields) &&\n (value.optionalFields === undefined || isStringArray(value.optionalFields)) &&\n (value.signUpPolicy === undefined ||\n (typeof value.signUpPolicy === 'string' && AUTH_SIGN_UP_POLICY_SET.has(value.signUpPolicy)))\n );\n}\n\nfunction isAuthOAuthConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.enabled === 'boolean' &&\n typeof value.callbackRoute === 'string' &&\n Array.isArray(value.providers) &&\n value.providers.every(isAuthOAuthProviderConfig)\n );\n}\n\nfunction isAuthOAuthProviderConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n (AUTH_OAUTH_PROVIDER_SET.has(value.id) || value.id.length > 0) &&\n isOptionalString(value.label) &&\n isOptionalBoolean(value.enabled) &&\n (value.scopes === undefined || isStringArray(value.scopes)) &&\n (value.queryParams === undefined || isStringRecord(value.queryParams)) &&\n (value.icon === undefined || isIconSpec(value.icon)) &&\n (value.credentialsRef === undefined || typeof value.credentialsRef === 'string')\n );\n}\n\nfunction isAuthProfileSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n isStringArray(value.fields) &&\n isOptionalString(value.table) &&\n (value.primaryKey === undefined ||\n (typeof value.primaryKey === 'string' &&\n AUTH_PROFILE_PRIMARY_KEY_STRATEGY_SET.has(value.primaryKey))) &&\n (value.createStrategy === undefined ||\n (typeof value.createStrategy === 'string' &&\n AUTH_PROFILE_CREATE_STRATEGY_SET.has(value.createStrategy))) &&\n (value.updateStrategy === undefined ||\n (typeof value.updateStrategy === 'string' &&\n AUTH_PROFILE_UPDATE_STRATEGY_SET.has(value.updateStrategy)))\n );\n}\n\nfunction isIconSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.name === 'string' &&\n isOptionalString(value.provider) &&\n (value.size === undefined ||\n typeof value.size === 'string' ||\n typeof value.size === 'number') &&\n isOptionalString(value.color)\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"infra.js","sourceRoot":"","sources":["../../src/appManifest/infra.ts"],"names":[],"mappings":"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","sourcesContent":["import { AUTH_OAUTH_PROVIDER_IDS } from '../auth';\nimport {\n AUTH_PROFILE_CREATE_STRATEGIES,\n AUTH_PROFILE_PRIMARY_KEY_STRATEGIES,\n AUTH_PROFILE_UPDATE_STRATEGIES,\n AUTH_SCOPES,\n AUTH_SIGN_IN_IDENTIFIERS,\n AUTH_SIGN_UP_POLICIES,\n AUTHZ_ENGINES,\n AUTHZ_KINDS,\n DATABASE_TIERS,\n STATE_PERSISTENCE_MODES,\n STORAGE_PROVIDERS,\n} from '../types';\nimport { isApiDefinitionList } from './apis';\nimport { isIconSpec } from './icon';\nimport {\n isOptionalBoolean,\n isOptionalString,\n isRecord,\n isStringArray,\n isStringRecord,\n} from './shared';\n\nconst AUTH_OAUTH_PROVIDER_SET = new Set<string>(AUTH_OAUTH_PROVIDER_IDS);\nconst AUTH_PROFILE_CREATE_STRATEGY_SET = new Set<string>(AUTH_PROFILE_CREATE_STRATEGIES);\nconst AUTH_PROFILE_PRIMARY_KEY_STRATEGY_SET = new Set<string>(AUTH_PROFILE_PRIMARY_KEY_STRATEGIES);\nconst AUTH_PROFILE_UPDATE_STRATEGY_SET = new Set<string>(AUTH_PROFILE_UPDATE_STRATEGIES);\nconst AUTH_SCOPE_SET = new Set<string>(AUTH_SCOPES);\nconst AUTH_SIGN_IN_IDENTIFIER_SET = new Set<string>(AUTH_SIGN_IN_IDENTIFIERS);\nconst AUTH_SIGN_UP_POLICY_SET = new Set<string>(AUTH_SIGN_UP_POLICIES);\nconst AUTHZ_ENGINE_SET = new Set<string>(AUTHZ_ENGINES);\nconst AUTHZ_KIND_SET = new Set<string>(AUTHZ_KINDS);\nconst DATABASE_TIER_SET = new Set<string>(DATABASE_TIERS);\nconst STATE_PERSISTENCE_MODE_SET = new Set<string>(STATE_PERSISTENCE_MODES);\nconst STORAGE_PROVIDER_SET = new Set<string>(STORAGE_PROVIDERS);\n\nexport function isInfraManifest(value: unknown): boolean {\n return (\n isRecord(value) &&\n (value.deployment === undefined || isDeploymentSpec(value.deployment)) &&\n (value.auth === undefined || isAuthSpec(value.auth)) &&\n (value.database === undefined || isDatabaseSpec(value.database)) &&\n (value.storage === undefined || isStorageSpec(value.storage)) &&\n (value.state === undefined || isStateSpec(value.state)) &&\n (value.networking === undefined || isNetworkingSpec(value.networking)) &&\n (value.apis === undefined || isApiDefinitionList(value.apis)) &&\n Array.isArray(value.modules) &&\n value.modules.every((moduleId) => typeof moduleId === 'string') &&\n (value.modulesConfig === undefined || isRecord(value.modulesConfig)) &&\n !('plugins' in value) &&\n !('pluginsConfig' in value)\n );\n}\n\nfunction isDeploymentSpec(value: unknown): boolean {\n return (\n isRecord(value) && typeof value.target === 'string' && typeof value.monitoring === 'boolean'\n );\n}\n\nfunction isDatabaseSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.provider === 'string' &&\n typeof value.tier === 'string' &&\n DATABASE_TIER_SET.has(value.tier)\n );\n}\n\nfunction isStorageSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.provider === 'string' &&\n STORAGE_PROVIDER_SET.has(value.provider) &&\n isStringArray(value.buckets)\n );\n}\n\nfunction isStateSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.provider === 'string' &&\n (value.persistence === undefined ||\n (typeof value.persistence === 'string' && STATE_PERSISTENCE_MODE_SET.has(value.persistence)))\n );\n}\n\nfunction isNetworkingSpec(value: unknown): boolean {\n return isRecord(value) && isOptionalString(value.domain) && typeof value.cdn === 'boolean';\n}\n\nfunction isAuthSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.scope === 'string' &&\n AUTH_SCOPE_SET.has(value.scope) &&\n typeof value.provider === 'string' &&\n (value.authorization === undefined || isAuthzSpec(value.authorization)) &&\n (value.flow === undefined || isAuthFlow(value.flow)) &&\n (value.signIn === undefined || isAuthSignInSpec(value.signIn)) &&\n (value.signUp === undefined || isAuthSignUpSpec(value.signUp)) &&\n (value.oauth === undefined || isAuthOAuthConfig(value.oauth)) &&\n (value.profile === undefined || isAuthProfileSpec(value.profile))\n );\n}\n\nfunction isAuthzSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.kind === 'string' &&\n AUTHZ_KIND_SET.has(value.kind) &&\n typeof value.engine === 'string' &&\n AUTHZ_ENGINE_SET.has(value.engine)\n );\n}\n\nfunction isAuthFlow(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.signInRoute === 'string' &&\n isOptionalString(value.signUpRoute) &&\n isOptionalString(value.signOutRoute) &&\n isOptionalString(value.forgotPasswordRoute) &&\n isOptionalString(value.otpRoute) &&\n typeof value.postSignInRoute === 'string' &&\n isOptionalString(value.unauthorizedRoute)\n );\n}\n\nfunction isAuthSignInSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n Array.isArray(value.identifiers) &&\n value.identifiers.every(\n (identifier) => typeof identifier === 'string' && AUTH_SIGN_IN_IDENTIFIER_SET.has(identifier),\n )\n );\n}\n\nfunction isAuthSignUpSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n isStringArray(value.requiredFields) &&\n (value.optionalFields === undefined || isStringArray(value.optionalFields)) &&\n (value.signUpPolicy === undefined ||\n (typeof value.signUpPolicy === 'string' && AUTH_SIGN_UP_POLICY_SET.has(value.signUpPolicy)))\n );\n}\n\nfunction isAuthOAuthConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.enabled === 'boolean' &&\n typeof value.callbackRoute === 'string' &&\n Array.isArray(value.providers) &&\n value.providers.every(isAuthOAuthProviderConfig)\n );\n}\n\nfunction isAuthOAuthProviderConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n (AUTH_OAUTH_PROVIDER_SET.has(value.id) || value.id.length > 0) &&\n isOptionalString(value.label) &&\n isOptionalBoolean(value.enabled) &&\n (value.scopes === undefined || isStringArray(value.scopes)) &&\n (value.queryParams === undefined || isStringRecord(value.queryParams)) &&\n (value.icon === undefined || isIconSpec(value.icon)) &&\n (value.credentialsRef === undefined || typeof value.credentialsRef === 'string')\n );\n}\n\nfunction isAuthProfileSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n isStringArray(value.fields) &&\n isOptionalString(value.table) &&\n (value.primaryKey === undefined ||\n (typeof value.primaryKey === 'string' &&\n AUTH_PROFILE_PRIMARY_KEY_STRATEGY_SET.has(value.primaryKey))) &&\n (value.createStrategy === undefined ||\n (typeof value.createStrategy === 'string' &&\n AUTH_PROFILE_CREATE_STRATEGY_SET.has(value.createStrategy))) &&\n (value.updateStrategy === undefined ||\n (typeof value.updateStrategy === 'string' &&\n AUTH_PROFILE_UPDATE_STRATEGY_SET.has(value.updateStrategy)))\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigator.d.ts","sourceRoot":"","sources":["../../src/appManifest/navigator.ts"],"names":[],"mappings":"AAeA,uEAAuE;AACvE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAU9D"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { NAVIGATOR_PRESETS, NAVIGATOR_TYPES } from '../navigator';
|
|
2
|
+
import { isIconSpec } from './icon';
|
|
3
|
+
import { hasOnlyKeys, isDrawerNavigatorOptions, isNavigatorScreenReference, isStackImplementationConfig, isStackScreenOptions, isTabsImplementationConfig, } from './navigatorOptions';
|
|
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
|
+
/*** Validate the complete serialized `AppManifest.navigator` slice. */
|
|
8
|
+
export function isAppNavigatorManifest(value) {
|
|
9
|
+
return (isRecord(value) &&
|
|
10
|
+
isNavigatorNode(value) &&
|
|
11
|
+
(value.preset === undefined ||
|
|
12
|
+
(typeof value.preset === 'string' && NAVIGATOR_PRESET_SET.has(value.preset))) &&
|
|
13
|
+
(value.flows === undefined || isNavigatorFlows(value.flows)) &&
|
|
14
|
+
(value.defaults === undefined || isNavigatorDefaults(value.defaults)) &&
|
|
15
|
+
(value.platforms === undefined || isNavigatorPlatforms(value.platforms)));
|
|
16
|
+
}
|
|
17
|
+
/*** Validate one nested navigator node independently from app-level authoring metadata. */
|
|
18
|
+
function isNavigatorNode(value) {
|
|
19
|
+
if (!isRecord(value) ||
|
|
20
|
+
typeof value.type !== 'string' ||
|
|
21
|
+
!NAVIGATOR_TYPE_SET.has(value.type) ||
|
|
22
|
+
!isOptionalString(value.initialRouteName) ||
|
|
23
|
+
!Array.isArray(value.routes) ||
|
|
24
|
+
!value.routes.every(isRouteDefinition)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
switch (value.type) {
|
|
28
|
+
case 'slot':
|
|
29
|
+
return value.options === undefined && value.implementation === undefined;
|
|
30
|
+
case 'stack':
|
|
31
|
+
return isStackImplementationConfig(value);
|
|
32
|
+
case 'tabs':
|
|
33
|
+
return isTabsImplementationConfig(value);
|
|
34
|
+
case 'drawer':
|
|
35
|
+
return (value.implementation === undefined &&
|
|
36
|
+
(value.options === undefined || isDrawerNavigatorOptions(value.options)));
|
|
37
|
+
case 'split-view':
|
|
38
|
+
return isSplitViewNavigatorNode(value);
|
|
39
|
+
case 'custom':
|
|
40
|
+
return isCustomNavigatorNode(value);
|
|
41
|
+
default:
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/*** Validate one route and preserve its portable metadata and nested navigator. */
|
|
46
|
+
function isRouteDefinition(value) {
|
|
47
|
+
return (isRecord(value) &&
|
|
48
|
+
typeof value.name === 'string' &&
|
|
49
|
+
isOptionalString(value.path) &&
|
|
50
|
+
isOptionalString(value.label) &&
|
|
51
|
+
(value.icon === undefined || isIconSpec(value.icon)) &&
|
|
52
|
+
isOptionalBoolean(value.showInPrimaryNavigation) &&
|
|
53
|
+
(value.guards === undefined || isStringArray(value.guards)) &&
|
|
54
|
+
isOptionalString(value.screenId) &&
|
|
55
|
+
(value.stackOptions === undefined || isStackScreenOptions(value.stackOptions)) &&
|
|
56
|
+
(value.navigator === undefined || isNavigatorNode(value.navigator)));
|
|
57
|
+
}
|
|
58
|
+
/*** Validate Split View screen references without duplicating the routed secondary tree. */
|
|
59
|
+
function isSplitViewNavigatorNode(value) {
|
|
60
|
+
return (value.implementation === undefined &&
|
|
61
|
+
value.options === undefined &&
|
|
62
|
+
isRecord(value.columns) &&
|
|
63
|
+
hasOnlyKeys(value.columns, ['primary', 'supplementary']) &&
|
|
64
|
+
isNavigatorScreenReference(value.columns.primary) &&
|
|
65
|
+
(value.columns.supplementary === undefined ||
|
|
66
|
+
isNavigatorScreenReference(value.columns.supplementary)) &&
|
|
67
|
+
(value.inspector === undefined || isNavigatorScreenReference(value.inspector)) &&
|
|
68
|
+
(value.topColumnForCollapsing === undefined ||
|
|
69
|
+
value.topColumnForCollapsing === 'primary' ||
|
|
70
|
+
value.topColumnForCollapsing === 'supplementary' ||
|
|
71
|
+
value.topColumnForCollapsing === 'secondary'));
|
|
72
|
+
}
|
|
73
|
+
/*** Validate a registered custom navigator with JSON-safe configuration only. */
|
|
74
|
+
function isCustomNavigatorNode(value) {
|
|
75
|
+
return (value.implementation === undefined &&
|
|
76
|
+
value.options === undefined &&
|
|
77
|
+
typeof value.navigatorId === 'string' &&
|
|
78
|
+
(value.config === undefined || isNavigatorJsonRecord(value.config)));
|
|
79
|
+
}
|
|
80
|
+
/*** Validate an acyclic, finite JSON object used by a custom navigator adapter. */
|
|
81
|
+
function isNavigatorJsonRecord(value) {
|
|
82
|
+
return isRecord(value) && isNavigatorJsonValue(value, new Set());
|
|
83
|
+
}
|
|
84
|
+
/*** Recursively validate the portable manifest value domain and reject cycles. */
|
|
85
|
+
function isNavigatorJsonValue(value, ancestors) {
|
|
86
|
+
if (value === null || typeof value === 'string' || typeof value === 'boolean')
|
|
87
|
+
return true;
|
|
88
|
+
if (typeof value === 'number')
|
|
89
|
+
return Number.isFinite(value);
|
|
90
|
+
if (typeof value !== 'object' || ancestors.has(value))
|
|
91
|
+
return false;
|
|
92
|
+
if (Array.isArray(value)) {
|
|
93
|
+
if (Object.keys(value).length !== value.length ||
|
|
94
|
+
Object.getOwnPropertySymbols(value).length > 0) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const prototype = Object.getPrototypeOf(value);
|
|
100
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
101
|
+
return false;
|
|
102
|
+
if (Reflect.ownKeys(value).some((key) => typeof key !== 'string'))
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
ancestors.add(value);
|
|
106
|
+
const isValid = Object.values(value).every((entry) => isNavigatorJsonValue(entry, ancestors));
|
|
107
|
+
ancestors.delete(value);
|
|
108
|
+
return isValid;
|
|
109
|
+
}
|
|
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
|
+
/*** Validate package-owned navigator defaults without requiring a navigator node type. */
|
|
117
|
+
function isNavigatorDefaults(value) {
|
|
118
|
+
return (isRecord(value) &&
|
|
119
|
+
hasOnlyKeys(value, ['tabs', 'stack']) &&
|
|
120
|
+
(value.tabs === undefined ||
|
|
121
|
+
(isRecord(value.tabs) && isTabsImplementationConfig(value.tabs))) &&
|
|
122
|
+
(value.stack === undefined ||
|
|
123
|
+
(isRecord(value.stack) && isStackImplementationConfig(value.stack))));
|
|
124
|
+
}
|
|
125
|
+
/*** Validate per-platform navigator implementation overrides. */
|
|
126
|
+
function isNavigatorPlatforms(value) {
|
|
127
|
+
return (isRecord(value) &&
|
|
128
|
+
hasOnlyKeys(value, ['android', 'ios', 'web']) &&
|
|
129
|
+
(value.android === undefined || isNavigatorPlatformConfig(value.android)) &&
|
|
130
|
+
(value.ios === undefined || isNavigatorPlatformConfig(value.ios)) &&
|
|
131
|
+
(value.web === undefined || isNavigatorPlatformConfig(value.web)));
|
|
132
|
+
}
|
|
133
|
+
/*** Validate one platform-specific navigator override slice. */
|
|
134
|
+
function isNavigatorPlatformConfig(value) {
|
|
135
|
+
return (isRecord(value) &&
|
|
136
|
+
hasOnlyKeys(value, ['tabs', 'stack']) &&
|
|
137
|
+
(value.tabs === undefined ||
|
|
138
|
+
(isRecord(value.tabs) && isTabsImplementationConfig(value.tabs))) &&
|
|
139
|
+
(value.stack === undefined ||
|
|
140
|
+
(isRecord(value.stack) && isStackImplementationConfig(value.stack))));
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=navigator.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/*** Validate stable native, JavaScript, or alpha Experimental Stack desired state. */
|
|
2
|
+
export declare function isStackImplementationConfig(value: Record<string, unknown>): boolean;
|
|
3
|
+
/*** Validate the serializable native-stack screen option subset. */
|
|
4
|
+
export declare function isStackScreenOptions(value: unknown): boolean;
|
|
5
|
+
/*** Validate the finite serializable Drawer option subset. */
|
|
6
|
+
export declare function isDrawerNavigatorOptions(value: unknown): boolean;
|
|
7
|
+
/*** Validate tabs implementation desired state, with omitted implementation meaning adaptive. */
|
|
8
|
+
export declare function isTabsImplementationConfig(value: Record<string, unknown>): boolean;
|
|
9
|
+
/*** Validate a reference into the app-owned screen registry. */
|
|
10
|
+
export declare function isNavigatorScreenReference(value: unknown): boolean;
|
|
11
|
+
/*** Check that a finite configuration object contains no unsupported keys. */
|
|
12
|
+
export declare function hasOnlyKeys(value: Record<string, unknown>, allowedKeys: readonly string[]): boolean;
|
|
13
|
+
//# sourceMappingURL=navigatorOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigatorOptions.d.ts","sourceRoot":"","sources":["../../src/appManifest/navigatorOptions.ts"],"names":[],"mappings":"AAqBA,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,CA0B5D;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"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { CUSTOM_TABS_PRESENTATIONS, DRAWER_POSITIONS, DRAWER_TYPES, FIXED_CUSTOM_TABS_PRESENTATIONS, JAVASCRIPT_STACK_PRESENTATIONS, JAVASCRIPT_TABS_PRESENTATIONS, NATIVE_TABS_MINIMIZE_BEHAVIORS, STACK_PRESENTATIONS, } from '../navigator';
|
|
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
|
+
/*** Validate stable native, JavaScript, or alpha Experimental Stack desired state. */
|
|
12
|
+
export function isStackImplementationConfig(value) {
|
|
13
|
+
if (!hasNoDefinedKeys(value, [
|
|
14
|
+
'native',
|
|
15
|
+
'web',
|
|
16
|
+
'presentation',
|
|
17
|
+
'responsive',
|
|
18
|
+
'customPresentationId',
|
|
19
|
+
'minimizeBehavior',
|
|
20
|
+
'bottomAccessory',
|
|
21
|
+
])) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
if (value.implementation === undefined || value.implementation === 'native') {
|
|
25
|
+
return value.options === undefined || isStackScreenOptions(value.options);
|
|
26
|
+
}
|
|
27
|
+
if (value.implementation === 'javascript') {
|
|
28
|
+
return value.options === undefined || isJavaScriptStackScreenOptions(value.options);
|
|
29
|
+
}
|
|
30
|
+
return (value.implementation === 'experimental' &&
|
|
31
|
+
(value.options === undefined || isStackHeaderOptions(value.options)));
|
|
32
|
+
}
|
|
33
|
+
/*** Validate the serializable native-stack screen option subset. */
|
|
34
|
+
export function isStackScreenOptions(value) {
|
|
35
|
+
if (!isRecord(value) ||
|
|
36
|
+
!hasOnlyKeys(value, [
|
|
37
|
+
'title',
|
|
38
|
+
'headerShown',
|
|
39
|
+
'headerTransparent',
|
|
40
|
+
'headerBackVisible',
|
|
41
|
+
'presentation',
|
|
42
|
+
'sheetAllowedDetents',
|
|
43
|
+
'sheetGrabberVisible',
|
|
44
|
+
]) ||
|
|
45
|
+
!isStackHeaderOptionsShape(value) ||
|
|
46
|
+
(value.presentation !== undefined &&
|
|
47
|
+
(typeof value.presentation !== 'string' || !STACK_PRESENTATION_SET.has(value.presentation)))) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
if (value.presentation !== 'formSheet') {
|
|
51
|
+
return value.sheetAllowedDetents === undefined && value.sheetGrabberVisible === undefined;
|
|
52
|
+
}
|
|
53
|
+
return ((value.sheetAllowedDetents === undefined || isSheetAllowedDetents(value.sheetAllowedDetents)) &&
|
|
54
|
+
isOptionalBoolean(value.sheetGrabberVisible));
|
|
55
|
+
}
|
|
56
|
+
/*** Validate the finite serializable Drawer option subset. */
|
|
57
|
+
export function isDrawerNavigatorOptions(value) {
|
|
58
|
+
return (isRecord(value) &&
|
|
59
|
+
hasOnlyKeys(value, ['drawerPosition', 'drawerType', 'swipeEnabled', 'headerShown']) &&
|
|
60
|
+
(value.drawerPosition === undefined ||
|
|
61
|
+
(typeof value.drawerPosition === 'string' &&
|
|
62
|
+
DRAWER_POSITION_SET.has(value.drawerPosition))) &&
|
|
63
|
+
(value.drawerType === undefined ||
|
|
64
|
+
(typeof value.drawerType === 'string' && DRAWER_TYPE_SET.has(value.drawerType))) &&
|
|
65
|
+
isOptionalBoolean(value.swipeEnabled) &&
|
|
66
|
+
isOptionalBoolean(value.headerShown));
|
|
67
|
+
}
|
|
68
|
+
/*** Validate tabs implementation desired state, with omitted implementation meaning adaptive. */
|
|
69
|
+
export function isTabsImplementationConfig(value) {
|
|
70
|
+
if (value.implementation === undefined || value.implementation === 'adaptive') {
|
|
71
|
+
return isAdaptiveTabsConfig(value);
|
|
72
|
+
}
|
|
73
|
+
if (value.implementation === 'native')
|
|
74
|
+
return isFullNativeTabsConfig(value);
|
|
75
|
+
if (value.implementation === 'javascript')
|
|
76
|
+
return isJavaScriptTabsConfig(value);
|
|
77
|
+
return (value.implementation === 'custom' &&
|
|
78
|
+
hasNoDefinedKeys(value, ['options', 'native', 'web', 'minimizeBehavior', 'bottomAccessory']) &&
|
|
79
|
+
isCustomTabsPresentationConfig(value));
|
|
80
|
+
}
|
|
81
|
+
/*** Validate a reference into the app-owned screen registry. */
|
|
82
|
+
export function isNavigatorScreenReference(value) {
|
|
83
|
+
return isRecord(value) && hasOnlyKeys(value, ['screenId']) && typeof value.screenId === 'string';
|
|
84
|
+
}
|
|
85
|
+
/*** Check that a finite configuration object contains no unsupported keys. */
|
|
86
|
+
export function hasOnlyKeys(value, allowedKeys) {
|
|
87
|
+
const allowed = new Set(allowedKeys);
|
|
88
|
+
return Object.keys(value).every((key) => allowed.has(key));
|
|
89
|
+
}
|
|
90
|
+
/*** Validate JavaScript Stack options without accepting native-only presentations. */
|
|
91
|
+
function isJavaScriptStackScreenOptions(value) {
|
|
92
|
+
return (isRecord(value) &&
|
|
93
|
+
hasOnlyKeys(value, [
|
|
94
|
+
'title',
|
|
95
|
+
'headerShown',
|
|
96
|
+
'headerTransparent',
|
|
97
|
+
'headerBackVisible',
|
|
98
|
+
'presentation',
|
|
99
|
+
]) &&
|
|
100
|
+
isStackHeaderOptionsShape(value) &&
|
|
101
|
+
(value.presentation === undefined ||
|
|
102
|
+
(typeof value.presentation === 'string' &&
|
|
103
|
+
JAVASCRIPT_STACK_PRESENTATION_SET.has(value.presentation))));
|
|
104
|
+
}
|
|
105
|
+
/*** Validate the portable header subset supported by Experimental Stack. */
|
|
106
|
+
function isStackHeaderOptions(value) {
|
|
107
|
+
return (isRecord(value) &&
|
|
108
|
+
hasOnlyKeys(value, ['title', 'headerShown', 'headerTransparent', 'headerBackVisible']) &&
|
|
109
|
+
isStackHeaderOptionsShape(value));
|
|
110
|
+
}
|
|
111
|
+
/*** Validate shared stack header field values after branch-specific key filtering. */
|
|
112
|
+
function isStackHeaderOptionsShape(value) {
|
|
113
|
+
return (isOptionalString(value.title) &&
|
|
114
|
+
isOptionalBoolean(value.headerShown) &&
|
|
115
|
+
isOptionalBoolean(value.headerTransparent) &&
|
|
116
|
+
isOptionalBoolean(value.headerBackVisible));
|
|
117
|
+
}
|
|
118
|
+
/*** Validate sorted, finite native sheet detents or the fit-to-content sentinel. */
|
|
119
|
+
function isSheetAllowedDetents(value) {
|
|
120
|
+
if (value === 'fitToContents')
|
|
121
|
+
return true;
|
|
122
|
+
if (!Array.isArray(value) || value.length === 0)
|
|
123
|
+
return false;
|
|
124
|
+
return value.every((detent, index) => typeof detent === 'number' &&
|
|
125
|
+
Number.isFinite(detent) &&
|
|
126
|
+
detent > 0 &&
|
|
127
|
+
detent <= 1 &&
|
|
128
|
+
(index === 0 || detent > value[index - 1]));
|
|
129
|
+
}
|
|
130
|
+
/*** Validate an adaptive tabs branch and reject implementation-specific conflicts. */
|
|
131
|
+
function isAdaptiveTabsConfig(value) {
|
|
132
|
+
return (hasNoDefinedKeys(value, [
|
|
133
|
+
'options',
|
|
134
|
+
'presentation',
|
|
135
|
+
'responsive',
|
|
136
|
+
'customPresentationId',
|
|
137
|
+
'minimizeBehavior',
|
|
138
|
+
'bottomAccessory',
|
|
139
|
+
]) &&
|
|
140
|
+
(value.native === undefined || isNativeTabsConfig(value.native)) &&
|
|
141
|
+
(value.web === undefined || isCustomTabsWebConfig(value.web)));
|
|
142
|
+
}
|
|
143
|
+
/*** Validate the top-level native tabs implementation. */
|
|
144
|
+
function isFullNativeTabsConfig(value) {
|
|
145
|
+
return (hasNoDefinedKeys(value, [
|
|
146
|
+
'options',
|
|
147
|
+
'native',
|
|
148
|
+
'web',
|
|
149
|
+
'presentation',
|
|
150
|
+
'responsive',
|
|
151
|
+
'customPresentationId',
|
|
152
|
+
]) && isNativeTabsFields(value));
|
|
153
|
+
}
|
|
154
|
+
/*** Validate the top-level JavaScript tabs implementation. */
|
|
155
|
+
function isJavaScriptTabsConfig(value) {
|
|
156
|
+
return (hasNoDefinedKeys(value, [
|
|
157
|
+
'options',
|
|
158
|
+
'native',
|
|
159
|
+
'web',
|
|
160
|
+
'responsive',
|
|
161
|
+
'customPresentationId',
|
|
162
|
+
'minimizeBehavior',
|
|
163
|
+
'bottomAccessory',
|
|
164
|
+
]) &&
|
|
165
|
+
(value.presentation === undefined ||
|
|
166
|
+
(typeof value.presentation === 'string' &&
|
|
167
|
+
JAVASCRIPT_TABS_PRESENTATION_SET.has(value.presentation))));
|
|
168
|
+
}
|
|
169
|
+
/*** Validate the native branch used by adaptive tabs. */
|
|
170
|
+
function isNativeTabsConfig(value) {
|
|
171
|
+
return (isRecord(value) &&
|
|
172
|
+
hasOnlyKeys(value, ['implementation', 'minimizeBehavior', 'bottomAccessory']) &&
|
|
173
|
+
value.implementation === 'native' &&
|
|
174
|
+
isNativeTabsFields(value));
|
|
175
|
+
}
|
|
176
|
+
/*** Validate fields supported by the native tabs branch. */
|
|
177
|
+
function isNativeTabsFields(value) {
|
|
178
|
+
return ((value.minimizeBehavior === undefined ||
|
|
179
|
+
(typeof value.minimizeBehavior === 'string' &&
|
|
180
|
+
NATIVE_TABS_MINIMIZE_BEHAVIOR_SET.has(value.minimizeBehavior))) &&
|
|
181
|
+
(value.bottomAccessory === undefined || isNavigatorScreenReference(value.bottomAccessory)));
|
|
182
|
+
}
|
|
183
|
+
/*** Validate the implementation-free custom-tabs Web branch inside adaptive tabs. */
|
|
184
|
+
function isCustomTabsWebConfig(value) {
|
|
185
|
+
return (isRecord(value) &&
|
|
186
|
+
hasOnlyKeys(value, ['presentation', 'responsive', 'customPresentationId']) &&
|
|
187
|
+
isCustomTabsPresentationConfig(value));
|
|
188
|
+
}
|
|
189
|
+
/*** Validate custom-tab presentation and its conditional serializable configuration. */
|
|
190
|
+
function isCustomTabsPresentationConfig(value) {
|
|
191
|
+
if (typeof value.presentation !== 'string' ||
|
|
192
|
+
!CUSTOM_TABS_PRESENTATION_SET.has(value.presentation)) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
if (value.responsive !== undefined && !isResponsiveTabsPresentation(value.responsive)) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
if (!isOptionalString(value.customPresentationId))
|
|
199
|
+
return false;
|
|
200
|
+
if (FIXED_CUSTOM_TABS_PRESENTATION_SET.has(value.presentation)) {
|
|
201
|
+
return value.responsive === undefined && value.customPresentationId === undefined;
|
|
202
|
+
}
|
|
203
|
+
if (value.presentation === 'responsive') {
|
|
204
|
+
return value.responsive !== undefined && value.customPresentationId === undefined;
|
|
205
|
+
}
|
|
206
|
+
return (value.responsive === undefined &&
|
|
207
|
+
typeof value.customPresentationId === 'string' &&
|
|
208
|
+
value.customPresentationId.length > 0);
|
|
209
|
+
}
|
|
210
|
+
/*** Validate semantic compact/medium/expanded custom-tab presentation mapping. */
|
|
211
|
+
function isResponsiveTabsPresentation(value) {
|
|
212
|
+
return (isRecord(value) &&
|
|
213
|
+
hasOnlyKeys(value, ['compact', 'medium', 'expanded']) &&
|
|
214
|
+
typeof value.compact === 'string' &&
|
|
215
|
+
FIXED_CUSTOM_TABS_PRESENTATION_SET.has(value.compact) &&
|
|
216
|
+
(value.medium === undefined ||
|
|
217
|
+
(typeof value.medium === 'string' && FIXED_CUSTOM_TABS_PRESENTATION_SET.has(value.medium))) &&
|
|
218
|
+
typeof value.expanded === 'string' &&
|
|
219
|
+
FIXED_CUSTOM_TABS_PRESENTATION_SET.has(value.expanded));
|
|
220
|
+
}
|
|
221
|
+
/*** Check that mutually exclusive branch fields are absent. */
|
|
222
|
+
function hasNoDefinedKeys(value, keys) {
|
|
223
|
+
const prohibited = new Set(keys);
|
|
224
|
+
return !Object.entries(value).some(([key, entry]) => prohibited.has(key) && entry !== undefined);
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=navigatorOptions.js.map
|