@empire-builder-kit/nx 1.0.0-beta.10

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 (243) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/README.md +34 -0
  4. package/executors.json +74 -0
  5. package/generators.json +40 -0
  6. package/migrations/standard-pre-v1-to-v1.md +11 -0
  7. package/package.json +80 -0
  8. package/src/blueprints/execution.d.ts +31 -0
  9. package/src/blueprints/execution.js +166 -0
  10. package/src/blueprints/execution.js.map +1 -0
  11. package/src/blueprints/index.d.ts +5 -0
  12. package/src/blueprints/index.js +9 -0
  13. package/src/blueprints/index.js.map +1 -0
  14. package/src/blueprints/inputs.d.ts +43 -0
  15. package/src/blueprints/inputs.js +103 -0
  16. package/src/blueprints/inputs.js.map +1 -0
  17. package/src/blueprints/manifest.d.ts +281 -0
  18. package/src/blueprints/manifest.js +441 -0
  19. package/src/blueprints/manifest.js.map +1 -0
  20. package/src/blueprints/resolver.d.ts +28 -0
  21. package/src/blueprints/resolver.js +218 -0
  22. package/src/blueprints/resolver.js.map +1 -0
  23. package/src/blueprints/transitions.d.ts +20 -0
  24. package/src/blueprints/transitions.js +61 -0
  25. package/src/blueprints/transitions.js.map +1 -0
  26. package/src/executors/deploy/deploy.d.ts +4 -0
  27. package/src/executors/deploy/deploy.js +6 -0
  28. package/src/executors/deploy/deploy.js.map +1 -0
  29. package/src/executors/deployment-plan/deployment-plan.d.ts +9 -0
  30. package/src/executors/deployment-plan/deployment-plan.js +50 -0
  31. package/src/executors/deployment-plan/deployment-plan.js.map +1 -0
  32. package/src/executors/deployment-plan/schema.json +24 -0
  33. package/src/executors/dev/dev.d.ts +4 -0
  34. package/src/executors/dev/dev.js +6 -0
  35. package/src/executors/dev/dev.js.map +1 -0
  36. package/src/executors/dev-doctor/dev-doctor.d.ts +31 -0
  37. package/src/executors/dev-doctor/dev-doctor.js +260 -0
  38. package/src/executors/dev-doctor/dev-doctor.js.map +1 -0
  39. package/src/executors/dev-doctor/schema.json +17 -0
  40. package/src/executors/dev-setup/dev-setup.d.ts +11 -0
  41. package/src/executors/dev-setup/dev-setup.js +454 -0
  42. package/src/executors/dev-setup/dev-setup.js.map +1 -0
  43. package/src/executors/dev-setup/schema.json +16 -0
  44. package/src/executors/fleet/fleet.d.ts +62 -0
  45. package/src/executors/fleet/fleet.js +613 -0
  46. package/src/executors/fleet/fleet.js.map +1 -0
  47. package/src/executors/fleet/schema.json +37 -0
  48. package/src/executors/foundation-preflight/foundation-preflight.d.ts +15 -0
  49. package/src/executors/foundation-preflight/foundation-preflight.js +116 -0
  50. package/src/executors/foundation-preflight/foundation-preflight.js.map +1 -0
  51. package/src/executors/foundation-preflight/schema.json +31 -0
  52. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.d.ts +8 -0
  53. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js +41 -0
  54. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js.map +1 -0
  55. package/src/executors/foundation-profile-preflight/schema.json +21 -0
  56. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.d.ts +13 -0
  57. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js +69 -0
  58. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js.map +1 -0
  59. package/src/executors/foundation-remove-preflight/schema.json +17 -0
  60. package/src/executors/github-bootstrap/github-bootstrap.d.ts +8 -0
  61. package/src/executors/github-bootstrap/github-bootstrap.js +30 -0
  62. package/src/executors/github-bootstrap/github-bootstrap.js.map +1 -0
  63. package/src/executors/github-bootstrap/schema.json +25 -0
  64. package/src/executors/refresh/refresh.d.ts +4 -0
  65. package/src/executors/refresh/refresh.js +6 -0
  66. package/src/executors/refresh/refresh.js.map +1 -0
  67. package/src/executors/remove/remove.d.ts +4 -0
  68. package/src/executors/remove/remove.js +6 -0
  69. package/src/executors/remove/remove.js.map +1 -0
  70. package/src/executors/sst-lifecycle/run-sst-command.d.ts +31 -0
  71. package/src/executors/sst-lifecycle/run-sst-command.js +226 -0
  72. package/src/executors/sst-lifecycle/run-sst-command.js.map +1 -0
  73. package/src/executors/sst-lifecycle/schema.json +45 -0
  74. package/src/executors/unlock/unlock.d.ts +4 -0
  75. package/src/executors/unlock/unlock.js +6 -0
  76. package/src/executors/unlock/unlock.js.map +1 -0
  77. package/src/executors/work-markers/schema.json +14 -0
  78. package/src/executors/work-markers/work-markers.d.ts +6 -0
  79. package/src/executors/work-markers/work-markers.js +20 -0
  80. package/src/executors/work-markers/work-markers.js.map +1 -0
  81. package/src/foundation/aurora-logical-database.d.ts +76 -0
  82. package/src/foundation/aurora-logical-database.js +419 -0
  83. package/src/foundation/aurora-logical-database.js.map +1 -0
  84. package/src/foundation/discovery.d.ts +55 -0
  85. package/src/foundation/discovery.js +55 -0
  86. package/src/foundation/discovery.js.map +1 -0
  87. package/src/foundation/index.d.ts +6 -0
  88. package/src/foundation/index.js +10 -0
  89. package/src/foundation/index.js.map +1 -0
  90. package/src/foundation/local-database-contract.d.ts +30 -0
  91. package/src/foundation/local-database-contract.js +75 -0
  92. package/src/foundation/local-database-contract.js.map +1 -0
  93. package/src/foundation/preflight.d.ts +31 -0
  94. package/src/foundation/preflight.js +114 -0
  95. package/src/foundation/preflight.js.map +1 -0
  96. package/src/foundation/provision-database-bindings.d.ts +30 -0
  97. package/src/foundation/provision-database-bindings.js +113 -0
  98. package/src/foundation/provision-database-bindings.js.map +1 -0
  99. package/src/foundation/provision-logical-database.d.ts +26 -0
  100. package/src/foundation/provision-logical-database.js +163 -0
  101. package/src/foundation/provision-logical-database.js.map +1 -0
  102. package/src/foundation/requirements.d.ts +37 -0
  103. package/src/foundation/requirements.js +141 -0
  104. package/src/foundation/requirements.js.map +1 -0
  105. package/src/foundation/stages.d.ts +14 -0
  106. package/src/foundation/stages.js +51 -0
  107. package/src/foundation/stages.js.map +1 -0
  108. package/src/generators/function/function.d.ts +13 -0
  109. package/src/generators/function/function.js +71 -0
  110. package/src/generators/function/function.js.map +1 -0
  111. package/src/generators/function/schema.d.ts +5 -0
  112. package/src/generators/function/schema.json +20 -0
  113. package/src/generators/job/job.d.ts +4 -0
  114. package/src/generators/job/job.js +5 -0
  115. package/src/generators/job/job.js.map +1 -0
  116. package/src/generators/preset/generator.d.ts +5 -0
  117. package/src/generators/preset/generator.js +41 -0
  118. package/src/generators/preset/generator.js.map +1 -0
  119. package/src/generators/preset/schema.d.ts +4 -0
  120. package/src/generators/preset/schema.json +22 -0
  121. package/src/generators/preset/workspace-files.d.ts +18 -0
  122. package/src/generators/preset/workspace-files.js +1605 -0
  123. package/src/generators/preset/workspace-files.js.map +1 -0
  124. package/src/generators/repository-policy/repository-policy.d.ts +4 -0
  125. package/src/generators/repository-policy/repository-policy.js +107 -0
  126. package/src/generators/repository-policy/repository-policy.js.map +1 -0
  127. package/src/generators/repository-policy/schema.d.ts +18 -0
  128. package/src/generators/repository-policy/schema.json +46 -0
  129. package/src/generators/service/service.d.ts +4 -0
  130. package/src/generators/service/service.js +5 -0
  131. package/src/generators/service/service.js.map +1 -0
  132. package/src/generators/slice/schema.d.ts +7 -0
  133. package/src/generators/slice/schema.json +38 -0
  134. package/src/generators/slice/slice.d.ts +26 -0
  135. package/src/generators/slice/slice.js +1698 -0
  136. package/src/generators/slice/slice.js.map +1 -0
  137. package/src/generators/upgrade/schema.d.ts +8 -0
  138. package/src/generators/upgrade/schema.json +31 -0
  139. package/src/generators/upgrade/upgrade.d.ts +27 -0
  140. package/src/generators/upgrade/upgrade.js +682 -0
  141. package/src/generators/upgrade/upgrade.js.map +1 -0
  142. package/src/generators/workload/schema.d.ts +6 -0
  143. package/src/generators/workload/schema.json +21 -0
  144. package/src/generators/workload/workload.d.ts +16 -0
  145. package/src/generators/workload/workload.js +157 -0
  146. package/src/generators/workload/workload.js.map +1 -0
  147. package/src/git-policy/action-pins.d.ts +28 -0
  148. package/src/git-policy/action-pins.js +35 -0
  149. package/src/git-policy/action-pins.js.map +1 -0
  150. package/src/git-policy/github-bootstrap.d.ts +23 -0
  151. package/src/git-policy/github-bootstrap.js +759 -0
  152. package/src/git-policy/github-bootstrap.js.map +1 -0
  153. package/src/git-policy/index.d.ts +3 -0
  154. package/src/git-policy/index.js +7 -0
  155. package/src/git-policy/index.js.map +1 -0
  156. package/src/git-policy/routing.d.ts +15 -0
  157. package/src/git-policy/routing.js +77 -0
  158. package/src/git-policy/routing.js.map +1 -0
  159. package/src/index.d.ts +8 -0
  160. package/src/index.js +12 -0
  161. package/src/index.js.map +1 -0
  162. package/src/local-dev/contracts.d.ts +31 -0
  163. package/src/local-dev/contracts.js +126 -0
  164. package/src/local-dev/contracts.js.map +1 -0
  165. package/src/local-dev/effects.d.ts +16 -0
  166. package/src/local-dev/effects.js +63 -0
  167. package/src/local-dev/effects.js.map +1 -0
  168. package/src/local-dev/gateway-daemon.d.ts +4 -0
  169. package/src/local-dev/gateway-daemon.js +39 -0
  170. package/src/local-dev/gateway-daemon.js.map +1 -0
  171. package/src/local-dev/gateway.d.ts +60 -0
  172. package/src/local-dev/gateway.js +368 -0
  173. package/src/local-dev/gateway.js.map +1 -0
  174. package/src/local-dev/identity.d.ts +16 -0
  175. package/src/local-dev/identity.js +101 -0
  176. package/src/local-dev/identity.js.map +1 -0
  177. package/src/local-dev/index.d.ts +7 -0
  178. package/src/local-dev/index.js +11 -0
  179. package/src/local-dev/index.js.map +1 -0
  180. package/src/local-dev/portless.d.ts +15 -0
  181. package/src/local-dev/portless.js +115 -0
  182. package/src/local-dev/portless.js.map +1 -0
  183. package/src/local-dev/ports.d.ts +10 -0
  184. package/src/local-dev/ports.js +39 -0
  185. package/src/local-dev/ports.js.map +1 -0
  186. package/src/local-dev/proxy.d.ts +37 -0
  187. package/src/local-dev/proxy.js +271 -0
  188. package/src/local-dev/proxy.js.map +1 -0
  189. package/src/local-dev/tls.d.ts +24 -0
  190. package/src/local-dev/tls.js +294 -0
  191. package/src/local-dev/tls.js.map +1 -0
  192. package/src/ownership/composition.d.ts +16 -0
  193. package/src/ownership/composition.js +125 -0
  194. package/src/ownership/composition.js.map +1 -0
  195. package/src/ownership/foundation-record.d.ts +66 -0
  196. package/src/ownership/foundation-record.js +108 -0
  197. package/src/ownership/foundation-record.js.map +1 -0
  198. package/src/ownership/hash.d.ts +2 -0
  199. package/src/ownership/hash.js +10 -0
  200. package/src/ownership/hash.js.map +1 -0
  201. package/src/ownership/index.d.ts +6 -0
  202. package/src/ownership/index.js +10 -0
  203. package/src/ownership/index.js.map +1 -0
  204. package/src/ownership/json-ownership.d.ts +13 -0
  205. package/src/ownership/json-ownership.js +147 -0
  206. package/src/ownership/json-ownership.js.map +1 -0
  207. package/src/ownership/record.d.ts +186 -0
  208. package/src/ownership/record.js +336 -0
  209. package/src/ownership/record.js.map +1 -0
  210. package/src/ownership/workspace-record.d.ts +66 -0
  211. package/src/ownership/workspace-record.js +108 -0
  212. package/src/ownership/workspace-record.js.map +1 -0
  213. package/src/repository-policy/aurora-preflight.d.ts +15 -0
  214. package/src/repository-policy/aurora-preflight.js +45 -0
  215. package/src/repository-policy/aurora-preflight.js.map +1 -0
  216. package/src/repository-policy/deployment-plan.d.ts +24 -0
  217. package/src/repository-policy/deployment-plan.js +124 -0
  218. package/src/repository-policy/deployment-plan.js.map +1 -0
  219. package/src/repository-policy/foundation-profile.d.ts +20 -0
  220. package/src/repository-policy/foundation-profile.js +45 -0
  221. package/src/repository-policy/foundation-profile.js.map +1 -0
  222. package/src/repository-policy/index.d.ts +4 -0
  223. package/src/repository-policy/index.js +8 -0
  224. package/src/repository-policy/index.js.map +1 -0
  225. package/src/repository-policy/policy.d.ts +59 -0
  226. package/src/repository-policy/policy.js +274 -0
  227. package/src/repository-policy/policy.js.map +1 -0
  228. package/src/schemas/blueprint-input-schema-v1.json +23 -0
  229. package/src/schemas/blueprint-v1.json +186 -0
  230. package/src/schemas/foundation-ownership-v2.json +42 -0
  231. package/src/schemas/foundation-requirement-v1.json +32 -0
  232. package/src/schemas/generated-ownership-v2.json +117 -0
  233. package/src/schemas/repository-policy-v1.json +58 -0
  234. package/src/schemas/workspace-ownership-v2.json +42 -0
  235. package/src/validation.d.ts +14 -0
  236. package/src/validation.js +14 -0
  237. package/src/validation.js.map +1 -0
  238. package/src/work-markers/index.d.ts +1 -0
  239. package/src/work-markers/index.js +5 -0
  240. package/src/work-markers/index.js.map +1 -0
  241. package/src/work-markers/work-markers.d.ts +39 -0
  242. package/src/work-markers/work-markers.js +359 -0
  243. package/src/work-markers/work-markers.js.map +1 -0
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PROTECTED_DEPLOYMENT_STAGES = exports.PROTECTED_DEPLOYMENT_ACTIONS = void 0;
4
+ exports.createProtectedDeploymentPlan = createProtectedDeploymentPlan;
5
+ const policy_js_1 = require("./policy.js");
6
+ exports.PROTECTED_DEPLOYMENT_ACTIONS = [
7
+ 'deploy',
8
+ 'refresh',
9
+ 'remove',
10
+ 'unlock',
11
+ ];
12
+ exports.PROTECTED_DEPLOYMENT_STAGES = ['staging', 'production'];
13
+ function supportsAction(project, action) {
14
+ return Object.prototype.hasOwnProperty.call(project.targets ?? {}, action);
15
+ }
16
+ function hasTag(project, tag) {
17
+ return project.tags?.includes(tag) ?? false;
18
+ }
19
+ function compareCodePoints(left, right) {
20
+ return left.name < right.name ? -1 : left.name > right.name ? 1 : 0;
21
+ }
22
+ function createProtectedDeploymentPlan(policy, options) {
23
+ const foundations = options.projects.filter((project) => hasTag(project, 'scope:foundation') &&
24
+ supportsAction(project, options.action));
25
+ if (foundations.length !== 1) {
26
+ throw new Error(`Protected deployment planning requires exactly one Foundation project with target ${options.action}; found ${foundations.length}.`);
27
+ }
28
+ const foundation = foundations[0];
29
+ if (!foundation) {
30
+ throw new Error('Protected deployment planning could not resolve Foundation.');
31
+ }
32
+ const slices = options.projects
33
+ .filter((project) => hasTag(project, 'type:slice') &&
34
+ supportsAction(project, options.action))
35
+ .sort(compareCodePoints);
36
+ if (options.action === 'remove' || options.action === 'unlock') {
37
+ if (!options.requestedProject) {
38
+ throw new Error(`Protected ${options.action} requires one explicit registered --project; batch recovery is not implicit.`);
39
+ }
40
+ const selected = [foundation, ...slices].find(({ name }) => name === options.requestedProject);
41
+ if (!selected) {
42
+ throw new Error(`Protected ${options.action} project ${options.requestedProject} is not a registered Foundation or Product Slice with that target.`);
43
+ }
44
+ const decision = (0, policy_js_1.evaluateRepositoryPolicyRequest)(policy, {
45
+ action: options.action,
46
+ projects: [
47
+ {
48
+ kind: selected === foundation ? 'foundation' : 'slice',
49
+ name: selected.name,
50
+ },
51
+ ],
52
+ stage: options.stage,
53
+ });
54
+ if (!decision.allowed) {
55
+ throw new Error(decision.reasons.join('\n'));
56
+ }
57
+ return {
58
+ action: options.action,
59
+ ...(decision.effectiveProductionProfile
60
+ ? {
61
+ effectiveProductionProfile: decision.effectiveProductionProfile,
62
+ }
63
+ : {}),
64
+ ...(selected === foundation
65
+ ? { foundationProject: foundation.name }
66
+ : {}),
67
+ orderedProjects: [selected.name],
68
+ sliceProjects: selected === foundation ? [] : [selected.name],
69
+ stage: options.stage,
70
+ };
71
+ }
72
+ if (options.requestedProject) {
73
+ throw new Error(`Protected ${options.action} derives its complete project set from committed policy; --project cannot narrow or expand it.`);
74
+ }
75
+ const selectedSlices = options.stage === 'production'
76
+ ? slices.filter(({ name }) => {
77
+ const status = policy.slices[name]?.productionStatus;
78
+ return status === 'pilot' || status === 'ready';
79
+ })
80
+ : slices;
81
+ if (options.stage === 'production') {
82
+ const missingPolicyEntries = slices
83
+ .filter(({ name }) => policy.slices[name] === undefined)
84
+ .map(({ name }) => name);
85
+ if (missingPolicyEntries.length > 0) {
86
+ throw new Error(`Registered Product Slices are missing explicit blocked, pilot, or ready production policy entries: ${missingPolicyEntries.join(', ')}.`);
87
+ }
88
+ for (const [name, entry] of Object.entries(policy.slices)) {
89
+ if ((entry.productionStatus === 'pilot' ||
90
+ entry.productionStatus === 'ready') &&
91
+ !slices.some((project) => project.name === name)) {
92
+ throw new Error(`Repository policy admits Product Slice ${name}, but no registered project exposes protected target ${options.action}.`);
93
+ }
94
+ }
95
+ }
96
+ const selectedProjects = [
97
+ { kind: 'foundation', name: foundation.name },
98
+ ...selectedSlices.map(({ name }) => ({ kind: 'slice', name })),
99
+ ];
100
+ const decision = (0, policy_js_1.evaluateRepositoryPolicyRequest)(policy, {
101
+ action: options.action,
102
+ projects: selectedProjects,
103
+ stage: options.stage,
104
+ });
105
+ if (!decision.allowed) {
106
+ throw new Error(`Repository Operating Policy rejected the complete protected deployment set:\n${decision.reasons.map((reason) => `- ${reason}`).join('\n')}`);
107
+ }
108
+ return {
109
+ action: options.action,
110
+ ...(decision.effectiveProductionProfile
111
+ ? {
112
+ effectiveProductionProfile: decision.effectiveProductionProfile,
113
+ }
114
+ : {}),
115
+ foundationProject: foundation.name,
116
+ orderedProjects: [
117
+ foundation.name,
118
+ ...selectedSlices.map(({ name }) => name),
119
+ ],
120
+ sliceProjects: selectedSlices.map(({ name }) => name),
121
+ stage: options.stage,
122
+ };
123
+ }
124
+ //# sourceMappingURL=deployment-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment-plan.js","sourceRoot":"","sources":["../../../../../packages/nx/src/repository-policy/deployment-plan.ts"],"names":[],"mappings":";;;AAoDA,sEA6IC;AA7LD,2CAA8D;AAEjD,QAAA,4BAA4B,GAAG;IAC1C,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;CACA,CAAC;AACE,QAAA,2BAA2B,GAAG,CAAC,SAAS,EAAE,YAAY,CAAU,CAAC;AAsB9E,SAAS,cAAc,CACrB,OAA8B,EAC9B,MAAiC;IAEjC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,MAAM,CAAC,OAA8B,EAAE,GAAW;IACzD,OAAO,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;AAC9C,CAAC;AAED,SAAS,iBAAiB,CACxB,IAA2B,EAC3B,KAA4B;IAE5B,OAAO,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAgB,6BAA6B,CAC3C,MAAiC,EACjC,OAKC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CACzC,CAAC,OAAO,EAAE,EAAE,CACV,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC;QACnC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAC1C,CAAC;IACF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,qFAAqF,OAAO,CAAC,MAAM,WAAW,WAAW,CAAC,MAAM,GAAG,CACpI,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ;SAC5B,MAAM,CACL,CAAC,OAAO,EAAE,EAAE,CACV,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC;QAC7B,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAC1C;SACA,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE3B,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,aAAa,OAAO,CAAC,MAAM,8EAA8E,CAC1G,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,CAAC,IAAI,CAC3C,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,gBAAgB,CAChD,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,aAAa,OAAO,CAAC,MAAM,YAAY,OAAO,CAAC,gBAAgB,oEAAoE,CACpI,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,IAAA,2CAA+B,EAAC,MAAM,EAAE;YACvD,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO;oBACtD,IAAI,EAAE,QAAQ,CAAC,IAAI;iBACpB;aACF;YACD,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,CAAC,QAAQ,CAAC,0BAA0B;gBACrC,CAAC,CAAC;oBACE,0BAA0B,EAAE,QAAQ,CAAC,0BAA0B;iBAChE;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,QAAQ,KAAK,UAAU;gBACzB,CAAC,CAAC,EAAE,iBAAiB,EAAE,UAAU,CAAC,IAAI,EAAE;gBACxC,CAAC,CAAC,EAAE,CAAC;YACP,eAAe,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChC,aAAa,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC7D,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,aAAa,OAAO,CAAC,MAAM,gGAAgG,CAC5H,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAClB,OAAO,CAAC,KAAK,KAAK,YAAY;QAC5B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YACzB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC;YACrD,OAAO,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,OAAO,CAAC;QAClD,CAAC,CAAC;QACJ,CAAC,CAAC,MAAM,CAAC;IACb,IAAI,OAAO,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;QACnC,MAAM,oBAAoB,GAAG,MAAM;aAChC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;aACvD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,sGAAsG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACzI,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1D,IACE,CAAC,KAAK,CAAC,gBAAgB,KAAK,OAAO;gBACjC,KAAK,CAAC,gBAAgB,KAAK,OAAO,CAAC;gBACrC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,EAChD,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,0CAA0C,IAAI,wDAAwD,OAAO,CAAC,MAAM,GAAG,CACxH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG;QACvB,EAAE,IAAI,EAAE,YAAqB,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE;QACtD,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;KACxE,CAAC;IACF,MAAM,QAAQ,GAAG,IAAA,2CAA+B,EAAC,MAAM,EAAE;QACvD,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,gBAAgB;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,gFAAgF,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7I,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,CAAC,QAAQ,CAAC,0BAA0B;YACrC,CAAC,CAAC;gBACE,0BAA0B,EAAE,QAAQ,CAAC,0BAA0B;aAChE;YACH,CAAC,CAAC,EAAE,CAAC;QACP,iBAAiB,EAAE,UAAU,CAAC,IAAI;QAClC,eAAe,EAAE;YACf,UAAU,CAAC,IAAI;YACf,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;SAC1C;QACD,aAAa,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;QACrD,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type ProductionFoundationProfile } from './policy.js';
2
+ export declare const FOUNDATION_AURORA_ENGINE: "postgres";
3
+ export declare const FOUNDATION_AURORA_ENGINE_FAMILY: "aurora-postgresql";
4
+ export declare const FOUNDATION_AURORA_ENGINE_VERSION: "17.4";
5
+ export interface ProductionFoundationProfileContract {
6
+ aurora: {
7
+ max: `${number} ACU`;
8
+ min: `${number} ACU`;
9
+ pauseAfter?: `${number} minutes`;
10
+ };
11
+ backupRetentionDays: 30;
12
+ deletionProtection: true;
13
+ nat: 'managed';
14
+ }
15
+ export declare const PRODUCTION_FOUNDATION_PROFILE_CONTRACTS: Readonly<Record<ProductionFoundationProfile, ProductionFoundationProfileContract>>;
16
+ export declare function requireProductionFoundationProfile(value: unknown): ProductionFoundationProfile;
17
+ export declare function productionFoundationProfileContract(value: unknown): {
18
+ contract: ProductionFoundationProfileContract;
19
+ profile: ProductionFoundationProfile;
20
+ };
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PRODUCTION_FOUNDATION_PROFILE_CONTRACTS = exports.FOUNDATION_AURORA_ENGINE_VERSION = exports.FOUNDATION_AURORA_ENGINE_FAMILY = exports.FOUNDATION_AURORA_ENGINE = void 0;
4
+ exports.requireProductionFoundationProfile = requireProductionFoundationProfile;
5
+ exports.productionFoundationProfileContract = productionFoundationProfileContract;
6
+ const policy_js_1 = require("./policy.js");
7
+ exports.FOUNDATION_AURORA_ENGINE = 'postgres';
8
+ exports.FOUNDATION_AURORA_ENGINE_FAMILY = 'aurora-postgresql';
9
+ exports.FOUNDATION_AURORA_ENGINE_VERSION = '17.4';
10
+ exports.PRODUCTION_FOUNDATION_PROFILE_CONTRACTS = {
11
+ 'cost-optimized': {
12
+ aurora: {
13
+ max: '4 ACU',
14
+ min: '0 ACU',
15
+ pauseAfter: '5 minutes',
16
+ },
17
+ backupRetentionDays: 30,
18
+ deletionProtection: true,
19
+ nat: 'managed',
20
+ },
21
+ standard: {
22
+ aurora: {
23
+ max: '16 ACU',
24
+ min: '2 ACU',
25
+ },
26
+ backupRetentionDays: 30,
27
+ deletionProtection: true,
28
+ nat: 'managed',
29
+ },
30
+ };
31
+ function requireProductionFoundationProfile(value) {
32
+ if (typeof value !== 'string' ||
33
+ !policy_js_1.PRODUCTION_FOUNDATION_PROFILES.includes(value)) {
34
+ throw new Error(`EBK_PRODUCTION_FOUNDATION_PROFILE must equal ${policy_js_1.PRODUCTION_FOUNDATION_PROFILES.join(' or ')} and may only come from validated Repository Operating Policy.`);
35
+ }
36
+ return value;
37
+ }
38
+ function productionFoundationProfileContract(value) {
39
+ const profile = requireProductionFoundationProfile(value);
40
+ return {
41
+ contract: exports.PRODUCTION_FOUNDATION_PROFILE_CONTRACTS[profile],
42
+ profile,
43
+ };
44
+ }
45
+ //# sourceMappingURL=foundation-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundation-profile.js","sourceRoot":"","sources":["../../../../../packages/nx/src/repository-policy/foundation-profile.ts"],"names":[],"mappings":";;;AA4CA,gFAcC;AAED,kFASC;AArED,2CAGqB;AAER,QAAA,wBAAwB,GAAG,UAAmB,CAAC;AAC/C,QAAA,+BAA+B,GAAG,mBAA4B,CAAC;AAC/D,QAAA,gCAAgC,GAAG,MAAe,CAAC;AAanD,QAAA,uCAAuC,GAEhD;IACF,gBAAgB,EAAE;QAChB,MAAM,EAAE;YACN,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,OAAO;YACZ,UAAU,EAAE,WAAW;SACxB;QACD,mBAAmB,EAAE,EAAE;QACvB,kBAAkB,EAAE,IAAI;QACxB,GAAG,EAAE,SAAS;KACf;IACD,QAAQ,EAAE;QACR,MAAM,EAAE;YACN,GAAG,EAAE,QAAQ;YACb,GAAG,EAAE,OAAO;SACb;QACD,mBAAmB,EAAE,EAAE;QACvB,kBAAkB,EAAE,IAAI;QACxB,GAAG,EAAE,SAAS;KACf;CACF,CAAC;AAEF,SAAgB,kCAAkC,CAChD,KAAc;IAEd,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,0CAA8B,CAAC,QAAQ,CACtC,KAAoC,CACrC,EACD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,gDAAgD,0CAA8B,CAAC,IAAI,CAAC,MAAM,CAAC,gEAAgE,CAC5J,CAAC;IACJ,CAAC;IACD,OAAO,KAAoC,CAAC;AAC9C,CAAC;AAED,SAAgB,mCAAmC,CAAC,KAAc;IAIhE,MAAM,OAAO,GAAG,kCAAkC,CAAC,KAAK,CAAC,CAAC;IAC1D,OAAO;QACL,QAAQ,EAAE,+CAAuC,CAAC,OAAO,CAAC;QAC1D,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './aurora-preflight.js';
2
+ export * from './deployment-plan.js';
3
+ export * from './foundation-profile.js';
4
+ export * from './policy.js';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./aurora-preflight.js"), exports);
5
+ tslib_1.__exportStar(require("./deployment-plan.js"), exports);
6
+ tslib_1.__exportStar(require("./foundation-profile.js"), exports);
7
+ tslib_1.__exportStar(require("./policy.js"), exports);
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/nx/src/repository-policy/index.ts"],"names":[],"mappings":";;;AAAA,gEAAsC;AACtC,+DAAqC;AACrC,kEAAwC;AACxC,sDAA4B"}
@@ -0,0 +1,59 @@
1
+ import { type ValidationIssue, type ValidationResult } from '../validation.js';
2
+ export declare const REPOSITORY_POLICY_FILE: "ebk.repository-policy.json";
3
+ export declare const REPOSITORY_POLICY_SCHEMA_VERSION: 1;
4
+ export declare const REPOSITORY_POLICY_SCHEMA_URL: "./node_modules/@empire-builder-kit/nx/schemas/repository-policy-v1.json";
5
+ export declare const PRODUCTION_ACCESS_VALUES: readonly ["disabled", "controlled"];
6
+ export declare const PRODUCTION_APPROVAL_MODES: readonly ["promotion-pr", "environment-reviewer"];
7
+ export declare const PRODUCTION_FOUNDATION_PROFILES: readonly ["cost-optimized", "standard"];
8
+ export declare const DEFAULT_RECOVERY_PRODUCTION_FOUNDATION_PROFILE: "standard";
9
+ export declare const SLICE_PRODUCTION_STATUSES: readonly ["blocked", "pilot", "ready"];
10
+ export declare const REPOSITORY_MODE_PRESETS: readonly ["incubation", "controlled-production", "operational"];
11
+ export type ProductionAccess = (typeof PRODUCTION_ACCESS_VALUES)[number];
12
+ export type ProductionApprovalMode = (typeof PRODUCTION_APPROVAL_MODES)[number];
13
+ export type ProductionFoundationProfile = (typeof PRODUCTION_FOUNDATION_PROFILES)[number];
14
+ export type SliceProductionStatus = (typeof SLICE_PRODUCTION_STATUSES)[number];
15
+ export type RepositoryModePreset = (typeof REPOSITORY_MODE_PRESETS)[number];
16
+ export interface RepositoryOperatingPolicy {
17
+ $schema?: string;
18
+ productionAccess: ProductionAccess;
19
+ productionApproval: {
20
+ mode: ProductionApprovalMode;
21
+ };
22
+ productionFoundation?: {
23
+ profile: ProductionFoundationProfile;
24
+ };
25
+ schemaVersion: typeof REPOSITORY_POLICY_SCHEMA_VERSION;
26
+ slices: Record<string, {
27
+ productionStatus: SliceProductionStatus;
28
+ }>;
29
+ }
30
+ export type RepositoryPolicyLifecycleAction = 'deploy' | 'dev' | 'migrate' | 'refresh' | 'remove' | 'unlock';
31
+ export interface RepositoryPolicyProject {
32
+ kind: 'foundation' | 'slice';
33
+ name: string;
34
+ }
35
+ export interface RepositoryPolicyRequest {
36
+ action: RepositoryPolicyLifecycleAction;
37
+ projects: readonly RepositoryPolicyProject[];
38
+ stage: string;
39
+ }
40
+ export interface RepositoryPolicyDecision {
41
+ allowed: boolean;
42
+ effectiveProductionProfile?: ProductionFoundationProfile;
43
+ reasons: string[];
44
+ }
45
+ export interface RepositoryPolicyChange {
46
+ preset?: RepositoryModePreset;
47
+ productionAccess?: ProductionAccess;
48
+ productionApprovalMode?: ProductionApprovalMode;
49
+ productionFoundationProfile?: ProductionFoundationProfile;
50
+ slices?: Readonly<Record<string, SliceProductionStatus>>;
51
+ }
52
+ export declare function validateRepositoryOperatingPolicy(value: unknown): ValidationResult<RepositoryOperatingPolicy>;
53
+ export declare function formatRepositoryPolicyIssues(issues: ReadonlyArray<ValidationIssue>): string;
54
+ export declare function parseRepositoryOperatingPolicy(contents: string, source?: string): RepositoryOperatingPolicy;
55
+ export declare function readRepositoryOperatingPolicy(workspaceRoot: string): RepositoryOperatingPolicy;
56
+ export declare function createIncubationRepositoryPolicy(): RepositoryOperatingPolicy;
57
+ export declare function applyRepositoryPolicyChange(current: RepositoryOperatingPolicy, change: RepositoryPolicyChange): RepositoryOperatingPolicy;
58
+ export declare function evaluateRepositoryPolicyRequest(policy: RepositoryOperatingPolicy, request: RepositoryPolicyRequest): RepositoryPolicyDecision;
59
+ export declare function assertRepositoryPolicyRequest(workspaceRoot: string, request: RepositoryPolicyRequest): RepositoryPolicyDecision;
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REPOSITORY_MODE_PRESETS = exports.SLICE_PRODUCTION_STATUSES = exports.DEFAULT_RECOVERY_PRODUCTION_FOUNDATION_PROFILE = exports.PRODUCTION_FOUNDATION_PROFILES = exports.PRODUCTION_APPROVAL_MODES = exports.PRODUCTION_ACCESS_VALUES = exports.REPOSITORY_POLICY_SCHEMA_URL = exports.REPOSITORY_POLICY_SCHEMA_VERSION = exports.REPOSITORY_POLICY_FILE = void 0;
4
+ exports.validateRepositoryOperatingPolicy = validateRepositoryOperatingPolicy;
5
+ exports.formatRepositoryPolicyIssues = formatRepositoryPolicyIssues;
6
+ exports.parseRepositoryOperatingPolicy = parseRepositoryOperatingPolicy;
7
+ exports.readRepositoryOperatingPolicy = readRepositoryOperatingPolicy;
8
+ exports.createIncubationRepositoryPolicy = createIncubationRepositoryPolicy;
9
+ exports.applyRepositoryPolicyChange = applyRepositoryPolicyChange;
10
+ exports.evaluateRepositoryPolicyRequest = evaluateRepositoryPolicyRequest;
11
+ exports.assertRepositoryPolicyRequest = assertRepositoryPolicyRequest;
12
+ const node_fs_1 = require("node:fs");
13
+ const node_path_1 = require("node:path");
14
+ const validation_js_1 = require("../validation.js");
15
+ exports.REPOSITORY_POLICY_FILE = 'ebk.repository-policy.json';
16
+ exports.REPOSITORY_POLICY_SCHEMA_VERSION = 1;
17
+ exports.REPOSITORY_POLICY_SCHEMA_URL = './node_modules/@empire-builder-kit/nx/schemas/repository-policy-v1.json';
18
+ exports.PRODUCTION_ACCESS_VALUES = ['disabled', 'controlled'];
19
+ exports.PRODUCTION_APPROVAL_MODES = [
20
+ 'promotion-pr',
21
+ 'environment-reviewer',
22
+ ];
23
+ exports.PRODUCTION_FOUNDATION_PROFILES = [
24
+ 'cost-optimized',
25
+ 'standard',
26
+ ];
27
+ exports.DEFAULT_RECOVERY_PRODUCTION_FOUNDATION_PROFILE = 'standard';
28
+ exports.SLICE_PRODUCTION_STATUSES = ['blocked', 'pilot', 'ready'];
29
+ exports.REPOSITORY_MODE_PRESETS = [
30
+ 'incubation',
31
+ 'controlled-production',
32
+ 'operational',
33
+ ];
34
+ const SLICE_NAME_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
35
+ const POLICY_PROPERTIES = new Set([
36
+ '$schema',
37
+ 'productionAccess',
38
+ 'productionApproval',
39
+ 'productionFoundation',
40
+ 'schemaVersion',
41
+ 'slices',
42
+ ]);
43
+ function rejectUnknownProperties(value, allowed, path, issues) {
44
+ for (const property of Object.keys(value)) {
45
+ if (!allowed.has(property)) {
46
+ issues.push({
47
+ message: 'is not an allowed property',
48
+ path: `${path}.${property}`,
49
+ });
50
+ }
51
+ }
52
+ }
53
+ function isOneOf(value, values) {
54
+ return typeof value === 'string' && values.includes(value);
55
+ }
56
+ function validateRepositoryOperatingPolicy(value) {
57
+ if (!(0, validation_js_1.isRecord)(value)) {
58
+ return {
59
+ issues: [{ message: 'must be an object', path: 'policy' }],
60
+ valid: false,
61
+ };
62
+ }
63
+ const issues = [];
64
+ rejectUnknownProperties(value, POLICY_PROPERTIES, 'policy', issues);
65
+ if (value.schemaVersion !== exports.REPOSITORY_POLICY_SCHEMA_VERSION) {
66
+ issues.push({ message: 'must equal 1', path: 'policy.schemaVersion' });
67
+ }
68
+ if (value.$schema !== undefined &&
69
+ (typeof value.$schema !== 'string' || value.$schema.trim() === '')) {
70
+ issues.push({
71
+ message: 'must be a non-empty string',
72
+ path: 'policy.$schema',
73
+ });
74
+ }
75
+ if (!isOneOf(value.productionAccess, exports.PRODUCTION_ACCESS_VALUES)) {
76
+ issues.push({
77
+ message: `must equal ${exports.PRODUCTION_ACCESS_VALUES.join(' or ')}`,
78
+ path: 'policy.productionAccess',
79
+ });
80
+ }
81
+ if (!(0, validation_js_1.isRecord)(value.productionApproval)) {
82
+ issues.push({
83
+ message: 'must be an object with an explicit promotion-pr or environment-reviewer mode',
84
+ path: 'policy.productionApproval',
85
+ });
86
+ }
87
+ else {
88
+ rejectUnknownProperties(value.productionApproval, new Set(['mode']), 'policy.productionApproval', issues);
89
+ if (!isOneOf(value.productionApproval.mode, exports.PRODUCTION_APPROVAL_MODES)) {
90
+ issues.push({
91
+ message: `must equal ${exports.PRODUCTION_APPROVAL_MODES.join(' or ')}`,
92
+ path: 'policy.productionApproval.mode',
93
+ });
94
+ }
95
+ }
96
+ if (value.productionFoundation !== undefined) {
97
+ if (!(0, validation_js_1.isRecord)(value.productionFoundation)) {
98
+ issues.push({
99
+ message: 'must be an object',
100
+ path: 'policy.productionFoundation',
101
+ });
102
+ }
103
+ else {
104
+ rejectUnknownProperties(value.productionFoundation, new Set(['profile']), 'policy.productionFoundation', issues);
105
+ if (!isOneOf(value.productionFoundation.profile, exports.PRODUCTION_FOUNDATION_PROFILES)) {
106
+ issues.push({
107
+ message: `must equal ${exports.PRODUCTION_FOUNDATION_PROFILES.join(' or ')}`,
108
+ path: 'policy.productionFoundation.profile',
109
+ });
110
+ }
111
+ }
112
+ }
113
+ if (!(0, validation_js_1.isRecord)(value.slices)) {
114
+ issues.push({ message: 'must be an object', path: 'policy.slices' });
115
+ }
116
+ else {
117
+ for (const [slice, entry] of Object.entries(value.slices)) {
118
+ const path = `policy.slices.${slice}`;
119
+ if (!SLICE_NAME_PATTERN.test(slice)) {
120
+ issues.push({
121
+ message: 'name must use lowercase letters, numbers, and hyphens',
122
+ path,
123
+ });
124
+ }
125
+ if (!(0, validation_js_1.isRecord)(entry)) {
126
+ issues.push({ message: 'must be an object', path });
127
+ continue;
128
+ }
129
+ rejectUnknownProperties(entry, new Set(['productionStatus']), path, issues);
130
+ if (!isOneOf(entry.productionStatus, exports.SLICE_PRODUCTION_STATUSES)) {
131
+ issues.push({
132
+ message: `must equal ${exports.SLICE_PRODUCTION_STATUSES.join(', ')}`,
133
+ path: `${path}.productionStatus`,
134
+ });
135
+ }
136
+ }
137
+ }
138
+ return (0, validation_js_1.validationResult)(value, issues);
139
+ }
140
+ function formatRepositoryPolicyIssues(issues) {
141
+ return issues.map(({ message, path }) => `- ${path}: ${message}`).join('\n');
142
+ }
143
+ function parseRepositoryOperatingPolicy(contents, source = exports.REPOSITORY_POLICY_FILE) {
144
+ let value;
145
+ try {
146
+ value = JSON.parse(contents);
147
+ }
148
+ catch (error) {
149
+ throw new Error(`Repository Operating Policy at ${source} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
150
+ }
151
+ const result = validateRepositoryOperatingPolicy(value);
152
+ if (!result.valid) {
153
+ throw new Error(`Repository Operating Policy at ${source} is invalid:\n${formatRepositoryPolicyIssues(result.issues)}`);
154
+ }
155
+ return result.value;
156
+ }
157
+ function readRepositoryOperatingPolicy(workspaceRoot) {
158
+ const path = (0, node_path_1.join)(workspaceRoot, exports.REPOSITORY_POLICY_FILE);
159
+ let contents;
160
+ try {
161
+ contents = (0, node_fs_1.readFileSync)(path, 'utf8');
162
+ }
163
+ catch (error) {
164
+ throw new Error(`Repository Operating Policy is required at ${path}: ${error instanceof Error ? error.message : String(error)}`);
165
+ }
166
+ return parseRepositoryOperatingPolicy(contents, path);
167
+ }
168
+ function createIncubationRepositoryPolicy() {
169
+ return {
170
+ $schema: exports.REPOSITORY_POLICY_SCHEMA_URL,
171
+ productionAccess: 'disabled',
172
+ productionApproval: { mode: 'promotion-pr' },
173
+ productionFoundation: {
174
+ profile: exports.DEFAULT_RECOVERY_PRODUCTION_FOUNDATION_PROFILE,
175
+ },
176
+ schemaVersion: exports.REPOSITORY_POLICY_SCHEMA_VERSION,
177
+ slices: {},
178
+ };
179
+ }
180
+ function applyRepositoryPolicyChange(current, change) {
181
+ const next = structuredClone(current);
182
+ if (change.preset === 'incubation') {
183
+ next.productionAccess = 'disabled';
184
+ next.productionFoundation ??= {
185
+ profile: exports.DEFAULT_RECOVERY_PRODUCTION_FOUNDATION_PROFILE,
186
+ };
187
+ for (const entry of Object.values(next.slices)) {
188
+ entry.productionStatus = 'blocked';
189
+ }
190
+ }
191
+ else if (change.preset === 'controlled-production') {
192
+ next.productionAccess = 'controlled';
193
+ next.productionFoundation = { profile: 'cost-optimized' };
194
+ }
195
+ else if (change.preset === 'operational') {
196
+ next.productionAccess = 'controlled';
197
+ next.productionFoundation = { profile: 'standard' };
198
+ }
199
+ if (change.productionAccess !== undefined) {
200
+ next.productionAccess = change.productionAccess;
201
+ }
202
+ if (change.productionApprovalMode !== undefined) {
203
+ next.productionApproval = { mode: change.productionApprovalMode };
204
+ }
205
+ if (change.productionFoundationProfile !== undefined) {
206
+ next.productionFoundation = {
207
+ profile: change.productionFoundationProfile,
208
+ };
209
+ }
210
+ for (const [slice, productionStatus] of Object.entries(change.slices ?? {})) {
211
+ if (!SLICE_NAME_PATTERN.test(slice)) {
212
+ throw new Error(`Product Slice name ${slice} must use lowercase letters, numbers, and hyphens.`);
213
+ }
214
+ next.slices[slice] = { productionStatus };
215
+ }
216
+ const result = validateRepositoryOperatingPolicy(next);
217
+ if (!result.valid) {
218
+ throw new Error(`Repository Operating Policy change is invalid:\n${formatRepositoryPolicyIssues(result.issues)}`);
219
+ }
220
+ return result.value;
221
+ }
222
+ function evaluateRepositoryPolicyRequest(policy, request) {
223
+ const reasons = [];
224
+ const projectNames = new Set();
225
+ for (const project of request.projects) {
226
+ if (projectNames.has(project.name)) {
227
+ reasons.push(`Project ${project.name} is selected more than once.`);
228
+ }
229
+ projectNames.add(project.name);
230
+ }
231
+ if (request.stage !== 'production') {
232
+ return { allowed: reasons.length === 0, reasons };
233
+ }
234
+ if (request.action === 'dev') {
235
+ reasons.push('Production development mode is prohibited.');
236
+ }
237
+ // Removal and unlock are dedicated protected recovery paths. The policy must
238
+ // still parse, but a blocked or disabled posture must not strand resources.
239
+ const recoveryAction = request.action === 'remove' || request.action === 'unlock';
240
+ if (!recoveryAction && policy.productionAccess !== 'controlled') {
241
+ reasons.push('Repository production access is disabled.');
242
+ }
243
+ const configuredProfile = policy.productionFoundation?.profile;
244
+ const profile = recoveryAction
245
+ ? (configuredProfile ?? exports.DEFAULT_RECOVERY_PRODUCTION_FOUNDATION_PROFILE)
246
+ : configuredProfile;
247
+ if (!recoveryAction && !profile) {
248
+ reasons.push('Production Foundation profile is not explicitly configured.');
249
+ }
250
+ if (!recoveryAction) {
251
+ for (const project of request.projects) {
252
+ if (project.kind !== 'slice')
253
+ continue;
254
+ const status = policy.slices[project.name]?.productionStatus ?? 'blocked';
255
+ if (status === 'blocked') {
256
+ reasons.push(`Product Slice ${project.name} is blocked for production deployment.`);
257
+ }
258
+ }
259
+ }
260
+ return {
261
+ allowed: reasons.length === 0,
262
+ ...(profile ? { effectiveProductionProfile: profile } : {}),
263
+ reasons,
264
+ };
265
+ }
266
+ function assertRepositoryPolicyRequest(workspaceRoot, request) {
267
+ const policy = readRepositoryOperatingPolicy(workspaceRoot);
268
+ const decision = evaluateRepositoryPolicyRequest(policy, request);
269
+ if (!decision.allowed) {
270
+ throw new Error(`Repository Operating Policy rejected ${request.action} for ${request.stage}:\n${decision.reasons.map((reason) => `- ${reason}`).join('\n')}`);
271
+ }
272
+ return decision;
273
+ }
274
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../../../packages/nx/src/repository-policy/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ {
2
+ "$id": "https://empirebuilderkit.dev/schemas/blueprint-input-schema-v1.json",
3
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
4
+ "additionalProperties": true,
5
+ "properties": {
6
+ "$id": { "type": "string" },
7
+ "$schema": {
8
+ "const": "https://json-schema.org/draft/2020-12/schema"
9
+ },
10
+ "additionalProperties": { "const": false },
11
+ "properties": { "type": "object" },
12
+ "required": {
13
+ "items": { "type": "string" },
14
+ "type": "array",
15
+ "uniqueItems": true
16
+ },
17
+ "title": { "type": "string" },
18
+ "type": { "const": "object" }
19
+ },
20
+ "required": ["type", "properties", "additionalProperties"],
21
+ "title": "Empire Builder Kit Blueprint Input Schema Profile v1",
22
+ "type": "object"
23
+ }