@ankhorage/contracts 14.0.0 → 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +10 -2
  3. package/dist/appManifest/apis.d.ts +1 -0
  4. package/dist/appManifest/apis.d.ts.map +1 -1
  5. package/dist/appManifest/apis.js +17 -14
  6. package/dist/appManifest/apis.js.map +1 -1
  7. package/dist/appManifest/bindings.d.ts +3 -0
  8. package/dist/appManifest/bindings.d.ts.map +1 -1
  9. package/dist/appManifest/bindings.js +17 -1
  10. package/dist/appManifest/bindings.js.map +1 -1
  11. package/dist/appManifest/constants.d.ts +18 -0
  12. package/dist/appManifest/constants.d.ts.map +1 -0
  13. package/dist/appManifest/constants.js +18 -0
  14. package/dist/appManifest/constants.js.map +1 -0
  15. package/dist/appManifest/data.d.ts +4 -0
  16. package/dist/appManifest/data.d.ts.map +1 -1
  17. package/dist/appManifest/data.js +22 -3
  18. package/dist/appManifest/data.js.map +1 -1
  19. package/dist/appManifest/dataSources.d.ts +1 -0
  20. package/dist/appManifest/dataSources.d.ts.map +1 -1
  21. package/dist/appManifest/dataSources.js +7 -6
  22. package/dist/appManifest/dataSources.js.map +1 -1
  23. package/dist/appManifest/deploy.d.ts +1 -0
  24. package/dist/appManifest/deploy.d.ts.map +1 -1
  25. package/dist/appManifest/deploy.js +16 -13
  26. package/dist/appManifest/deploy.js.map +1 -1
  27. package/dist/appManifest/icon.d.ts.map +1 -1
  28. package/dist/appManifest/icon.js +2 -1
  29. package/dist/appManifest/icon.js.map +1 -1
  30. package/dist/appManifest/isAppManifest.d.ts +4 -0
  31. package/dist/appManifest/isAppManifest.d.ts.map +1 -0
  32. package/dist/appManifest/isAppManifest.js +69 -0
  33. package/dist/appManifest/isAppManifest.js.map +1 -0
  34. package/dist/appManifest/isAppStateSpec.d.ts +4 -0
  35. package/dist/appManifest/isAppStateSpec.d.ts.map +1 -0
  36. package/dist/appManifest/isAppStateSpec.js +9 -0
  37. package/dist/appManifest/isAppStateSpec.js.map +1 -0
  38. package/dist/appManifest/isManifestValue.d.ts +3 -0
  39. package/dist/appManifest/isManifestValue.d.ts.map +1 -0
  40. package/dist/appManifest/isManifestValue.js +15 -0
  41. package/dist/appManifest/isManifestValue.js.map +1 -0
  42. package/dist/appManifest/media.d.ts +1 -0
  43. package/dist/appManifest/media.d.ts.map +1 -1
  44. package/dist/appManifest/media.js +10 -8
  45. package/dist/appManifest/media.js.map +1 -1
  46. package/dist/appManifest/navigator.d.ts.map +1 -1
  47. package/dist/appManifest/navigator.js +7 -6
  48. package/dist/appManifest/navigator.js.map +1 -1
  49. package/dist/appManifest/navigatorOptions.d.ts +0 -2
  50. package/dist/appManifest/navigatorOptions.d.ts.map +1 -1
  51. package/dist/appManifest/navigatorOptions.js +8 -12
  52. package/dist/appManifest/navigatorOptions.js.map +1 -1
  53. package/dist/appManifest/parseAppManifest.d.ts +10 -0
  54. package/dist/appManifest/parseAppManifest.d.ts.map +1 -0
  55. package/dist/appManifest/parseAppManifest.js +14 -0
  56. package/dist/appManifest/parseAppManifest.js.map +1 -0
  57. package/dist/appManifest/screens.d.ts +4 -0
  58. package/dist/appManifest/screens.d.ts.map +1 -1
  59. package/dist/appManifest/screens.js +14 -2
  60. package/dist/appManifest/screens.js.map +1 -1
  61. package/dist/appManifest.d.ts +3 -18
  62. package/dist/appManifest.d.ts.map +1 -1
  63. package/dist/appManifest.js +2 -80
  64. package/dist/appManifest.js.map +1 -1
  65. package/dist/auth.d.ts +3 -2
  66. package/dist/auth.d.ts.map +1 -1
  67. package/dist/auth.js.map +1 -1
  68. package/dist/deploy.d.ts +0 -9
  69. package/dist/deploy.d.ts.map +1 -1
  70. package/dist/deploy.js +0 -8
  71. package/dist/deploy.js.map +1 -1
  72. package/dist/environments.d.ts +4 -0
  73. package/dist/environments.d.ts.map +1 -0
  74. package/dist/environments.js +3 -0
  75. package/dist/environments.js.map +1 -0
  76. package/dist/index.d.ts +2 -1
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +2 -1
  79. package/dist/index.js.map +1 -1
  80. package/dist/infra/constants.d.ts +91 -0
  81. package/dist/infra/constants.d.ts.map +1 -0
  82. package/dist/infra/constants.js +91 -0
  83. package/dist/infra/constants.js.map +1 -0
  84. package/dist/infra/infraFields.d.ts +12 -0
  85. package/dist/infra/infraFields.d.ts.map +1 -0
  86. package/dist/infra/infraFields.js +14 -0
  87. package/dist/infra/infraFields.js.map +1 -0
  88. package/dist/infra/isInfraAdapterDescriptor.d.ts +4 -0
  89. package/dist/infra/isInfraAdapterDescriptor.d.ts.map +1 -0
  90. package/dist/infra/isInfraAdapterDescriptor.js +31 -0
  91. package/dist/infra/isInfraAdapterDescriptor.js.map +1 -0
  92. package/dist/infra/isInfraAuthSpec.d.ts +4 -0
  93. package/dist/infra/isInfraAuthSpec.d.ts.map +1 -0
  94. package/dist/infra/isInfraAuthSpec.js +75 -0
  95. package/dist/infra/isInfraAuthSpec.js.map +1 -0
  96. package/dist/infra/isInfraCredentialRef.d.ts +3 -0
  97. package/dist/infra/isInfraCredentialRef.d.ts.map +1 -0
  98. package/dist/infra/isInfraCredentialRef.js +10 -0
  99. package/dist/infra/isInfraCredentialRef.js.map +1 -0
  100. package/dist/infra/isInfraDeploymentSpec.d.ts +4 -0
  101. package/dist/infra/isInfraDeploymentSpec.d.ts.map +1 -0
  102. package/dist/infra/isInfraDeploymentSpec.js +66 -0
  103. package/dist/infra/isInfraDeploymentSpec.js.map +1 -0
  104. package/dist/infra/isInfraEnvironmentSpec.d.ts +4 -0
  105. package/dist/infra/isInfraEnvironmentSpec.d.ts.map +1 -0
  106. package/dist/infra/isInfraEnvironmentSpec.js +82 -0
  107. package/dist/infra/isInfraEnvironmentSpec.js.map +1 -0
  108. package/dist/infra/isInfraManifest.d.ts +4 -0
  109. package/dist/infra/isInfraManifest.d.ts.map +1 -0
  110. package/dist/infra/isInfraManifest.js +23 -0
  111. package/dist/infra/isInfraManifest.js.map +1 -0
  112. package/dist/infra/isInfraShape.d.ts +3 -0
  113. package/dist/infra/isInfraShape.d.ts.map +1 -0
  114. package/dist/infra/isInfraShape.js +10 -0
  115. package/dist/infra/isInfraShape.js.map +1 -0
  116. package/dist/infra/isInfraWorkloadHealth.d.ts +3 -0
  117. package/dist/infra/isInfraWorkloadHealth.d.ts.map +1 -0
  118. package/dist/infra/isInfraWorkloadHealth.js +37 -0
  119. package/dist/infra/isInfraWorkloadHealth.js.map +1 -0
  120. package/dist/infra/isInfraWorkloadSpec.d.ts +4 -0
  121. package/dist/infra/isInfraWorkloadSpec.d.ts.map +1 -0
  122. package/dist/infra/isInfraWorkloadSpec.js +70 -0
  123. package/dist/infra/isInfraWorkloadSpec.js.map +1 -0
  124. package/dist/infra/isInfraWorkloadValue.d.ts +3 -0
  125. package/dist/infra/isInfraWorkloadValue.d.ts.map +1 -0
  126. package/dist/infra/isInfraWorkloadValue.js +40 -0
  127. package/dist/infra/isInfraWorkloadValue.js.map +1 -0
  128. package/dist/infra/parseInfraManifest.d.ts +5 -0
  129. package/dist/infra/parseInfraManifest.d.ts.map +1 -0
  130. package/dist/infra/parseInfraManifest.js +17 -0
  131. package/dist/infra/parseInfraManifest.js.map +1 -0
  132. package/dist/infra/validateInfraAdapterSelection.d.ts +6 -0
  133. package/dist/infra/validateInfraAdapterSelection.d.ts.map +1 -0
  134. package/dist/infra/validateInfraAdapterSelection.js +36 -0
  135. package/dist/infra/validateInfraAdapterSelection.js.map +1 -0
  136. package/dist/infra.d.ts +16 -0
  137. package/dist/infra.d.ts.map +1 -0
  138. package/dist/infra.js +11 -0
  139. package/dist/infra.js.map +1 -0
  140. package/dist/media.d.ts +7 -6
  141. package/dist/media.d.ts.map +1 -1
  142. package/dist/media.js +5 -5
  143. package/dist/media.js.map +1 -1
  144. package/dist/state.d.ts +5 -0
  145. package/dist/state.d.ts.map +1 -1
  146. package/dist/state.js.map +1 -1
  147. package/dist/types/appManifest.d.ts +9 -0
  148. package/dist/types/appManifest.d.ts.map +1 -0
  149. package/dist/types/appManifest.js +2 -0
  150. package/dist/types/appManifest.js.map +1 -0
  151. package/dist/types/infraAdapters.d.ts +85 -0
  152. package/dist/types/infraAdapters.d.ts.map +1 -0
  153. package/dist/types/infraAdapters.js +2 -0
  154. package/dist/types/infraAdapters.js.map +1 -0
  155. package/dist/types/infraLifecycle.d.ts +107 -0
  156. package/dist/types/infraLifecycle.d.ts.map +1 -0
  157. package/dist/types/infraLifecycle.js +2 -0
  158. package/dist/types/infraLifecycle.js.map +1 -0
  159. package/dist/types/infraManifest.d.ts +142 -0
  160. package/dist/types/infraManifest.d.ts.map +1 -0
  161. package/dist/types/infraManifest.js +2 -0
  162. package/dist/types/infraManifest.js.map +1 -0
  163. package/dist/types/infraSecrets.d.ts +15 -0
  164. package/dist/types/infraSecrets.d.ts.map +1 -0
  165. package/dist/types/infraSecrets.js +2 -0
  166. package/dist/types/infraSecrets.js.map +1 -0
  167. package/dist/types/infraValidation.d.ts +5 -0
  168. package/dist/types/infraValidation.d.ts.map +1 -0
  169. package/dist/types/infraValidation.js +2 -0
  170. package/dist/types/infraValidation.js.map +1 -0
  171. package/dist/types/infraWorkload.d.ts +70 -0
  172. package/dist/types/infraWorkload.d.ts.map +1 -0
  173. package/dist/types/infraWorkload.js +2 -0
  174. package/dist/types/infraWorkload.js.map +1 -0
  175. package/dist/types.d.ts +7 -70
  176. package/dist/types.d.ts.map +1 -1
  177. package/dist/types.js +0 -9
  178. package/dist/types.js.map +1 -1
  179. package/package.json +11 -2
  180. package/src/appManifest/apis.ts +18 -16
  181. package/src/appManifest/bindings.ts +18 -1
  182. package/src/appManifest/constants.ts +19 -0
  183. package/src/appManifest/data.ts +23 -9
  184. package/src/appManifest/dataSources.ts +8 -7
  185. package/src/appManifest/deploy.ts +17 -15
  186. package/src/appManifest/icon.ts +3 -1
  187. package/src/appManifest/isAppManifest.ts +95 -0
  188. package/src/appManifest/isAppStateSpec.ts +13 -0
  189. package/src/appManifest/isManifestValue.ts +19 -0
  190. package/src/appManifest/media.ts +11 -10
  191. package/src/appManifest/navigator.ts +7 -6
  192. package/src/appManifest/navigatorOptions.ts +9 -16
  193. package/src/appManifest/parseAppManifest.ts +15 -0
  194. package/src/appManifest/screens.ts +14 -2
  195. package/src/appManifest.test.ts +9 -5
  196. package/src/appManifest.ts +3 -107
  197. package/src/auth-flow-contract.test.ts +6 -10
  198. package/src/auth-oauth.test.ts +2 -2
  199. package/src/auth.ts +3 -2
  200. package/src/bindings.test.ts +5 -0
  201. package/src/contracts.test.ts +21 -19
  202. package/src/deploy.test.ts +13 -5
  203. package/src/deploy.ts +0 -11
  204. package/src/environments.ts +4 -0
  205. package/src/index.ts +2 -1
  206. package/src/infra/constants.ts +91 -0
  207. package/src/infra/infraFields.ts +20 -0
  208. package/src/infra/isInfraAdapterDescriptor.ts +37 -0
  209. package/src/infra/isInfraAuthSpec.ts +98 -0
  210. package/src/infra/isInfraCredentialRef.ts +11 -0
  211. package/src/infra/isInfraDeploymentSpec.ts +75 -0
  212. package/src/infra/isInfraEnvironmentSpec.ts +95 -0
  213. package/src/infra/isInfraManifest.ts +29 -0
  214. package/src/infra/isInfraShape.ts +16 -0
  215. package/src/infra/isInfraWorkloadHealth.ts +38 -0
  216. package/src/infra/isInfraWorkloadSpec.ts +87 -0
  217. package/src/infra/isInfraWorkloadValue.ts +41 -0
  218. package/src/infra/parseInfraManifest.ts +20 -0
  219. package/src/infra/validateInfraAdapterSelection.ts +42 -0
  220. package/src/infra-types.test.ts +78 -0
  221. package/src/infra-workload.test.ts +186 -0
  222. package/src/infra.test.ts +268 -0
  223. package/src/infra.ts +15 -0
  224. package/src/media.ts +12 -11
  225. package/src/profile-contract.test.ts +2 -3
  226. package/src/secrets.test.ts +19 -13
  227. package/src/state.ts +6 -0
  228. package/src/types/appManifest.ts +5 -0
  229. package/src/types/infraAdapters.ts +148 -0
  230. package/src/types/infraLifecycle.ts +105 -0
  231. package/src/types/infraManifest.ts +130 -0
  232. package/src/types/infraSecrets.ts +16 -0
  233. package/src/types/infraValidation.ts +2 -0
  234. package/src/types/infraWorkload.ts +64 -0
  235. package/src/types.ts +7 -87
  236. package/dist/appManifest/infra.d.ts +0 -2
  237. package/dist/appManifest/infra.d.ts.map +0 -1
  238. package/dist/appManifest/infra.js +0 -130
  239. package/dist/appManifest/infra.js.map +0 -1
  240. package/dist/appManifest/shared.d.ts +0 -8
  241. package/dist/appManifest/shared.d.ts.map +0 -1
  242. package/dist/appManifest/shared.js +0 -31
  243. package/dist/appManifest/shared.js.map +0 -1
  244. package/dist/secretManifest.d.ts +0 -11
  245. package/dist/secretManifest.d.ts.map +0 -1
  246. package/dist/secretManifest.js +0 -2
  247. package/dist/secretManifest.js.map +0 -1
  248. package/src/appManifest/infra.ts +0 -190
  249. package/src/appManifest/shared.ts +0 -40
  250. package/src/secretManifest.ts +0 -12
@@ -0,0 +1 @@
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 { isIconSpec } from '../appManifest/icon';\nimport { AUTH_OAUTH_PROVIDER_IDS } from '../auth';\nimport {\n AUTH_PROFILE_CREATE_STRATEGIES,\n AUTH_PROFILE_PRIMARY_KEY_STRATEGIES,\n AUTH_PROFILE_UPDATE_STRATEGIES,\n AUTH_SCOPES,\n AUTH_SIGN_IN_IDENTIFIERS,\n AUTH_SIGN_UP_POLICIES,\n} 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"]}
@@ -0,0 +1,3 @@
1
+ /*** Bootstrap credential references are explicitly separate from managed runtime secrets. */
2
+ export declare function isInfraCredentialRef(value: unknown): boolean;
3
+ //# sourceMappingURL=isInfraCredentialRef.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraCredentialRef.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraCredentialRef.ts"],"names":[],"mappings":"AAIA,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAK5D"}
@@ -0,0 +1,10 @@
1
+ import { isNonEmptyString } from '@ankhorage/utility/string';
2
+ import { isInfraShape } from './isInfraShape';
3
+ /*** Bootstrap credential references are explicitly separate from managed runtime secrets. */
4
+ export function isInfraCredentialRef(value) {
5
+ return isInfraShape(value, {
6
+ source: (source) => source === 'control-plane',
7
+ name: isNonEmptyString,
8
+ });
9
+ }
10
+ //# sourceMappingURL=isInfraCredentialRef.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraCredentialRef.js","sourceRoot":"","sources":["../../src/infra/isInfraCredentialRef.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,6FAA6F;AAC7F,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,YAAY,CAAC,KAAK,EAAE;QACzB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,eAAe;QAC9C,IAAI,EAAE,gBAAgB;KACvB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { isNonEmptyString } from '@ankhorage/utility/string';\n\nimport { isInfraShape } from './isInfraShape';\n\n/*** Bootstrap credential references are explicitly separate from managed runtime secrets. */\nexport function isInfraCredentialRef(value: unknown): boolean {\n return isInfraShape(value, {\n source: (source) => source === 'control-plane',\n name: isNonEmptyString,\n });\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { InfraDeploymentSpec } from '../types/infraManifest';
2
+ /*** Validate provider-specific config and the exact same compatibility map used by TypeScript. */
3
+ export declare function isInfraDeploymentSpec(value: unknown): value is InfraDeploymentSpec;
4
+ //# sourceMappingURL=isInfraDeploymentSpec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraDeploymentSpec.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraDeploymentSpec.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,mBAAmB,EAEpB,MAAM,wBAAwB,CAAC;AAOhC,kGAAkG;AAClG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CASlF"}
@@ -0,0 +1,66 @@
1
+ import { isRecord } from '@ankhorage/utility/object';
2
+ import { isNonEmptyString } from '@ankhorage/utility/string';
3
+ import { INFRA_RUNTIME_COMPATIBILITY } from './constants';
4
+ import { infraFields } from './infraFields';
5
+ import { isInfraCredentialRef } from './isInfraCredentialRef';
6
+ import { isInfraShape } from './isInfraShape';
7
+ /*** Validate provider-specific config and the exact same compatibility map used by TypeScript. */
8
+ export function isInfraDeploymentSpec(value) {
9
+ if (!isInfraShape(value, { compute: isCompute, runtime: isRuntime }) || !isRecord(value))
10
+ return false;
11
+ if (!isRecord(value.compute) || !isRecord(value.runtime))
12
+ return false;
13
+ const compute = value.compute.provider;
14
+ const runtime = value.runtime.provider;
15
+ return Object.entries(INFRA_RUNTIME_COMPATIBILITY).some(([id, providers]) => id === runtime && providers.some((provider) => provider === compute));
16
+ }
17
+ /*** Compute configuration is closed per provider; control-plane refs cannot be managed secrets. */
18
+ function isCompute(value) {
19
+ if (!isRecord(value))
20
+ return false;
21
+ if (value.provider === 'local')
22
+ return isInfraShape(value, {
23
+ provider: (provider) => provider === 'local',
24
+ workingDirectory: infraFields.optionalText,
25
+ });
26
+ return isInfraShape(value, {
27
+ provider: (provider) => provider === 'hetzner',
28
+ location: isNonEmptyString,
29
+ serverType: infraFields.optionalText,
30
+ image: infraFields.optionalText,
31
+ credentials: (credentials) => credentials === undefined || isInfraCredentialRef(credentials),
32
+ });
33
+ }
34
+ /*** Runtime topology expresses host roles and never couples k3s to a compute vendor. */
35
+ function isRuntime(value) {
36
+ if (!isRecord(value))
37
+ return false;
38
+ switch (value.provider) {
39
+ case 'minikube':
40
+ return isInfraShape(value, {
41
+ provider: (provider) => provider === 'minikube',
42
+ profile: infraFields.optionalText,
43
+ driver: (driver) => driver === undefined || driver === 'docker' || driver === 'podman',
44
+ cpus: infraFields.optionalPositiveInteger,
45
+ memoryMiB: infraFields.optionalPositiveInteger,
46
+ });
47
+ case 'k3s':
48
+ return isInfraShape(value, {
49
+ provider: (provider) => provider === 'k3s',
50
+ version: infraFields.optionalText,
51
+ topology: (topology) => topology === undefined ||
52
+ isInfraShape(topology, {
53
+ servers: infraFields.positiveInteger,
54
+ agents: infraFields.nonnegativeInteger,
55
+ }),
56
+ });
57
+ case 'docker-compose':
58
+ return isInfraShape(value, {
59
+ provider: (provider) => provider === 'docker-compose',
60
+ projectName: infraFields.optionalText,
61
+ });
62
+ default:
63
+ return false;
64
+ }
65
+ }
66
+ //# sourceMappingURL=isInfraDeploymentSpec.js.map
@@ -0,0 +1 @@
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 type {\n InfraComputeSelection,\n InfraDeploymentSpec,\n InfraRuntimeSelection,\n} from '../types/infraManifest';\nimport type { InfraShape } from '../types/infraValidation';\nimport { INFRA_RUNTIME_COMPATIBILITY } from './constants';\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 } 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"]}
@@ -0,0 +1,4 @@
1
+ import type { InfraEnvironmentSpec } from '../types/infraManifest';
2
+ /*** Validate sibling capabilities and their required relationships within one environment. */
3
+ export declare function isInfraEnvironmentSpec(value: unknown): value is InfraEnvironmentSpec;
4
+ //# sourceMappingURL=isInfraEnvironmentSpec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraEnvironmentSpec.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraEnvironmentSpec.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAA0B,MAAM,wBAAwB,CAAC;AAU3F,8FAA8F;AAC9F,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAEpF"}
@@ -0,0 +1,82 @@
1
+ import { isRecord } from '@ankhorage/utility/object';
2
+ import { INFRA_ADAPTER_CATALOG } from './constants';
3
+ import { infraFields } from './infraFields';
4
+ import { isInfraAuthSpec } from './isInfraAuthSpec';
5
+ import { isInfraCredentialRef } from './isInfraCredentialRef';
6
+ import { isInfraDeploymentSpec } from './isInfraDeploymentSpec';
7
+ import { isInfraShape } from './isInfraShape';
8
+ import { isInfraWorkloadSpec } from './isInfraWorkloadSpec';
9
+ /*** Validate sibling capabilities and their required relationships within one environment. */
10
+ export function isInfraEnvironmentSpec(value) {
11
+ return isEnvironmentShape(value) && hasServiceDependencies(value);
12
+ }
13
+ /*** Check all environment field shapes before inspecting canonical dependency metadata. */
14
+ function isEnvironmentShape(value) {
15
+ return isInfraShape(value, {
16
+ deployment: isInfraDeploymentSpec,
17
+ database: (database) => database === undefined ||
18
+ isInfraShape(database, {
19
+ provider: (provider) => provider === 'supabase',
20
+ tier: (tier) => tier === undefined || tier === 'dev' || tier === 'prod',
21
+ }),
22
+ objectStorage: (storage) => storage === undefined || isObjectStorage(storage),
23
+ auth: (auth) => auth === undefined || isInfraAuthSpec(auth),
24
+ authz: (authz) => authz === undefined ||
25
+ isInfraShape(authz, {
26
+ provider: (provider) => provider === 'cerbos',
27
+ kind: (kind) => kind === 'ABAC' || kind === 'RBAC',
28
+ }),
29
+ secretStore: (store) => store === undefined ||
30
+ isInfraShape(store, {
31
+ provider: (provider) => provider === 'supabase-vault',
32
+ schema: infraFields.optionalText,
33
+ }),
34
+ networking: (networking) => networking === undefined || isInfraShape(networking, { domain: infraFields.optionalText }),
35
+ workloads: (workloads) => workloads === undefined || isWorkloads(workloads),
36
+ });
37
+ }
38
+ /*** Object storage can vary independently from database/auth; there is no implicit auto provider. */
39
+ function isObjectStorage(value) {
40
+ if (!isRecord(value))
41
+ return false;
42
+ const common = {
43
+ provider: (provider) => provider === value.provider,
44
+ buckets: infraFields.optionalStrings,
45
+ };
46
+ if (value.provider === 'supabase')
47
+ return isInfraShape(value, common);
48
+ return isInfraShape(value, {
49
+ ...common,
50
+ provider: (provider) => provider === 'r2',
51
+ accountId: infraFields.optionalText,
52
+ credentials: (credentials) => credentials === undefined || isInfraCredentialRef(credentials),
53
+ });
54
+ }
55
+ /*** Duplicate desired workload identities cannot be reconciled safely. */
56
+ function isWorkloads(value) {
57
+ return (Array.isArray(value) &&
58
+ value.every(isInfraWorkloadSpec) &&
59
+ new Set(value.map((workload) => workload.id)).size === value.length);
60
+ }
61
+ /*** Check catalog dependencies against selected sibling capabilities and runtime capabilities. */
62
+ function hasServiceDependencies(value) {
63
+ const selections = [
64
+ value.database,
65
+ value.auth,
66
+ value.authz,
67
+ value.objectStorage,
68
+ value.secretStore,
69
+ ];
70
+ const runtime = Object.values(INFRA_ADAPTER_CATALOG).find((entry) => entry.id === value.deployment.runtime.provider);
71
+ const capabilities = new Set([
72
+ 'compute',
73
+ ...(runtime?.capabilities ?? []),
74
+ ...Object.entries(value)
75
+ .filter(([, selection]) => selection !== undefined)
76
+ .map(([capability]) => capability),
77
+ ]);
78
+ return Object.values(INFRA_ADAPTER_CATALOG)
79
+ .filter((entry) => selections.some((selection) => selection?.provider === entry.id))
80
+ .every((entry) => entry.dependencies.every((dependency) => capabilities.has(dependency)));
81
+ }
82
+ //# sourceMappingURL=isInfraEnvironmentSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraEnvironmentSpec.js","sourceRoot":"","sources":["../../src/infra/isInfraEnvironmentSpec.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRecord } from '@ankhorage/utility/object';\n\nimport type { InfraEnvironmentSpec, InfraObjectStorageSpec } from '../types/infraManifest';\nimport type { InfraShape } from '../types/infraValidation';\nimport { INFRA_ADAPTER_CATALOG } from './constants';\nimport { infraFields } from './infraFields';\nimport { isInfraAuthSpec } from './isInfraAuthSpec';\nimport { isInfraCredentialRef } from './isInfraCredentialRef';\nimport { isInfraDeploymentSpec } from './isInfraDeploymentSpec';\nimport { isInfraShape } from './isInfraShape';\nimport { isInfraWorkloadSpec } from './isInfraWorkloadSpec';\n\n/*** Validate sibling capabilities and their required relationships within one environment. */\nexport function isInfraEnvironmentSpec(value: unknown): value is InfraEnvironmentSpec {\n return isEnvironmentShape(value) && hasServiceDependencies(value);\n}\n\n/*** Check all environment field shapes before inspecting canonical dependency metadata. */\nfunction isEnvironmentShape(value: unknown): value is InfraEnvironmentSpec {\n return isInfraShape(value, {\n deployment: isInfraDeploymentSpec,\n database: (database) =>\n database === undefined ||\n isInfraShape(database, {\n provider: (provider) => provider === 'supabase',\n tier: (tier) => tier === undefined || tier === 'dev' || tier === 'prod',\n }),\n objectStorage: (storage) => storage === undefined || isObjectStorage(storage),\n auth: (auth) => auth === undefined || isInfraAuthSpec(auth),\n authz: (authz) =>\n authz === undefined ||\n isInfraShape(authz, {\n provider: (provider) => provider === 'cerbos',\n kind: (kind) => kind === 'ABAC' || kind === 'RBAC',\n }),\n secretStore: (store) =>\n store === undefined ||\n isInfraShape(store, {\n provider: (provider) => provider === 'supabase-vault',\n schema: infraFields.optionalText,\n }),\n networking: (networking) =>\n networking === undefined || isInfraShape(networking, { domain: infraFields.optionalText }),\n workloads: (workloads) => workloads === undefined || isWorkloads(workloads),\n } satisfies InfraShape<InfraEnvironmentSpec>);\n}\n\n/*** Object storage can vary independently from database/auth; there is no implicit auto provider. */\nfunction isObjectStorage(value: unknown): boolean {\n if (!isRecord(value)) return false;\n const common = {\n provider: (provider: unknown) => provider === value.provider,\n buckets: infraFields.optionalStrings,\n };\n if (value.provider === 'supabase') return isInfraShape(value, common);\n return isInfraShape(value, {\n ...common,\n provider: (provider) => provider === 'r2',\n accountId: infraFields.optionalText,\n credentials: (credentials) => credentials === undefined || isInfraCredentialRef(credentials),\n } satisfies InfraShape<Extract<InfraObjectStorageSpec, { readonly provider: 'r2' }>>);\n}\n\n/*** Duplicate desired workload identities cannot be reconciled safely. */\nfunction isWorkloads(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.every(isInfraWorkloadSpec) &&\n new Set(value.map((workload) => workload.id)).size === value.length\n );\n}\n\n/*** Check catalog dependencies against selected sibling capabilities and runtime capabilities. */\nfunction hasServiceDependencies(value: InfraEnvironmentSpec): boolean {\n const selections = [\n value.database,\n value.auth,\n value.authz,\n value.objectStorage,\n value.secretStore,\n ];\n const runtime = Object.values(INFRA_ADAPTER_CATALOG).find(\n (entry) => entry.id === value.deployment.runtime.provider,\n );\n const capabilities = new Set<string>([\n 'compute',\n ...(runtime?.capabilities ?? []),\n ...Object.entries(value)\n .filter(([, selection]) => selection !== undefined)\n .map(([capability]) => capability),\n ]);\n return Object.values(INFRA_ADAPTER_CATALOG)\n .filter((entry) => selections.some((selection) => selection?.provider === entry.id))\n .every((entry) => entry.dependencies.every((dependency) => capabilities.has(dependency)));\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { InfraManifest } from '../types/infraManifest';
2
+ /*** Validate standalone infrastructure without AppManifest, Deploy or provider package side effects. */
3
+ export declare function isInfraManifest(value: unknown): value is InfraManifest;
4
+ //# sourceMappingURL=isInfraManifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraManifest.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraManifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAM5D,wGAAwG;AACxG,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAOtE"}
@@ -0,0 +1,23 @@
1
+ import { isRecord } from '@ankhorage/utility/object';
2
+ import { isApiDefinitionList } from '../appManifest/apis';
3
+ import { APP_ENVIRONMENT_IDS } from '../environments';
4
+ import { infraFields } from './infraFields';
5
+ import { isInfraEnvironmentSpec } from './isInfraEnvironmentSpec';
6
+ import { isInfraShape } from './isInfraShape';
7
+ /*** Validate standalone infrastructure without AppManifest, Deploy or provider package side effects. */
8
+ export function isInfraManifest(value) {
9
+ return isInfraShape(value, {
10
+ environments: isEnvironments,
11
+ apis: (apis) => apis === undefined || isApiDefinitionList(apis),
12
+ modules: infraFields.strings,
13
+ modulesConfig: (config) => config === undefined || isRecord(config),
14
+ });
15
+ }
16
+ /*** Local is required; preview and production are optional but never inferred from arbitrary keys. */
17
+ function isEnvironments(value) {
18
+ if (!isRecord(value) || !isInfraEnvironmentSpec(value.local))
19
+ return false;
20
+ return Object.entries(value).every(([key, environment]) => APP_ENVIRONMENT_IDS.some((id) => id === key) &&
21
+ ((environment === undefined && key !== 'local') || isInfraEnvironmentSpec(environment)));
22
+ }
23
+ //# sourceMappingURL=isInfraManifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraManifest.js","sourceRoot":"","sources":["../../src/infra/isInfraManifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,wGAAwG;AACxG,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,YAAY,CAAC,KAAK,EAAE;QACzB,YAAY,EAAE,cAAc;QAC5B,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,mBAAmB,CAAC,IAAI,CAAC;QAC/D,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC;KAChC,CAAC,CAAC;AACzC,CAAC;AAED,sGAAsG;AACtG,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3E,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAChC,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE,CACrB,mBAAmB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC;QAC5C,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO,CAAC,IAAI,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAC1F,CAAC;AACJ,CAAC","sourcesContent":["import { isRecord } from '@ankhorage/utility/object';\n\nimport { isApiDefinitionList } from '../appManifest/apis';\nimport { APP_ENVIRONMENT_IDS } from '../environments';\nimport type { InfraManifest } from '../types/infraManifest';\nimport type { InfraShape } from '../types/infraValidation';\nimport { infraFields } from './infraFields';\nimport { isInfraEnvironmentSpec } from './isInfraEnvironmentSpec';\nimport { isInfraShape } from './isInfraShape';\n\n/*** Validate standalone infrastructure without AppManifest, Deploy or provider package side effects. */\nexport function isInfraManifest(value: unknown): value is InfraManifest {\n return isInfraShape(value, {\n environments: isEnvironments,\n apis: (apis) => apis === undefined || isApiDefinitionList(apis),\n modules: infraFields.strings,\n modulesConfig: (config) => config === undefined || isRecord(config),\n } satisfies InfraShape<InfraManifest>);\n}\n\n/*** Local is required; preview and production are optional but never inferred from arbitrary keys. */\nfunction isEnvironments(value: unknown): boolean {\n if (!isRecord(value) || !isInfraEnvironmentSpec(value.local)) return false;\n return Object.entries(value).every(\n ([key, environment]) =>\n APP_ENVIRONMENT_IDS.some((id) => id === key) &&\n ((environment === undefined && key !== 'local') || isInfraEnvironmentSpec(environment)),\n );\n}\n"]}
@@ -0,0 +1,3 @@
1
+ /*** Validate an exact Infra object shape, rejecting unknown and superseded configuration keys. */
2
+ export declare function isInfraShape(value: unknown, fields: Readonly<Record<string, (field: unknown) => boolean>>): boolean;
3
+ //# sourceMappingURL=isInfraShape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraShape.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraShape.ts"],"names":[],"mappings":"AAEA,kGAAkG;AAClG,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,GAC5D,OAAO,CAST"}
@@ -0,0 +1,10 @@
1
+ import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';
2
+ /*** Validate an exact Infra object shape, rejecting unknown and superseded configuration keys. */
3
+ export function isInfraShape(value, fields) {
4
+ if (!isRecord(value))
5
+ return false;
6
+ const entries = Object.entries(fields);
7
+ return (hasOnlyKeys(value, Object.keys(fields)) &&
8
+ entries.every(([key, validate]) => validate(Object.hasOwn(value, key) ? Reflect.get(value, key) : undefined)));
9
+ }
10
+ //# sourceMappingURL=isInfraShape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraShape.js","sourceRoot":"","sources":["../../src/infra/isInfraShape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAElE,kGAAkG;AAClG,MAAM,UAAU,YAAY,CAC1B,KAAc,EACd,MAA6D;IAE7D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,CACL,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,CAChC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAC1E,CACF,CAAC;AACJ,CAAC","sourcesContent":["import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';\n\n/*** Validate an exact Infra object shape, rejecting unknown and superseded configuration keys. */\nexport function isInfraShape(\n value: unknown,\n fields: Readonly<Record<string, (field: unknown) => boolean>>,\n): boolean {\n if (!isRecord(value)) return false;\n const entries = Object.entries(fields);\n return (\n hasOnlyKeys(value, Object.keys(fields)) &&\n entries.every(([key, validate]) =>\n validate(Object.hasOwn(value, key) ? Reflect.get(value, key) : undefined),\n )\n );\n}\n"]}
@@ -0,0 +1,3 @@
1
+ /*** Validate runtime-neutral readiness probes and bounded numeric parameters. */
2
+ export declare function isInfraWorkloadHealth(value: unknown): boolean;
3
+ //# sourceMappingURL=isInfraWorkloadHealth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraWorkloadHealth.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraWorkloadHealth.ts"],"names":[],"mappings":"AAKA,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA+B7D"}
@@ -0,0 +1,37 @@
1
+ import { isRecord } from '@ankhorage/utility/object';
2
+ import { infraFields } from './infraFields';
3
+ import { isInfraShape } from './isInfraShape';
4
+ /*** Validate runtime-neutral readiness probes and bounded numeric parameters. */
5
+ export function isInfraWorkloadHealth(value) {
6
+ if (!isRecord(value))
7
+ return false;
8
+ const timing = {
9
+ intervalSeconds: infraFields.optionalPositiveInteger,
10
+ timeoutSeconds: infraFields.optionalPositiveInteger,
11
+ failureThreshold: infraFields.optionalPositiveInteger,
12
+ };
13
+ switch (value.kind) {
14
+ case 'http':
15
+ return isInfraShape(value, {
16
+ ...timing,
17
+ kind: (kind) => kind === 'http',
18
+ port: infraFields.port,
19
+ path: (path) => typeof path === 'string' && path.startsWith('/'),
20
+ });
21
+ case 'tcp':
22
+ return isInfraShape(value, {
23
+ ...timing,
24
+ kind: (kind) => kind === 'tcp',
25
+ port: infraFields.port,
26
+ });
27
+ case 'command':
28
+ return isInfraShape(value, {
29
+ ...timing,
30
+ kind: (kind) => kind === 'command',
31
+ command: (command) => Array.isArray(command) && command.length > 0 && infraFields.strings(command),
32
+ });
33
+ default:
34
+ return false;
35
+ }
36
+ }
37
+ //# sourceMappingURL=isInfraWorkloadHealth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraWorkloadHealth.js","sourceRoot":"","sources":["../../src/infra/isInfraWorkloadHealth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,iFAAiF;AACjF,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,MAAM,GAAG;QACb,eAAe,EAAE,WAAW,CAAC,uBAAuB;QACpD,cAAc,EAAE,WAAW,CAAC,uBAAuB;QACnD,gBAAgB,EAAE,WAAW,CAAC,uBAAuB;KACtD,CAAC;IACF,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,KAAK,EAAE;gBACzB,GAAG,MAAM;gBACT,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM;gBAC/B,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;aACjE,CAAC,CAAC;QACL,KAAK,KAAK;YACR,OAAO,YAAY,CAAC,KAAK,EAAE;gBACzB,GAAG,MAAM;gBACT,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK;gBAC9B,IAAI,EAAE,WAAW,CAAC,IAAI;aACvB,CAAC,CAAC;QACL,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,KAAK,EAAE;gBACzB,GAAG,MAAM;gBACT,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS;gBAClC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACnB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;aAC/E,CAAC,CAAC;QACL;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC","sourcesContent":["import { isRecord } from '@ankhorage/utility/object';\n\nimport { infraFields } from './infraFields';\nimport { isInfraShape } from './isInfraShape';\n\n/*** Validate runtime-neutral readiness probes and bounded numeric parameters. */\nexport function isInfraWorkloadHealth(value: unknown): boolean {\n if (!isRecord(value)) return false;\n const timing = {\n intervalSeconds: infraFields.optionalPositiveInteger,\n timeoutSeconds: infraFields.optionalPositiveInteger,\n failureThreshold: infraFields.optionalPositiveInteger,\n };\n switch (value.kind) {\n case 'http':\n return isInfraShape(value, {\n ...timing,\n kind: (kind) => kind === 'http',\n port: infraFields.port,\n path: (path) => typeof path === 'string' && path.startsWith('/'),\n });\n case 'tcp':\n return isInfraShape(value, {\n ...timing,\n kind: (kind) => kind === 'tcp',\n port: infraFields.port,\n });\n case 'command':\n return isInfraShape(value, {\n ...timing,\n kind: (kind) => kind === 'command',\n command: (command) =>\n Array.isArray(command) && command.length > 0 && infraFields.strings(command),\n });\n default:\n return false;\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { InfraWorkloadSpec } from '../types/infraWorkload';
2
+ /*** Validate the portable desired workload; runtime-specific fields and plaintext secret objects fail. */
3
+ export declare function isInfraWorkloadSpec(value: unknown): value is InfraWorkloadSpec;
4
+ //# sourceMappingURL=isInfraWorkloadSpec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraWorkloadSpec.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraWorkloadSpec.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAMhE,0GAA0G;AAC1G,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAkC9E"}
@@ -0,0 +1,70 @@
1
+ import { isStringArray } from '@ankhorage/utility/array';
2
+ import { isRecord } from '@ankhorage/utility/object';
3
+ import { isNonEmptyString } from '@ankhorage/utility/string';
4
+ import { infraFields } from './infraFields';
5
+ import { isInfraShape } from './isInfraShape';
6
+ import { isInfraWorkloadHealth } from './isInfraWorkloadHealth';
7
+ import { isInfraWorkloadValue } from './isInfraWorkloadValue';
8
+ /*** Validate the portable desired workload; runtime-specific fields and plaintext secret objects fail. */
9
+ export function isInfraWorkloadSpec(value) {
10
+ return isInfraShape(value, {
11
+ id: isNonEmptyString,
12
+ artifact: (artifact) => isInfraShape(artifact, { kind: (kind) => kind === 'image', image: isNonEmptyString }),
13
+ command: infraFields.optionalStrings,
14
+ args: (args) => args === undefined || isStringArray(args),
15
+ ports: (ports) => ports === undefined ||
16
+ (Array.isArray(ports) && ports.every(isPort) && hasUniqueField(ports, 'name')),
17
+ environment: (environment) => environment === undefined ||
18
+ (isRecord(environment) && Object.values(environment).every(isInfraWorkloadValue)),
19
+ files: (files) => files === undefined ||
20
+ (Array.isArray(files) && files.every(isFile) && hasUniqueField(files, 'path')),
21
+ health: (health) => health === undefined || isInfraWorkloadHealth(health),
22
+ resources: (resources) => resources === undefined ||
23
+ isInfraShape(resources, {
24
+ cpuMillis: infraFields.optionalPositiveInteger,
25
+ memoryMiB: infraFields.optionalPositiveInteger,
26
+ }),
27
+ persistence: (volumes) => volumes === undefined ||
28
+ (Array.isArray(volumes) &&
29
+ volumes.every(isVolume) &&
30
+ hasUniqueField(volumes, 'id') &&
31
+ hasUniqueField(volumes, 'mountPath')),
32
+ exposure: (exposure) => exposure === undefined || exposure === 'internal' || exposure === 'public',
33
+ replicas: infraFields.optionalNonnegativeInteger,
34
+ dependsOn: infraFields.optionalStrings,
35
+ });
36
+ }
37
+ /*** Named transport ports stay independent from runtime resource types. */
38
+ function isPort(value) {
39
+ return isInfraShape(value, {
40
+ name: isNonEmptyString,
41
+ port: infraFields.port,
42
+ protocol: (protocol) => protocol === undefined || protocol === 'tcp' || protocol === 'udp',
43
+ });
44
+ }
45
+ /*** Portable files model policy/config materialization without host filesystem access. */
46
+ function isFile(value) {
47
+ return isInfraShape(value, { path: isAbsoluteWorkloadPath, content: isInfraWorkloadValue });
48
+ }
49
+ /*** Persistence has explicit ownership-local identity and a retention policy. */
50
+ function isVolume(value) {
51
+ return isInfraShape(value, {
52
+ id: isNonEmptyString,
53
+ mountPath: isAbsoluteWorkloadPath,
54
+ sizeGiB: infraFields.positiveInteger,
55
+ retention: (retention) => retention === 'retain' || retention === 'delete-on-destroy',
56
+ });
57
+ }
58
+ /*** Workload paths are absolute container paths, never relative host traversal. */
59
+ function isAbsoluteWorkloadPath(value) {
60
+ return (typeof value === 'string' &&
61
+ value.startsWith('/') &&
62
+ value.length > 1 &&
63
+ !value.split('/').includes('..'));
64
+ }
65
+ /*** Duplicate workload-local identities would make runtime projection ambiguous. */
66
+ function hasUniqueField(values, field) {
67
+ const ids = values.map((value) => (isRecord(value) ? Reflect.get(value, field) : undefined));
68
+ return new Set(ids).size === ids.length;
69
+ }
70
+ //# sourceMappingURL=isInfraWorkloadSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraWorkloadSpec.js","sourceRoot":"","sources":["../../src/infra/isInfraWorkloadSpec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAI7D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,0GAA0G;AAC1G,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,YAAY,CAAC,KAAK,EAAE;QACzB,EAAE,EAAE,gBAAgB;QACpB,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CACrB,YAAY,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QACvF,OAAO,EAAE,WAAW,CAAC,eAAe;QACpC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC;QACzD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,KAAK,KAAK,SAAS;YACnB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChF,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE,CAC3B,WAAW,KAAK,SAAS;YACzB,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACnF,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,KAAK,KAAK,SAAS;YACnB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChF,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,IAAI,qBAAqB,CAAC,MAAM,CAAC;QACzE,SAAS,EAAE,CAAC,SAAS,EAAE,EAAE,CACvB,SAAS,KAAK,SAAS;YACvB,YAAY,CAAC,SAAS,EAAE;gBACtB,SAAS,EAAE,WAAW,CAAC,uBAAuB;gBAC9C,SAAS,EAAE,WAAW,CAAC,uBAAuB;aAC/C,CAAC;QACJ,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CACvB,OAAO,KAAK,SAAS;YACrB,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACvB,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC;gBAC7B,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACzC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CACrB,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,QAAQ;QAC5E,QAAQ,EAAE,WAAW,CAAC,0BAA0B;QAChD,SAAS,EAAE,WAAW,CAAC,eAAe;KACC,CAAC,CAAC;AAC7C,CAAC;AAED,2EAA2E;AAC3E,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,YAAY,CAAC,KAAK,EAAE;QACzB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK;KAC3F,CAAC,CAAC;AACL,CAAC;AAED,0FAA0F;AAC1F,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,YAAY,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,iFAAiF;AACjF,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,YAAY,CAAC,KAAK,EAAE;QACzB,EAAE,EAAE,gBAAgB;QACpB,SAAS,EAAE,sBAAsB;QACjC,OAAO,EAAE,WAAW,CAAC,eAAe;QACpC,SAAS,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,mBAAmB;KACtF,CAAC,CAAC;AACL,CAAC;AAED,mFAAmF;AACnF,SAAS,sBAAsB,CAAC,KAAc;IAC5C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CACjC,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,SAAS,cAAc,CAAC,MAA0B,EAAE,KAAa;IAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7F,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC;AAC1C,CAAC","sourcesContent":["import { isStringArray } from '@ankhorage/utility/array';\nimport { isRecord } from '@ankhorage/utility/object';\nimport { isNonEmptyString } from '@ankhorage/utility/string';\n\nimport type { InfraShape } from '../types/infraValidation';\nimport type { InfraWorkloadSpec } from '../types/infraWorkload';\nimport { infraFields } from './infraFields';\nimport { isInfraShape } from './isInfraShape';\nimport { isInfraWorkloadHealth } from './isInfraWorkloadHealth';\nimport { isInfraWorkloadValue } from './isInfraWorkloadValue';\n\n/*** Validate the portable desired workload; runtime-specific fields and plaintext secret objects fail. */\nexport function isInfraWorkloadSpec(value: unknown): value is InfraWorkloadSpec {\n return isInfraShape(value, {\n id: isNonEmptyString,\n artifact: (artifact) =>\n isInfraShape(artifact, { kind: (kind) => kind === 'image', image: isNonEmptyString }),\n command: infraFields.optionalStrings,\n args: (args) => args === undefined || isStringArray(args),\n ports: (ports) =>\n ports === undefined ||\n (Array.isArray(ports) && ports.every(isPort) && hasUniqueField(ports, 'name')),\n environment: (environment) =>\n environment === undefined ||\n (isRecord(environment) && Object.values(environment).every(isInfraWorkloadValue)),\n files: (files) =>\n files === undefined ||\n (Array.isArray(files) && files.every(isFile) && hasUniqueField(files, 'path')),\n health: (health) => health === undefined || isInfraWorkloadHealth(health),\n resources: (resources) =>\n resources === undefined ||\n isInfraShape(resources, {\n cpuMillis: infraFields.optionalPositiveInteger,\n memoryMiB: infraFields.optionalPositiveInteger,\n }),\n persistence: (volumes) =>\n volumes === undefined ||\n (Array.isArray(volumes) &&\n volumes.every(isVolume) &&\n hasUniqueField(volumes, 'id') &&\n hasUniqueField(volumes, 'mountPath')),\n exposure: (exposure) =>\n exposure === undefined || exposure === 'internal' || exposure === 'public',\n replicas: infraFields.optionalNonnegativeInteger,\n dependsOn: infraFields.optionalStrings,\n } satisfies InfraShape<InfraWorkloadSpec>);\n}\n\n/*** Named transport ports stay independent from runtime resource types. */\nfunction isPort(value: unknown): boolean {\n return isInfraShape(value, {\n name: isNonEmptyString,\n port: infraFields.port,\n protocol: (protocol) => protocol === undefined || protocol === 'tcp' || protocol === 'udp',\n });\n}\n\n/*** Portable files model policy/config materialization without host filesystem access. */\nfunction isFile(value: unknown): boolean {\n return isInfraShape(value, { path: isAbsoluteWorkloadPath, content: isInfraWorkloadValue });\n}\n\n/*** Persistence has explicit ownership-local identity and a retention policy. */\nfunction isVolume(value: unknown): boolean {\n return isInfraShape(value, {\n id: isNonEmptyString,\n mountPath: isAbsoluteWorkloadPath,\n sizeGiB: infraFields.positiveInteger,\n retention: (retention) => retention === 'retain' || retention === 'delete-on-destroy',\n });\n}\n\n/*** Workload paths are absolute container paths, never relative host traversal. */\nfunction isAbsoluteWorkloadPath(value: unknown): boolean {\n return (\n typeof value === 'string' &&\n value.startsWith('/') &&\n value.length > 1 &&\n !value.split('/').includes('..')\n );\n}\n\n/*** Duplicate workload-local identities would make runtime projection ambiguous. */\nfunction hasUniqueField(values: readonly unknown[], field: string): boolean {\n const ids = values.map((value) => (isRecord(value) ? Reflect.get(value, field) : undefined));\n return new Set(ids).size === ids.length;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ /*** Workload values explicitly distinguish public literals, output dependencies and secret references. */
2
+ export declare function isInfraWorkloadValue(value: unknown): boolean;
3
+ //# sourceMappingURL=isInfraWorkloadValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraWorkloadValue.d.ts","sourceRoot":"","sources":["../../src/infra/isInfraWorkloadValue.ts"],"names":[],"mappings":"AAMA,0GAA0G;AAC1G,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAsB5D"}
@@ -0,0 +1,40 @@
1
+ import { isRecord } from '@ankhorage/utility/object';
2
+ import { isNonEmptyString } from '@ankhorage/utility/string';
3
+ import { APP_ENVIRONMENT_IDS } from '../environments';
4
+ import { isInfraShape } from './isInfraShape';
5
+ /*** Workload values explicitly distinguish public literals, output dependencies and secret references. */
6
+ export function isInfraWorkloadValue(value) {
7
+ if (!isRecord(value))
8
+ return false;
9
+ switch (value.kind) {
10
+ case 'literal':
11
+ return isInfraShape(value, {
12
+ kind: (kind) => kind === 'literal',
13
+ value: (field) => typeof field === 'string',
14
+ });
15
+ case 'output':
16
+ return isInfraShape(value, {
17
+ kind: (kind) => kind === 'output',
18
+ resourceId: isNonEmptyString,
19
+ output: isNonEmptyString,
20
+ });
21
+ case 'secret':
22
+ return isInfraShape(value, {
23
+ kind: (kind) => kind === 'secret',
24
+ reference: isSecretReference,
25
+ });
26
+ default:
27
+ return false;
28
+ }
29
+ }
30
+ /*** Managed secret references contain identity only, never privileged payloads. */
31
+ function isSecretReference(value) {
32
+ return isInfraShape(value, {
33
+ source: (source) => source === 'secret-store',
34
+ projectId: isNonEmptyString,
35
+ environment: (environment) => APP_ENVIRONMENT_IDS.some((id) => id === environment),
36
+ ref: isNonEmptyString,
37
+ key: isNonEmptyString,
38
+ });
39
+ }
40
+ //# sourceMappingURL=isInfraWorkloadValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isInfraWorkloadValue.js","sourceRoot":"","sources":["../../src/infra/isInfraWorkloadValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,0GAA0G;AAC1G,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,KAAK,EAAE;gBACzB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS;gBAClC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ;aAC5C,CAAC,CAAC;QACL,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,KAAK,EAAE;gBACzB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ;gBACjC,UAAU,EAAE,gBAAgB;gBAC5B,MAAM,EAAE,gBAAgB;aACzB,CAAC,CAAC;QACL,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,KAAK,EAAE;gBACzB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ;gBACjC,SAAS,EAAE,iBAAiB;aAC7B,CAAC,CAAC;QACL;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,YAAY,CAAC,KAAK,EAAE;QACzB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,cAAc;QAC7C,SAAS,EAAE,gBAAgB;QAC3B,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,WAAW,CAAC;QAClF,GAAG,EAAE,gBAAgB;QACrB,GAAG,EAAE,gBAAgB;KACtB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { isRecord } from '@ankhorage/utility/object';\nimport { isNonEmptyString } from '@ankhorage/utility/string';\n\nimport { APP_ENVIRONMENT_IDS } from '../environments';\nimport { isInfraShape } from './isInfraShape';\n\n/*** Workload values explicitly distinguish public literals, output dependencies and secret references. */\nexport function isInfraWorkloadValue(value: unknown): boolean {\n if (!isRecord(value)) return false;\n switch (value.kind) {\n case 'literal':\n return isInfraShape(value, {\n kind: (kind) => kind === 'literal',\n value: (field) => typeof field === 'string',\n });\n case 'output':\n return isInfraShape(value, {\n kind: (kind) => kind === 'output',\n resourceId: isNonEmptyString,\n output: isNonEmptyString,\n });\n case 'secret':\n return isInfraShape(value, {\n kind: (kind) => kind === 'secret',\n reference: isSecretReference,\n });\n default:\n return false;\n }\n}\n\n/*** Managed secret references contain identity only, never privileged payloads. */\nfunction isSecretReference(value: unknown): boolean {\n return isInfraShape(value, {\n source: (source) => source === 'secret-store',\n projectId: isNonEmptyString,\n environment: (environment) => APP_ENVIRONMENT_IDS.some((id) => id === environment),\n ref: isNonEmptyString,\n key: isNonEmptyString,\n });\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { InfraResult } from '../types/infraLifecycle';
2
+ import type { InfraManifest } from '../types/infraManifest';
3
+ /** Parse unknown infrastructure input; package availability and credentials are separate validation stages. */
4
+ export declare function parseInfraManifest(value: unknown): InfraResult<InfraManifest>;
5
+ //# sourceMappingURL=parseInfraManifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseInfraManifest.d.ts","sourceRoot":"","sources":["../../src/infra/parseInfraManifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAG5D,+GAA+G;AAC/G,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,aAAa,CAAC,CAc7E"}
@@ -0,0 +1,17 @@
1
+ import { isInfraManifest } from './isInfraManifest';
2
+ /** Parse unknown infrastructure input; package availability and credentials are separate validation stages. */
3
+ export function parseInfraManifest(value) {
4
+ return isInfraManifest(value)
5
+ ? { ok: true, value, diagnostics: [] }
6
+ : {
7
+ ok: false,
8
+ diagnostics: [
9
+ {
10
+ severity: 'error',
11
+ code: 'invalid_manifest',
12
+ message: 'Expected canonical Infra environments with supported provider configuration and compute/runtime compatibility.',
13
+ },
14
+ ],
15
+ };
16
+ }
17
+ //# sourceMappingURL=parseInfraManifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseInfraManifest.js","sourceRoot":"","sources":["../../src/infra/parseInfraManifest.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,+GAA+G;AAC/G,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,eAAe,CAAC,KAAK,CAAC;QAC3B,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;QACtC,CAAC,CAAC;YACE,EAAE,EAAE,KAAK;YACT,WAAW,EAAE;gBACX;oBACE,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EACL,gHAAgH;iBACnH;aACF;SACF,CAAC;AACR,CAAC","sourcesContent":["import type { InfraResult } from '../types/infraLifecycle';\nimport type { InfraManifest } from '../types/infraManifest';\nimport { isInfraManifest } from './isInfraManifest';\n\n/** Parse unknown infrastructure input; package availability and credentials are separate validation stages. */\nexport function parseInfraManifest(value: unknown): InfraResult<InfraManifest> {\n return isInfraManifest(value)\n ? { ok: true, value, diagnostics: [] }\n : {\n ok: false,\n diagnostics: [\n {\n severity: 'error',\n code: 'invalid_manifest',\n message:\n 'Expected canonical Infra environments with supported provider configuration and compute/runtime compatibility.',\n },\n ],\n };\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { InfraAdapterDescriptor } from '../types/infraAdapters';
2
+ import type { InfraResult } from '../types/infraLifecycle';
3
+ import type { InfraEnvironmentSpec } from '../types/infraManifest';
4
+ /** Validate supplied installed descriptors without imports or filesystem access; only selected packages matter. */
5
+ export declare function validateInfraAdapterSelection(environment: InfraEnvironmentSpec, installed: readonly unknown[]): InfraResult<readonly InfraAdapterDescriptor[]>;
6
+ //# sourceMappingURL=validateInfraAdapterSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateInfraAdapterSelection.d.ts","sourceRoot":"","sources":["../../src/infra/validateInfraAdapterSelection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAInE,mHAAmH;AACnH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,oBAAoB,EACjC,SAAS,EAAE,SAAS,OAAO,EAAE,GAC5B,WAAW,CAAC,SAAS,sBAAsB,EAAE,CAAC,CA+BhD"}