@ankhorage/contracts 13.0.1 → 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +10 -2
  3. package/dist/appManifest/apis.d.ts +1 -0
  4. package/dist/appManifest/apis.d.ts.map +1 -1
  5. package/dist/appManifest/apis.js +17 -14
  6. package/dist/appManifest/apis.js.map +1 -1
  7. package/dist/appManifest/bindings.d.ts +3 -0
  8. package/dist/appManifest/bindings.d.ts.map +1 -1
  9. package/dist/appManifest/bindings.js +17 -1
  10. package/dist/appManifest/bindings.js.map +1 -1
  11. package/dist/appManifest/constants.d.ts +18 -0
  12. package/dist/appManifest/constants.d.ts.map +1 -0
  13. package/dist/appManifest/constants.js +18 -0
  14. package/dist/appManifest/constants.js.map +1 -0
  15. package/dist/appManifest/data.d.ts +4 -0
  16. package/dist/appManifest/data.d.ts.map +1 -1
  17. package/dist/appManifest/data.js +22 -3
  18. package/dist/appManifest/data.js.map +1 -1
  19. package/dist/appManifest/dataSources.d.ts +1 -0
  20. package/dist/appManifest/dataSources.d.ts.map +1 -1
  21. package/dist/appManifest/dataSources.js +7 -6
  22. package/dist/appManifest/dataSources.js.map +1 -1
  23. package/dist/appManifest/deploy.d.ts +1 -0
  24. package/dist/appManifest/deploy.d.ts.map +1 -1
  25. package/dist/appManifest/deploy.js +16 -13
  26. package/dist/appManifest/deploy.js.map +1 -1
  27. package/dist/appManifest/icon.d.ts.map +1 -1
  28. package/dist/appManifest/icon.js +2 -1
  29. package/dist/appManifest/icon.js.map +1 -1
  30. package/dist/appManifest/isAppManifest.d.ts +4 -0
  31. package/dist/appManifest/isAppManifest.d.ts.map +1 -0
  32. package/dist/appManifest/isAppManifest.js +69 -0
  33. package/dist/appManifest/isAppManifest.js.map +1 -0
  34. package/dist/appManifest/isAppStateSpec.d.ts +4 -0
  35. package/dist/appManifest/isAppStateSpec.d.ts.map +1 -0
  36. package/dist/appManifest/isAppStateSpec.js +9 -0
  37. package/dist/appManifest/isAppStateSpec.js.map +1 -0
  38. package/dist/appManifest/isManifestValue.d.ts +3 -0
  39. package/dist/appManifest/isManifestValue.d.ts.map +1 -0
  40. package/dist/appManifest/isManifestValue.js +15 -0
  41. package/dist/appManifest/isManifestValue.js.map +1 -0
  42. package/dist/appManifest/media.d.ts +1 -0
  43. package/dist/appManifest/media.d.ts.map +1 -1
  44. package/dist/appManifest/media.js +10 -8
  45. package/dist/appManifest/media.js.map +1 -1
  46. package/dist/appManifest/navigator.d.ts.map +1 -1
  47. package/dist/appManifest/navigator.js +7 -6
  48. package/dist/appManifest/navigator.js.map +1 -1
  49. package/dist/appManifest/navigatorOptions.d.ts +0 -2
  50. package/dist/appManifest/navigatorOptions.d.ts.map +1 -1
  51. package/dist/appManifest/navigatorOptions.js +8 -12
  52. package/dist/appManifest/navigatorOptions.js.map +1 -1
  53. package/dist/appManifest/parseAppManifest.d.ts +10 -0
  54. package/dist/appManifest/parseAppManifest.d.ts.map +1 -0
  55. package/dist/appManifest/parseAppManifest.js +14 -0
  56. package/dist/appManifest/parseAppManifest.js.map +1 -0
  57. package/dist/appManifest/screens.d.ts +4 -0
  58. package/dist/appManifest/screens.d.ts.map +1 -1
  59. package/dist/appManifest/screens.js +14 -2
  60. package/dist/appManifest/screens.js.map +1 -1
  61. package/dist/appManifest/splashScreen.d.ts +15 -0
  62. package/dist/appManifest/splashScreen.d.ts.map +1 -0
  63. package/dist/appManifest/splashScreen.js +2 -0
  64. package/dist/appManifest/splashScreen.js.map +1 -0
  65. package/dist/appManifest.d.ts +4 -18
  66. package/dist/appManifest.d.ts.map +1 -1
  67. package/dist/appManifest.js +2 -80
  68. package/dist/appManifest.js.map +1 -1
  69. package/dist/auth.d.ts +3 -2
  70. package/dist/auth.d.ts.map +1 -1
  71. package/dist/auth.js.map +1 -1
  72. package/dist/deploy.d.ts +0 -9
  73. package/dist/deploy.d.ts.map +1 -1
  74. package/dist/deploy.js +0 -8
  75. package/dist/deploy.js.map +1 -1
  76. package/dist/environments.d.ts +4 -0
  77. package/dist/environments.d.ts.map +1 -0
  78. package/dist/environments.js +3 -0
  79. package/dist/environments.js.map +1 -0
  80. package/dist/index.d.ts +2 -1
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +2 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/infra/constants.d.ts +91 -0
  85. package/dist/infra/constants.d.ts.map +1 -0
  86. package/dist/infra/constants.js +91 -0
  87. package/dist/infra/constants.js.map +1 -0
  88. package/dist/infra/infraFields.d.ts +12 -0
  89. package/dist/infra/infraFields.d.ts.map +1 -0
  90. package/dist/infra/infraFields.js +14 -0
  91. package/dist/infra/infraFields.js.map +1 -0
  92. package/dist/infra/isInfraAdapterDescriptor.d.ts +4 -0
  93. package/dist/infra/isInfraAdapterDescriptor.d.ts.map +1 -0
  94. package/dist/infra/isInfraAdapterDescriptor.js +31 -0
  95. package/dist/infra/isInfraAdapterDescriptor.js.map +1 -0
  96. package/dist/infra/isInfraAuthSpec.d.ts +4 -0
  97. package/dist/infra/isInfraAuthSpec.d.ts.map +1 -0
  98. package/dist/infra/isInfraAuthSpec.js +75 -0
  99. package/dist/infra/isInfraAuthSpec.js.map +1 -0
  100. package/dist/infra/isInfraCredentialRef.d.ts +3 -0
  101. package/dist/infra/isInfraCredentialRef.d.ts.map +1 -0
  102. package/dist/infra/isInfraCredentialRef.js +10 -0
  103. package/dist/infra/isInfraCredentialRef.js.map +1 -0
  104. package/dist/infra/isInfraDeploymentSpec.d.ts +4 -0
  105. package/dist/infra/isInfraDeploymentSpec.d.ts.map +1 -0
  106. package/dist/infra/isInfraDeploymentSpec.js +66 -0
  107. package/dist/infra/isInfraDeploymentSpec.js.map +1 -0
  108. package/dist/infra/isInfraEnvironmentSpec.d.ts +4 -0
  109. package/dist/infra/isInfraEnvironmentSpec.d.ts.map +1 -0
  110. package/dist/infra/isInfraEnvironmentSpec.js +82 -0
  111. package/dist/infra/isInfraEnvironmentSpec.js.map +1 -0
  112. package/dist/infra/isInfraManifest.d.ts +4 -0
  113. package/dist/infra/isInfraManifest.d.ts.map +1 -0
  114. package/dist/infra/isInfraManifest.js +23 -0
  115. package/dist/infra/isInfraManifest.js.map +1 -0
  116. package/dist/infra/isInfraShape.d.ts +3 -0
  117. package/dist/infra/isInfraShape.d.ts.map +1 -0
  118. package/dist/infra/isInfraShape.js +10 -0
  119. package/dist/infra/isInfraShape.js.map +1 -0
  120. package/dist/infra/isInfraWorkloadHealth.d.ts +3 -0
  121. package/dist/infra/isInfraWorkloadHealth.d.ts.map +1 -0
  122. package/dist/infra/isInfraWorkloadHealth.js +37 -0
  123. package/dist/infra/isInfraWorkloadHealth.js.map +1 -0
  124. package/dist/infra/isInfraWorkloadSpec.d.ts +4 -0
  125. package/dist/infra/isInfraWorkloadSpec.d.ts.map +1 -0
  126. package/dist/infra/isInfraWorkloadSpec.js +70 -0
  127. package/dist/infra/isInfraWorkloadSpec.js.map +1 -0
  128. package/dist/infra/isInfraWorkloadValue.d.ts +3 -0
  129. package/dist/infra/isInfraWorkloadValue.d.ts.map +1 -0
  130. package/dist/infra/isInfraWorkloadValue.js +40 -0
  131. package/dist/infra/isInfraWorkloadValue.js.map +1 -0
  132. package/dist/infra/parseInfraManifest.d.ts +5 -0
  133. package/dist/infra/parseInfraManifest.d.ts.map +1 -0
  134. package/dist/infra/parseInfraManifest.js +17 -0
  135. package/dist/infra/parseInfraManifest.js.map +1 -0
  136. package/dist/infra/validateInfraAdapterSelection.d.ts +6 -0
  137. package/dist/infra/validateInfraAdapterSelection.d.ts.map +1 -0
  138. package/dist/infra/validateInfraAdapterSelection.js +36 -0
  139. package/dist/infra/validateInfraAdapterSelection.js.map +1 -0
  140. package/dist/infra.d.ts +16 -0
  141. package/dist/infra.d.ts.map +1 -0
  142. package/dist/infra.js +11 -0
  143. package/dist/infra.js.map +1 -0
  144. package/dist/media.d.ts +7 -6
  145. package/dist/media.d.ts.map +1 -1
  146. package/dist/media.js +5 -5
  147. package/dist/media.js.map +1 -1
  148. package/dist/state.d.ts +5 -0
  149. package/dist/state.d.ts.map +1 -1
  150. package/dist/state.js.map +1 -1
  151. package/dist/types/appManifest.d.ts +9 -0
  152. package/dist/types/appManifest.d.ts.map +1 -0
  153. package/dist/types/appManifest.js +2 -0
  154. package/dist/types/appManifest.js.map +1 -0
  155. package/dist/types/infraAdapters.d.ts +85 -0
  156. package/dist/types/infraAdapters.d.ts.map +1 -0
  157. package/dist/types/infraAdapters.js +2 -0
  158. package/dist/types/infraAdapters.js.map +1 -0
  159. package/dist/types/infraLifecycle.d.ts +107 -0
  160. package/dist/types/infraLifecycle.d.ts.map +1 -0
  161. package/dist/types/infraLifecycle.js +2 -0
  162. package/dist/types/infraLifecycle.js.map +1 -0
  163. package/dist/types/infraManifest.d.ts +142 -0
  164. package/dist/types/infraManifest.d.ts.map +1 -0
  165. package/dist/types/infraManifest.js +2 -0
  166. package/dist/types/infraManifest.js.map +1 -0
  167. package/dist/types/infraSecrets.d.ts +15 -0
  168. package/dist/types/infraSecrets.d.ts.map +1 -0
  169. package/dist/types/infraSecrets.js +2 -0
  170. package/dist/types/infraSecrets.js.map +1 -0
  171. package/dist/types/infraValidation.d.ts +5 -0
  172. package/dist/types/infraValidation.d.ts.map +1 -0
  173. package/dist/types/infraValidation.js +2 -0
  174. package/dist/types/infraValidation.js.map +1 -0
  175. package/dist/types/infraWorkload.d.ts +70 -0
  176. package/dist/types/infraWorkload.d.ts.map +1 -0
  177. package/dist/types/infraWorkload.js +2 -0
  178. package/dist/types/infraWorkload.js.map +1 -0
  179. package/dist/types.d.ts +8 -82
  180. package/dist/types.d.ts.map +1 -1
  181. package/dist/types.js +0 -9
  182. package/dist/types.js.map +1 -1
  183. package/package.json +13 -3
  184. package/src/appManifest/apis.ts +18 -16
  185. package/src/appManifest/bindings.ts +18 -1
  186. package/src/appManifest/constants.ts +19 -0
  187. package/src/appManifest/data.ts +23 -9
  188. package/src/appManifest/dataSources.ts +8 -7
  189. package/src/appManifest/deploy.ts +17 -15
  190. package/src/appManifest/icon.ts +3 -1
  191. package/src/appManifest/isAppManifest.ts +95 -0
  192. package/src/appManifest/isAppStateSpec.ts +13 -0
  193. package/src/appManifest/isManifestValue.ts +19 -0
  194. package/src/appManifest/media.ts +11 -10
  195. package/src/appManifest/navigator.ts +7 -6
  196. package/src/appManifest/navigatorOptions.ts +9 -16
  197. package/src/appManifest/parseAppManifest.ts +15 -0
  198. package/src/appManifest/screens.ts +14 -2
  199. package/src/appManifest/splashScreen.test.ts +40 -0
  200. package/src/appManifest/splashScreen.ts +24 -0
  201. package/src/appManifest.test.ts +9 -5
  202. package/src/appManifest.ts +8 -106
  203. package/src/auth-flow-contract.test.ts +6 -10
  204. package/src/auth-oauth.test.ts +2 -2
  205. package/src/auth.ts +3 -2
  206. package/src/bindings.test.ts +5 -0
  207. package/src/contracts.test.ts +21 -39
  208. package/src/deploy.test.ts +13 -5
  209. package/src/deploy.ts +0 -11
  210. package/src/environments.ts +4 -0
  211. package/src/index.ts +2 -1
  212. package/src/infra/constants.ts +91 -0
  213. package/src/infra/infraFields.ts +20 -0
  214. package/src/infra/isInfraAdapterDescriptor.ts +37 -0
  215. package/src/infra/isInfraAuthSpec.ts +98 -0
  216. package/src/infra/isInfraCredentialRef.ts +11 -0
  217. package/src/infra/isInfraDeploymentSpec.ts +75 -0
  218. package/src/infra/isInfraEnvironmentSpec.ts +95 -0
  219. package/src/infra/isInfraManifest.ts +29 -0
  220. package/src/infra/isInfraShape.ts +16 -0
  221. package/src/infra/isInfraWorkloadHealth.ts +38 -0
  222. package/src/infra/isInfraWorkloadSpec.ts +87 -0
  223. package/src/infra/isInfraWorkloadValue.ts +41 -0
  224. package/src/infra/parseInfraManifest.ts +20 -0
  225. package/src/infra/validateInfraAdapterSelection.ts +42 -0
  226. package/src/infra-types.test.ts +78 -0
  227. package/src/infra-workload.test.ts +186 -0
  228. package/src/infra.test.ts +268 -0
  229. package/src/infra.ts +15 -0
  230. package/src/media.ts +12 -11
  231. package/src/profile-contract.test.ts +2 -3
  232. package/src/secrets.test.ts +19 -13
  233. package/src/state.ts +6 -0
  234. package/src/types/appManifest.ts +5 -0
  235. package/src/types/infraAdapters.ts +148 -0
  236. package/src/types/infraLifecycle.ts +105 -0
  237. package/src/types/infraManifest.ts +130 -0
  238. package/src/types/infraSecrets.ts +16 -0
  239. package/src/types/infraValidation.ts +2 -0
  240. package/src/types/infraWorkload.ts +64 -0
  241. package/src/types.ts +8 -103
  242. package/dist/appManifest/infra.d.ts +0 -2
  243. package/dist/appManifest/infra.d.ts.map +0 -1
  244. package/dist/appManifest/infra.js +0 -130
  245. package/dist/appManifest/infra.js.map +0 -1
  246. package/dist/appManifest/shared.d.ts +0 -8
  247. package/dist/appManifest/shared.d.ts.map +0 -1
  248. package/dist/appManifest/shared.js +0 -31
  249. package/dist/appManifest/shared.js.map +0 -1
  250. package/dist/secretManifest.d.ts +0 -11
  251. package/dist/secretManifest.d.ts.map +0 -1
  252. package/dist/secretManifest.js +0 -2
  253. package/dist/secretManifest.js.map +0 -1
  254. package/src/appManifest/infra.ts +0 -190
  255. package/src/appManifest/shared.ts +0 -40
  256. package/src/secretManifest.ts +0 -12
@@ -1 +1 @@
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
+ {"version":3,"file":"navigator.js","sourceRoot":"","sources":["../../src/appManifest/navigator.ts"],"names":[],"mappings":"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","sourcesContent":["import { isStringArray } from '@ankhorage/utility/array';\nimport { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';\nimport { isOptionalString } from '@ankhorage/utility/string';\n\nimport { type AppNavigatorManifest, NAVIGATOR_PRESETS, NAVIGATOR_TYPES } from '../navigator';\nimport { isIconSpec } from './icon';\nimport {\n isDrawerNavigatorOptions,\n isNavigatorScreenReference,\n isStackImplementationConfig,\n isStackScreenOptions,\n isTabsImplementationConfig,\n} from './navigatorOptions';\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 [value.path, value.label, value.screenId].every(isOptionalString) &&\n (value.icon === undefined || isIconSpec(value.icon)) &&\n (value.showInPrimaryNavigation === undefined ||\n typeof value.showInPrimaryNavigation === 'boolean') &&\n (value.guards === undefined || isStringArray(value.guards)) &&\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"]}
@@ -8,6 +8,4 @@ export declare function isDrawerNavigatorOptions(value: unknown): boolean;
8
8
  export declare function isTabsImplementationConfig(value: Record<string, unknown>): boolean;
9
9
  /*** Validate a reference into the app-owned screen registry. */
10
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
11
  //# sourceMappingURL=navigatorOptions.d.ts.map
@@ -1 +1 @@
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
+ {"version":3,"file":"navigatorOptions.d.ts","sourceRoot":"","sources":["../../src/appManifest/navigatorOptions.ts"],"names":[],"mappings":"AAcA,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"}
@@ -1,5 +1,6 @@
1
+ import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';
2
+ import { isOptionalString } from '@ankhorage/utility/string';
1
3
  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
- import { isOptionalBoolean, isOptionalString, isRecord } from './shared';
3
4
  /*** Validate stable native, JavaScript, or alpha Experimental Stack desired state. */
4
5
  export function isStackImplementationConfig(value) {
5
6
  if (!hasNoDefinedKeys(value, [
@@ -44,7 +45,7 @@ export function isStackScreenOptions(value) {
44
45
  return value.sheetAllowedDetents === undefined && value.sheetGrabberVisible === undefined;
45
46
  }
46
47
  return ((value.sheetAllowedDetents === undefined || isSheetAllowedDetents(value.sheetAllowedDetents)) &&
47
- isOptionalBoolean(value.sheetGrabberVisible));
48
+ (value.sheetGrabberVisible === undefined || typeof value.sheetGrabberVisible === 'boolean'));
48
49
  }
49
50
  /*** Validate the finite serializable Drawer option subset. */
50
51
  export function isDrawerNavigatorOptions(value) {
@@ -55,8 +56,8 @@ export function isDrawerNavigatorOptions(value) {
55
56
  contains(DRAWER_POSITIONS, value.drawerPosition))) &&
56
57
  (value.drawerType === undefined ||
57
58
  (typeof value.drawerType === 'string' && contains(DRAWER_TYPES, value.drawerType))) &&
58
- isOptionalBoolean(value.swipeEnabled) &&
59
- isOptionalBoolean(value.headerShown));
59
+ (value.swipeEnabled === undefined || typeof value.swipeEnabled === 'boolean') &&
60
+ (value.headerShown === undefined || typeof value.headerShown === 'boolean'));
60
61
  }
61
62
  /*** Validate tabs implementation desired state, with omitted implementation meaning adaptive. */
62
63
  export function isTabsImplementationConfig(value) {
@@ -75,11 +76,6 @@ export function isTabsImplementationConfig(value) {
75
76
  export function isNavigatorScreenReference(value) {
76
77
  return isRecord(value) && hasOnlyKeys(value, ['screenId']) && typeof value.screenId === 'string';
77
78
  }
78
- /*** Check that a finite configuration object contains no unsupported keys. */
79
- export function hasOnlyKeys(value, allowedKeys) {
80
- const allowed = new Set(allowedKeys);
81
- return Object.keys(value).every((key) => allowed.has(key));
82
- }
83
79
  /*** Validate JavaScript Stack options without accepting native-only presentations. */
84
80
  function isJavaScriptStackScreenOptions(value) {
85
81
  return (isRecord(value) &&
@@ -104,9 +100,9 @@ function isStackHeaderOptions(value) {
104
100
  /*** Validate shared stack header field values after branch-specific key filtering. */
105
101
  function isStackHeaderOptionsShape(value) {
106
102
  return (isOptionalString(value.title) &&
107
- isOptionalBoolean(value.headerShown) &&
108
- isOptionalBoolean(value.headerTransparent) &&
109
- isOptionalBoolean(value.headerBackVisible));
103
+ (value.headerShown === undefined || typeof value.headerShown === 'boolean') &&
104
+ (value.headerTransparent === undefined || typeof value.headerTransparent === 'boolean') &&
105
+ (value.headerBackVisible === undefined || typeof value.headerBackVisible === 'boolean'));
110
106
  }
111
107
  /*** Validate sorted, finite native sheet detents or the fit-to-content sentinel. */
112
108
  function isSheetAllowedDetents(value) {
@@ -1 +1 @@
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"]}
1
+ {"version":3,"file":"navigatorOptions.js","sourceRoot":"","sources":["../../src/appManifest/navigatorOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';\nimport { isOptionalString } from '@ankhorage/utility/string';\n\nimport {\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';\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 (value.sheetGrabberVisible === undefined || typeof value.sheetGrabberVisible === 'boolean')\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 (value.swipeEnabled === undefined || typeof value.swipeEnabled === 'boolean') &&\n (value.headerShown === undefined || typeof value.headerShown === 'boolean')\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/*** 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 (value.headerShown === undefined || typeof value.headerShown === 'boolean') &&\n (value.headerTransparent === undefined || typeof value.headerTransparent === 'boolean') &&\n (value.headerBackVisible === undefined || typeof value.headerBackVisible === 'boolean')\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,10 @@
1
+ import type { AppManifestParseResult } from '../types/appManifest';
2
+ /**
3
+ * Parse unknown JSON-compatible input at the canonical AppManifest boundary.
4
+ *
5
+ * Contracts owns structural manifest validation. Consumers may add semantic
6
+ * diagnostics after this parser succeeds, but should not reconstruct the
7
+ * AppManifest shape in their own packages.
8
+ */
9
+ export declare function parseAppManifest(value: unknown): AppManifestParseResult;
10
+ //# sourceMappingURL=parseAppManifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseAppManifest.d.ts","sourceRoot":"","sources":["../../src/appManifest/parseAppManifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGnE;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAIvE"}
@@ -0,0 +1,14 @@
1
+ import { isAppManifest } from './isAppManifest';
2
+ /**
3
+ * Parse unknown JSON-compatible input at the canonical AppManifest boundary.
4
+ *
5
+ * Contracts owns structural manifest validation. Consumers may add semantic
6
+ * diagnostics after this parser succeeds, but should not reconstruct the
7
+ * AppManifest shape in their own packages.
8
+ */
9
+ export function parseAppManifest(value) {
10
+ return isAppManifest(value)
11
+ ? { ok: true, manifest: value }
12
+ : { ok: false, message: 'Value is not a canonical AppManifest.' };
13
+ }
14
+ //# sourceMappingURL=parseAppManifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseAppManifest.js","sourceRoot":"","sources":["../../src/appManifest/parseAppManifest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,aAAa,CAAC,KAAK,CAAC;QACzB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC/B,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC;AACtE,CAAC","sourcesContent":["import type { AppManifestParseResult } from '../types/appManifest';\nimport { isAppManifest } from './isAppManifest';\n\n/**\n * Parse unknown JSON-compatible input at the canonical AppManifest boundary.\n *\n * Contracts owns structural manifest validation. Consumers may add semantic\n * diagnostics after this parser succeeds, but should not reconstruct the\n * AppManifest shape in their own packages.\n */\nexport function parseAppManifest(value: unknown): AppManifestParseResult {\n return isAppManifest(value)\n ? { ok: true, manifest: value }\n : { ok: false, message: 'Value is not a canonical AppManifest.' };\n}\n"]}
@@ -1,6 +1,10 @@
1
1
  export { isAppNavigatorManifest } from './navigator';
2
+ /*** Validate application identity and optional authored metadata. */
2
3
  export declare function isManifestMetadata(value: unknown): boolean;
4
+ /*** Validate theme identity and its required light and dark modes. */
3
5
  export declare function isThemeConfig(value: unknown): boolean;
6
+ /*** Validate screens in the authored screen registry. */
4
7
  export declare function isScreenRegistry(value: unknown): boolean;
8
+ /*** Validate optional light and dark splash-screen configuration. */
5
9
  export declare function isSplashScreenSpec(value: unknown): boolean;
6
10
  //# sourceMappingURL=screens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"screens.d.ts","sourceRoot":"","sources":["../../src/appManifest/screens.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAMrD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAY1D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQrD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQxD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM1D"}
1
+ {"version":3,"file":"screens.d.ts","sourceRoot":"","sources":["../../src/appManifest/screens.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAMrD,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAY1D;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQrD;AAED,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQxD;AAED,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM1D"}
@@ -1,12 +1,14 @@
1
1
  import { COLOR_HARMONIES } from '@ankhorage/color-theory';
2
+ import { isRecord } from '@ankhorage/utility/object';
3
+ import { isOptionalString } from '@ankhorage/utility/string';
2
4
  import { isMediaAssetReference } from '../media';
3
5
  import { APP_CATEGORIES } from '../types';
4
6
  import { isBindingValueSource, isScreenDataLoaderDefinition } from './bindings';
5
- import { isOptionalNumber, isOptionalString, isRecord } from './shared';
6
7
  export { isAppNavigatorManifest } from './navigator';
7
8
  const APP_CATEGORY_SET = new Set(APP_CATEGORIES);
8
9
  const COLOR_HARMONY_SET = new Set(COLOR_HARMONIES);
9
10
  const SPLASH_SCREEN_RESIZE_MODE_SET = new Set(['contain', 'cover', 'native']);
11
+ /*** Validate application identity and optional authored metadata. */
10
12
  export function isManifestMetadata(value) {
11
13
  return (isRecord(value) &&
12
14
  typeof value.name === 'string' &&
@@ -18,6 +20,7 @@ export function isManifestMetadata(value) {
18
20
  isOptionalString(value.created) &&
19
21
  isOptionalString(value.updated));
20
22
  }
23
+ /*** Validate theme identity and its required light and dark modes. */
21
24
  export function isThemeConfig(value) {
22
25
  return (isRecord(value) &&
23
26
  typeof value.id === 'string' &&
@@ -25,21 +28,25 @@ export function isThemeConfig(value) {
25
28
  isThemeModeConfig(value.light) &&
26
29
  isThemeModeConfig(value.dark));
27
30
  }
31
+ /*** Validate screens in the authored screen registry. */
28
32
  export function isScreenRegistry(value) {
29
33
  return (isRecord(value) &&
30
34
  Object.entries(value).every(([registryKey, screen]) => isScreenSpec(screen) && isRecord(screen) && registryKey === screen.id));
31
35
  }
36
+ /*** Validate optional light and dark splash-screen configuration. */
32
37
  export function isSplashScreenSpec(value) {
33
38
  return (isSplashScreenModeSpec(value) &&
34
39
  isRecord(value) &&
35
40
  (value.dark === undefined || isSplashScreenModeSpec(value.dark)));
36
41
  }
42
+ /*** Validate the primary color and supported color harmony of a theme mode. */
37
43
  function isThemeModeConfig(value) {
38
44
  return (isRecord(value) &&
39
45
  typeof value.primaryColor === 'string' &&
40
46
  typeof value.harmony === 'string' &&
41
47
  COLOR_HARMONY_SET.has(value.harmony));
42
48
  }
49
+ /*** Validate an authored component node and its nested children. */
43
50
  function isUiNode(value) {
44
51
  return (isRecord(value) &&
45
52
  typeof value.id === 'string' &&
@@ -51,6 +58,7 @@ function isUiNode(value) {
51
58
  (value.children === undefined ||
52
59
  (Array.isArray(value.children) && value.children.every(isUiNode))));
53
60
  }
61
+ /*** Validate repeat source and item binding configuration. */
54
62
  function isUiNodeRepeatSpec(value) {
55
63
  return (isRecord(value) &&
56
64
  isBindingValueSource(value.source) &&
@@ -58,6 +66,7 @@ function isUiNodeRepeatSpec(value) {
58
66
  isOptionalString(value.keyPath) &&
59
67
  (value.empty === undefined || (Array.isArray(value.empty) && value.empty.every(isUiNode))));
60
68
  }
69
+ /*** Validate screen identity, root component and optional requirements. */
61
70
  function isScreenSpec(value) {
62
71
  return (isRecord(value) &&
63
72
  typeof value.id === 'string' &&
@@ -70,20 +79,23 @@ function isScreenSpec(value) {
70
79
  (value.requires === undefined || isScreenRequirements(value.requires)) &&
71
80
  isUiNode(value.root));
72
81
  }
82
+ /*** Validate one splash-screen appearance configuration. */
73
83
  function isSplashScreenModeSpec(value) {
74
84
  return (isRecord(value) &&
75
85
  (value.image === undefined || isMediaAssetReference(value.image)) &&
76
- isOptionalNumber(value.imageWidth) &&
86
+ (value.imageWidth === undefined || typeof value.imageWidth === 'number') &&
77
87
  (value.resizeMode === undefined ||
78
88
  (typeof value.resizeMode === 'string' &&
79
89
  SPLASH_SCREEN_RESIZE_MODE_SET.has(value.resizeMode))) &&
80
90
  isOptionalString(value.backgroundColor));
81
91
  }
92
+ /*** Validate screen capability and permission requirements. */
82
93
  function isScreenRequirements(value) {
83
94
  return (isRecord(value) &&
84
95
  (value.permissions === undefined || isRequirementArray(value.permissions, 'permission')) &&
85
96
  (value.capabilities === undefined || isRequirementArray(value.capabilities, 'capability')));
86
97
  }
98
+ /*** Validate the entries of a capability or permission requirement list. */
87
99
  function isRequirementArray(value, key) {
88
100
  return (Array.isArray(value) &&
89
101
  value.every((entry) => isRecord(entry) && typeof entry[key] === 'string'));
@@ -1 +1 @@
1
- {"version":3,"file":"screens.js","sourceRoot":"","sources":["../../src/appManifest/screens.ts"],"names":[],"mappings":"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","sourcesContent":["import { COLOR_HARMONIES } from '@ankhorage/color-theory';\n\nimport { isMediaAssetReference } from '../media';\nimport { APP_CATEGORIES } from '../types';\nimport { isBindingValueSource, isScreenDataLoaderDefinition } from './bindings';\nimport { isOptionalNumber, isOptionalString, isRecord } from './shared';\n\nexport { isAppNavigatorManifest } from './navigator';\n\nconst APP_CATEGORY_SET = new Set<string>(APP_CATEGORIES);\nconst COLOR_HARMONY_SET = new Set<string>(COLOR_HARMONIES);\nconst SPLASH_SCREEN_RESIZE_MODE_SET = new Set<string>(['contain', 'cover', 'native']);\n\nexport function isManifestMetadata(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.name === 'string' &&\n typeof value.slug === 'string' &&\n typeof value.version === 'string' &&\n typeof value.category === 'string' &&\n APP_CATEGORY_SET.has(value.category) &&\n typeof value.themeId === 'string' &&\n isOptionalString(value.created) &&\n isOptionalString(value.updated)\n );\n}\n\nexport function isThemeConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.name === 'string' &&\n isThemeModeConfig(value.light) &&\n isThemeModeConfig(value.dark)\n );\n}\n\nexport function isScreenRegistry(value: unknown): boolean {\n return (\n isRecord(value) &&\n Object.entries(value).every(\n ([registryKey, screen]) =>\n isScreenSpec(screen) && isRecord(screen) && registryKey === screen.id,\n )\n );\n}\n\nexport function isSplashScreenSpec(value: unknown): boolean {\n return (\n isSplashScreenModeSpec(value) &&\n isRecord(value) &&\n (value.dark === undefined || isSplashScreenModeSpec(value.dark))\n );\n}\n\nfunction isThemeModeConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.primaryColor === 'string' &&\n typeof value.harmony === 'string' &&\n COLOR_HARMONY_SET.has(value.harmony)\n );\n}\n\nfunction isUiNode(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.type === 'string' &&\n isOptionalString(value.alias) &&\n (value.props === undefined || isRecord(value.props)) &&\n (value.style === undefined || isRecord(value.style)) &&\n (value.repeat === undefined || isUiNodeRepeatSpec(value.repeat)) &&\n (value.children === undefined ||\n (Array.isArray(value.children) && value.children.every(isUiNode)))\n );\n}\n\nfunction isUiNodeRepeatSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n isBindingValueSource(value.source) &&\n isOptionalString(value.itemAlias) &&\n isOptionalString(value.keyPath) &&\n (value.empty === undefined || (Array.isArray(value.empty) && value.empty.every(isUiNode)))\n );\n}\n\nfunction isScreenSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.name === 'string' &&\n isOptionalString(value.title) &&\n isOptionalString(value.description) &&\n (value.dataLoaders === undefined ||\n (Array.isArray(value.dataLoaders) &&\n value.dataLoaders.every(isScreenDataLoaderDefinition))) &&\n (value.requires === undefined || isScreenRequirements(value.requires)) &&\n isUiNode(value.root)\n );\n}\n\nfunction isSplashScreenModeSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n (value.image === undefined || isMediaAssetReference(value.image)) &&\n isOptionalNumber(value.imageWidth) &&\n (value.resizeMode === undefined ||\n (typeof value.resizeMode === 'string' &&\n SPLASH_SCREEN_RESIZE_MODE_SET.has(value.resizeMode))) &&\n isOptionalString(value.backgroundColor)\n );\n}\n\nfunction isScreenRequirements(value: unknown): boolean {\n return (\n isRecord(value) &&\n (value.permissions === undefined || isRequirementArray(value.permissions, 'permission')) &&\n (value.capabilities === undefined || isRequirementArray(value.capabilities, 'capability'))\n );\n}\n\nfunction isRequirementArray(value: unknown, key: 'capability' | 'permission'): boolean {\n return (\n Array.isArray(value) &&\n value.every((entry) => isRecord(entry) && typeof entry[key] === 'string')\n );\n}\n"]}
1
+ {"version":3,"file":"screens.js","sourceRoot":"","sources":["../../src/appManifest/screens.ts"],"names":[],"mappings":"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","sourcesContent":["import { COLOR_HARMONIES } from '@ankhorage/color-theory';\nimport { isRecord } from '@ankhorage/utility/object';\nimport { isOptionalString } from '@ankhorage/utility/string';\n\nimport { isMediaAssetReference } from '../media';\nimport { APP_CATEGORIES } from '../types';\nimport { isBindingValueSource, isScreenDataLoaderDefinition } from './bindings';\n\nexport { isAppNavigatorManifest } from './navigator';\n\nconst APP_CATEGORY_SET = new Set<string>(APP_CATEGORIES);\nconst COLOR_HARMONY_SET = new Set<string>(COLOR_HARMONIES);\nconst SPLASH_SCREEN_RESIZE_MODE_SET = new Set<string>(['contain', 'cover', 'native']);\n\n/*** Validate application identity and optional authored metadata. */\nexport function isManifestMetadata(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.name === 'string' &&\n typeof value.slug === 'string' &&\n typeof value.version === 'string' &&\n typeof value.category === 'string' &&\n APP_CATEGORY_SET.has(value.category) &&\n typeof value.themeId === 'string' &&\n isOptionalString(value.created) &&\n isOptionalString(value.updated)\n );\n}\n\n/*** Validate theme identity and its required light and dark modes. */\nexport function isThemeConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.name === 'string' &&\n isThemeModeConfig(value.light) &&\n isThemeModeConfig(value.dark)\n );\n}\n\n/*** Validate screens in the authored screen registry. */\nexport function isScreenRegistry(value: unknown): boolean {\n return (\n isRecord(value) &&\n Object.entries(value).every(\n ([registryKey, screen]) =>\n isScreenSpec(screen) && isRecord(screen) && registryKey === screen.id,\n )\n );\n}\n\n/*** Validate optional light and dark splash-screen configuration. */\nexport function isSplashScreenSpec(value: unknown): boolean {\n return (\n isSplashScreenModeSpec(value) &&\n isRecord(value) &&\n (value.dark === undefined || isSplashScreenModeSpec(value.dark))\n );\n}\n\n/*** Validate the primary color and supported color harmony of a theme mode. */\nfunction isThemeModeConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.primaryColor === 'string' &&\n typeof value.harmony === 'string' &&\n COLOR_HARMONY_SET.has(value.harmony)\n );\n}\n\n/*** Validate an authored component node and its nested children. */\nfunction isUiNode(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.type === 'string' &&\n isOptionalString(value.alias) &&\n (value.props === undefined || isRecord(value.props)) &&\n (value.style === undefined || isRecord(value.style)) &&\n (value.repeat === undefined || isUiNodeRepeatSpec(value.repeat)) &&\n (value.children === undefined ||\n (Array.isArray(value.children) && value.children.every(isUiNode)))\n );\n}\n\n/*** Validate repeat source and item binding configuration. */\nfunction isUiNodeRepeatSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n isBindingValueSource(value.source) &&\n isOptionalString(value.itemAlias) &&\n isOptionalString(value.keyPath) &&\n (value.empty === undefined || (Array.isArray(value.empty) && value.empty.every(isUiNode)))\n );\n}\n\n/*** Validate screen identity, root component and optional requirements. */\nfunction isScreenSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.name === 'string' &&\n isOptionalString(value.title) &&\n isOptionalString(value.description) &&\n (value.dataLoaders === undefined ||\n (Array.isArray(value.dataLoaders) &&\n value.dataLoaders.every(isScreenDataLoaderDefinition))) &&\n (value.requires === undefined || isScreenRequirements(value.requires)) &&\n isUiNode(value.root)\n );\n}\n\n/*** Validate one splash-screen appearance configuration. */\nfunction isSplashScreenModeSpec(value: unknown): boolean {\n return (\n isRecord(value) &&\n (value.image === undefined || isMediaAssetReference(value.image)) &&\n (value.imageWidth === undefined || typeof value.imageWidth === 'number') &&\n (value.resizeMode === undefined ||\n (typeof value.resizeMode === 'string' &&\n SPLASH_SCREEN_RESIZE_MODE_SET.has(value.resizeMode))) &&\n isOptionalString(value.backgroundColor)\n );\n}\n\n/*** Validate screen capability and permission requirements. */\nfunction isScreenRequirements(value: unknown): boolean {\n return (\n isRecord(value) &&\n (value.permissions === undefined || isRequirementArray(value.permissions, 'permission')) &&\n (value.capabilities === undefined || isRequirementArray(value.capabilities, 'capability'))\n );\n}\n\n/*** Validate the entries of a capability or permission requirement list. */\nfunction isRequirementArray(value: unknown, key: 'capability' | 'permission'): boolean {\n return (\n Array.isArray(value) &&\n value.every((entry) => isRecord(entry) && typeof entry[key] === 'string')\n );\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import type { Props as ExpoSplashScreenPluginProps } from 'expo-splash-screen/plugin';
2
+ import type { MediaAssetReference } from '../media';
3
+ type ExpoSplashScreenRootProps = Pick<ExpoSplashScreenPluginProps, 'backgroundColor' | 'image' | 'imageWidth' | 'resizeMode'>;
4
+ type PortableSplashScreenProps<T extends {
5
+ readonly image?: string;
6
+ }> = Readonly<Omit<T, 'image'>> & {
7
+ readonly image?: MediaAssetReference;
8
+ };
9
+ export type SplashScreenResizeMode = NonNullable<ExpoSplashScreenPluginProps['resizeMode']>;
10
+ export type SplashScreenModeSpec = PortableSplashScreenProps<NonNullable<ExpoSplashScreenPluginProps['dark']>>;
11
+ export type SplashScreenSpec = PortableSplashScreenProps<ExpoSplashScreenRootProps> & {
12
+ readonly dark?: SplashScreenModeSpec;
13
+ };
14
+ export {};
15
+ //# sourceMappingURL=splashScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splashScreen.d.ts","sourceRoot":"","sources":["../../src/appManifest/splashScreen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAEtF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,KAAK,yBAAyB,GAAG,IAAI,CACnC,2BAA2B,EAC3B,iBAAiB,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,CAC1D,CAAC;AAEF,KAAK,yBAAyB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,IAAI,QAAQ,CAC9E,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CACjB,GAAG;IACF,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,WAAW,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC,CAAC;AAE5F,MAAM,MAAM,oBAAoB,GAAG,yBAAyB,CAC1D,WAAW,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC,CACjD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,yBAAyB,CAAC,GAAG;IACpF,QAAQ,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC;CACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=splashScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splashScreen.js","sourceRoot":"","sources":["../../src/appManifest/splashScreen.ts"],"names":[],"mappings":"","sourcesContent":["import type { Props as ExpoSplashScreenPluginProps } from 'expo-splash-screen/plugin';\n\nimport type { MediaAssetReference } from '../media';\n\ntype ExpoSplashScreenRootProps = Pick<\n ExpoSplashScreenPluginProps,\n 'backgroundColor' | 'image' | 'imageWidth' | 'resizeMode'\n>;\n\ntype PortableSplashScreenProps<T extends { readonly image?: string }> = Readonly<\n Omit<T, 'image'>\n> & {\n readonly image?: MediaAssetReference;\n};\n\nexport type SplashScreenResizeMode = NonNullable<ExpoSplashScreenPluginProps['resizeMode']>;\n\nexport type SplashScreenModeSpec = PortableSplashScreenProps<\n NonNullable<ExpoSplashScreenPluginProps['dark']>\n>;\n\nexport type SplashScreenSpec = PortableSplashScreenProps<ExpoSplashScreenRootProps> & {\n readonly dark?: SplashScreenModeSpec;\n};\n"]}
@@ -1,19 +1,5 @@
1
- import type { AppManifest } from './types';
2
- export type AppManifestParseResult = {
3
- readonly ok: true;
4
- readonly manifest: AppManifest;
5
- } | {
6
- readonly ok: false;
7
- readonly message: string;
8
- };
9
- /**
10
- * Parse unknown JSON-compatible input at the canonical AppManifest boundary.
11
- *
12
- * Contracts owns structural manifest validation. Consumers may add semantic
13
- * diagnostics after this parser succeeds, but should not reconstruct the
14
- * AppManifest shape in their own packages.
15
- */
16
- export declare function parseAppManifest(value: unknown): AppManifestParseResult;
17
- /** Return whether an unknown value satisfies the canonical AppManifest shape. */
18
- export declare function isAppManifest(value: unknown): value is AppManifest;
1
+ export { isAppManifest } from './appManifest/isAppManifest';
2
+ export { parseAppManifest } from './appManifest/parseAppManifest';
3
+ export type { SplashScreenModeSpec, SplashScreenResizeMode, SplashScreenSpec, } from './appManifest/splashScreen';
4
+ export type { AppManifestParseResult } from './types/appManifest';
19
5
  //# sourceMappingURL=appManifest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"appManifest.d.ts","sourceRoot":"","sources":["../src/appManifest.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,MAAM,sBAAsB,GAC9B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAmBrD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAIvE;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAqBlE"}
1
+ {"version":3,"file":"appManifest.d.ts","sourceRoot":"","sources":["../src/appManifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,YAAY,EACV,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,81 +1,3 @@
1
- import { isComponentDataBindingRegistry } from './appManifest/bindings';
2
- import { isDataSourceRegistry } from './appManifest/dataSources';
3
- import { isAppDeployManifest } from './appManifest/deploy';
4
- import { isInfraManifest } from './appManifest/infra';
5
- import { isMediaManifest } from './appManifest/media';
6
- import { isAppNavigatorManifest, isManifestMetadata, isScreenRegistry, isSplashScreenSpec, isThemeConfig, } from './appManifest/screens';
7
- import { isRecord, isStringArray } from './appManifest/shared';
8
- const APP_MANIFEST_KEY_POLICY = {
9
- metadata: 'required',
10
- themes: 'required',
11
- activeThemeId: 'required',
12
- activeThemeMode: 'optional',
13
- splashScreen: 'optional',
14
- media: 'optional',
15
- deploy: 'optional',
16
- infra: 'required',
17
- navigator: 'required',
18
- screens: 'required',
19
- dataSources: 'optional',
20
- dataBindings: 'optional',
21
- repository: 'optional',
22
- settings: 'required',
23
- };
24
- /**
25
- * Parse unknown JSON-compatible input at the canonical AppManifest boundary.
26
- *
27
- * Contracts owns structural manifest validation. Consumers may add semantic
28
- * diagnostics after this parser succeeds, but should not reconstruct the
29
- * AppManifest shape in their own packages.
30
- */
31
- export function parseAppManifest(value) {
32
- return isAppManifest(value)
33
- ? { ok: true, manifest: value }
34
- : { ok: false, message: 'Value is not a canonical AppManifest.' };
35
- }
36
- /** Return whether an unknown value satisfies the canonical AppManifest shape. */
37
- export function isAppManifest(value) {
38
- return (isRecord(value) &&
39
- hasRequiredManifestKeys(value) &&
40
- !('generatedApis' in value) &&
41
- isManifestMetadata(value.metadata) &&
42
- Array.isArray(value.themes) &&
43
- value.themes.every(isThemeConfig) &&
44
- typeof value.activeThemeId === 'string' &&
45
- isActiveThemeMode(value.activeThemeMode) &&
46
- (value.splashScreen === undefined || isSplashScreenSpec(value.splashScreen)) &&
47
- (value.media === undefined || isMediaManifest(value.media)) &&
48
- (value.deploy === undefined || isAppDeployManifest(value.deploy)) &&
49
- isInfraManifest(value.infra) &&
50
- isAppNavigatorManifest(value.navigator) &&
51
- isScreenRegistry(value.screens) &&
52
- (value.dataSources === undefined || isDataSourceRegistry(value.dataSources)) &&
53
- (value.dataBindings === undefined || isComponentDataBindingRegistry(value.dataBindings)) &&
54
- (value.repository === undefined || isRepositoryManifest(value.repository)) &&
55
- isAppSettings(value.settings));
56
- }
57
- function hasRequiredManifestKeys(value) {
58
- return Object.entries(APP_MANIFEST_KEY_POLICY).every(([key, policy]) => policy === 'optional' || key in value);
59
- }
60
- function isActiveThemeMode(value) {
61
- return value === undefined || value === 'dark' || value === 'light';
62
- }
63
- function isRepositoryManifest(value) {
64
- return (isRecord(value) &&
65
- value.provider === 'github' &&
66
- typeof value.owner === 'string' &&
67
- value.owner.length > 0 &&
68
- typeof value.name === 'string' &&
69
- value.name.length > 0 &&
70
- typeof value.url === 'string' &&
71
- value.url.length > 0 &&
72
- value.defaultBranch === 'main');
73
- }
74
- function isAppSettings(value) {
75
- return (isRecord(value) &&
76
- !('apiBaseUrl' in value) &&
77
- isRecord(value.localization) &&
78
- typeof value.localization.defaultLocale === 'string' &&
79
- isStringArray(value.localization.locales));
80
- }
1
+ export { isAppManifest } from './appManifest/isAppManifest';
2
+ export { parseAppManifest } from './appManifest/parseAppManifest';
81
3
  //# sourceMappingURL=appManifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"appManifest.js","sourceRoot":"","sources":["../src/appManifest.ts"],"names":[],"mappings":"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","sourcesContent":["import { isComponentDataBindingRegistry } from './appManifest/bindings';\nimport { isDataSourceRegistry } from './appManifest/dataSources';\nimport { isAppDeployManifest } from './appManifest/deploy';\nimport { isInfraManifest } from './appManifest/infra';\nimport { isMediaManifest } from './appManifest/media';\nimport {\n isAppNavigatorManifest,\n isManifestMetadata,\n isScreenRegistry,\n isSplashScreenSpec,\n isThemeConfig,\n} from './appManifest/screens';\nimport { isRecord, isStringArray } from './appManifest/shared';\nimport type { AppManifest } from './types';\n\nexport type AppManifestParseResult =\n | { readonly ok: true; readonly manifest: AppManifest }\n | { readonly ok: false; readonly message: string };\n\nconst APP_MANIFEST_KEY_POLICY = {\n metadata: 'required',\n themes: 'required',\n activeThemeId: 'required',\n activeThemeMode: 'optional',\n splashScreen: 'optional',\n media: 'optional',\n deploy: 'optional',\n infra: 'required',\n navigator: 'required',\n screens: 'required',\n dataSources: 'optional',\n dataBindings: 'optional',\n repository: 'optional',\n settings: 'required',\n} as const satisfies Record<keyof AppManifest, 'optional' | 'required'>;\n\n/**\n * Parse unknown JSON-compatible input at the canonical AppManifest boundary.\n *\n * Contracts owns structural manifest validation. Consumers may add semantic\n * diagnostics after this parser succeeds, but should not reconstruct the\n * AppManifest shape in their own packages.\n */\nexport function parseAppManifest(value: unknown): AppManifestParseResult {\n return isAppManifest(value)\n ? { ok: true, manifest: value }\n : { ok: false, message: 'Value is not a canonical AppManifest.' };\n}\n\n/** Return whether an unknown value satisfies the canonical AppManifest shape. */\nexport function isAppManifest(value: unknown): value is AppManifest {\n return (\n isRecord(value) &&\n hasRequiredManifestKeys(value) &&\n !('generatedApis' in value) &&\n isManifestMetadata(value.metadata) &&\n Array.isArray(value.themes) &&\n value.themes.every(isThemeConfig) &&\n typeof value.activeThemeId === 'string' &&\n isActiveThemeMode(value.activeThemeMode) &&\n (value.splashScreen === undefined || isSplashScreenSpec(value.splashScreen)) &&\n (value.media === undefined || isMediaManifest(value.media)) &&\n (value.deploy === undefined || isAppDeployManifest(value.deploy)) &&\n isInfraManifest(value.infra) &&\n isAppNavigatorManifest(value.navigator) &&\n isScreenRegistry(value.screens) &&\n (value.dataSources === undefined || isDataSourceRegistry(value.dataSources)) &&\n (value.dataBindings === undefined || isComponentDataBindingRegistry(value.dataBindings)) &&\n (value.repository === undefined || isRepositoryManifest(value.repository)) &&\n isAppSettings(value.settings)\n );\n}\n\nfunction hasRequiredManifestKeys(value: Record<string, unknown>): boolean {\n return Object.entries(APP_MANIFEST_KEY_POLICY).every(\n ([key, policy]) => policy === 'optional' || key in value,\n );\n}\n\nfunction isActiveThemeMode(value: unknown): boolean {\n return value === undefined || value === 'dark' || value === 'light';\n}\n\nfunction isRepositoryManifest(value: unknown): boolean {\n return (\n isRecord(value) &&\n value.provider === 'github' &&\n typeof value.owner === 'string' &&\n value.owner.length > 0 &&\n typeof value.name === 'string' &&\n value.name.length > 0 &&\n typeof value.url === 'string' &&\n value.url.length > 0 &&\n value.defaultBranch === 'main'\n );\n}\n\nfunction isAppSettings(value: unknown): boolean {\n return (\n isRecord(value) &&\n !('apiBaseUrl' in value) &&\n isRecord(value.localization) &&\n typeof value.localization.defaultLocale === 'string' &&\n isStringArray(value.localization.locales)\n );\n}\n"]}
1
+ {"version":3,"file":"appManifest.js","sourceRoot":"","sources":["../src/appManifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC","sourcesContent":["export { isAppManifest } from './appManifest/isAppManifest';\nexport { parseAppManifest } from './appManifest/parseAppManifest';\nexport type {\n SplashScreenModeSpec,\n SplashScreenResizeMode,\n SplashScreenSpec,\n} from './appManifest/splashScreen';\nexport type { AppManifestParseResult } from './types/appManifest';\n"]}
package/dist/auth.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { AppDeployEnvironmentId, AppDeployTargetId } from './deploy';
1
+ import type { AppDeployTargetId } from './deploy';
2
+ import type { AppEnvironmentId } from './environments';
2
3
  import type { SecretRef } from './secrets';
3
4
  import type { IconSpec } from './types';
4
5
  export declare const AUTH_IDENTIFIER_KINDS: readonly ["email", "phone", "username"];
@@ -48,7 +49,7 @@ export type AuthOAuthSetupRequirement = AuthOAuthSetupFieldRequirement | AuthOAu
48
49
  export interface AuthOAuthSetupPlan {
49
50
  readonly provider: AuthOAuthProviderId;
50
51
  readonly transport: AuthOAuthTransportId;
51
- readonly environment: AppDeployEnvironmentId;
52
+ readonly environment: AppEnvironmentId;
52
53
  /** Enabled application targets considered while deriving this plan. */
53
54
  readonly targets: readonly AppDeployTargetId[];
54
55
  readonly requirements: readonly AuthOAuthSetupRequirement[];