@ankhorage/contracts 20.0.0 → 22.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 (105) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/appManifest/apis.d.ts +3 -3
  3. package/dist/appManifest/apis.d.ts.map +1 -1
  4. package/dist/appManifest/apis.js +4 -6
  5. package/dist/appManifest/apis.js.map +1 -1
  6. package/dist/appManifest/bindings.d.ts.map +1 -1
  7. package/dist/appManifest/bindings.js +2 -1
  8. package/dist/appManifest/bindings.js.map +1 -1
  9. package/dist/appManifest/data.d.ts.map +1 -1
  10. package/dist/appManifest/data.js +5 -4
  11. package/dist/appManifest/data.js.map +1 -1
  12. package/dist/appManifest/isAppManifest.js +3 -3
  13. package/dist/appManifest/isAppManifest.js.map +1 -1
  14. package/dist/appManifest/isManifestValue.d.ts +1 -1
  15. package/dist/appManifest/isManifestValue.d.ts.map +1 -1
  16. package/dist/appManifest/isManifestValue.js +3 -12
  17. package/dist/appManifest/isManifestValue.js.map +1 -1
  18. package/dist/appManifest/screens.d.ts +3 -2
  19. package/dist/appManifest/screens.d.ts.map +1 -1
  20. package/dist/appManifest/screens.js +15 -7
  21. package/dist/appManifest/screens.js.map +1 -1
  22. package/dist/bindings.d.ts +2 -3
  23. package/dist/bindings.d.ts.map +1 -1
  24. package/dist/bindings.js.map +1 -1
  25. package/dist/collections.d.ts +4 -0
  26. package/dist/collections.d.ts.map +1 -0
  27. package/dist/collections.js +6 -0
  28. package/dist/collections.js.map +1 -0
  29. package/dist/data/apis.d.ts +1 -1
  30. package/dist/data/apis.d.ts.map +1 -1
  31. package/dist/data/apis.js.map +1 -1
  32. package/dist/data/values.d.ts +2 -3
  33. package/dist/data/values.d.ts.map +1 -1
  34. package/dist/data/values.js.map +1 -1
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +2 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/infra/isInfraEnvironmentSpec.d.ts.map +1 -1
  40. package/dist/infra/isInfraEnvironmentSpec.js +10 -12
  41. package/dist/infra/isInfraEnvironmentSpec.js.map +1 -1
  42. package/dist/infra/isInfraManifest.d.ts.map +1 -1
  43. package/dist/infra/isInfraManifest.js +14 -5
  44. package/dist/infra/isInfraManifest.js.map +1 -1
  45. package/dist/infra/isInfraWorkloadSpec.d.ts.map +1 -1
  46. package/dist/infra/isInfraWorkloadSpec.js +26 -20
  47. package/dist/infra/isInfraWorkloadSpec.js.map +1 -1
  48. package/dist/requirements.d.ts +5 -10
  49. package/dist/requirements.d.ts.map +1 -1
  50. package/dist/requirements.js.map +1 -1
  51. package/dist/serializable.d.ts +6 -0
  52. package/dist/serializable.d.ts.map +1 -0
  53. package/dist/serializable.js +14 -0
  54. package/dist/serializable.js.map +1 -0
  55. package/dist/state.d.ts +2 -3
  56. package/dist/state.d.ts.map +1 -1
  57. package/dist/state.js.map +1 -1
  58. package/dist/types/infraAdapters.d.ts +12 -3
  59. package/dist/types/infraAdapters.d.ts.map +1 -1
  60. package/dist/types/infraAdapters.js.map +1 -1
  61. package/dist/types/infraManifest.d.ts +14 -13
  62. package/dist/types/infraManifest.d.ts.map +1 -1
  63. package/dist/types/infraManifest.js.map +1 -1
  64. package/dist/types/infraWorkload.d.ts +11 -11
  65. package/dist/types/infraWorkload.d.ts.map +1 -1
  66. package/dist/types/infraWorkload.js.map +1 -1
  67. package/dist/types.d.ts +9 -8
  68. package/dist/types.d.ts.map +1 -1
  69. package/dist/types.js.map +1 -1
  70. package/package.json +10 -9
  71. package/src/appManifest/apis.ts +9 -6
  72. package/src/appManifest/bindings.ts +7 -1
  73. package/src/appManifest/data.ts +13 -4
  74. package/src/appManifest/isAppManifest.ts +3 -3
  75. package/src/appManifest/isManifestValue.ts +3 -16
  76. package/src/appManifest/screens.ts +21 -10
  77. package/src/appManifest.test.ts +21 -16
  78. package/src/bindings.test.ts +11 -8
  79. package/src/bindings.ts +2 -9
  80. package/src/collections.ts +8 -0
  81. package/src/contracts.test.ts +16 -13
  82. package/src/data/apis.test.ts +6 -4
  83. package/src/data/apis.ts +1 -1
  84. package/src/data/values.ts +3 -9
  85. package/src/deploy.test.ts +4 -4
  86. package/src/index.ts +2 -0
  87. package/src/infra/isInfraEnvironmentSpec.ts +16 -16
  88. package/src/infra/isInfraManifest.ts +17 -6
  89. package/src/infra/isInfraWorkloadSpec.ts +39 -24
  90. package/src/infra-published-port.test.ts +8 -8
  91. package/src/infra-types.test.ts +27 -0
  92. package/src/infra-workload-persistence.test.ts +4 -4
  93. package/src/infra-workload.test.ts +24 -22
  94. package/src/infra.test.ts +16 -20
  95. package/src/infraPersistence.test.ts +1 -1
  96. package/src/infraServices.test.ts +1 -1
  97. package/src/requirements.test.ts +2 -2
  98. package/src/requirements.ts +6 -12
  99. package/src/secrets.test.ts +1 -1
  100. package/src/serializable.ts +25 -0
  101. package/src/state.ts +3 -6
  102. package/src/types/infraAdapters.ts +20 -5
  103. package/src/types/infraManifest.ts +17 -13
  104. package/src/types/infraWorkload.ts +12 -11
  105. package/src/types.ts +11 -12
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @ankhorage/contracts
2
2
 
3
+ ## 22.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 258f45f: Normalize AppManifest collection semantics: keyed registries for stable entities, serializable sets for unordered membership, one module registry, keyed workload collections, and one canonical serializable value shape.
8
+
9
+ ## 21.0.0
10
+
11
+ ### Major Changes
12
+
13
+ - 94a9eb0: Add a provider-neutral control-plane credential port with optional lookup and explicit persistence, and add an optional service preparation phase for mutating infrastructure lifecycle orchestration.
14
+
3
15
  ## 20.0.0
4
16
 
5
17
  ### Major Changes
@@ -1,4 +1,4 @@
1
- import type { ApiDefinitionList } from '../data';
2
- /*** Validate API definitions and require unique API identities. */
3
- export declare function isApiDefinitionList(value: unknown): value is ApiDefinitionList;
1
+ import type { ApiDefinitionRegistry } from '../data';
2
+ /*** Validate API definitions in the canonical registry and require key/identity consistency. */
3
+ export declare function isApiDefinitionRegistry(value: unknown): value is ApiDefinitionRegistry;
4
4
  //# sourceMappingURL=apis.d.ts.map
@@ -1 +1 @@
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
+ {"version":3,"file":"apis.d.ts","sourceRoot":"","sources":["../../src/appManifest/apis.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAqBpE,gGAAgG;AAChG,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAOtF"}
@@ -18,12 +18,10 @@ const EXTERNAL_GRAPHQL_KEYS = [...API_BASE_KEYS, 'endpointUrl', 'introspection']
18
18
  const INTERNAL_REST_KEYS = [...API_BASE_KEYS, 'basePath'];
19
19
  const OPEN_API_KEYS = ['url', 'documentId', 'version'];
20
20
  const INTROSPECTION_KEYS = ['enabled', 'schemaVersion'];
21
- /*** Validate API definitions and require unique API identities. */
22
- export function isApiDefinitionList(value) {
23
- if (!Array.isArray(value) || !value.every(isApiDefinition))
24
- return false;
25
- const ids = value.map((api) => api.id);
26
- return new Set(ids).size === ids.length;
21
+ /*** Validate API definitions in the canonical registry and require key/identity consistency. */
22
+ export function isApiDefinitionRegistry(value) {
23
+ return (isRecord(value) &&
24
+ Object.entries(value).every(([registryKey, api]) => isApiDefinition(api) && registryKey === api.id));
27
25
  }
28
26
  /*** Validate one API definition against its origin and protocol branch. */
29
27
  function isApiDefinition(value) {
@@ -1 +1 @@
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
+ {"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, ApiDefinitionRegistry } 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 in the canonical registry and require key/identity consistency. */\nexport function isApiDefinitionRegistry(value: unknown): value is ApiDefinitionRegistry {\n return (\n isRecord(value) &&\n Object.entries(value).every(\n ([registryKey, api]) => isApiDefinition(api) && registryKey === api.id,\n )\n );\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 +1 @@
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
+ {"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,CAQtE;AAED,mEAAmE;AACnE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAW5D;AAED,0EAA0E;AAC1E,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQpE"}
@@ -3,7 +3,8 @@ import { isOptionalString } from '@ankhorage/utility/string';
3
3
  import { isManifestValue } from './isManifestValue';
4
4
  /*** Validate every component binding in the authored registry. */
5
5
  export function isComponentDataBindingRegistry(value) {
6
- return isRecord(value) && Object.values(value).every(isComponentDataBinding);
6
+ return (isRecord(value) &&
7
+ Object.entries(value).every(([componentId, binding]) => isComponentDataBinding(binding) && isRecord(binding) && binding.componentId === componentId));
7
8
  }
8
9
  /*** Validate literal, operation and path-based binding sources. */
9
10
  export function isBindingValueSource(value) {
@@ -1 +1 @@
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"]}
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 (\n isRecord(value) &&\n Object.entries(value).every(\n ([componentId, binding]) =>\n isComponentDataBinding(binding) && isRecord(binding) && binding.componentId === componentId,\n )\n );\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"]}
@@ -1 +1 @@
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
+ {"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,CAQ9D;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,5 +1,5 @@
1
1
  import { isStringArray } from '@ankhorage/utility/array';
2
- import { isRecord } from '@ankhorage/utility/object';
2
+ import { isRecord, readOwnProperty } from '@ankhorage/utility/object';
3
3
  import { isOptionalString } from '@ankhorage/utility/string';
4
4
  import { isManifestValue } from './isManifestValue';
5
5
  const DATA_SCHEMA_TYPES = new Set([
@@ -15,7 +15,8 @@ const OPERATION_INTENTS = new Set(['action', 'create', 'delete', 'read', 'update
15
15
  const PARAMETER_LOCATIONS = new Set(['body', 'cookie', 'header', 'path', 'query']);
16
16
  /*** Validate every endpoint in the data endpoint registry. */
17
17
  export function isDataEndpointRegistry(value) {
18
- return isRecord(value) && Object.values(value).every(isDataEndpointConfig);
18
+ return (isRecord(value) &&
19
+ Object.entries(value).every(([endpointId, endpoint]) => isDataEndpointConfig(endpoint) && isRecord(endpoint) && endpoint.id === endpointId));
19
20
  }
20
21
  /*** Validate every schema in the data schema registry. */
21
22
  export function isDataSchemaRegistry(value) {
@@ -49,7 +50,7 @@ function isDataEndpointConfig(value) {
49
50
  isOptionalString(value.path) &&
50
51
  (value.credential === undefined || isCredentialRef(value.credential)) &&
51
52
  isRecord(value.operations) &&
52
- Object.values(value.operations).every(isDataOperationConfig) &&
53
+ Object.entries(value.operations).every(([operationId, operation]) => isDataOperationConfig(operation) && isRecord(operation) && operation.id === operationId) &&
53
54
  (value.metadata === undefined || isManifestValue(value.metadata)));
54
55
  }
55
56
  /*** Validate operation protocol, intent, request and response configuration. */
@@ -148,7 +149,7 @@ function isOptionalSchemaCollections(value) {
148
149
  /*** Validate optional schema alternatives and intersections. */
149
150
  function isOptionalSchemaComposition(value) {
150
151
  return ['allOf', 'anyOf', 'oneOf'].every((key) => {
151
- const entry = value[key];
152
+ const entry = readOwnProperty(value, key);
152
153
  return entry === undefined || (Array.isArray(entry) && entry.every(isDataSchema));
153
154
  });
154
155
  }
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/appManifest/data.ts"],"names":[],"mappings":"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","sourcesContent":["import { isStringArray } from '@ankhorage/utility/array';\nimport { isRecord } from '@ankhorage/utility/object';\nimport { isOptionalString } from '@ankhorage/utility/string';\n\nimport { isManifestValue } from './isManifestValue';\n\nconst DATA_SCHEMA_TYPES = new Set([\n 'array',\n 'boolean',\n 'integer',\n 'null',\n 'number',\n 'object',\n 'string',\n]);\nconst OPERATION_INTENTS = new Set(['action', 'create', 'delete', 'read', 'update']);\nconst PARAMETER_LOCATIONS = new Set(['body', 'cookie', 'header', 'path', 'query']);\n\n/*** Validate every endpoint in the data endpoint registry. */\nexport function isDataEndpointRegistry(value: unknown): boolean {\n return isRecord(value) && Object.values(value).every(isDataEndpointConfig);\n}\n\n/*** Validate every schema in the data schema registry. */\nexport function isDataSchemaRegistry(value: unknown): boolean {\n return isRecord(value) && Object.values(value).every(isDataSchema);\n}\n\n/*** Validate credential identity and optional descriptive metadata. */\nexport function isCredentialRef(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.kind === 'string' &&\n isOptionalString(value.label) &&\n isOptionalString(value.scope)\n );\n}\n\n/*** Validate an adapter reference and its optional authored configuration. */\nexport function isAdapterRef(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.kind === 'string' &&\n isOptionalString(value.packageName) &&\n isOptionalString(value.exportName) &&\n (value.config === undefined || isManifestValue(value.config))\n );\n}\n\n/*** Validate endpoint identity, operations and optional connection metadata. */\nfunction isDataEndpointConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.kind === 'string' &&\n isOptionalString(value.name) &&\n isOptionalString(value.description) &&\n isOptionalString(value.baseUrl) &&\n isOptionalString(value.path) &&\n (value.credential === undefined || isCredentialRef(value.credential)) &&\n isRecord(value.operations) &&\n Object.values(value.operations).every(isDataOperationConfig) &&\n (value.metadata === undefined || isManifestValue(value.metadata))\n );\n}\n\n/*** Validate operation protocol, intent, request and response configuration. */\nfunction isDataOperationConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n isOptionalString(value.endpointId) &&\n isOptionalString(value.name) &&\n isOptionalString(value.description) &&\n typeof value.protocol === 'string' &&\n typeof value.intent === 'string' &&\n OPERATION_INTENTS.has(value.intent) &&\n isOptionalString(value.method) &&\n isOptionalString(value.path) &&\n (value.request === undefined || isDataOperationRequest(value.request)) &&\n (value.response === undefined || isDataOperationResponse(value.response)) &&\n (value.pagination === undefined || isRecord(value.pagination)) &&\n (value.credential === undefined || isCredentialRef(value.credential)) &&\n (value.metadata === undefined || isManifestValue(value.metadata))\n );\n}\n\n/*** Validate request schema, parameters and optional content type. */\nfunction isDataOperationRequest(value: unknown): boolean {\n return (\n isRecord(value) &&\n isDataSchemaSlot(value) &&\n isOptionalString(value.contentType) &&\n (value.parameters === undefined ||\n (Array.isArray(value.parameters) && value.parameters.every(isDataOperationParameter)))\n );\n}\n\n/*** Validate parameter identity, location, schema and optional default value. */\nfunction isDataOperationParameter(value: unknown): boolean {\n return (\n isRecord(value) &&\n isDataSchemaSlot(value) &&\n typeof value.name === 'string' &&\n typeof value.location === 'string' &&\n PARAMETER_LOCATIONS.has(value.location) &&\n (value.required === undefined || typeof value.required === 'boolean') &&\n isOptionalString(value.description) &&\n (value.default === undefined || isManifestValue(value.default))\n );\n}\n\n/*** Validate response status, schema and optional descriptive metadata. */\nfunction isDataOperationResponse(value: unknown): boolean {\n return (\n isRecord(value) &&\n isDataSchemaSlot(value) &&\n (value.status === undefined ||\n typeof value.status === 'string' ||\n typeof value.status === 'number') &&\n isOptionalString(value.contentType) &&\n isOptionalString(value.description)\n );\n}\n\n/*** Validate inline schema and schema-reference fields. */\nfunction isDataSchemaSlot(value: Record<string, unknown>): boolean {\n return (\n (value.schema === undefined || isDataSchema(value.schema)) &&\n (value.schemaRef === undefined || isDataSchemaRef(value.schemaRef))\n );\n}\n\n/*** Validate supported schema types, constraints and compositions. */\nfunction isDataSchema(value: unknown): boolean {\n if (!isRecord(value) || !isDataSchemaType(value.type)) return false;\n if (!isOptionalSchemaScalars(value)) return false;\n if (!isOptionalSchemaCollections(value)) return false;\n return isOptionalSchemaComposition(value);\n}\n\n/*** Validate a supported schema type or an array of supported types. */\nfunction isDataSchemaType(value: unknown): boolean {\n if (value === undefined) return true;\n if (typeof value === 'string') return DATA_SCHEMA_TYPES.has(value);\n return (\n Array.isArray(value) &&\n value.every((entry) => typeof entry === 'string' && DATA_SCHEMA_TYPES.has(entry))\n );\n}\n\n/*** Validate optional scalar schema constraints. */\nfunction isOptionalSchemaScalars(value: Record<string, unknown>): boolean {\n return (\n isOptionalString(value.title) &&\n isOptionalString(value.description) &&\n isOptionalString(value.format) &&\n (value.nullable === undefined || typeof value.nullable === 'boolean') &&\n (value.const === undefined || isManifestValue(value.const)) &&\n (value.default === undefined || isManifestValue(value.default)) &&\n (value.enum === undefined ||\n (Array.isArray(value.enum) && value.enum.every(isManifestValue))) &&\n (value.ref === undefined || isDataSchemaRef(value.ref))\n );\n}\n\n/*** Validate optional schema properties, items and required fields. */\nfunction isOptionalSchemaCollections(value: Record<string, unknown>): boolean {\n return (\n (value.required === undefined || isStringArray(value.required)) &&\n (value.properties === undefined ||\n (isRecord(value.properties) && Object.values(value.properties).every(isDataSchema))) &&\n (value.additionalProperties === undefined ||\n typeof value.additionalProperties === 'boolean' ||\n isDataSchema(value.additionalProperties)) &&\n (value.items === undefined || isDataSchema(value.items))\n );\n}\n\n/*** Validate optional schema alternatives and intersections. */\nfunction isOptionalSchemaComposition(value: Record<string, unknown>): boolean {\n return ['allOf', 'anyOf', 'oneOf'].every((key) => {\n const entry = value[key];\n return entry === undefined || (Array.isArray(entry) && entry.every(isDataSchema));\n });\n}\n\n/*** Validate a named schema reference. */\nfunction isDataSchemaRef(value: unknown): boolean {\n return isRecord(value) && typeof value.id === 'string';\n}\n"]}
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/appManifest/data.ts"],"names":[],"mappings":"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","sourcesContent":["import { isStringArray } from '@ankhorage/utility/array';\nimport { isRecord, readOwnProperty } from '@ankhorage/utility/object';\nimport { isOptionalString } from '@ankhorage/utility/string';\n\nimport { isManifestValue } from './isManifestValue';\n\nconst DATA_SCHEMA_TYPES = new Set([\n 'array',\n 'boolean',\n 'integer',\n 'null',\n 'number',\n 'object',\n 'string',\n]);\nconst OPERATION_INTENTS = new Set(['action', 'create', 'delete', 'read', 'update']);\nconst PARAMETER_LOCATIONS = new Set(['body', 'cookie', 'header', 'path', 'query']);\n\n/*** Validate every endpoint in the data endpoint registry. */\nexport function isDataEndpointRegistry(value: unknown): boolean {\n return (\n isRecord(value) &&\n Object.entries(value).every(\n ([endpointId, endpoint]) =>\n isDataEndpointConfig(endpoint) && isRecord(endpoint) && endpoint.id === endpointId,\n )\n );\n}\n\n/*** Validate every schema in the data schema registry. */\nexport function isDataSchemaRegistry(value: unknown): boolean {\n return isRecord(value) && Object.values(value).every(isDataSchema);\n}\n\n/*** Validate credential identity and optional descriptive metadata. */\nexport function isCredentialRef(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.kind === 'string' &&\n isOptionalString(value.label) &&\n isOptionalString(value.scope)\n );\n}\n\n/*** Validate an adapter reference and its optional authored configuration. */\nexport function isAdapterRef(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.kind === 'string' &&\n isOptionalString(value.packageName) &&\n isOptionalString(value.exportName) &&\n (value.config === undefined || isManifestValue(value.config))\n );\n}\n\n/*** Validate endpoint identity, operations and optional connection metadata. */\nfunction isDataEndpointConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.kind === 'string' &&\n isOptionalString(value.name) &&\n isOptionalString(value.description) &&\n isOptionalString(value.baseUrl) &&\n isOptionalString(value.path) &&\n (value.credential === undefined || isCredentialRef(value.credential)) &&\n isRecord(value.operations) &&\n Object.entries(value.operations).every(\n ([operationId, operation]) =>\n isDataOperationConfig(operation) && isRecord(operation) && operation.id === operationId,\n ) &&\n (value.metadata === undefined || isManifestValue(value.metadata))\n );\n}\n\n/*** Validate operation protocol, intent, request and response configuration. */\nfunction isDataOperationConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n isOptionalString(value.endpointId) &&\n isOptionalString(value.name) &&\n isOptionalString(value.description) &&\n typeof value.protocol === 'string' &&\n typeof value.intent === 'string' &&\n OPERATION_INTENTS.has(value.intent) &&\n isOptionalString(value.method) &&\n isOptionalString(value.path) &&\n (value.request === undefined || isDataOperationRequest(value.request)) &&\n (value.response === undefined || isDataOperationResponse(value.response)) &&\n (value.pagination === undefined || isRecord(value.pagination)) &&\n (value.credential === undefined || isCredentialRef(value.credential)) &&\n (value.metadata === undefined || isManifestValue(value.metadata))\n );\n}\n\n/*** Validate request schema, parameters and optional content type. */\nfunction isDataOperationRequest(value: unknown): boolean {\n return (\n isRecord(value) &&\n isDataSchemaSlot(value) &&\n isOptionalString(value.contentType) &&\n (value.parameters === undefined ||\n (Array.isArray(value.parameters) && value.parameters.every(isDataOperationParameter)))\n );\n}\n\n/*** Validate parameter identity, location, schema and optional default value. */\nfunction isDataOperationParameter(value: unknown): boolean {\n return (\n isRecord(value) &&\n isDataSchemaSlot(value) &&\n typeof value.name === 'string' &&\n typeof value.location === 'string' &&\n PARAMETER_LOCATIONS.has(value.location) &&\n (value.required === undefined || typeof value.required === 'boolean') &&\n isOptionalString(value.description) &&\n (value.default === undefined || isManifestValue(value.default))\n );\n}\n\n/*** Validate response status, schema and optional descriptive metadata. */\nfunction isDataOperationResponse(value: unknown): boolean {\n return (\n isRecord(value) &&\n isDataSchemaSlot(value) &&\n (value.status === undefined ||\n typeof value.status === 'string' ||\n typeof value.status === 'number') &&\n isOptionalString(value.contentType) &&\n isOptionalString(value.description)\n );\n}\n\n/*** Validate inline schema and schema-reference fields. */\nfunction isDataSchemaSlot(value: Record<string, unknown>): boolean {\n return (\n (value.schema === undefined || isDataSchema(value.schema)) &&\n (value.schemaRef === undefined || isDataSchemaRef(value.schemaRef))\n );\n}\n\n/*** Validate supported schema types, constraints and compositions. */\nfunction isDataSchema(value: unknown): boolean {\n if (!isRecord(value) || !isDataSchemaType(value.type)) return false;\n if (!isOptionalSchemaScalars(value)) return false;\n if (!isOptionalSchemaCollections(value)) return false;\n return isOptionalSchemaComposition(value);\n}\n\n/*** Validate a supported schema type or an array of supported types. */\nfunction isDataSchemaType(value: unknown): boolean {\n if (value === undefined) return true;\n if (typeof value === 'string') return DATA_SCHEMA_TYPES.has(value);\n return (\n Array.isArray(value) &&\n value.every((entry) => typeof entry === 'string' && DATA_SCHEMA_TYPES.has(entry))\n );\n}\n\n/*** Validate optional scalar schema constraints. */\nfunction isOptionalSchemaScalars(value: Record<string, unknown>): boolean {\n return (\n isOptionalString(value.title) &&\n isOptionalString(value.description) &&\n isOptionalString(value.format) &&\n (value.nullable === undefined || typeof value.nullable === 'boolean') &&\n (value.const === undefined || isManifestValue(value.const)) &&\n (value.default === undefined || isManifestValue(value.default)) &&\n (value.enum === undefined ||\n (Array.isArray(value.enum) && value.enum.every(isManifestValue))) &&\n (value.ref === undefined || isDataSchemaRef(value.ref))\n );\n}\n\n/*** Validate optional schema properties, items and required fields. */\nfunction isOptionalSchemaCollections(value: Record<string, unknown>): boolean {\n return (\n (value.required === undefined || isStringArray(value.required)) &&\n (value.properties === undefined ||\n (isRecord(value.properties) && Object.values(value.properties).every(isDataSchema))) &&\n (value.additionalProperties === undefined ||\n typeof value.additionalProperties === 'boolean' ||\n isDataSchema(value.additionalProperties)) &&\n (value.items === undefined || isDataSchema(value.items))\n );\n}\n\n/*** Validate optional schema alternatives and intersections. */\nfunction isOptionalSchemaComposition(value: Record<string, unknown>): boolean {\n return ['allOf', 'anyOf', 'oneOf'].every((key) => {\n const entry = readOwnProperty(value, key);\n return entry === undefined || (Array.isArray(entry) && entry.every(isDataSchema));\n });\n}\n\n/*** Validate a named schema reference. */\nfunction isDataSchemaRef(value: unknown): boolean {\n return isRecord(value) && typeof value.id === 'string';\n}\n"]}
@@ -7,7 +7,7 @@ import { isDataSourceRegistry } from './dataSources';
7
7
  import { isAppDeployManifest } from './deploy';
8
8
  import { isAppStateSpec } from './isAppStateSpec';
9
9
  import { isMediaManifest } from './media';
10
- import { isAppNavigatorManifest, isManifestMetadata, isScreenRegistry, isSplashScreenSpec, isThemeConfig, } from './screens';
10
+ import { isAppNavigatorManifest, isManifestMetadata, isScreenRegistry, isSplashScreenSpec, isThemeRegistry, } from './screens';
11
11
  /*** Return whether an unknown value satisfies the canonical AppManifest shape. */
12
12
  export function isAppManifest(value) {
13
13
  return (isRecord(value) &&
@@ -51,9 +51,9 @@ function isAppSettings(value) {
51
51
  }
52
52
  /*** Validate authored appearance as one cohesive manifest concern. */
53
53
  function isPresentation(value) {
54
- return (Array.isArray(value.themes) &&
55
- value.themes.every(isThemeConfig) &&
54
+ return (isThemeRegistry(value.themes) &&
56
55
  typeof value.activeThemeId === 'string' &&
56
+ Object.hasOwn(value.themes, value.activeThemeId) &&
57
57
  isActiveThemeMode(value.activeThemeMode) &&
58
58
  (value.splashScreen === undefined || isSplashScreenSpec(value.splashScreen)) &&
59
59
  (value.media === undefined || isMediaManifest(value.media)));
@@ -1 +1 @@
1
- {"version":3,"file":"isAppManifest.js","sourceRoot":"","sources":["../../src/appManifest/isAppManifest.ts"],"names":[],"mappings":"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","sourcesContent":["import { isStringArray } from '@ankhorage/utility/array';\nimport { isRecord } from '@ankhorage/utility/object';\n\nimport { isInfraManifest } from '../infra/isInfraManifest';\nimport type { AppManifest } from '../types';\nimport { isComponentDataBindingRegistry } from './bindings';\nimport { APP_MANIFEST_KEY_POLICY } from './constants';\nimport { isDataSourceRegistry } from './dataSources';\nimport { isAppDeployManifest } from './deploy';\nimport { isAppStateSpec } from './isAppStateSpec';\nimport { isMediaManifest } from './media';\nimport {\n isAppNavigatorManifest,\n isManifestMetadata,\n isScreenRegistry,\n isSplashScreenSpec,\n isThemeConfig,\n} from './screens';\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 isPresentation(value) &&\n isOptionalCapabilities(value) &&\n isInfraManifest(value.infra) &&\n isAppNavigatorManifest(value.navigator) &&\n isScreenRegistry(value.screens) &&\n isAppSettings(value.settings)\n );\n}\n\n/*** Validate the canonical application manifest field policy. */\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\n/*** Validate the canonical application manifest field policy. */\nfunction isActiveThemeMode(value: unknown): boolean {\n return value === undefined || value === 'dark' || value === 'light';\n}\n\n/*** Validate the canonical application manifest field policy. */\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\n/*** Validate the canonical application manifest field policy. */\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\n/*** Validate authored appearance as one cohesive manifest concern. */\nfunction isPresentation(value: Record<string, unknown>): boolean {\n return (\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 );\n}\n\n/*** Validate independently optional application capability selections. */\nfunction isOptionalCapabilities(value: Record<string, unknown>): boolean {\n return (\n (value.deploy === undefined || isAppDeployManifest(value.deploy)) &&\n (value.state === undefined || isAppStateSpec(value.state)) &&\n (value.dataSources === undefined || isDataSourceRegistry(value.dataSources)) &&\n (value.dataBindings === undefined || isComponentDataBindingRegistry(value.dataBindings)) &&\n (value.repository === undefined || isRepositoryManifest(value.repository))\n );\n}\n"]}
1
+ {"version":3,"file":"isAppManifest.js","sourceRoot":"","sources":["../../src/appManifest/isAppManifest.ts"],"names":[],"mappings":"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","sourcesContent":["import { isStringArray } from '@ankhorage/utility/array';\nimport { isRecord } from '@ankhorage/utility/object';\n\nimport { isInfraManifest } from '../infra/isInfraManifest';\nimport type { AppManifest } from '../types';\nimport { isComponentDataBindingRegistry } from './bindings';\nimport { APP_MANIFEST_KEY_POLICY } from './constants';\nimport { isDataSourceRegistry } from './dataSources';\nimport { isAppDeployManifest } from './deploy';\nimport { isAppStateSpec } from './isAppStateSpec';\nimport { isMediaManifest } from './media';\nimport {\n isAppNavigatorManifest,\n isManifestMetadata,\n isScreenRegistry,\n isSplashScreenSpec,\n isThemeRegistry,\n} from './screens';\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 isPresentation(value) &&\n isOptionalCapabilities(value) &&\n isInfraManifest(value.infra) &&\n isAppNavigatorManifest(value.navigator) &&\n isScreenRegistry(value.screens) &&\n isAppSettings(value.settings)\n );\n}\n\n/*** Validate the canonical application manifest field policy. */\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\n/*** Validate the canonical application manifest field policy. */\nfunction isActiveThemeMode(value: unknown): boolean {\n return value === undefined || value === 'dark' || value === 'light';\n}\n\n/*** Validate the canonical application manifest field policy. */\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\n/*** Validate the canonical application manifest field policy. */\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\n/*** Validate authored appearance as one cohesive manifest concern. */\nfunction isPresentation(value: Record<string, unknown>): boolean {\n return (\n isThemeRegistry(value.themes) &&\n typeof value.activeThemeId === 'string' &&\n Object.hasOwn(value.themes, value.activeThemeId) &&\n isActiveThemeMode(value.activeThemeMode) &&\n (value.splashScreen === undefined || isSplashScreenSpec(value.splashScreen)) &&\n (value.media === undefined || isMediaManifest(value.media))\n );\n}\n\n/*** Validate independently optional application capability selections. */\nfunction isOptionalCapabilities(value: Record<string, unknown>): boolean {\n return (\n (value.deploy === undefined || isAppDeployManifest(value.deploy)) &&\n (value.state === undefined || isAppStateSpec(value.state)) &&\n (value.dataSources === undefined || isDataSourceRegistry(value.dataSources)) &&\n (value.dataBindings === undefined || isComponentDataBindingRegistry(value.dataBindings)) &&\n (value.repository === undefined || isRepositoryManifest(value.repository))\n );\n}\n"]}
@@ -1,3 +1,3 @@
1
- /*** Validate the existing recursive ManifestValue domain used by authored bindings and API metadata. */
1
+ /*** Validate authored values through the canonical serializable-value contract. */
2
2
  export declare function isManifestValue(value: unknown): boolean;
3
3
  //# sourceMappingURL=isManifestValue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isManifestValue.d.ts","sourceRoot":"","sources":["../../src/appManifest/isManifestValue.ts"],"names":[],"mappings":"AAEA,wGAAwG;AACxG,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAevD"}
1
+ {"version":3,"file":"isManifestValue.d.ts","sourceRoot":"","sources":["../../src/appManifest/isManifestValue.ts"],"names":[],"mappings":"AAEA,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEvD"}
@@ -1,15 +1,6 @@
1
- import { isRecord } from '@ankhorage/utility/object';
2
- /*** Validate the existing recursive ManifestValue domain used by authored bindings and API metadata. */
1
+ import { isSerializableValue } from '../serializable';
2
+ /*** Validate authored values through the canonical serializable-value contract. */
3
3
  export function isManifestValue(value) {
4
- if (value === null ||
5
- typeof value === 'string' ||
6
- typeof value === 'number' ||
7
- typeof value === 'boolean') {
8
- return true;
9
- }
10
- if (Array.isArray(value)) {
11
- return value.every(isManifestValue);
12
- }
13
- return isRecord(value) && Object.values(value).every(isManifestValue);
4
+ return isSerializableValue(value);
14
5
  }
15
6
  //# sourceMappingURL=isManifestValue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"isManifestValue.js","sourceRoot":"","sources":["../../src/appManifest/isManifestValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,wGAAwG;AACxG,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,SAAS,EAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AACxE,CAAC","sourcesContent":["import { isRecord } from '@ankhorage/utility/object';\n\n/*** Validate the existing recursive ManifestValue domain used by authored bindings and API metadata. */\nexport function isManifestValue(value: unknown): boolean {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.every(isManifestValue);\n }\n\n return isRecord(value) && Object.values(value).every(isManifestValue);\n}\n"]}
1
+ {"version":3,"file":"isManifestValue.js","sourceRoot":"","sources":["../../src/appManifest/isManifestValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,mFAAmF;AACnF,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC","sourcesContent":["import { isSerializableValue } from '../serializable';\n\n/*** Validate authored values through the canonical serializable-value contract. */\nexport function isManifestValue(value: unknown): boolean {\n return isSerializableValue(value);\n}\n"]}
@@ -1,8 +1,9 @@
1
+ import { type ThemeRegistry } from '../types';
1
2
  export { isAppNavigatorManifest } from './navigator';
2
3
  /*** Validate application identity and optional authored metadata. */
3
4
  export declare function isManifestMetadata(value: unknown): boolean;
4
- /*** Validate theme identity and its required light and dark modes. */
5
- export declare function isThemeConfig(value: unknown): boolean;
5
+ /*** Validate themes in the authored theme registry and require registry keys to match theme identity. */
6
+ export declare function isThemeRegistry(value: unknown): value is ThemeRegistry;
6
7
  /*** Validate screens in the authored screen registry. */
7
8
  export declare function isScreenRegistry(value: unknown): boolean;
8
9
  /*** Validate optional light and dark splash-screen configuration. */
@@ -1 +1 @@
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
+ {"version":3,"file":"screens.d.ts","sourceRoot":"","sources":["../../src/appManifest/screens.ts"],"names":[],"mappings":"AAOA,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAQrD,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAY1D;AAaD,yGAAyG;AACzG,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAOtE;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,13 +1,17 @@
1
1
  import { COLOR_HARMONIES } from '@ankhorage/color-theory';
2
2
  import { isRecord } from '@ankhorage/utility/object';
3
3
  import { isOptionalString } from '@ankhorage/utility/string';
4
+ import { isSerializableSet } from '../collections';
4
5
  import { isMediaAssetReference } from '../media';
6
+ import { ANKHORAGE_CAPABILITY_NAMES, ANKHORAGE_PERMISSION_NAMES } from '../requirements';
5
7
  import { APP_CATEGORIES } from '../types';
6
8
  import { isBindingValueSource, isScreenDataLoaderDefinition } from './bindings';
7
9
  export { isAppNavigatorManifest } from './navigator';
8
10
  const APP_CATEGORY_SET = new Set(APP_CATEGORIES);
9
11
  const COLOR_HARMONY_SET = new Set(COLOR_HARMONIES);
10
12
  const SPLASH_SCREEN_RESIZE_MODE_SET = new Set(['contain', 'cover', 'native']);
13
+ const PERMISSION_NAME_SET = new Set(ANKHORAGE_PERMISSION_NAMES);
14
+ const CAPABILITY_NAME_SET = new Set(ANKHORAGE_CAPABILITY_NAMES);
11
15
  /*** Validate application identity and optional authored metadata. */
12
16
  export function isManifestMetadata(value) {
13
17
  return (isRecord(value) &&
@@ -21,13 +25,18 @@ export function isManifestMetadata(value) {
21
25
  isOptionalString(value.updated));
22
26
  }
23
27
  /*** Validate theme identity and its required light and dark modes. */
24
- export function isThemeConfig(value) {
28
+ function isThemeConfig(value) {
25
29
  return (isRecord(value) &&
26
30
  typeof value.id === 'string' &&
27
31
  typeof value.name === 'string' &&
28
32
  isThemeModeConfig(value.light) &&
29
33
  isThemeModeConfig(value.dark));
30
34
  }
35
+ /*** Validate themes in the authored theme registry and require registry keys to match theme identity. */
36
+ export function isThemeRegistry(value) {
37
+ return (isRecord(value) &&
38
+ Object.entries(value).every(([registryKey, theme]) => isThemeConfig(theme) && isRecord(theme) && registryKey === theme.id));
39
+ }
31
40
  /*** Validate screens in the authored screen registry. */
32
41
  export function isScreenRegistry(value) {
33
42
  return (isRecord(value) &&
@@ -92,12 +101,11 @@ function isSplashScreenModeSpec(value) {
92
101
  /*** Validate screen capability and permission requirements. */
93
102
  function isScreenRequirements(value) {
94
103
  return (isRecord(value) &&
95
- (value.permissions === undefined || isRequirementArray(value.permissions, 'permission')) &&
96
- (value.capabilities === undefined || isRequirementArray(value.capabilities, 'capability')));
104
+ (value.permissions === undefined || isRequirementSet(value.permissions, PERMISSION_NAME_SET)) &&
105
+ (value.capabilities === undefined || isRequirementSet(value.capabilities, CAPABILITY_NAME_SET)));
97
106
  }
98
- /*** Validate the entries of a capability or permission requirement list. */
99
- function isRequirementArray(value, key) {
100
- return (Array.isArray(value) &&
101
- value.every((entry) => isRecord(entry) && typeof entry[key] === 'string'));
107
+ /*** Validate unordered requirement membership against the supported capability or permission names. */
108
+ function isRequirementSet(value, allowedNames) {
109
+ return isSerializableSet(value) && Object.keys(value).every((name) => allowedNames.has(name));
102
110
  }
103
111
  //# sourceMappingURL=screens.js.map
@@ -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';\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"]}
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 { isSerializableSet } from '../collections';\nimport { isMediaAssetReference } from '../media';\nimport { ANKHORAGE_CAPABILITY_NAMES, ANKHORAGE_PERMISSION_NAMES } from '../requirements';\nimport { APP_CATEGORIES, type ThemeRegistry } 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']);\nconst PERMISSION_NAME_SET = new Set<string>(ANKHORAGE_PERMISSION_NAMES);\nconst CAPABILITY_NAME_SET = new Set<string>(ANKHORAGE_CAPABILITY_NAMES);\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. */\nfunction 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 themes in the authored theme registry and require registry keys to match theme identity. */\nexport function isThemeRegistry(value: unknown): value is ThemeRegistry {\n return (\n isRecord(value) &&\n Object.entries(value).every(\n ([registryKey, theme]) => isThemeConfig(theme) && isRecord(theme) && registryKey === theme.id,\n )\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 || isRequirementSet(value.permissions, PERMISSION_NAME_SET)) &&\n (value.capabilities === undefined || isRequirementSet(value.capabilities, CAPABILITY_NAME_SET))\n );\n}\n\n/*** Validate unordered requirement membership against the supported capability or permission names. */\nfunction isRequirementSet(value: unknown, allowedNames: ReadonlySet<string>): boolean {\n return isSerializableSet(value) && Object.keys(value).every((name) => allowedNames.has(name));\n}\n"]}
@@ -1,9 +1,8 @@
1
1
  import type { ApiId, EndpointId, OperationId } from './data';
2
+ import type { SerializableValue } from './serializable';
2
3
  export type ComponentInstanceId = string;
3
4
  export type ComponentTypeId = string;
4
- export type BindingValue = string | number | boolean | null | readonly BindingValue[] | {
5
- readonly [key: string]: BindingValue;
6
- };
5
+ export type BindingValue = SerializableValue;
7
6
  export type BindingDataPath = string;
8
7
  export type BindingValueTransform = 'lowercase' | 'trim' | 'uppercase';
9
8
  export interface BindingOperationRef {
@@ -1 +1 @@
1
- {"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../src/bindings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../src/bindings.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bindings.js","sourceRoot":"","sources":["../src/bindings.ts"],"names":[],"mappings":"","sourcesContent":["import type { ApiId, EndpointId, OperationId } from './data';\n\nexport type ComponentInstanceId = string;\nexport type ComponentTypeId = string;\n\nexport type BindingValue =\n | string\n | number\n | boolean\n | null\n | readonly BindingValue[]\n | {\n readonly [key: string]: BindingValue;\n };\n\nexport type BindingDataPath = string;\n\nexport type BindingValueTransform = 'lowercase' | 'trim' | 'uppercase';\n\nexport interface BindingOperationRef {\n readonly apiId: ApiId;\n readonly operationId: OperationId;\n readonly endpointId?: EndpointId;\n}\n\nexport type BindingValueSource =\n | {\n readonly kind: 'context';\n readonly path: BindingDataPath;\n }\n | {\n readonly kind: 'event';\n readonly path: BindingDataPath;\n }\n | {\n readonly kind: 'literal';\n readonly value: BindingValue;\n }\n | {\n readonly kind: 'operation';\n readonly operation: BindingOperationRef;\n readonly path?: BindingDataPath;\n }\n | {\n readonly kind: 'state';\n readonly path: BindingDataPath;\n };\n\nexport interface BindingValueExpression {\n readonly source: BindingValueSource;\n readonly transforms?: readonly BindingValueTransform[];\n}\n\nexport interface BindingFallback {\n readonly value?: BindingValue;\n readonly source?: BindingValueSource;\n}\n\nexport type BindingLifecycleState = 'empty' | 'error' | 'loading';\n\nexport interface BindingLifecycleBehavior {\n readonly state: BindingLifecycleState;\n readonly fallback?: BindingFallback;\n readonly message?: string;\n}\n\nexport interface PropBinding {\n readonly source: BindingValueSource;\n readonly fallback?: BindingFallback;\n readonly loading?: BindingLifecycleBehavior;\n readonly error?: BindingLifecycleBehavior;\n readonly empty?: BindingLifecycleBehavior;\n readonly transforms?: readonly BindingValueTransform[];\n}\n\nexport type BindingInputValue =\n | {\n readonly kind: 'array';\n readonly items: readonly BindingInputValue[];\n }\n | {\n readonly kind: 'literal';\n readonly value: BindingValue;\n }\n | {\n readonly kind: 'object';\n readonly fields: Readonly<Record<string, BindingInputValue>>;\n }\n | {\n readonly kind: 'source';\n readonly source: BindingValueSource;\n readonly transforms?: readonly BindingValueTransform[];\n };\n\nexport type BindingInputMap = Readonly<Record<string, BindingInputValue>>;\n\nexport interface OperationScreenDataLoaderDefinition {\n readonly kind: 'operation';\n readonly id?: string;\n readonly operation: BindingOperationRef;\n readonly input?: BindingInputMap;\n}\n\nexport type ScreenDataLoaderDefinition = OperationScreenDataLoaderDefinition;\n\nexport type BindingConditionOperator = 'eq' | 'exists' | 'neq' | 'notExists';\n\nexport interface BindingCondition {\n readonly source: BindingValueSource;\n readonly operator: BindingConditionOperator;\n readonly value?: BindingValue;\n}\n\nexport type EventBindingTarget =\n | {\n readonly kind: 'action';\n readonly type: string;\n }\n | {\n readonly kind: 'operation';\n readonly operation: BindingOperationRef;\n };\n\nexport interface EventBinding {\n readonly target: EventBindingTarget;\n readonly input?: BindingInputMap;\n readonly when?: BindingCondition;\n}\n\nexport interface ComponentDataBinding {\n readonly componentId: ComponentInstanceId;\n readonly componentType?: ComponentTypeId;\n readonly props?: Readonly<Record<string, PropBinding>>;\n readonly events?: Readonly<Record<string, readonly EventBinding[]>>;\n}\n\nexport type ComponentDataBindingRegistry = Readonly<\n Record<ComponentInstanceId, ComponentDataBinding>\n>;\n"]}
1
+ {"version":3,"file":"bindings.js","sourceRoot":"","sources":["../src/bindings.ts"],"names":[],"mappings":"","sourcesContent":["import type { ApiId, EndpointId, OperationId } from './data';\nimport type { SerializableValue } from './serializable';\n\nexport type ComponentInstanceId = string;\nexport type ComponentTypeId = string;\n\nexport type BindingValue = SerializableValue;\n\nexport type BindingDataPath = string;\n\nexport type BindingValueTransform = 'lowercase' | 'trim' | 'uppercase';\n\nexport interface BindingOperationRef {\n readonly apiId: ApiId;\n readonly operationId: OperationId;\n readonly endpointId?: EndpointId;\n}\n\nexport type BindingValueSource =\n | {\n readonly kind: 'context';\n readonly path: BindingDataPath;\n }\n | {\n readonly kind: 'event';\n readonly path: BindingDataPath;\n }\n | {\n readonly kind: 'literal';\n readonly value: BindingValue;\n }\n | {\n readonly kind: 'operation';\n readonly operation: BindingOperationRef;\n readonly path?: BindingDataPath;\n }\n | {\n readonly kind: 'state';\n readonly path: BindingDataPath;\n };\n\nexport interface BindingValueExpression {\n readonly source: BindingValueSource;\n readonly transforms?: readonly BindingValueTransform[];\n}\n\nexport interface BindingFallback {\n readonly value?: BindingValue;\n readonly source?: BindingValueSource;\n}\n\nexport type BindingLifecycleState = 'empty' | 'error' | 'loading';\n\nexport interface BindingLifecycleBehavior {\n readonly state: BindingLifecycleState;\n readonly fallback?: BindingFallback;\n readonly message?: string;\n}\n\nexport interface PropBinding {\n readonly source: BindingValueSource;\n readonly fallback?: BindingFallback;\n readonly loading?: BindingLifecycleBehavior;\n readonly error?: BindingLifecycleBehavior;\n readonly empty?: BindingLifecycleBehavior;\n readonly transforms?: readonly BindingValueTransform[];\n}\n\nexport type BindingInputValue =\n | {\n readonly kind: 'array';\n readonly items: readonly BindingInputValue[];\n }\n | {\n readonly kind: 'literal';\n readonly value: BindingValue;\n }\n | {\n readonly kind: 'object';\n readonly fields: Readonly<Record<string, BindingInputValue>>;\n }\n | {\n readonly kind: 'source';\n readonly source: BindingValueSource;\n readonly transforms?: readonly BindingValueTransform[];\n };\n\nexport type BindingInputMap = Readonly<Record<string, BindingInputValue>>;\n\nexport interface OperationScreenDataLoaderDefinition {\n readonly kind: 'operation';\n readonly id?: string;\n readonly operation: BindingOperationRef;\n readonly input?: BindingInputMap;\n}\n\nexport type ScreenDataLoaderDefinition = OperationScreenDataLoaderDefinition;\n\nexport type BindingConditionOperator = 'eq' | 'exists' | 'neq' | 'notExists';\n\nexport interface BindingCondition {\n readonly source: BindingValueSource;\n readonly operator: BindingConditionOperator;\n readonly value?: BindingValue;\n}\n\nexport type EventBindingTarget =\n | {\n readonly kind: 'action';\n readonly type: string;\n }\n | {\n readonly kind: 'operation';\n readonly operation: BindingOperationRef;\n };\n\nexport interface EventBinding {\n readonly target: EventBindingTarget;\n readonly input?: BindingInputMap;\n readonly when?: BindingCondition;\n}\n\nexport interface ComponentDataBinding {\n readonly componentId: ComponentInstanceId;\n readonly componentType?: ComponentTypeId;\n readonly props?: Readonly<Record<string, PropBinding>>;\n readonly events?: Readonly<Record<string, readonly EventBinding[]>>;\n}\n\nexport type ComponentDataBindingRegistry = Readonly<\n Record<ComponentInstanceId, ComponentDataBinding>\n>;\n"]}
@@ -0,0 +1,4 @@
1
+ export type SerializableSet<T extends string = string> = Readonly<Partial<Record<T, true>>>;
2
+ /*** Validate the canonical JSON-safe representation for unordered string membership. */
3
+ export declare function isSerializableSet(value: unknown): value is SerializableSet;
4
+ //# sourceMappingURL=collections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAE5F,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E"}
@@ -0,0 +1,6 @@
1
+ import { isRecord } from '@ankhorage/utility/object';
2
+ /*** Validate the canonical JSON-safe representation for unordered string membership. */
3
+ export function isSerializableSet(value) {
4
+ return isRecord(value) && Object.values(value).every((member) => member === true);
5
+ }
6
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAIrD,wFAAwF;AACxF,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;AACpF,CAAC","sourcesContent":["import { isRecord } from '@ankhorage/utility/object';\n\nexport type SerializableSet<T extends string = string> = Readonly<Partial<Record<T, true>>>;\n\n/*** Validate the canonical JSON-safe representation for unordered string membership. */\nexport function isSerializableSet(value: unknown): value is SerializableSet {\n return isRecord(value) && Object.values(value).every((member) => member === true);\n}\n"]}