@ankhorage/contracts 22.8.2 → 22.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +22 -1
- package/dist/appManifest/dataSources.js +1 -1
- package/dist/appManifest/dataSources.js.map +1 -1
- package/dist/appManifest/navigator.d.ts.map +1 -1
- package/dist/appManifest/navigator.js +1 -1
- package/dist/appManifest/navigator.js.map +1 -1
- package/dist/appManifest.d.ts +1 -1
- package/dist/appManifest.d.ts.map +1 -1
- package/dist/appManifest.js.map +1 -1
- package/dist/{appManifest/data.d.ts → data/dataValidation.d.ts} +1 -1
- package/dist/data/dataValidation.d.ts.map +1 -0
- package/dist/{appManifest/data.js → data/dataValidation.js} +19 -13
- package/dist/data/dataValidation.js.map +1 -0
- package/dist/{appManifest/apis.d.ts → data/isApiDefinitionRegistry.d.ts} +2 -2
- package/dist/data/isApiDefinitionRegistry.d.ts.map +1 -0
- package/dist/{appManifest/apis.js → data/isApiDefinitionRegistry.js} +4 -4
- package/dist/data/isApiDefinitionRegistry.js.map +1 -0
- package/dist/icon.d.ts.map +1 -0
- package/dist/{appManifest/icon.js → icon.js} +1 -1
- package/dist/icon.js.map +1 -0
- package/dist/infra/isInfraAdapterDescriptor.d.ts.map +1 -1
- package/dist/infra/isInfraAdapterDescriptor.js +1 -1
- package/dist/infra/isInfraAdapterDescriptor.js.map +1 -1
- package/dist/infra/isInfraAuthSpec.js +1 -1
- package/dist/infra/isInfraAuthSpec.js.map +1 -1
- package/dist/infra/isInfraDeploymentSpec.d.ts.map +1 -1
- package/dist/infra/isInfraDeploymentSpec.js +1 -1
- package/dist/infra/isInfraDeploymentSpec.js.map +1 -1
- package/dist/infra/isInfraEnvironmentSpec.d.ts.map +1 -1
- package/dist/infra/isInfraEnvironmentSpec.js +1 -1
- package/dist/infra/isInfraEnvironmentSpec.js.map +1 -1
- package/dist/infra/isInfraManifest.js +1 -1
- package/dist/infra/isInfraManifest.js.map +1 -1
- package/dist/infra/validateInfraAdapterSelection.d.ts.map +1 -1
- package/dist/infra/validateInfraAdapterSelection.js +1 -1
- package/dist/infra/validateInfraAdapterSelection.js.map +1 -1
- package/dist/infra.d.ts +1 -1
- package/dist/infra.d.ts.map +1 -1
- package/dist/infra.js +1 -1
- package/dist/infra.js.map +1 -1
- package/dist/{infra/constants.d.ts → infraCatalog.d.ts} +1 -1
- package/dist/infraCatalog.d.ts.map +1 -0
- package/dist/{infra/constants.js → infraCatalog.js} +1 -1
- package/dist/infraCatalog.js.map +1 -0
- package/dist/structure/generated.d.ts +2 -2
- package/dist/structure/generated.js +2 -2
- package/dist/structure/generated.js.map +1 -1
- package/dist/types/infraAdapters.d.ts +1 -1
- package/dist/types/infraAdapters.d.ts.map +1 -1
- package/dist/types/infraAdapters.js.map +1 -1
- package/dist/types/infraManifest.d.ts +1 -1
- package/dist/types/infraManifest.d.ts.map +1 -1
- package/dist/types/infraManifest.js.map +1 -1
- package/dist/types.d.ts +10 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +7 -7
- package/src/appManifest/dataSources.ts +1 -1
- package/src/appManifest/navigator.ts +1 -1
- package/src/appManifest.ts +1 -5
- package/src/{appManifest/data.ts → data/dataValidation.ts} +20 -10
- package/src/{appManifest/apis.ts → data/isApiDefinitionRegistry.ts} +4 -4
- package/src/{appManifest/icon.ts → icon.ts} +1 -1
- package/src/infra/isInfraAdapterDescriptor.ts +1 -1
- package/src/infra/isInfraAuthSpec.ts +1 -1
- package/src/infra/isInfraDeploymentSpec.ts +1 -1
- package/src/infra/isInfraEnvironmentSpec.ts +1 -1
- package/src/infra/isInfraManifest.ts +1 -1
- package/src/infra/validateInfraAdapterSelection.ts +1 -1
- package/src/infra.ts +1 -1
- package/src/structure/generated.ts +2 -2
- package/src/types/infraAdapters.ts +1 -1
- package/src/types/infraManifest.ts +1 -1
- package/src/types.ts +13 -1
- package/dist/appManifest/apis.d.ts.map +0 -1
- package/dist/appManifest/apis.js.map +0 -1
- package/dist/appManifest/data.d.ts.map +0 -1
- package/dist/appManifest/data.js.map +0 -1
- package/dist/appManifest/icon.d.ts.map +0 -1
- package/dist/appManifest/icon.js.map +0 -1
- package/dist/appManifest/splashScreen.d.ts +0 -12
- package/dist/appManifest/splashScreen.d.ts.map +0 -1
- package/dist/appManifest/splashScreen.js +0 -2
- package/dist/appManifest/splashScreen.js.map +0 -1
- package/dist/infra/constants.d.ts.map +0 -1
- package/dist/infra/constants.js.map +0 -1
- package/src/appManifest/splashScreen.ts +0 -14
- /package/dist/{appManifest/icon.d.ts → icon.d.ts} +0 -0
- /package/src/{infra/constants.ts → infraCatalog.ts} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @ankhorage/contracts
|
|
2
2
|
|
|
3
|
+
## 22.8.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- dc17765: Keep repository-only Renovate configuration out of published documentation.
|
|
8
|
+
- b0933b1: Update Ankhorage dependencies: `@ankhorage/paradox`, `@ankhorage/utility`.
|
|
9
|
+
- 43079fc: Update Ankhorage dependencies: `@ankhorage/utility`.
|
|
10
|
+
- d57e66e: Break the AppManifest/Infra source cycle without restructuring unrelated contract modules.
|
|
11
|
+
|
|
3
12
|
## 22.8.2
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -3,10 +3,31 @@
|
|
|
3
3
|
|
|
4
4
|
# @ankhorage/contracts
|
|
5
5
|
|
|
6
|
-
         
|
|
7
7
|
|
|
8
8
|
Serializable app, action, theme, auth, and secret-store contracts for Ankhorage.
|
|
9
9
|
|
|
10
|
+
## Configuration
|
|
11
|
+
|
|
12
|
+
### Example
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import { defineParadoxConfig } from '@ankhorage/paradox';
|
|
16
|
+
|
|
17
|
+
export default defineParadoxConfig({
|
|
18
|
+
mode: 'write',
|
|
19
|
+
|
|
20
|
+
package: {
|
|
21
|
+
root: '.',
|
|
22
|
+
entrypoints: ['src/index.ts'],
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
output: {
|
|
26
|
+
dir: './paradox',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
10
31
|
## Generated documentation
|
|
11
32
|
|
|
12
33
|
- [Interactive documentation app](././paradox/index.html)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';
|
|
2
2
|
import { isOptionalString } from '@ankhorage/utility/string';
|
|
3
|
-
import { isAdapterRef, isCredentialRef, isDataEndpointRegistry, isDataSchemaRegistry, } from '
|
|
3
|
+
import { isAdapterRef, isCredentialRef, isDataEndpointRegistry, isDataSchemaRegistry, } from '../data/dataValidation';
|
|
4
4
|
import { isManifestValue } from './isManifestValue';
|
|
5
5
|
const DATABASE_SOURCE_KEYS = [
|
|
6
6
|
'id',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataSources.js","sourceRoot":"","sources":["../../src/appManifest/dataSources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EACL,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,
|
|
1
|
+
{"version":3,"file":"dataSources.js","sourceRoot":"","sources":["../../src/appManifest/dataSources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EACL,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,oBAAoB,GAAG;IAC3B,IAAI;IACJ,MAAM;IACN,MAAM;IACN,aAAa;IACb,YAAY;IACZ,SAAS;IACT,WAAW;IACX,SAAS;IACT,UAAU;CACF,CAAC;AAEX,mEAAmE;AACnE,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAChG,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,oBAAoB,CAAC;QACxC,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,KAAK,CAAC,IAAI,KAAK,UAAU;QACzB,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5B,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC;QACnC,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;QACvB,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU;QACjC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC;QAC3B,sBAAsB,CAAC,KAAK,CAAC,SAAS,CAAC;QACvC,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpE,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAClE,CAAC;AACJ,CAAC","sourcesContent":["import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';\nimport { isOptionalString } from '@ankhorage/utility/string';\n\nimport {\n isAdapterRef,\n isCredentialRef,\n isDataEndpointRegistry,\n isDataSchemaRegistry,\n} from '../data/dataValidation';\nimport { isManifestValue } from './isManifestValue';\n\nconst DATABASE_SOURCE_KEYS = [\n 'id',\n 'kind',\n 'name',\n 'description',\n 'credential',\n 'adapter',\n 'endpoints',\n 'schemas',\n 'metadata',\n] as const;\n\n/*** Validate the supported data-source entries in the registry. */\nexport function isDataSourceRegistry(value: unknown): boolean {\n return (\n isRecord(value) &&\n Object.entries(value).every(([id, source]) => isDatabaseDataSource(source) && source.id === id)\n );\n}\n\n/*** Validate database adapter identity and supported configuration fields. */\nfunction isDatabaseDataSource(value: unknown): value is Record<string, unknown> {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, DATABASE_SOURCE_KEYS) &&\n typeof value.id === 'string' &&\n value.kind === 'database' &&\n isOptionalString(value.name) &&\n isOptionalString(value.description) &&\n (value.credential === undefined || isCredentialRef(value.credential)) &&\n isRecord(value.adapter) &&\n value.adapter.kind === 'database' &&\n isAdapterRef(value.adapter) &&\n isDataEndpointRegistry(value.endpoints) &&\n (value.schemas === undefined || isDataSchemaRegistry(value.schemas)) &&\n (value.metadata === undefined || isManifestValue(value.metadata))\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigator.d.ts","sourceRoot":"","sources":["../../src/appManifest/navigator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"navigator.d.ts","sourceRoot":"","sources":["../../src/appManifest/navigator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,oBAAoB,EAAsC,MAAM,cAAc,CAAC;AAS7F,uEAAuE;AACvE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAUpF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { isStringArray } from '@ankhorage/utility/array';
|
|
2
2
|
import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';
|
|
3
3
|
import { isOptionalString } from '@ankhorage/utility/string';
|
|
4
|
+
import { isIconSpec } from '../icon';
|
|
4
5
|
import { NAVIGATOR_PRESETS, NAVIGATOR_TYPES } from '../navigator';
|
|
5
|
-
import { isIconSpec } from './icon';
|
|
6
6
|
import { isDrawerNavigatorOptions, isNavigatorScreenReference, isStackImplementationConfig, isStackScreenOptions, isTabsImplementationConfig, } from './navigatorOptions';
|
|
7
7
|
/*** Validate the complete serialized `AppManifest.navigator` slice. */
|
|
8
8
|
export function isAppNavigatorManifest(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigator.js","sourceRoot":"","sources":["../../src/appManifest/navigator.ts"],"names":[],"mappings":"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","sourcesContent":["import { isStringArray } from '@ankhorage/utility/array';\nimport { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';\nimport { isOptionalString } from '@ankhorage/utility/string';\n\nimport { type AppNavigatorManifest, NAVIGATOR_PRESETS, NAVIGATOR_TYPES } from '../navigator';\nimport { isIconSpec } from './icon';\nimport {\n isDrawerNavigatorOptions,\n isNavigatorScreenReference,\n isStackImplementationConfig,\n isStackScreenOptions,\n isTabsImplementationConfig,\n} from './navigatorOptions';\n\n/*** Validate the complete serialized `AppManifest.navigator` slice. */\nexport function isAppNavigatorManifest(value: unknown): value is AppNavigatorManifest {\n return (\n isRecord(value) &&\n isNavigatorNode(value) &&\n (value.preset === undefined ||\n (typeof value.preset === 'string' && hasNavigatorPreset(value.preset))) &&\n value.flows === undefined &&\n (value.defaults === undefined || isNavigatorDefaults(value.defaults)) &&\n (value.platforms === undefined || isNavigatorPlatforms(value.platforms))\n );\n}\n\n/*** Validate one nested navigator node independently from app-level authoring metadata. */\nfunction isNavigatorNode(value: unknown): boolean {\n if (\n !isRecord(value) ||\n typeof value.type !== 'string' ||\n !hasNavigatorType(value.type) ||\n !isOptionalString(value.initialRouteName) ||\n !Array.isArray(value.routes) ||\n !value.routes.every(isRouteDefinition)\n ) {\n return false;\n }\n\n switch (value.type) {\n case 'slot':\n return value.options === undefined && value.implementation === undefined;\n case 'stack':\n return isStackImplementationConfig(value);\n case 'tabs':\n return isTabsImplementationConfig(value);\n case 'drawer':\n return (\n value.implementation === undefined &&\n (value.options === undefined || isDrawerNavigatorOptions(value.options))\n );\n case 'split-view':\n return isSplitViewNavigatorNode(value);\n case 'custom':\n return isCustomNavigatorNode(value);\n default:\n return false;\n }\n}\n\n/*** Check a serialized preset against the public contract without eager cyclic initialization. */\nfunction hasNavigatorPreset(value: string): boolean {\n return (NAVIGATOR_PRESETS as readonly string[]).includes(value);\n}\n\n/*** Check a serialized topology against the public contract without eager cyclic initialization. */\nfunction hasNavigatorType(value: string): boolean {\n return (NAVIGATOR_TYPES as readonly string[]).includes(value);\n}\n\n/*** Validate one route and preserve its portable metadata and nested navigator. */\nfunction isRouteDefinition(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.name === 'string' &&\n [value.path, value.label, value.screenId].every(isOptionalString) &&\n (value.icon === undefined || isIconSpec(value.icon)) &&\n (value.showInPrimaryNavigation === undefined ||\n typeof value.showInPrimaryNavigation === 'boolean') &&\n (value.guards === undefined || isStringArray(value.guards)) &&\n (value.stackOptions === undefined || isStackScreenOptions(value.stackOptions)) &&\n (value.navigator === undefined || isNavigatorNode(value.navigator))\n );\n}\n\n/*** Validate Split View screen references without duplicating the routed secondary tree. */\nfunction isSplitViewNavigatorNode(value: Record<string, unknown>): boolean {\n return (\n value.implementation === undefined &&\n value.options === undefined &&\n isRecord(value.columns) &&\n hasOnlyKeys(value.columns, ['primary', 'supplementary']) &&\n isNavigatorScreenReference(value.columns.primary) &&\n (value.columns.supplementary === undefined ||\n isNavigatorScreenReference(value.columns.supplementary)) &&\n (value.inspector === undefined || isNavigatorScreenReference(value.inspector)) &&\n (value.topColumnForCollapsing === undefined ||\n value.topColumnForCollapsing === 'primary' ||\n value.topColumnForCollapsing === 'supplementary' ||\n value.topColumnForCollapsing === 'secondary')\n );\n}\n\n/*** Validate a registered custom navigator with JSON-safe configuration only. */\nfunction isCustomNavigatorNode(value: Record<string, unknown>): boolean {\n return (\n value.implementation === undefined &&\n value.options === undefined &&\n typeof value.navigatorId === 'string' &&\n (value.config === undefined || isNavigatorJsonRecord(value.config))\n );\n}\n\n/*** Validate an acyclic, finite JSON object used by a custom navigator adapter. */\nfunction isNavigatorJsonRecord(value: unknown): boolean {\n return isRecord(value) && isNavigatorJsonValue(value, new Set<object>());\n}\n\n/*** Recursively validate the portable manifest value domain and reject cycles. */\nfunction isNavigatorJsonValue(value: unknown, ancestors: Set<object>): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object' || ancestors.has(value)) return false;\n\n if (Array.isArray(value)) {\n if (\n Object.keys(value).length !== value.length ||\n Object.getOwnPropertySymbols(value).length > 0\n ) {\n return false;\n }\n } else {\n const prototype = Object.getPrototypeOf(value) as object | null;\n if (prototype !== Object.prototype && prototype !== null) return false;\n if (Reflect.ownKeys(value).some((key) => typeof key !== 'string')) return false;\n }\n\n ancestors.add(value);\n const isValid = Object.values(value).every((entry) => isNavigatorJsonValue(entry, ancestors));\n ancestors.delete(value);\n return isValid;\n}\n\n/*** Validate package-owned navigator defaults without requiring a navigator node type. */\nfunction isNavigatorDefaults(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['tabs', 'stack']) &&\n (value.tabs === undefined ||\n (isRecord(value.tabs) && isTabsImplementationConfig(value.tabs))) &&\n (value.stack === undefined ||\n (isRecord(value.stack) && isStackImplementationConfig(value.stack)))\n );\n}\n\n/*** Validate per-platform navigator implementation overrides. */\nfunction isNavigatorPlatforms(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['android', 'ios', 'web']) &&\n (value.android === undefined || isNavigatorPlatformConfig(value.android)) &&\n (value.ios === undefined || isNavigatorPlatformConfig(value.ios)) &&\n (value.web === undefined || isNavigatorPlatformConfig(value.web))\n );\n}\n\n/*** Validate one platform-specific navigator override slice. */\nfunction isNavigatorPlatformConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['tabs', 'stack']) &&\n (value.tabs === undefined ||\n (isRecord(value.tabs) && isTabsImplementationConfig(value.tabs))) &&\n (value.stack === undefined ||\n (isRecord(value.stack) && isStackImplementationConfig(value.stack)))\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"navigator.js","sourceRoot":"","sources":["../../src/appManifest/navigator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAA6B,iBAAiB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7F,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,EAC3B,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAE5B,uEAAuE;AACvE,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,eAAe,CAAC,KAAK,CAAC;QACtB,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;YACzB,CAAC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,KAAK,CAAC,KAAK,KAAK,SAAS;QACzB,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CACzE,CAAC;AACJ,CAAC;AAED,2FAA2F;AAC3F,SAAS,eAAe,CAAC,KAAc;IACrC,IACE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;QAC7B,CAAC,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACzC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QAC5B,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,EACtC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,CAAC;QAC3E,KAAK,OAAO;YACV,OAAO,2BAA2B,CAAC,KAAK,CAAC,CAAC;QAC5C,KAAK,MAAM;YACT,OAAO,0BAA0B,CAAC,KAAK,CAAC,CAAC;QAC3C,KAAK,QAAQ;YACX,OAAO,CACL,KAAK,CAAC,cAAc,KAAK,SAAS;gBAClC,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CACzE,CAAC;QACJ,KAAK,YAAY;YACf,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC;QACzC,KAAK,QAAQ;YACX,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAQ,iBAAuC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,oGAAoG;AACpG,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAQ,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,mFAAmF;AACnF,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACjE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,KAAK,CAAC,uBAAuB,KAAK,SAAS;YAC1C,OAAO,KAAK,CAAC,uBAAuB,KAAK,SAAS,CAAC;QACrD,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3D,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC9E,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CACpE,CAAC;AACJ,CAAC;AAED,4FAA4F;AAC5F,SAAS,wBAAwB,CAAC,KAA8B;IAC9D,OAAO,CACL,KAAK,CAAC,cAAc,KAAK,SAAS;QAClC,KAAK,CAAC,OAAO,KAAK,SAAS;QAC3B,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;QACvB,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACxD,0BAA0B,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QACjD,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS;YACxC,0BAA0B,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1D,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,0BAA0B,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9E,CAAC,KAAK,CAAC,sBAAsB,KAAK,SAAS;YACzC,KAAK,CAAC,sBAAsB,KAAK,SAAS;YAC1C,KAAK,CAAC,sBAAsB,KAAK,eAAe;YAChD,KAAK,CAAC,sBAAsB,KAAK,WAAW,CAAC,CAChD,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,SAAS,qBAAqB,CAAC,KAA8B;IAC3D,OAAO,CACL,KAAK,CAAC,cAAc,KAAK,SAAS;QAClC,KAAK,CAAC,OAAO,KAAK,SAAS;QAC3B,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QACrC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CACpE,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,SAAS,qBAAqB,CAAC,KAAc;IAC3C,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC,KAAK,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;AAC3E,CAAC;AAED,kFAAkF;AAClF,SAAS,oBAAoB,CAAC,KAAc,EAAE,SAAsB;IAClE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3F,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IACE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAC1C,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAC9C,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAkB,CAAC;QAChE,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACvE,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;IAClF,CAAC;IAED,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IAC9F,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,0FAA0F;AAC1F,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;YACvB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS;YACxB,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,2BAA2B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CACvE,CAAC;AACJ,CAAC;AAED,iEAAiE;AACjE,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzE,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjE,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAClE,CAAC;AACJ,CAAC;AAED,gEAAgE;AAChE,SAAS,yBAAyB,CAAC,KAAc;IAC/C,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;YACvB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS;YACxB,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,2BAA2B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CACvE,CAAC;AACJ,CAAC","sourcesContent":["import { isStringArray } from '@ankhorage/utility/array';\nimport { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';\nimport { isOptionalString } from '@ankhorage/utility/string';\n\nimport { isIconSpec } from '../icon';\nimport { type AppNavigatorManifest, NAVIGATOR_PRESETS, NAVIGATOR_TYPES } from '../navigator';\nimport {\n isDrawerNavigatorOptions,\n isNavigatorScreenReference,\n isStackImplementationConfig,\n isStackScreenOptions,\n isTabsImplementationConfig,\n} from './navigatorOptions';\n\n/*** Validate the complete serialized `AppManifest.navigator` slice. */\nexport function isAppNavigatorManifest(value: unknown): value is AppNavigatorManifest {\n return (\n isRecord(value) &&\n isNavigatorNode(value) &&\n (value.preset === undefined ||\n (typeof value.preset === 'string' && hasNavigatorPreset(value.preset))) &&\n value.flows === undefined &&\n (value.defaults === undefined || isNavigatorDefaults(value.defaults)) &&\n (value.platforms === undefined || isNavigatorPlatforms(value.platforms))\n );\n}\n\n/*** Validate one nested navigator node independently from app-level authoring metadata. */\nfunction isNavigatorNode(value: unknown): boolean {\n if (\n !isRecord(value) ||\n typeof value.type !== 'string' ||\n !hasNavigatorType(value.type) ||\n !isOptionalString(value.initialRouteName) ||\n !Array.isArray(value.routes) ||\n !value.routes.every(isRouteDefinition)\n ) {\n return false;\n }\n\n switch (value.type) {\n case 'slot':\n return value.options === undefined && value.implementation === undefined;\n case 'stack':\n return isStackImplementationConfig(value);\n case 'tabs':\n return isTabsImplementationConfig(value);\n case 'drawer':\n return (\n value.implementation === undefined &&\n (value.options === undefined || isDrawerNavigatorOptions(value.options))\n );\n case 'split-view':\n return isSplitViewNavigatorNode(value);\n case 'custom':\n return isCustomNavigatorNode(value);\n default:\n return false;\n }\n}\n\n/*** Check a serialized preset against the public contract without eager cyclic initialization. */\nfunction hasNavigatorPreset(value: string): boolean {\n return (NAVIGATOR_PRESETS as readonly string[]).includes(value);\n}\n\n/*** Check a serialized topology against the public contract without eager cyclic initialization. */\nfunction hasNavigatorType(value: string): boolean {\n return (NAVIGATOR_TYPES as readonly string[]).includes(value);\n}\n\n/*** Validate one route and preserve its portable metadata and nested navigator. */\nfunction isRouteDefinition(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.name === 'string' &&\n [value.path, value.label, value.screenId].every(isOptionalString) &&\n (value.icon === undefined || isIconSpec(value.icon)) &&\n (value.showInPrimaryNavigation === undefined ||\n typeof value.showInPrimaryNavigation === 'boolean') &&\n (value.guards === undefined || isStringArray(value.guards)) &&\n (value.stackOptions === undefined || isStackScreenOptions(value.stackOptions)) &&\n (value.navigator === undefined || isNavigatorNode(value.navigator))\n );\n}\n\n/*** Validate Split View screen references without duplicating the routed secondary tree. */\nfunction isSplitViewNavigatorNode(value: Record<string, unknown>): boolean {\n return (\n value.implementation === undefined &&\n value.options === undefined &&\n isRecord(value.columns) &&\n hasOnlyKeys(value.columns, ['primary', 'supplementary']) &&\n isNavigatorScreenReference(value.columns.primary) &&\n (value.columns.supplementary === undefined ||\n isNavigatorScreenReference(value.columns.supplementary)) &&\n (value.inspector === undefined || isNavigatorScreenReference(value.inspector)) &&\n (value.topColumnForCollapsing === undefined ||\n value.topColumnForCollapsing === 'primary' ||\n value.topColumnForCollapsing === 'supplementary' ||\n value.topColumnForCollapsing === 'secondary')\n );\n}\n\n/*** Validate a registered custom navigator with JSON-safe configuration only. */\nfunction isCustomNavigatorNode(value: Record<string, unknown>): boolean {\n return (\n value.implementation === undefined &&\n value.options === undefined &&\n typeof value.navigatorId === 'string' &&\n (value.config === undefined || isNavigatorJsonRecord(value.config))\n );\n}\n\n/*** Validate an acyclic, finite JSON object used by a custom navigator adapter. */\nfunction isNavigatorJsonRecord(value: unknown): boolean {\n return isRecord(value) && isNavigatorJsonValue(value, new Set<object>());\n}\n\n/*** Recursively validate the portable manifest value domain and reject cycles. */\nfunction isNavigatorJsonValue(value: unknown, ancestors: Set<object>): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object' || ancestors.has(value)) return false;\n\n if (Array.isArray(value)) {\n if (\n Object.keys(value).length !== value.length ||\n Object.getOwnPropertySymbols(value).length > 0\n ) {\n return false;\n }\n } else {\n const prototype = Object.getPrototypeOf(value) as object | null;\n if (prototype !== Object.prototype && prototype !== null) return false;\n if (Reflect.ownKeys(value).some((key) => typeof key !== 'string')) return false;\n }\n\n ancestors.add(value);\n const isValid = Object.values(value).every((entry) => isNavigatorJsonValue(entry, ancestors));\n ancestors.delete(value);\n return isValid;\n}\n\n/*** Validate package-owned navigator defaults without requiring a navigator node type. */\nfunction isNavigatorDefaults(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['tabs', 'stack']) &&\n (value.tabs === undefined ||\n (isRecord(value.tabs) && isTabsImplementationConfig(value.tabs))) &&\n (value.stack === undefined ||\n (isRecord(value.stack) && isStackImplementationConfig(value.stack)))\n );\n}\n\n/*** Validate per-platform navigator implementation overrides. */\nfunction isNavigatorPlatforms(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['android', 'ios', 'web']) &&\n (value.android === undefined || isNavigatorPlatformConfig(value.android)) &&\n (value.ios === undefined || isNavigatorPlatformConfig(value.ios)) &&\n (value.web === undefined || isNavigatorPlatformConfig(value.web))\n );\n}\n\n/*** Validate one platform-specific navigator override slice. */\nfunction isNavigatorPlatformConfig(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['tabs', 'stack']) &&\n (value.tabs === undefined ||\n (isRecord(value.tabs) && isTabsImplementationConfig(value.tabs))) &&\n (value.stack === undefined ||\n (isRecord(value.stack) && isStackImplementationConfig(value.stack)))\n );\n}\n"]}
|
package/dist/appManifest.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { isAppManifest } from './appManifest/isAppManifest';
|
|
2
2
|
export { parseAppManifest } from './appManifest/parseAppManifest';
|
|
3
|
-
export type { SplashScreenModeSpec, SplashScreenResizeMode, SplashScreenSpec
|
|
3
|
+
export type { SplashScreenModeSpec, SplashScreenResizeMode, SplashScreenSpec } from './types';
|
|
4
4
|
export type { AppManifestParseResult } from './types/appManifest';
|
|
5
5
|
//# sourceMappingURL=appManifest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appManifest.d.ts","sourceRoot":"","sources":["../src/appManifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,YAAY,
|
|
1
|
+
{"version":3,"file":"appManifest.d.ts","sourceRoot":"","sources":["../src/appManifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC9F,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/appManifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appManifest.js","sourceRoot":"","sources":["../src/appManifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC","sourcesContent":["export { isAppManifest } from './appManifest/isAppManifest';\nexport { parseAppManifest } from './appManifest/parseAppManifest';\nexport type {
|
|
1
|
+
{"version":3,"file":"appManifest.js","sourceRoot":"","sources":["../src/appManifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC","sourcesContent":["export { isAppManifest } from './appManifest/isAppManifest';\nexport { parseAppManifest } from './appManifest/parseAppManifest';\nexport type { SplashScreenModeSpec, SplashScreenResizeMode, SplashScreenSpec } from './types';\nexport type { AppManifestParseResult } from './types/appManifest';\n"]}
|
|
@@ -6,4 +6,4 @@ export declare function isDataSchemaRegistry(value: unknown): boolean;
|
|
|
6
6
|
export declare function isCredentialRef(value: unknown): boolean;
|
|
7
7
|
/*** Validate an adapter reference and its optional authored configuration. */
|
|
8
8
|
export declare function isAdapterRef(value: unknown): boolean;
|
|
9
|
-
//# sourceMappingURL=
|
|
9
|
+
//# sourceMappingURL=dataValidation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataValidation.d.ts","sourceRoot":"","sources":["../../src/data/dataValidation.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,7 +1,7 @@
|
|
|
1
1
|
import { isStringArray } from '@ankhorage/utility/array';
|
|
2
2
|
import { isRecord, readOwnProperty } from '@ankhorage/utility/object';
|
|
3
3
|
import { isOptionalString } from '@ankhorage/utility/string';
|
|
4
|
-
import {
|
|
4
|
+
import { isSerializableValue } from '../serializable';
|
|
5
5
|
const DATA_SCHEMA_TYPES = new Set([
|
|
6
6
|
'array',
|
|
7
7
|
'boolean',
|
|
@@ -37,7 +37,7 @@ export function isAdapterRef(value) {
|
|
|
37
37
|
typeof value.kind === 'string' &&
|
|
38
38
|
isOptionalString(value.packageName) &&
|
|
39
39
|
isOptionalString(value.exportName) &&
|
|
40
|
-
(value.config === undefined ||
|
|
40
|
+
(value.config === undefined || isSerializableValue(value.config)));
|
|
41
41
|
}
|
|
42
42
|
/*** Validate endpoint identity, operations and optional connection metadata. */
|
|
43
43
|
function isDataEndpointConfig(value) {
|
|
@@ -51,12 +51,15 @@ function isDataEndpointConfig(value) {
|
|
|
51
51
|
(value.credential === undefined || isCredentialRef(value.credential)) &&
|
|
52
52
|
isRecord(value.operations) &&
|
|
53
53
|
Object.entries(value.operations).every(([operationId, operation]) => isDataOperationConfig(operation) && isRecord(operation) && operation.id === operationId) &&
|
|
54
|
-
(value.metadata === undefined ||
|
|
54
|
+
(value.metadata === undefined || isSerializableValue(value.metadata)));
|
|
55
55
|
}
|
|
56
56
|
/*** Validate operation protocol, intent, request and response configuration. */
|
|
57
57
|
function isDataOperationConfig(value) {
|
|
58
|
-
return
|
|
59
|
-
|
|
58
|
+
return isRecord(value) && isDataOperationIdentity(value) && isDataOperationDetails(value);
|
|
59
|
+
}
|
|
60
|
+
/*** Validate operation identity, protocol and routing fields. */
|
|
61
|
+
function isDataOperationIdentity(value) {
|
|
62
|
+
return (typeof value.id === 'string' &&
|
|
60
63
|
isOptionalString(value.endpointId) &&
|
|
61
64
|
isOptionalString(value.name) &&
|
|
62
65
|
isOptionalString(value.description) &&
|
|
@@ -64,12 +67,15 @@ function isDataOperationConfig(value) {
|
|
|
64
67
|
typeof value.intent === 'string' &&
|
|
65
68
|
OPERATION_INTENTS.has(value.intent) &&
|
|
66
69
|
isOptionalString(value.method) &&
|
|
67
|
-
isOptionalString(value.path)
|
|
68
|
-
|
|
70
|
+
isOptionalString(value.path));
|
|
71
|
+
}
|
|
72
|
+
/*** Validate operation request, response and authored metadata. */
|
|
73
|
+
function isDataOperationDetails(value) {
|
|
74
|
+
return ((value.request === undefined || isDataOperationRequest(value.request)) &&
|
|
69
75
|
(value.response === undefined || isDataOperationResponse(value.response)) &&
|
|
70
76
|
(value.pagination === undefined || isRecord(value.pagination)) &&
|
|
71
77
|
(value.credential === undefined || isCredentialRef(value.credential)) &&
|
|
72
|
-
(value.metadata === undefined ||
|
|
78
|
+
(value.metadata === undefined || isSerializableValue(value.metadata)));
|
|
73
79
|
}
|
|
74
80
|
/*** Validate request schema, parameters and optional content type. */
|
|
75
81
|
function isDataOperationRequest(value) {
|
|
@@ -88,7 +94,7 @@ function isDataOperationParameter(value) {
|
|
|
88
94
|
PARAMETER_LOCATIONS.has(value.location) &&
|
|
89
95
|
(value.required === undefined || typeof value.required === 'boolean') &&
|
|
90
96
|
isOptionalString(value.description) &&
|
|
91
|
-
(value.default === undefined ||
|
|
97
|
+
(value.default === undefined || isSerializableValue(value.default)));
|
|
92
98
|
}
|
|
93
99
|
/*** Validate response status, schema and optional descriptive metadata. */
|
|
94
100
|
function isDataOperationResponse(value) {
|
|
@@ -130,10 +136,10 @@ function isOptionalSchemaScalars(value) {
|
|
|
130
136
|
isOptionalString(value.description) &&
|
|
131
137
|
isOptionalString(value.format) &&
|
|
132
138
|
(value.nullable === undefined || typeof value.nullable === 'boolean') &&
|
|
133
|
-
(value.const === undefined ||
|
|
134
|
-
(value.default === undefined ||
|
|
139
|
+
(value.const === undefined || isSerializableValue(value.const)) &&
|
|
140
|
+
(value.default === undefined || isSerializableValue(value.default)) &&
|
|
135
141
|
(value.enum === undefined ||
|
|
136
|
-
(Array.isArray(value.enum) && value.enum.every(
|
|
142
|
+
(Array.isArray(value.enum) && value.enum.every(isSerializableValue))) &&
|
|
137
143
|
(value.ref === undefined || isDataSchemaRef(value.ref)));
|
|
138
144
|
}
|
|
139
145
|
/*** Validate optional schema properties, items and required fields. */
|
|
@@ -157,4 +163,4 @@ function isOptionalSchemaComposition(value) {
|
|
|
157
163
|
function isDataSchemaRef(value) {
|
|
158
164
|
return isRecord(value) && typeof value.id === 'string';
|
|
159
165
|
}
|
|
160
|
-
//# sourceMappingURL=
|
|
166
|
+
//# sourceMappingURL=dataValidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataValidation.js","sourceRoot":"","sources":["../../src/data/dataValidation.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 { isSerializableValue } from '../serializable';\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 || isSerializableValue(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 || isSerializableValue(value.metadata))\n );\n}\n\n/*** Validate operation protocol, intent, request and response configuration. */\nfunction isDataOperationConfig(value: unknown): boolean {\n return isRecord(value) && isDataOperationIdentity(value) && isDataOperationDetails(value);\n}\n\n/*** Validate operation identity, protocol and routing fields. */\nfunction isDataOperationIdentity(value: Record<string, unknown>): boolean {\n return (\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 );\n}\n\n/*** Validate operation request, response and authored metadata. */\nfunction isDataOperationDetails(value: Record<string, unknown>): boolean {\n return (\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 || isSerializableValue(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 || isSerializableValue(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 || isSerializableValue(value.const)) &&\n (value.default === undefined || isSerializableValue(value.default)) &&\n (value.enum === undefined ||\n (Array.isArray(value.enum) && value.enum.every(isSerializableValue))) &&\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"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ApiDefinitionRegistry } from '
|
|
1
|
+
import type { ApiDefinitionRegistry } from './apis';
|
|
2
2
|
/*** Validate API definitions in the canonical registry and require key/identity consistency. */
|
|
3
3
|
export declare function isApiDefinitionRegistry(value: unknown): value is ApiDefinitionRegistry;
|
|
4
|
-
//# sourceMappingURL=
|
|
4
|
+
//# sourceMappingURL=isApiDefinitionRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isApiDefinitionRegistry.d.ts","sourceRoot":"","sources":["../../src/data/isApiDefinitionRegistry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAiB,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAoBnE,gGAAgG;AAChG,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAOtF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';
|
|
2
2
|
import { isNonEmptyString, isOptionalString } from '@ankhorage/utility/string';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { isSerializableValue } from '../serializable';
|
|
4
|
+
import { isCredentialRef, isDataEndpointRegistry, isDataSchemaRegistry } from './dataValidation';
|
|
5
5
|
const API_BASE_KEYS = [
|
|
6
6
|
'id',
|
|
7
7
|
'origin',
|
|
@@ -46,7 +46,7 @@ function isApiBaseDefinition(value) {
|
|
|
46
46
|
(value.credential === undefined || isCredentialRef(value.credential)) &&
|
|
47
47
|
isDataEndpointRegistry(value.endpoints) &&
|
|
48
48
|
(value.schemas === undefined || isDataSchemaRegistry(value.schemas)) &&
|
|
49
|
-
(value.metadata === undefined ||
|
|
49
|
+
(value.metadata === undefined || isSerializableValue(value.metadata)));
|
|
50
50
|
}
|
|
51
51
|
/*** Validate external REST endpoint and optional OpenAPI metadata. */
|
|
52
52
|
function isExternalRestApi(value) {
|
|
@@ -79,4 +79,4 @@ function isGraphQlIntrospection(value) {
|
|
|
79
79
|
typeof value.enabled === 'boolean' &&
|
|
80
80
|
isOptionalString(value.schemaVersion));
|
|
81
81
|
}
|
|
82
|
-
//# sourceMappingURL=
|
|
82
|
+
//# sourceMappingURL=isApiDefinitionRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isApiDefinitionRegistry.js","sourceRoot":"","sources":["../../src/data/isApiDefinitionRegistry.ts"],"names":[],"mappings":"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","sourcesContent":["import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';\nimport { isNonEmptyString, isOptionalString } from '@ankhorage/utility/string';\n\nimport { isSerializableValue } from '../serializable';\nimport type { ApiDefinition, ApiDefinitionRegistry } from './apis';\nimport { isCredentialRef, isDataEndpointRegistry, isDataSchemaRegistry } from './dataValidation';\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 || isSerializableValue(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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../src/icon.ts"],"names":[],"mappings":"AAKA,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAqBlD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isRecord } from '@ankhorage/utility/object';
|
|
2
2
|
import { isOptionalString } from '@ankhorage/utility/string';
|
|
3
|
-
import { isMediaAssetReference } from '
|
|
3
|
+
import { isMediaAssetReference } from './media';
|
|
4
4
|
/*** Validate a serializable icon as either a named font glyph or an SVG media reference. */
|
|
5
5
|
export function isIconSpec(value) {
|
|
6
6
|
if (!isRecord(value))
|
package/dist/icon.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon.js","sourceRoot":"","sources":["../src/icon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEhD,4FAA4F;AAC5F,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnC,MAAM,oBAAoB,GACxB,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;QACvB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;QACjC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC,oBAAoB;QAAE,OAAO,KAAK,CAAC;IAExC,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QACtB,OAAO,CACL,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC;YACnC,KAAK,CAAC,IAAI,KAAK,SAAS;YACxB,KAAK,CAAC,QAAQ,KAAK,SAAS,CAC7B,CAAC;IACJ,CAAC;IAED,OAAO,CACL,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,CACjG,CAAC;AACJ,CAAC","sourcesContent":["import { isRecord } from '@ankhorage/utility/object';\nimport { isOptionalString } from '@ankhorage/utility/string';\n\nimport { isMediaAssetReference } from './media';\n\n/*** Validate a serializable icon as either a named font glyph or an SVG media reference. */\nexport function isIconSpec(value: unknown): boolean {\n if (!isRecord(value)) return false;\n\n const hasValidPresentation =\n (value.size === undefined ||\n typeof value.size === 'string' ||\n typeof value.size === 'number') &&\n isOptionalString(value.color);\n if (!hasValidPresentation) return false;\n\n if ('source' in value) {\n return (\n isMediaAssetReference(value.source) &&\n value.name === undefined &&\n value.provider === undefined\n );\n }\n\n return (\n typeof value.name === 'string' && isOptionalString(value.provider) && value.source === undefined\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isInfraAdapterDescriptor.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraAdapterDescriptor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"isInfraAdapterDescriptor.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraAdapterDescriptor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGrE,+GAA+G;AAC/G,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,sBAAsB,CAoBxF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isRecord } from '@ankhorage/utility/object';
|
|
2
|
-
import { INFRA_ADAPTER_CATALOG } from '
|
|
2
|
+
import { INFRA_ADAPTER_CATALOG } from '../infraCatalog';
|
|
3
3
|
import { isInfraShape } from './isInfraShape';
|
|
4
4
|
/*** Installed adapters must match the canonical identity, capabilities, targets and config version exactly. */
|
|
5
5
|
export function isInfraAdapterDescriptor(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isInfraAdapterDescriptor.js","sourceRoot":"","sources":["../../src/infra/isInfraAdapterDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"isInfraAdapterDescriptor.js","sourceRoot":"","sources":["../../src/infra/isInfraAdapterDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,+GAA+G;AAC/G,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;IAClG,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,YAAY,CAAC,KAAK,EAAE;QACzB,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE;QAC3B,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO;QACzC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;QACnC,aAAa,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,CAAC,aAAa;QAC3D,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC;QACtE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;QAC5D,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC;QACtE,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CACpB,KAAK,KAAK,SAAS;YACnB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACnB,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM;gBACpC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAa,EAAE,EAAE,CAC5B,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,CACzF,CAAC;KACP,CAAC,CAAC;AACL,CAAC;AAED,mGAAmG;AACnG,SAAS,kBAAkB,CAAC,KAAc,EAAE,QAA2B;IACrE,OAAO,CACL,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACpB,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAChC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAC1D,CAAC;AACJ,CAAC","sourcesContent":["import { isRecord } from '@ankhorage/utility/object';\n\nimport { INFRA_ADAPTER_CATALOG } from '../infraCatalog';\nimport type { InfraAdapterDescriptor } from '../types/infraAdapters';\nimport { isInfraShape } from './isInfraShape';\n\n/*** Installed adapters must match the canonical identity, capabilities, targets and config version exactly. */\nexport function isInfraAdapterDescriptor(value: unknown): value is InfraAdapterDescriptor {\n if (!isRecord(value)) return false;\n const entry = Object.values(INFRA_ADAPTER_CATALOG).find((candidate) => candidate.id === value.id);\n if (!entry) return false;\n return isInfraShape(value, {\n id: (id) => id === entry.id,\n package: (name) => name === entry.package,\n kind: (kind) => kind === entry.kind,\n configVersion: (version) => version === entry.configVersion,\n capabilities: (items) => matchesCatalogList(items, entry.capabilities),\n targets: (items) => matchesCatalogList(items, entry.targets),\n dependencies: (items) => matchesCatalogList(items, entry.dependencies),\n operations: (items) =>\n items === undefined ||\n (Array.isArray(items) &&\n new Set(items).size === items.length &&\n items.every((item: unknown) =>\n ['suspend', 'resume', 'generate', 'diagnostics'].some((operation) => operation === item),\n )),\n });\n}\n\n/*** Canonical descriptor lists are ordered so JSON discovery and conformance are deterministic. */\nfunction matchesCatalogList(value: unknown, expected: readonly string[]): boolean {\n return (\n Array.isArray(value) &&\n value.length === expected.length &&\n value.every((item, index) => item === expected.at(index))\n );\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { isStringArray } from '@ankhorage/utility/array';
|
|
2
2
|
import { isRecordOf } from '@ankhorage/utility/object';
|
|
3
3
|
import { isOptionalString } from '@ankhorage/utility/string';
|
|
4
|
-
import { isIconSpec } from '../appManifest/icon';
|
|
5
4
|
import { AUTH_OAUTH_PROVIDER_IDS } from '../auth';
|
|
5
|
+
import { isIconSpec } from '../icon';
|
|
6
6
|
import { AUTH_PROFILE_CREATE_STRATEGIES, AUTH_PROFILE_PRIMARY_KEY_STRATEGIES, AUTH_PROFILE_UPDATE_STRATEGIES, AUTH_SCOPES, AUTH_SIGN_IN_IDENTIFIERS, AUTH_SIGN_UP_POLICIES, } from '../types';
|
|
7
7
|
import { isInfraShape } from './isInfraShape';
|
|
8
8
|
/*** Preserve application auth configuration while rejecting nested authorization and unknown providers. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isInfraAuthSpec.js","sourceRoot":"","sources":["../../src/infra/isInfraAuthSpec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"isInfraAuthSpec.js","sourceRoot":"","sources":["../../src/infra/isInfraAuthSpec.ts"],"names":[],"mappings":"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","sourcesContent":["import { isStringArray } from '@ankhorage/utility/array';\nimport { isRecordOf } from '@ankhorage/utility/object';\nimport { isOptionalString } from '@ankhorage/utility/string';\n\nimport { AUTH_OAUTH_PROVIDER_IDS } from '../auth';\nimport { isIconSpec } from '../icon';\nimport {\n AUTH_PROFILE_CREATE_STRATEGIES,\n AUTH_PROFILE_PRIMARY_KEY_STRATEGIES,\n AUTH_PROFILE_UPDATE_STRATEGIES,\n AUTH_SCOPES,\n AUTH_SIGN_IN_IDENTIFIERS,\n AUTH_SIGN_UP_POLICIES,\n} from '../types';\nimport type { InfraAuthSpec } from '../types/infraManifest';\nimport type { InfraShape } from '../types/infraValidation';\nimport { isInfraShape } from './isInfraShape';\n\n/*** Preserve application auth configuration while rejecting nested authorization and unknown providers. */\nexport function isInfraAuthSpec(value: unknown): value is InfraAuthSpec {\n return isInfraShape(value, {\n provider: (provider) => provider === 'supabase',\n scope: (scope) => scope === undefined || AUTH_SCOPES.some((item) => item === scope),\n flow: (flow) => flow === undefined || isAuthFlow(flow),\n signIn: (signIn) =>\n signIn === undefined ||\n isInfraShape(signIn, {\n identifiers: (ids) =>\n Array.isArray(ids) &&\n ids.every((id) => AUTH_SIGN_IN_IDENTIFIERS.some((item) => item === id)),\n }),\n signUp: (signUp) => signUp === undefined || isAuthSignUp(signUp),\n oauth: (oauth) => oauth === undefined || isAuthOAuth(oauth),\n profile: (profile) => profile === undefined || isAuthProfile(profile),\n } satisfies InfraShape<InfraAuthSpec>);\n}\n\n/*** Auth routing intent stays separate from provider-runtime callbacks and Navigator topology. */\nfunction isAuthFlow(value: unknown): boolean {\n return isInfraShape(value, {\n signInRoute: (route) => typeof route === 'string',\n postSignInRoute: (route) => typeof route === 'string',\n signUpRoute: isOptionalString,\n signOutRoute: isOptionalString,\n forgotPasswordRoute: isOptionalString,\n otpRoute: isOptionalString,\n unauthorizedRoute: isOptionalString,\n });\n}\n\n/*** Validate sign-up field intent using the existing application auth contract. */\nfunction isAuthSignUp(value: unknown): boolean {\n return isInfraShape(value, {\n requiredFields: isStringArray,\n optionalFields: (fields) => fields === undefined || isStringArray(fields),\n signUpPolicy: (policy) =>\n policy === undefined || AUTH_SIGN_UP_POLICIES.some((item) => item === policy),\n });\n}\n\n/*** OAuth references contain no credential payload. Custom OAuth identities remain application-owned. */\nfunction isAuthOAuth(value: unknown): boolean {\n return isInfraShape(value, {\n enabled: (enabled) => typeof enabled === 'boolean',\n callbackRoute: (route) => typeof route === 'string',\n providers: (providers) => Array.isArray(providers) && providers.every(isAuthOAuthProvider),\n });\n}\n\n/*** Validate OAuth display/config metadata, preserving explicitly extensible OAuth provider IDs. */\nfunction isAuthOAuthProvider(value: unknown): boolean {\n return isInfraShape(value, {\n id: (id) =>\n typeof id === 'string' &&\n (AUTH_OAUTH_PROVIDER_IDS.some((item) => item === id) || id.length > 0),\n label: isOptionalString,\n enabled: (value) => value === undefined || typeof value === 'boolean',\n scopes: (scopes) => scopes === undefined || isStringArray(scopes),\n queryParams: (params) =>\n params === undefined || isRecordOf(params, (entry) => typeof entry === 'string'),\n icon: (icon) => icon === undefined || isIconSpec(icon),\n credentialsRef: isOptionalString,\n });\n}\n\n/*** Validate profile provisioning choices without inventing a new application profile model. */\nfunction isAuthProfile(value: unknown): boolean {\n return isInfraShape(value, {\n fields: isStringArray,\n table: isOptionalString,\n primaryKey: (key) =>\n key === undefined || AUTH_PROFILE_PRIMARY_KEY_STRATEGIES.some((item) => item === key),\n createStrategy: (strategy) =>\n strategy === undefined || AUTH_PROFILE_CREATE_STRATEGIES.some((item) => item === strategy),\n updateStrategy: (strategy) =>\n strategy === undefined || AUTH_PROFILE_UPDATE_STRATEGIES.some((item) => item === strategy),\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isInfraDeploymentSpec.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraDeploymentSpec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"isInfraDeploymentSpec.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraDeploymentSpec.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,mBAAmB,EAEpB,MAAM,wBAAwB,CAAC;AAMhC,kGAAkG;AAClG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CASlF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isRecord } from '@ankhorage/utility/object';
|
|
2
2
|
import { isNonEmptyString } from '@ankhorage/utility/string';
|
|
3
|
-
import { INFRA_RUNTIME_COMPATIBILITY } from '
|
|
3
|
+
import { INFRA_RUNTIME_COMPATIBILITY } from '../infraCatalog';
|
|
4
4
|
import { infraFields } from './infraFields';
|
|
5
5
|
import { isInfraCredentialRef } from './isInfraCredentialRef';
|
|
6
6
|
import { isInfraShape } from './isInfraShape';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isInfraDeploymentSpec.js","sourceRoot":"","sources":["../../src/infra/isInfraDeploymentSpec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"isInfraDeploymentSpec.js","sourceRoot":"","sources":["../../src/infra/isInfraDeploymentSpec.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRecord } from '@ankhorage/utility/object';\nimport { isNonEmptyString } from '@ankhorage/utility/string';\n\nimport { INFRA_RUNTIME_COMPATIBILITY } from '../infraCatalog';\nimport type {\n InfraComputeSelection,\n InfraDeploymentSpec,\n InfraRuntimeSelection,\n} from '../types/infraManifest';\nimport type { InfraShape } from '../types/infraValidation';\nimport { infraFields } from './infraFields';\nimport { isInfraCredentialRef } from './isInfraCredentialRef';\nimport { isInfraShape } from './isInfraShape';\n\n/*** Validate provider-specific config and the exact same compatibility map used by TypeScript. */\nexport function isInfraDeploymentSpec(value: unknown): value is InfraDeploymentSpec {\n if (!isInfraShape(value, { compute: isCompute, runtime: isRuntime }) || !isRecord(value))\n return false;\n if (!isRecord(value.compute) || !isRecord(value.runtime)) return false;\n const compute = value.compute.provider;\n const runtime = value.runtime.provider;\n return Object.entries(INFRA_RUNTIME_COMPATIBILITY).some(\n ([id, providers]) => id === runtime && providers.some((provider) => provider === compute),\n );\n}\n\n/*** Compute configuration is closed per provider; control-plane refs cannot be managed secrets. */\nfunction isCompute(value: unknown): boolean {\n if (!isRecord(value)) return false;\n if (value.provider === 'local')\n return isInfraShape(value, {\n provider: (provider) => provider === 'local',\n workingDirectory: infraFields.optionalText,\n } satisfies InfraShape<InfraComputeSelection<'local'>>);\n return isInfraShape(value, {\n provider: (provider) => provider === 'hetzner',\n location: isNonEmptyString,\n serverType: infraFields.optionalText,\n image: infraFields.optionalText,\n credentials: (credentials) => credentials === undefined || isInfraCredentialRef(credentials),\n ssh: (ssh) =>\n ssh === undefined ||\n isInfraShape(ssh, {\n user: infraFields.optionalText,\n port: infraFields.optionalPositiveInteger,\n credentials: (credentials) =>\n credentials === undefined || isInfraCredentialRef(credentials),\n }),\n } satisfies InfraShape<InfraComputeSelection<'hetzner'>>);\n}\n\n/*** Runtime topology expresses host roles and never couples k3s to a compute vendor. */\nfunction isRuntime(value: unknown): boolean {\n if (!isRecord(value)) return false;\n switch (value.provider) {\n case 'minikube':\n return isInfraShape(value, {\n provider: (provider) => provider === 'minikube',\n profile: infraFields.optionalText,\n driver: (driver) => driver === undefined || driver === 'docker' || driver === 'podman',\n cpus: infraFields.optionalPositiveInteger,\n memoryMiB: infraFields.optionalPositiveInteger,\n } satisfies InfraShape<InfraRuntimeSelection<'minikube'>>);\n case 'k3s':\n return isInfraShape(value, {\n provider: (provider) => provider === 'k3s',\n version: infraFields.optionalText,\n topology: (topology) =>\n topology === undefined ||\n isInfraShape(topology, {\n servers: infraFields.positiveInteger,\n agents: infraFields.nonnegativeInteger,\n }),\n } satisfies InfraShape<InfraRuntimeSelection<'k3s'>>);\n case 'docker-compose':\n return isInfraShape(value, {\n provider: (provider) => provider === 'docker-compose',\n projectName: infraFields.optionalText,\n } satisfies InfraShape<InfraRuntimeSelection<'docker-compose'>>);\n default:\n return false;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isInfraEnvironmentSpec.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraEnvironmentSpec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"isInfraEnvironmentSpec.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraEnvironmentSpec.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,oBAAoB,EAIrB,MAAM,wBAAwB,CAAC;AAShC,8FAA8F;AAC9F,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAOpF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isRecord } from '@ankhorage/utility/object';
|
|
2
2
|
import { isNonEmptyString } from '@ankhorage/utility/string';
|
|
3
3
|
import { isSerializableSet } from '../collections';
|
|
4
|
-
import { INFRA_ADAPTER_CATALOG } from '
|
|
4
|
+
import { INFRA_ADAPTER_CATALOG } from '../infraCatalog';
|
|
5
5
|
import { infraFields } from './infraFields';
|
|
6
6
|
import { isInfraAuthSpec } from './isInfraAuthSpec';
|
|
7
7
|
import { isInfraCredentialRef } from './isInfraCredentialRef';
|