@ankhorage/contracts 14.0.0 → 16.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 (250) 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.d.ts +3 -18
  62. package/dist/appManifest.d.ts.map +1 -1
  63. package/dist/appManifest.js +2 -80
  64. package/dist/appManifest.js.map +1 -1
  65. package/dist/auth.d.ts +3 -2
  66. package/dist/auth.d.ts.map +1 -1
  67. package/dist/auth.js.map +1 -1
  68. package/dist/deploy.d.ts +0 -9
  69. package/dist/deploy.d.ts.map +1 -1
  70. package/dist/deploy.js +0 -8
  71. package/dist/deploy.js.map +1 -1
  72. package/dist/environments.d.ts +4 -0
  73. package/dist/environments.d.ts.map +1 -0
  74. package/dist/environments.js +3 -0
  75. package/dist/environments.js.map +1 -0
  76. package/dist/index.d.ts +2 -1
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +2 -1
  79. package/dist/index.js.map +1 -1
  80. package/dist/infra/constants.d.ts +91 -0
  81. package/dist/infra/constants.d.ts.map +1 -0
  82. package/dist/infra/constants.js +91 -0
  83. package/dist/infra/constants.js.map +1 -0
  84. package/dist/infra/infraFields.d.ts +12 -0
  85. package/dist/infra/infraFields.d.ts.map +1 -0
  86. package/dist/infra/infraFields.js +14 -0
  87. package/dist/infra/infraFields.js.map +1 -0
  88. package/dist/infra/isInfraAdapterDescriptor.d.ts +4 -0
  89. package/dist/infra/isInfraAdapterDescriptor.d.ts.map +1 -0
  90. package/dist/infra/isInfraAdapterDescriptor.js +31 -0
  91. package/dist/infra/isInfraAdapterDescriptor.js.map +1 -0
  92. package/dist/infra/isInfraAuthSpec.d.ts +4 -0
  93. package/dist/infra/isInfraAuthSpec.d.ts.map +1 -0
  94. package/dist/infra/isInfraAuthSpec.js +75 -0
  95. package/dist/infra/isInfraAuthSpec.js.map +1 -0
  96. package/dist/infra/isInfraCredentialRef.d.ts +3 -0
  97. package/dist/infra/isInfraCredentialRef.d.ts.map +1 -0
  98. package/dist/infra/isInfraCredentialRef.js +10 -0
  99. package/dist/infra/isInfraCredentialRef.js.map +1 -0
  100. package/dist/infra/isInfraDeploymentSpec.d.ts +4 -0
  101. package/dist/infra/isInfraDeploymentSpec.d.ts.map +1 -0
  102. package/dist/infra/isInfraDeploymentSpec.js +66 -0
  103. package/dist/infra/isInfraDeploymentSpec.js.map +1 -0
  104. package/dist/infra/isInfraEnvironmentSpec.d.ts +4 -0
  105. package/dist/infra/isInfraEnvironmentSpec.d.ts.map +1 -0
  106. package/dist/infra/isInfraEnvironmentSpec.js +82 -0
  107. package/dist/infra/isInfraEnvironmentSpec.js.map +1 -0
  108. package/dist/infra/isInfraManifest.d.ts +4 -0
  109. package/dist/infra/isInfraManifest.d.ts.map +1 -0
  110. package/dist/infra/isInfraManifest.js +23 -0
  111. package/dist/infra/isInfraManifest.js.map +1 -0
  112. package/dist/infra/isInfraShape.d.ts +3 -0
  113. package/dist/infra/isInfraShape.d.ts.map +1 -0
  114. package/dist/infra/isInfraShape.js +10 -0
  115. package/dist/infra/isInfraShape.js.map +1 -0
  116. package/dist/infra/isInfraWorkloadHealth.d.ts +3 -0
  117. package/dist/infra/isInfraWorkloadHealth.d.ts.map +1 -0
  118. package/dist/infra/isInfraWorkloadHealth.js +37 -0
  119. package/dist/infra/isInfraWorkloadHealth.js.map +1 -0
  120. package/dist/infra/isInfraWorkloadSpec.d.ts +4 -0
  121. package/dist/infra/isInfraWorkloadSpec.d.ts.map +1 -0
  122. package/dist/infra/isInfraWorkloadSpec.js +70 -0
  123. package/dist/infra/isInfraWorkloadSpec.js.map +1 -0
  124. package/dist/infra/isInfraWorkloadValue.d.ts +3 -0
  125. package/dist/infra/isInfraWorkloadValue.d.ts.map +1 -0
  126. package/dist/infra/isInfraWorkloadValue.js +40 -0
  127. package/dist/infra/isInfraWorkloadValue.js.map +1 -0
  128. package/dist/infra/parseInfraManifest.d.ts +5 -0
  129. package/dist/infra/parseInfraManifest.d.ts.map +1 -0
  130. package/dist/infra/parseInfraManifest.js +17 -0
  131. package/dist/infra/parseInfraManifest.js.map +1 -0
  132. package/dist/infra/validateInfraAdapterSelection.d.ts +6 -0
  133. package/dist/infra/validateInfraAdapterSelection.d.ts.map +1 -0
  134. package/dist/infra/validateInfraAdapterSelection.js +36 -0
  135. package/dist/infra/validateInfraAdapterSelection.js.map +1 -0
  136. package/dist/infra.d.ts +16 -0
  137. package/dist/infra.d.ts.map +1 -0
  138. package/dist/infra.js +11 -0
  139. package/dist/infra.js.map +1 -0
  140. package/dist/media.d.ts +7 -6
  141. package/dist/media.d.ts.map +1 -1
  142. package/dist/media.js +5 -5
  143. package/dist/media.js.map +1 -1
  144. package/dist/state.d.ts +5 -0
  145. package/dist/state.d.ts.map +1 -1
  146. package/dist/state.js.map +1 -1
  147. package/dist/types/appManifest.d.ts +9 -0
  148. package/dist/types/appManifest.d.ts.map +1 -0
  149. package/dist/types/appManifest.js +2 -0
  150. package/dist/types/appManifest.js.map +1 -0
  151. package/dist/types/infraAdapters.d.ts +87 -0
  152. package/dist/types/infraAdapters.d.ts.map +1 -0
  153. package/dist/types/infraAdapters.js +2 -0
  154. package/dist/types/infraAdapters.js.map +1 -0
  155. package/dist/types/infraLifecycle.d.ts +107 -0
  156. package/dist/types/infraLifecycle.d.ts.map +1 -0
  157. package/dist/types/infraLifecycle.js +2 -0
  158. package/dist/types/infraLifecycle.js.map +1 -0
  159. package/dist/types/infraManifest.d.ts +142 -0
  160. package/dist/types/infraManifest.d.ts.map +1 -0
  161. package/dist/types/infraManifest.js +2 -0
  162. package/dist/types/infraManifest.js.map +1 -0
  163. package/dist/types/infraSecrets.d.ts +15 -0
  164. package/dist/types/infraSecrets.d.ts.map +1 -0
  165. package/dist/types/infraSecrets.js +2 -0
  166. package/dist/types/infraSecrets.js.map +1 -0
  167. package/dist/types/infraValidation.d.ts +5 -0
  168. package/dist/types/infraValidation.d.ts.map +1 -0
  169. package/dist/types/infraValidation.js +2 -0
  170. package/dist/types/infraValidation.js.map +1 -0
  171. package/dist/types/infraWorkload.d.ts +70 -0
  172. package/dist/types/infraWorkload.d.ts.map +1 -0
  173. package/dist/types/infraWorkload.js +2 -0
  174. package/dist/types/infraWorkload.js.map +1 -0
  175. package/dist/types.d.ts +7 -70
  176. package/dist/types.d.ts.map +1 -1
  177. package/dist/types.js +0 -9
  178. package/dist/types.js.map +1 -1
  179. package/package.json +11 -2
  180. package/src/appManifest/apis.ts +18 -16
  181. package/src/appManifest/bindings.ts +18 -1
  182. package/src/appManifest/constants.ts +19 -0
  183. package/src/appManifest/data.ts +23 -9
  184. package/src/appManifest/dataSources.ts +8 -7
  185. package/src/appManifest/deploy.ts +17 -15
  186. package/src/appManifest/icon.ts +3 -1
  187. package/src/appManifest/isAppManifest.ts +95 -0
  188. package/src/appManifest/isAppStateSpec.ts +13 -0
  189. package/src/appManifest/isManifestValue.ts +19 -0
  190. package/src/appManifest/media.ts +11 -10
  191. package/src/appManifest/navigator.ts +7 -6
  192. package/src/appManifest/navigatorOptions.ts +9 -16
  193. package/src/appManifest/parseAppManifest.ts +15 -0
  194. package/src/appManifest/screens.ts +14 -2
  195. package/src/appManifest.test.ts +9 -5
  196. package/src/appManifest.ts +3 -107
  197. package/src/auth-flow-contract.test.ts +6 -10
  198. package/src/auth-oauth.test.ts +2 -2
  199. package/src/auth.ts +3 -2
  200. package/src/bindings.test.ts +5 -0
  201. package/src/contracts.test.ts +21 -19
  202. package/src/deploy.test.ts +13 -5
  203. package/src/deploy.ts +0 -11
  204. package/src/environments.ts +4 -0
  205. package/src/index.ts +2 -1
  206. package/src/infra/constants.ts +91 -0
  207. package/src/infra/infraFields.ts +20 -0
  208. package/src/infra/isInfraAdapterDescriptor.ts +37 -0
  209. package/src/infra/isInfraAuthSpec.ts +98 -0
  210. package/src/infra/isInfraCredentialRef.ts +11 -0
  211. package/src/infra/isInfraDeploymentSpec.ts +75 -0
  212. package/src/infra/isInfraEnvironmentSpec.ts +95 -0
  213. package/src/infra/isInfraManifest.ts +29 -0
  214. package/src/infra/isInfraShape.ts +16 -0
  215. package/src/infra/isInfraWorkloadHealth.ts +38 -0
  216. package/src/infra/isInfraWorkloadSpec.ts +87 -0
  217. package/src/infra/isInfraWorkloadValue.ts +41 -0
  218. package/src/infra/parseInfraManifest.ts +20 -0
  219. package/src/infra/validateInfraAdapterSelection.ts +42 -0
  220. package/src/infra-types.test.ts +93 -0
  221. package/src/infra-workload.test.ts +186 -0
  222. package/src/infra.test.ts +268 -0
  223. package/src/infra.ts +15 -0
  224. package/src/media.ts +12 -11
  225. package/src/profile-contract.test.ts +2 -3
  226. package/src/secrets.test.ts +19 -13
  227. package/src/state.ts +6 -0
  228. package/src/types/appManifest.ts +5 -0
  229. package/src/types/infraAdapters.ts +150 -0
  230. package/src/types/infraLifecycle.ts +105 -0
  231. package/src/types/infraManifest.ts +130 -0
  232. package/src/types/infraSecrets.ts +16 -0
  233. package/src/types/infraValidation.ts +2 -0
  234. package/src/types/infraWorkload.ts +64 -0
  235. package/src/types.ts +7 -87
  236. package/dist/appManifest/infra.d.ts +0 -2
  237. package/dist/appManifest/infra.d.ts.map +0 -1
  238. package/dist/appManifest/infra.js +0 -130
  239. package/dist/appManifest/infra.js.map +0 -1
  240. package/dist/appManifest/shared.d.ts +0 -8
  241. package/dist/appManifest/shared.d.ts.map +0 -1
  242. package/dist/appManifest/shared.js +0 -31
  243. package/dist/appManifest/shared.js.map +0 -1
  244. package/dist/secretManifest.d.ts +0 -11
  245. package/dist/secretManifest.d.ts.map +0 -1
  246. package/dist/secretManifest.js +0 -2
  247. package/dist/secretManifest.js.map +0 -1
  248. package/src/appManifest/infra.ts +0 -190
  249. package/src/appManifest/shared.ts +0 -40
  250. package/src/secretManifest.ts +0 -12
package/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # @ankhorage/contracts
2
2
 
3
+ ## 16.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 5f7c17d: Require runtime desired state to carry the already resolved outputs available to portable workload output references.
8
+
9
+ ## 15.0.0
10
+
11
+ ### Major Changes
12
+
13
+ - 8693243: Replace the single-target Infra manifest with canonical local/preview/production environments and
14
+ closed compute/runtime/service selections. The public `@ankhorage/contracts/infra` entrypoint owns
15
+ provider config maps, exact compatibility typing and validation, adapter/package descriptors,
16
+ portable compute targets and workloads, lifecycle results, outputs, diagnostics and ownership/
17
+ retention contracts.
18
+
19
+ Move `storage` to environment-local `objectStorage`, move nested authorization to sibling `authz`,
20
+ and remove deployment monitoring, implicit storage providers and unused CDN flags. Move app state
21
+ to optional `AppManifest.state`; Legend can only declare `persistence: false` or omit persistence.
22
+ Superseded Infra types and the secret-store module augmentation are removed, with no compatibility
23
+ aliases or dual manifest shapes. Auth flow, profile and OAuth references remain supported.
24
+
25
+ Shared environment IDs now live at `@ankhorage/contracts/environments` as `APP_ENVIRONMENT_IDS` and
26
+ `AppEnvironmentId`, replacing Deploy-specific environment names. App shipment target IDs remain
27
+ unchanged. Existing application runtime SecretStore/DB/Auth/Storage/State adapter ports remain
28
+ separate from infrastructure providers.
29
+
30
+ Release Contracts before migrating direct consumers. Templates and Studio must then adopt the
31
+ published API and correct their Legend persistence manifests; this release alone does not complete
32
+ Phase 1 of ankhorage/infra#145 or implement provider lifecycle behavior.
33
+
34
+ Use the published Utility object, array and string helpers directly for structural validation.
35
+ Remove local duplicates and the internal AppManifest shared helper module without changing the
36
+ public parser behavior.
37
+ Require Utility `^0.8.0`, which has no reverse Contracts dependency and exports `isOptionalString`.
38
+ Reuse this guard for optional string fields instead of duplicating its predicate inline.
39
+
3
40
  ## 14.0.0
4
41
 
5
42
  ### Major Changes
package/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  <!-- markdownlint-disable MD013 MD033 -->
2
2
  <!-- This file is generated by Paradox. Do not edit manually. -->
3
3
 
4
- # CONTRACTS
4
+ # @ankhorage/contracts
5
5
 
6
- ![license: MIT](././paradox/badges/license.svg) ![npm: v12.0.0](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
6
+ ![license: MIT](././paradox/badges/license.svg) ![npm: v15.0.0](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
7
7
 
8
8
  Serializable app, action, theme, auth, and secret-store contracts for Ankhorage.
9
9
 
@@ -15,3 +15,11 @@ Serializable app, action, theme, auth, and secret-store contracts for Ankhorage.
15
15
  - [Architecture overview](././paradox/diagrams/architecture-overview.mmd)
16
16
  - [Module relationships](././paradox/diagrams/module-relationships.mmd)
17
17
  - [Export graph](././paradox/diagrams/export-graph.mmd)
18
+ - [isInfraAdapterDescriptor sequence](././paradox/diagrams/sequences/is-infra-adapter-descriptor.mmd)
19
+ - [isInfraAuthSpec sequence](././paradox/diagrams/sequences/is-infra-auth-spec.mmd)
20
+ - [isInfraDeploymentSpec sequence](././paradox/diagrams/sequences/is-infra-deployment-spec.mmd)
21
+ - [isInfraEnvironmentSpec sequence](././paradox/diagrams/sequences/is-infra-environment-spec.mmd)
22
+ - [isInfraManifest sequence](././paradox/diagrams/sequences/is-infra-manifest.mmd)
23
+ - [isInfraWorkloadSpec sequence](././paradox/diagrams/sequences/is-infra-workload-spec.mmd)
24
+ - [isMediaAssetReference sequence](././paradox/diagrams/sequences/is-media-asset-reference.mmd)
25
+ - [parseInfraManifest sequence](././paradox/diagrams/sequences/parse-infra-manifest.mmd)
@@ -1,3 +1,4 @@
1
1
  import type { ApiDefinitionList } from '../data';
2
+ /*** Validate API definitions and require unique API identities. */
2
3
  export declare function isApiDefinitionList(value: unknown): value is ApiDefinitionList;
3
4
  //# sourceMappingURL=apis.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apis.d.ts","sourceRoot":"","sources":["../../src/appManifest/apis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAqBhE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAI9E"}
1
+ {"version":3,"file":"apis.d.ts","sourceRoot":"","sources":["../../src/appManifest/apis.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAqBhE,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAI9E"}
@@ -1,5 +1,7 @@
1
+ import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';
2
+ import { isNonEmptyString, isOptionalString } from '@ankhorage/utility/string';
1
3
  import { isCredentialRef, isDataEndpointRegistry, isDataSchemaRegistry } from './data';
2
- import { isManifestValue, isOptionalString, isRecord } from './shared';
4
+ import { isManifestValue } from './isManifestValue';
3
5
  const API_BASE_KEYS = [
4
6
  'id',
5
7
  'origin',
@@ -11,17 +13,19 @@ const API_BASE_KEYS = [
11
13
  'schemas',
12
14
  'metadata',
13
15
  ];
14
- const EXTERNAL_REST_KEYS = new Set([...API_BASE_KEYS, 'baseUrl', 'openApi']);
15
- const EXTERNAL_GRAPHQL_KEYS = new Set([...API_BASE_KEYS, 'endpointUrl', 'introspection']);
16
- const INTERNAL_REST_KEYS = new Set([...API_BASE_KEYS, 'basePath']);
17
- const OPEN_API_KEYS = new Set(['url', 'documentId', 'version']);
18
- const INTROSPECTION_KEYS = new Set(['enabled', 'schemaVersion']);
16
+ const EXTERNAL_REST_KEYS = [...API_BASE_KEYS, 'baseUrl', 'openApi'];
17
+ const EXTERNAL_GRAPHQL_KEYS = [...API_BASE_KEYS, 'endpointUrl', 'introspection'];
18
+ const INTERNAL_REST_KEYS = [...API_BASE_KEYS, 'basePath'];
19
+ const OPEN_API_KEYS = ['url', 'documentId', 'version'];
20
+ const INTROSPECTION_KEYS = ['enabled', 'schemaVersion'];
21
+ /*** Validate API definitions and require unique API identities. */
19
22
  export function isApiDefinitionList(value) {
20
23
  if (!Array.isArray(value) || !value.every(isApiDefinition))
21
24
  return false;
22
25
  const ids = value.map((api) => api.id);
23
26
  return new Set(ids).size === ids.length;
24
27
  }
28
+ /*** Validate one API definition against its origin and protocol branch. */
25
29
  function isApiDefinition(value) {
26
30
  if (!isApiBaseDefinition(value))
27
31
  return false;
@@ -34,31 +38,35 @@ function isApiDefinition(value) {
34
38
  return isInternalRestApi(value);
35
39
  return false;
36
40
  }
41
+ /*** Validate common API identity, endpoint, schema and authored metadata fields. */
37
42
  function isApiBaseDefinition(value) {
38
43
  return (isRecord(value) &&
39
44
  isNonEmptyString(value.id) &&
40
45
  (value.origin === 'external' || value.origin === 'internal') &&
41
46
  (value.protocol === 'graphql' || value.protocol === 'rest') &&
42
- isOptionalString(value.name) &&
43
- isOptionalString(value.description) &&
47
+ [value.name, value.description].every(isOptionalString) &&
44
48
  (value.credential === undefined || isCredentialRef(value.credential)) &&
45
49
  isDataEndpointRegistry(value.endpoints) &&
46
50
  (value.schemas === undefined || isDataSchemaRegistry(value.schemas)) &&
47
51
  (value.metadata === undefined || isManifestValue(value.metadata)));
48
52
  }
53
+ /*** Validate external REST endpoint and optional OpenAPI metadata. */
49
54
  function isExternalRestApi(value) {
50
55
  return (hasOnlyKeys(value, EXTERNAL_REST_KEYS) &&
51
56
  isNonEmptyString(value.baseUrl) &&
52
57
  (value.openApi === undefined || isOpenApiDocumentRef(value.openApi)));
53
58
  }
59
+ /*** Validate external GraphQL endpoint and optional introspection metadata. */
54
60
  function isExternalGraphQlApi(value) {
55
61
  return (hasOnlyKeys(value, EXTERNAL_GRAPHQL_KEYS) &&
56
62
  isNonEmptyString(value.endpointUrl) &&
57
63
  (value.introspection === undefined || isGraphQlIntrospection(value.introspection)));
58
64
  }
65
+ /*** Validate the supported internal REST API configuration. */
59
66
  function isInternalRestApi(value) {
60
67
  return hasOnlyKeys(value, INTERNAL_REST_KEYS) && isNonEmptyString(value.basePath);
61
68
  }
69
+ /*** Validate optional OpenAPI document location and version fields. */
62
70
  function isOpenApiDocumentRef(value) {
63
71
  return (isRecord(value) &&
64
72
  hasOnlyKeys(value, OPEN_API_KEYS) &&
@@ -66,16 +74,11 @@ function isOpenApiDocumentRef(value) {
66
74
  isOptionalString(value.documentId) &&
67
75
  isOptionalString(value.version));
68
76
  }
77
+ /*** Validate explicit GraphQL introspection settings. */
69
78
  function isGraphQlIntrospection(value) {
70
79
  return (isRecord(value) &&
71
80
  hasOnlyKeys(value, INTROSPECTION_KEYS) &&
72
81
  typeof value.enabled === 'boolean' &&
73
82
  isOptionalString(value.schemaVersion));
74
83
  }
75
- function isNonEmptyString(value) {
76
- return typeof value === 'string' && value.trim().length > 0;
77
- }
78
- function hasOnlyKeys(value, allowed) {
79
- return Object.keys(value).every((key) => allowed.has(key));
80
- }
81
84
  //# sourceMappingURL=apis.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"apis.js","sourceRoot":"","sources":["../../src/appManifest/apis.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ApiDefinition, ApiDefinitionList } from '../data';\nimport { isCredentialRef, isDataEndpointRegistry, isDataSchemaRegistry } from './data';\nimport { isManifestValue, isOptionalString, isRecord } from './shared';\n\nconst API_BASE_KEYS = [\n 'id',\n 'origin',\n 'protocol',\n 'name',\n 'description',\n 'credential',\n 'endpoints',\n 'schemas',\n 'metadata',\n] as const;\nconst EXTERNAL_REST_KEYS = new Set([...API_BASE_KEYS, 'baseUrl', 'openApi']);\nconst EXTERNAL_GRAPHQL_KEYS = new Set([...API_BASE_KEYS, 'endpointUrl', 'introspection']);\nconst INTERNAL_REST_KEYS = new Set([...API_BASE_KEYS, 'basePath']);\nconst OPEN_API_KEYS = new Set(['url', 'documentId', 'version']);\nconst INTROSPECTION_KEYS = new Set(['enabled', 'schemaVersion']);\n\nexport function isApiDefinitionList(value: unknown): value is ApiDefinitionList {\n if (!Array.isArray(value) || !value.every(isApiDefinition)) return false;\n const ids = value.map((api) => api.id);\n return new Set(ids).size === ids.length;\n}\n\nfunction isApiDefinition(value: unknown): value is ApiDefinition {\n if (!isApiBaseDefinition(value)) return false;\n if (value.origin === 'external' && value.protocol === 'rest') return isExternalRestApi(value);\n if (value.origin === 'external' && value.protocol === 'graphql') {\n return isExternalGraphQlApi(value);\n }\n if (value.origin === 'internal' && value.protocol === 'rest') return isInternalRestApi(value);\n return false;\n}\n\nfunction isApiBaseDefinition(value: unknown): value is Record<string, unknown> {\n return (\n isRecord(value) &&\n isNonEmptyString(value.id) &&\n (value.origin === 'external' || value.origin === 'internal') &&\n (value.protocol === 'graphql' || value.protocol === 'rest') &&\n isOptionalString(value.name) &&\n isOptionalString(value.description) &&\n (value.credential === undefined || isCredentialRef(value.credential)) &&\n isDataEndpointRegistry(value.endpoints) &&\n (value.schemas === undefined || isDataSchemaRegistry(value.schemas)) &&\n (value.metadata === undefined || isManifestValue(value.metadata))\n );\n}\n\nfunction isExternalRestApi(value: Record<string, unknown>): boolean {\n return (\n hasOnlyKeys(value, EXTERNAL_REST_KEYS) &&\n isNonEmptyString(value.baseUrl) &&\n (value.openApi === undefined || isOpenApiDocumentRef(value.openApi))\n );\n}\n\nfunction isExternalGraphQlApi(value: Record<string, unknown>): boolean {\n return (\n hasOnlyKeys(value, EXTERNAL_GRAPHQL_KEYS) &&\n isNonEmptyString(value.endpointUrl) &&\n (value.introspection === undefined || isGraphQlIntrospection(value.introspection))\n );\n}\n\nfunction isInternalRestApi(value: Record<string, unknown>): boolean {\n return hasOnlyKeys(value, INTERNAL_REST_KEYS) && isNonEmptyString(value.basePath);\n}\n\nfunction isOpenApiDocumentRef(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, OPEN_API_KEYS) &&\n isOptionalString(value.url) &&\n isOptionalString(value.documentId) &&\n isOptionalString(value.version)\n );\n}\n\nfunction isGraphQlIntrospection(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, INTROSPECTION_KEYS) &&\n typeof value.enabled === 'boolean' &&\n isOptionalString(value.schemaVersion)\n );\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction hasOnlyKeys(value: Record<string, unknown>, allowed: ReadonlySet<string>): boolean {\n return Object.keys(value).every((key) => allowed.has(key));\n}\n"]}
1
+ {"version":3,"file":"apis.js","sourceRoot":"","sources":["../../src/appManifest/apis.ts"],"names":[],"mappings":"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","sourcesContent":["import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';\nimport { isNonEmptyString, isOptionalString } from '@ankhorage/utility/string';\n\nimport type { ApiDefinition, ApiDefinitionList } from '../data';\nimport { isCredentialRef, isDataEndpointRegistry, isDataSchemaRegistry } from './data';\nimport { isManifestValue } from './isManifestValue';\n\nconst API_BASE_KEYS = [\n 'id',\n 'origin',\n 'protocol',\n 'name',\n 'description',\n 'credential',\n 'endpoints',\n 'schemas',\n 'metadata',\n] as const;\nconst EXTERNAL_REST_KEYS = [...API_BASE_KEYS, 'baseUrl', 'openApi'] as const;\nconst EXTERNAL_GRAPHQL_KEYS = [...API_BASE_KEYS, 'endpointUrl', 'introspection'] as const;\nconst INTERNAL_REST_KEYS = [...API_BASE_KEYS, 'basePath'] as const;\nconst OPEN_API_KEYS = ['url', 'documentId', 'version'] as const;\nconst INTROSPECTION_KEYS = ['enabled', 'schemaVersion'] as const;\n\n/*** Validate API definitions and require unique API identities. */\nexport function isApiDefinitionList(value: unknown): value is ApiDefinitionList {\n if (!Array.isArray(value) || !value.every(isApiDefinition)) return false;\n const ids = value.map((api) => api.id);\n return new Set(ids).size === ids.length;\n}\n\n/*** Validate one API definition against its origin and protocol branch. */\nfunction isApiDefinition(value: unknown): value is ApiDefinition {\n if (!isApiBaseDefinition(value)) return false;\n if (value.origin === 'external' && value.protocol === 'rest') return isExternalRestApi(value);\n if (value.origin === 'external' && value.protocol === 'graphql') {\n return isExternalGraphQlApi(value);\n }\n if (value.origin === 'internal' && value.protocol === 'rest') return isInternalRestApi(value);\n return false;\n}\n\n/*** Validate common API identity, endpoint, schema and authored metadata fields. */\nfunction isApiBaseDefinition(value: unknown): value is Record<string, unknown> {\n return (\n isRecord(value) &&\n isNonEmptyString(value.id) &&\n (value.origin === 'external' || value.origin === 'internal') &&\n (value.protocol === 'graphql' || value.protocol === 'rest') &&\n [value.name, value.description].every(isOptionalString) &&\n (value.credential === undefined || isCredentialRef(value.credential)) &&\n isDataEndpointRegistry(value.endpoints) &&\n (value.schemas === undefined || isDataSchemaRegistry(value.schemas)) &&\n (value.metadata === undefined || isManifestValue(value.metadata))\n );\n}\n\n/*** Validate external REST endpoint and optional OpenAPI metadata. */\nfunction isExternalRestApi(value: Record<string, unknown>): boolean {\n return (\n hasOnlyKeys(value, EXTERNAL_REST_KEYS) &&\n isNonEmptyString(value.baseUrl) &&\n (value.openApi === undefined || isOpenApiDocumentRef(value.openApi))\n );\n}\n\n/*** Validate external GraphQL endpoint and optional introspection metadata. */\nfunction isExternalGraphQlApi(value: Record<string, unknown>): boolean {\n return (\n hasOnlyKeys(value, EXTERNAL_GRAPHQL_KEYS) &&\n isNonEmptyString(value.endpointUrl) &&\n (value.introspection === undefined || isGraphQlIntrospection(value.introspection))\n );\n}\n\n/*** Validate the supported internal REST API configuration. */\nfunction isInternalRestApi(value: Record<string, unknown>): boolean {\n return hasOnlyKeys(value, INTERNAL_REST_KEYS) && isNonEmptyString(value.basePath);\n}\n\n/*** Validate optional OpenAPI document location and version fields. */\nfunction isOpenApiDocumentRef(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, OPEN_API_KEYS) &&\n isOptionalString(value.url) &&\n isOptionalString(value.documentId) &&\n isOptionalString(value.version)\n );\n}\n\n/*** Validate explicit GraphQL introspection settings. */\nfunction isGraphQlIntrospection(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, INTROSPECTION_KEYS) &&\n typeof value.enabled === 'boolean' &&\n isOptionalString(value.schemaVersion)\n );\n}\n"]}
@@ -1,4 +1,7 @@
1
+ /*** Validate every component binding in the authored registry. */
1
2
  export declare function isComponentDataBindingRegistry(value: unknown): boolean;
3
+ /*** Validate literal, operation and path-based binding sources. */
2
4
  export declare function isBindingValueSource(value: unknown): boolean;
5
+ /*** Validate a screen operation loader and its optional input mapping. */
3
6
  export declare function isScreenDataLoaderDefinition(value: unknown): boolean;
4
7
  //# sourceMappingURL=bindings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../../src/appManifest/bindings.ts"],"names":[],"mappings":"AAEA,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEtE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAW5D;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQpE"}
1
+ {"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../../src/appManifest/bindings.ts"],"names":[],"mappings":"AAKA,kEAAkE;AAClE,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEtE;AAED,mEAAmE;AACnE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAW5D;AAED,0EAA0E;AAC1E,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQpE"}
@@ -1,7 +1,11 @@
1
- import { isManifestValue, isOptionalString, isRecord } from './shared';
1
+ import { isRecord } from '@ankhorage/utility/object';
2
+ import { isOptionalString } from '@ankhorage/utility/string';
3
+ import { isManifestValue } from './isManifestValue';
4
+ /*** Validate every component binding in the authored registry. */
2
5
  export function isComponentDataBindingRegistry(value) {
3
6
  return isRecord(value) && Object.values(value).every(isComponentDataBinding);
4
7
  }
8
+ /*** Validate literal, operation and path-based binding sources. */
5
9
  export function isBindingValueSource(value) {
6
10
  return (isRecord(value) &&
7
11
  typeof value.kind === 'string' &&
@@ -12,6 +16,7 @@ export function isBindingValueSource(value) {
12
16
  ? isBindingOperationRef(value.operation) && isOptionalString(value.path)
13
17
  : typeof value.path === 'string'));
14
18
  }
19
+ /*** Validate a screen operation loader and its optional input mapping. */
15
20
  export function isScreenDataLoaderDefinition(value) {
16
21
  return (isRecord(value) &&
17
22
  value.kind === 'operation' &&
@@ -19,6 +24,7 @@ export function isScreenDataLoaderDefinition(value) {
19
24
  isBindingOperationRef(value.operation) &&
20
25
  (value.input === undefined || isBindingInputMap(value.input)));
21
26
  }
27
+ /*** Validate component identity and its property and event bindings. */
22
28
  function isComponentDataBinding(value) {
23
29
  return (isRecord(value) &&
24
30
  typeof value.componentId === 'string' &&
@@ -29,6 +35,7 @@ function isComponentDataBinding(value) {
29
35
  (isRecord(value.events) &&
30
36
  Object.values(value.events).every((bindings) => Array.isArray(bindings) && bindings.every(isEventBinding)))));
31
37
  }
38
+ /*** Validate a property binding with optional transforms and fallback behavior. */
32
39
  function isPropBinding(value) {
33
40
  return (isRecord(value) &&
34
41
  isBindingValueSource(value.source) &&
@@ -38,34 +45,40 @@ function isPropBinding(value) {
38
45
  (value.empty === undefined || isBindingLifecycleBehavior(value.empty)) &&
39
46
  isOptionalBindingTransforms(value.transforms));
40
47
  }
48
+ /*** Validate an event binding and its declared target. */
41
49
  function isEventBinding(value) {
42
50
  return (isRecord(value) &&
43
51
  isEventBindingTarget(value.target) &&
44
52
  (value.input === undefined || isBindingInputMap(value.input)) &&
45
53
  (value.when === undefined || isBindingCondition(value.when)));
46
54
  }
55
+ /*** Validate the selected operation or action event target. */
47
56
  function isEventBindingTarget(value) {
48
57
  return (isRecord(value) &&
49
58
  ((value.kind === 'action' && typeof value.type === 'string') ||
50
59
  (value.kind === 'operation' && isBindingOperationRef(value.operation))));
51
60
  }
61
+ /*** Validate a binding condition and its source value. */
52
62
  function isBindingCondition(value) {
53
63
  return (isRecord(value) &&
54
64
  isBindingValueSource(value.source) &&
55
65
  ['eq', 'exists', 'neq', 'notExists'].includes(String(value.operator)) &&
56
66
  (value.value === undefined || isManifestValue(value.value)));
57
67
  }
68
+ /*** Validate API and operation identities with an optional endpoint reference. */
58
69
  function isBindingOperationRef(value) {
59
70
  return (isRecord(value) &&
60
71
  typeof value.apiId === 'string' &&
61
72
  typeof value.operationId === 'string' &&
62
73
  isOptionalString(value.endpointId));
63
74
  }
75
+ /*** Validate authored binding fallback values. */
64
76
  function isBindingFallback(value) {
65
77
  return (isRecord(value) &&
66
78
  (value.value === undefined || isManifestValue(value.value)) &&
67
79
  (value.source === undefined || isBindingValueSource(value.source)));
68
80
  }
81
+ /*** Validate loading, empty and error binding behavior. */
69
82
  function isBindingLifecycleBehavior(value) {
70
83
  return (isRecord(value) &&
71
84
  typeof value.state === 'string' &&
@@ -73,14 +86,17 @@ function isBindingLifecycleBehavior(value) {
73
86
  (value.fallback === undefined || isBindingFallback(value.fallback)) &&
74
87
  isOptionalString(value.message));
75
88
  }
89
+ /*** Validate optional ordered binding transformations. */
76
90
  function isOptionalBindingTransforms(value) {
77
91
  return (value === undefined ||
78
92
  (Array.isArray(value) &&
79
93
  value.every((transform) => ['lowercase', 'trim', 'uppercase'].includes(String(transform)))));
80
94
  }
95
+ /*** Validate every value in an operation input mapping. */
81
96
  function isBindingInputMap(value) {
82
97
  return isRecord(value) && Object.values(value).every(isBindingInputValue);
83
98
  }
99
+ /*** Validate recursive array, object, literal and source operation inputs. */
84
100
  function isBindingInputValue(value) {
85
101
  return (isRecord(value) &&
86
102
  typeof value.kind === 'string' &&
@@ -1 +1 @@
1
- {"version":3,"file":"bindings.js","sourceRoot":"","sources":["../../src/appManifest/bindings.ts"],"names":[],"mappings":"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","sourcesContent":["import { isManifestValue, isOptionalString, isRecord } from './shared';\n\nexport function isComponentDataBindingRegistry(value: unknown): boolean {\n return isRecord(value) && Object.values(value).every(isComponentDataBinding);\n}\n\nexport function isBindingValueSource(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.kind === 'string' &&\n ['context', 'event', 'literal', 'operation', 'state'].includes(value.kind) &&\n (value.kind === 'literal'\n ? isManifestValue(value.value)\n : value.kind === 'operation'\n ? isBindingOperationRef(value.operation) && isOptionalString(value.path)\n : typeof value.path === 'string')\n );\n}\n\nexport function isScreenDataLoaderDefinition(value: unknown): boolean {\n return (\n isRecord(value) &&\n value.kind === 'operation' &&\n isOptionalString(value.id) &&\n isBindingOperationRef(value.operation) &&\n (value.input === undefined || isBindingInputMap(value.input))\n );\n}\n\nfunction isComponentDataBinding(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.componentId === 'string' &&\n isOptionalString(value.componentType) &&\n (value.props === undefined ||\n (isRecord(value.props) && Object.values(value.props).every(isPropBinding))) &&\n (value.events === undefined ||\n (isRecord(value.events) &&\n Object.values(value.events).every(\n (bindings) => Array.isArray(bindings) && bindings.every(isEventBinding),\n )))\n );\n}\n\nfunction isPropBinding(value: unknown): boolean {\n return (\n isRecord(value) &&\n isBindingValueSource(value.source) &&\n (value.fallback === undefined || isBindingFallback(value.fallback)) &&\n (value.loading === undefined || isBindingLifecycleBehavior(value.loading)) &&\n (value.error === undefined || isBindingLifecycleBehavior(value.error)) &&\n (value.empty === undefined || isBindingLifecycleBehavior(value.empty)) &&\n isOptionalBindingTransforms(value.transforms)\n );\n}\n\nfunction isEventBinding(value: unknown): boolean {\n return (\n isRecord(value) &&\n isEventBindingTarget(value.target) &&\n (value.input === undefined || isBindingInputMap(value.input)) &&\n (value.when === undefined || isBindingCondition(value.when))\n );\n}\n\nfunction isEventBindingTarget(value: unknown): boolean {\n return (\n isRecord(value) &&\n ((value.kind === 'action' && typeof value.type === 'string') ||\n (value.kind === 'operation' && isBindingOperationRef(value.operation)))\n );\n}\n\nfunction isBindingCondition(value: unknown): boolean {\n return (\n isRecord(value) &&\n isBindingValueSource(value.source) &&\n ['eq', 'exists', 'neq', 'notExists'].includes(String(value.operator)) &&\n (value.value === undefined || isManifestValue(value.value))\n );\n}\n\nfunction isBindingOperationRef(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.apiId === 'string' &&\n typeof value.operationId === 'string' &&\n isOptionalString(value.endpointId)\n );\n}\n\nfunction isBindingFallback(value: unknown): boolean {\n return (\n isRecord(value) &&\n (value.value === undefined || isManifestValue(value.value)) &&\n (value.source === undefined || isBindingValueSource(value.source))\n );\n}\n\nfunction isBindingLifecycleBehavior(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.state === 'string' &&\n ['empty', 'error', 'loading'].includes(value.state) &&\n (value.fallback === undefined || isBindingFallback(value.fallback)) &&\n isOptionalString(value.message)\n );\n}\n\nfunction isOptionalBindingTransforms(value: unknown): boolean {\n return (\n value === undefined ||\n (Array.isArray(value) &&\n value.every((transform) => ['lowercase', 'trim', 'uppercase'].includes(String(transform))))\n );\n}\n\nfunction isBindingInputMap(value: unknown): boolean {\n return isRecord(value) && Object.values(value).every(isBindingInputValue);\n}\n\nfunction isBindingInputValue(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.kind === 'string' &&\n ((value.kind === 'array' &&\n Array.isArray(value.items) &&\n value.items.every(isBindingInputValue)) ||\n (value.kind === 'literal' && isManifestValue(value.value)) ||\n (value.kind === 'object' && isBindingInputMap(value.fields)) ||\n (value.kind === 'source' &&\n isBindingValueSource(value.source) &&\n isOptionalBindingTransforms(value.transforms)))\n );\n}\n"]}
1
+ {"version":3,"file":"bindings.js","sourceRoot":"","sources":["../../src/appManifest/bindings.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRecord } from '@ankhorage/utility/object';\nimport { isOptionalString } from '@ankhorage/utility/string';\n\nimport { isManifestValue } from './isManifestValue';\n\n/*** Validate every component binding in the authored registry. */\nexport function isComponentDataBindingRegistry(value: unknown): boolean {\n return isRecord(value) && Object.values(value).every(isComponentDataBinding);\n}\n\n/*** Validate literal, operation and path-based binding sources. */\nexport function isBindingValueSource(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.kind === 'string' &&\n ['context', 'event', 'literal', 'operation', 'state'].includes(value.kind) &&\n (value.kind === 'literal'\n ? isManifestValue(value.value)\n : value.kind === 'operation'\n ? isBindingOperationRef(value.operation) && isOptionalString(value.path)\n : typeof value.path === 'string')\n );\n}\n\n/*** Validate a screen operation loader and its optional input mapping. */\nexport function isScreenDataLoaderDefinition(value: unknown): boolean {\n return (\n isRecord(value) &&\n value.kind === 'operation' &&\n isOptionalString(value.id) &&\n isBindingOperationRef(value.operation) &&\n (value.input === undefined || isBindingInputMap(value.input))\n );\n}\n\n/*** Validate component identity and its property and event bindings. */\nfunction isComponentDataBinding(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.componentId === 'string' &&\n isOptionalString(value.componentType) &&\n (value.props === undefined ||\n (isRecord(value.props) && Object.values(value.props).every(isPropBinding))) &&\n (value.events === undefined ||\n (isRecord(value.events) &&\n Object.values(value.events).every(\n (bindings) => Array.isArray(bindings) && bindings.every(isEventBinding),\n )))\n );\n}\n\n/*** Validate a property binding with optional transforms and fallback behavior. */\nfunction isPropBinding(value: unknown): boolean {\n return (\n isRecord(value) &&\n isBindingValueSource(value.source) &&\n (value.fallback === undefined || isBindingFallback(value.fallback)) &&\n (value.loading === undefined || isBindingLifecycleBehavior(value.loading)) &&\n (value.error === undefined || isBindingLifecycleBehavior(value.error)) &&\n (value.empty === undefined || isBindingLifecycleBehavior(value.empty)) &&\n isOptionalBindingTransforms(value.transforms)\n );\n}\n\n/*** Validate an event binding and its declared target. */\nfunction isEventBinding(value: unknown): boolean {\n return (\n isRecord(value) &&\n isEventBindingTarget(value.target) &&\n (value.input === undefined || isBindingInputMap(value.input)) &&\n (value.when === undefined || isBindingCondition(value.when))\n );\n}\n\n/*** Validate the selected operation or action event target. */\nfunction isEventBindingTarget(value: unknown): boolean {\n return (\n isRecord(value) &&\n ((value.kind === 'action' && typeof value.type === 'string') ||\n (value.kind === 'operation' && isBindingOperationRef(value.operation)))\n );\n}\n\n/*** Validate a binding condition and its source value. */\nfunction isBindingCondition(value: unknown): boolean {\n return (\n isRecord(value) &&\n isBindingValueSource(value.source) &&\n ['eq', 'exists', 'neq', 'notExists'].includes(String(value.operator)) &&\n (value.value === undefined || isManifestValue(value.value))\n );\n}\n\n/*** Validate API and operation identities with an optional endpoint reference. */\nfunction isBindingOperationRef(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.apiId === 'string' &&\n typeof value.operationId === 'string' &&\n isOptionalString(value.endpointId)\n );\n}\n\n/*** Validate authored binding fallback values. */\nfunction isBindingFallback(value: unknown): boolean {\n return (\n isRecord(value) &&\n (value.value === undefined || isManifestValue(value.value)) &&\n (value.source === undefined || isBindingValueSource(value.source))\n );\n}\n\n/*** Validate loading, empty and error binding behavior. */\nfunction isBindingLifecycleBehavior(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.state === 'string' &&\n ['empty', 'error', 'loading'].includes(value.state) &&\n (value.fallback === undefined || isBindingFallback(value.fallback)) &&\n isOptionalString(value.message)\n );\n}\n\n/*** Validate optional ordered binding transformations. */\nfunction isOptionalBindingTransforms(value: unknown): boolean {\n return (\n value === undefined ||\n (Array.isArray(value) &&\n value.every((transform) => ['lowercase', 'trim', 'uppercase'].includes(String(transform))))\n );\n}\n\n/*** Validate every value in an operation input mapping. */\nfunction isBindingInputMap(value: unknown): boolean {\n return isRecord(value) && Object.values(value).every(isBindingInputValue);\n}\n\n/*** Validate recursive array, object, literal and source operation inputs. */\nfunction isBindingInputValue(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.kind === 'string' &&\n ((value.kind === 'array' &&\n Array.isArray(value.items) &&\n value.items.every(isBindingInputValue)) ||\n (value.kind === 'literal' && isManifestValue(value.value)) ||\n (value.kind === 'object' && isBindingInputMap(value.fields)) ||\n (value.kind === 'source' &&\n isBindingValueSource(value.source) &&\n isOptionalBindingTransforms(value.transforms)))\n );\n}\n"]}
@@ -0,0 +1,18 @@
1
+ export declare const APP_MANIFEST_KEY_POLICY: {
2
+ readonly metadata: "required";
3
+ readonly themes: "required";
4
+ readonly activeThemeId: "required";
5
+ readonly activeThemeMode: "optional";
6
+ readonly splashScreen: "optional";
7
+ readonly media: "optional";
8
+ readonly deploy: "optional";
9
+ readonly state: "optional";
10
+ readonly infra: "required";
11
+ readonly navigator: "required";
12
+ readonly screens: "required";
13
+ readonly dataSources: "optional";
14
+ readonly dataBindings: "optional";
15
+ readonly repository: "optional";
16
+ readonly settings: "required";
17
+ };
18
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/appManifest/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;CAgBmC,CAAC"}
@@ -0,0 +1,18 @@
1
+ export const APP_MANIFEST_KEY_POLICY = {
2
+ metadata: 'required',
3
+ themes: 'required',
4
+ activeThemeId: 'required',
5
+ activeThemeMode: 'optional',
6
+ splashScreen: 'optional',
7
+ media: 'optional',
8
+ deploy: 'optional',
9
+ state: 'optional',
10
+ infra: 'required',
11
+ navigator: 'required',
12
+ screens: 'required',
13
+ dataSources: 'optional',
14
+ dataBindings: 'optional',
15
+ repository: 'optional',
16
+ settings: 'required',
17
+ };
18
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/appManifest/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,UAAU;IAClB,aAAa,EAAE,UAAU;IACzB,eAAe,EAAE,UAAU;IAC3B,YAAY,EAAE,UAAU;IACxB,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,UAAU;IACjB,SAAS,EAAE,UAAU;IACrB,OAAO,EAAE,UAAU;IACnB,WAAW,EAAE,UAAU;IACvB,YAAY,EAAE,UAAU;IACxB,UAAU,EAAE,UAAU;IACtB,QAAQ,EAAE,UAAU;CACiD,CAAC","sourcesContent":["import type { AppManifest } from '../types';\n\nexport const 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 state: '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"]}
@@ -1,5 +1,9 @@
1
+ /*** Validate every endpoint in the data endpoint registry. */
1
2
  export declare function isDataEndpointRegistry(value: unknown): boolean;
3
+ /*** Validate every schema in the data schema registry. */
2
4
  export declare function isDataSchemaRegistry(value: unknown): boolean;
5
+ /*** Validate credential identity and optional descriptive metadata. */
3
6
  export declare function isCredentialRef(value: unknown): boolean;
7
+ /*** Validate an adapter reference and its optional authored configuration. */
4
8
  export declare function isAdapterRef(value: unknown): boolean;
5
9
  //# sourceMappingURL=data.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/appManifest/data.ts"],"names":[],"mappings":"AAoBA,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE9D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE5D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQvD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASpD"}
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/appManifest/data.ts"],"names":[],"mappings":"AAkBA,8DAA8D;AAC9D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE9D;AAED,0DAA0D;AAC1D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE5D;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQvD;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASpD"}
@@ -1,4 +1,7 @@
1
- import { isManifestValue, isOptionalBoolean, isOptionalString, isRecord, isStringArray, } from './shared';
1
+ import { isStringArray } from '@ankhorage/utility/array';
2
+ import { isRecord } from '@ankhorage/utility/object';
3
+ import { isOptionalString } from '@ankhorage/utility/string';
4
+ import { isManifestValue } from './isManifestValue';
2
5
  const DATA_SCHEMA_TYPES = new Set([
3
6
  'array',
4
7
  'boolean',
@@ -10,12 +13,15 @@ const DATA_SCHEMA_TYPES = new Set([
10
13
  ]);
11
14
  const OPERATION_INTENTS = new Set(['action', 'create', 'delete', 'read', 'update']);
12
15
  const PARAMETER_LOCATIONS = new Set(['body', 'cookie', 'header', 'path', 'query']);
16
+ /*** Validate every endpoint in the data endpoint registry. */
13
17
  export function isDataEndpointRegistry(value) {
14
18
  return isRecord(value) && Object.values(value).every(isDataEndpointConfig);
15
19
  }
20
+ /*** Validate every schema in the data schema registry. */
16
21
  export function isDataSchemaRegistry(value) {
17
22
  return isRecord(value) && Object.values(value).every(isDataSchema);
18
23
  }
24
+ /*** Validate credential identity and optional descriptive metadata. */
19
25
  export function isCredentialRef(value) {
20
26
  return (isRecord(value) &&
21
27
  typeof value.id === 'string' &&
@@ -23,6 +29,7 @@ export function isCredentialRef(value) {
23
29
  isOptionalString(value.label) &&
24
30
  isOptionalString(value.scope));
25
31
  }
32
+ /*** Validate an adapter reference and its optional authored configuration. */
26
33
  export function isAdapterRef(value) {
27
34
  return (isRecord(value) &&
28
35
  typeof value.id === 'string' &&
@@ -31,6 +38,7 @@ export function isAdapterRef(value) {
31
38
  isOptionalString(value.exportName) &&
32
39
  (value.config === undefined || isManifestValue(value.config)));
33
40
  }
41
+ /*** Validate endpoint identity, operations and optional connection metadata. */
34
42
  function isDataEndpointConfig(value) {
35
43
  return (isRecord(value) &&
36
44
  typeof value.id === 'string' &&
@@ -44,6 +52,7 @@ function isDataEndpointConfig(value) {
44
52
  Object.values(value.operations).every(isDataOperationConfig) &&
45
53
  (value.metadata === undefined || isManifestValue(value.metadata)));
46
54
  }
55
+ /*** Validate operation protocol, intent, request and response configuration. */
47
56
  function isDataOperationConfig(value) {
48
57
  return (isRecord(value) &&
49
58
  typeof value.id === 'string' &&
@@ -61,6 +70,7 @@ function isDataOperationConfig(value) {
61
70
  (value.credential === undefined || isCredentialRef(value.credential)) &&
62
71
  (value.metadata === undefined || isManifestValue(value.metadata)));
63
72
  }
73
+ /*** Validate request schema, parameters and optional content type. */
64
74
  function isDataOperationRequest(value) {
65
75
  return (isRecord(value) &&
66
76
  isDataSchemaSlot(value) &&
@@ -68,16 +78,18 @@ function isDataOperationRequest(value) {
68
78
  (value.parameters === undefined ||
69
79
  (Array.isArray(value.parameters) && value.parameters.every(isDataOperationParameter))));
70
80
  }
81
+ /*** Validate parameter identity, location, schema and optional default value. */
71
82
  function isDataOperationParameter(value) {
72
83
  return (isRecord(value) &&
73
84
  isDataSchemaSlot(value) &&
74
85
  typeof value.name === 'string' &&
75
86
  typeof value.location === 'string' &&
76
87
  PARAMETER_LOCATIONS.has(value.location) &&
77
- isOptionalBoolean(value.required) &&
88
+ (value.required === undefined || typeof value.required === 'boolean') &&
78
89
  isOptionalString(value.description) &&
79
90
  (value.default === undefined || isManifestValue(value.default)));
80
91
  }
92
+ /*** Validate response status, schema and optional descriptive metadata. */
81
93
  function isDataOperationResponse(value) {
82
94
  return (isRecord(value) &&
83
95
  isDataSchemaSlot(value) &&
@@ -87,10 +99,12 @@ function isDataOperationResponse(value) {
87
99
  isOptionalString(value.contentType) &&
88
100
  isOptionalString(value.description));
89
101
  }
102
+ /*** Validate inline schema and schema-reference fields. */
90
103
  function isDataSchemaSlot(value) {
91
104
  return ((value.schema === undefined || isDataSchema(value.schema)) &&
92
105
  (value.schemaRef === undefined || isDataSchemaRef(value.schemaRef)));
93
106
  }
107
+ /*** Validate supported schema types, constraints and compositions. */
94
108
  function isDataSchema(value) {
95
109
  if (!isRecord(value) || !isDataSchemaType(value.type))
96
110
  return false;
@@ -100,6 +114,7 @@ function isDataSchema(value) {
100
114
  return false;
101
115
  return isOptionalSchemaComposition(value);
102
116
  }
117
+ /*** Validate a supported schema type or an array of supported types. */
103
118
  function isDataSchemaType(value) {
104
119
  if (value === undefined)
105
120
  return true;
@@ -108,17 +123,19 @@ function isDataSchemaType(value) {
108
123
  return (Array.isArray(value) &&
109
124
  value.every((entry) => typeof entry === 'string' && DATA_SCHEMA_TYPES.has(entry)));
110
125
  }
126
+ /*** Validate optional scalar schema constraints. */
111
127
  function isOptionalSchemaScalars(value) {
112
128
  return (isOptionalString(value.title) &&
113
129
  isOptionalString(value.description) &&
114
130
  isOptionalString(value.format) &&
115
- isOptionalBoolean(value.nullable) &&
131
+ (value.nullable === undefined || typeof value.nullable === 'boolean') &&
116
132
  (value.const === undefined || isManifestValue(value.const)) &&
117
133
  (value.default === undefined || isManifestValue(value.default)) &&
118
134
  (value.enum === undefined ||
119
135
  (Array.isArray(value.enum) && value.enum.every(isManifestValue))) &&
120
136
  (value.ref === undefined || isDataSchemaRef(value.ref)));
121
137
  }
138
+ /*** Validate optional schema properties, items and required fields. */
122
139
  function isOptionalSchemaCollections(value) {
123
140
  return ((value.required === undefined || isStringArray(value.required)) &&
124
141
  (value.properties === undefined ||
@@ -128,12 +145,14 @@ function isOptionalSchemaCollections(value) {
128
145
  isDataSchema(value.additionalProperties)) &&
129
146
  (value.items === undefined || isDataSchema(value.items)));
130
147
  }
148
+ /*** Validate optional schema alternatives and intersections. */
131
149
  function isOptionalSchemaComposition(value) {
132
150
  return ['allOf', 'anyOf', 'oneOf'].every((key) => {
133
151
  const entry = value[key];
134
152
  return entry === undefined || (Array.isArray(entry) && entry.every(isDataSchema));
135
153
  });
136
154
  }
155
+ /*** Validate a named schema reference. */
137
156
  function isDataSchemaRef(value) {
138
157
  return isRecord(value) && typeof value.id === 'string';
139
158
  }