@stackweld/core 0.2.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 (172) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-lint.log +498 -0
  3. package/.turbo/turbo-test.log +21 -0
  4. package/.turbo/turbo-typecheck.log +4 -0
  5. package/dist/__tests__/compatibility-scorer.test.d.ts +2 -0
  6. package/dist/__tests__/compatibility-scorer.test.d.ts.map +1 -0
  7. package/dist/__tests__/compatibility-scorer.test.js +226 -0
  8. package/dist/__tests__/compatibility-scorer.test.js.map +1 -0
  9. package/dist/__tests__/rules-engine.test.d.ts +2 -0
  10. package/dist/__tests__/rules-engine.test.d.ts.map +1 -0
  11. package/dist/__tests__/rules-engine.test.js +161 -0
  12. package/dist/__tests__/rules-engine.test.js.map +1 -0
  13. package/dist/__tests__/scaffold-orchestrator.test.d.ts +2 -0
  14. package/dist/__tests__/scaffold-orchestrator.test.d.ts.map +1 -0
  15. package/dist/__tests__/scaffold-orchestrator.test.js +149 -0
  16. package/dist/__tests__/scaffold-orchestrator.test.js.map +1 -0
  17. package/dist/__tests__/stack-engine.test.d.ts +2 -0
  18. package/dist/__tests__/stack-engine.test.d.ts.map +1 -0
  19. package/dist/__tests__/stack-engine.test.js +278 -0
  20. package/dist/__tests__/stack-engine.test.js.map +1 -0
  21. package/dist/db/database.d.ts +9 -0
  22. package/dist/db/database.d.ts.map +1 -0
  23. package/dist/db/database.js +106 -0
  24. package/dist/db/database.js.map +1 -0
  25. package/dist/db/index.d.ts +2 -0
  26. package/dist/db/index.d.ts.map +1 -0
  27. package/dist/db/index.js +2 -0
  28. package/dist/db/index.js.map +1 -0
  29. package/dist/engine/compatibility-scorer.d.ts +37 -0
  30. package/dist/engine/compatibility-scorer.d.ts.map +1 -0
  31. package/dist/engine/compatibility-scorer.js +178 -0
  32. package/dist/engine/compatibility-scorer.js.map +1 -0
  33. package/dist/engine/compose-generator.d.ts +35 -0
  34. package/dist/engine/compose-generator.d.ts.map +1 -0
  35. package/dist/engine/compose-generator.js +95 -0
  36. package/dist/engine/compose-generator.js.map +1 -0
  37. package/dist/engine/cost-estimator.d.ts +22 -0
  38. package/dist/engine/cost-estimator.d.ts.map +1 -0
  39. package/dist/engine/cost-estimator.js +451 -0
  40. package/dist/engine/cost-estimator.js.map +1 -0
  41. package/dist/engine/env-analyzer.d.ts +36 -0
  42. package/dist/engine/env-analyzer.d.ts.map +1 -0
  43. package/dist/engine/env-analyzer.js +111 -0
  44. package/dist/engine/env-analyzer.js.map +1 -0
  45. package/dist/engine/health-checker.d.ts +20 -0
  46. package/dist/engine/health-checker.d.ts.map +1 -0
  47. package/dist/engine/health-checker.js +377 -0
  48. package/dist/engine/health-checker.js.map +1 -0
  49. package/dist/engine/index.d.ts +11 -0
  50. package/dist/engine/index.d.ts.map +1 -0
  51. package/dist/engine/index.js +7 -0
  52. package/dist/engine/index.js.map +1 -0
  53. package/dist/engine/infra-generator.d.ts +26 -0
  54. package/dist/engine/infra-generator.d.ts.map +1 -0
  55. package/dist/engine/infra-generator.js +751 -0
  56. package/dist/engine/infra-generator.js.map +1 -0
  57. package/dist/engine/migration-planner.d.ts +34 -0
  58. package/dist/engine/migration-planner.d.ts.map +1 -0
  59. package/dist/engine/migration-planner.js +427 -0
  60. package/dist/engine/migration-planner.js.map +1 -0
  61. package/dist/engine/performance-profiler.d.ts +22 -0
  62. package/dist/engine/performance-profiler.d.ts.map +1 -0
  63. package/dist/engine/performance-profiler.js +292 -0
  64. package/dist/engine/performance-profiler.js.map +1 -0
  65. package/dist/engine/plugin-loader.d.ts +36 -0
  66. package/dist/engine/plugin-loader.d.ts.map +1 -0
  67. package/dist/engine/plugin-loader.js +157 -0
  68. package/dist/engine/plugin-loader.js.map +1 -0
  69. package/dist/engine/preferences.d.ts +24 -0
  70. package/dist/engine/preferences.d.ts.map +1 -0
  71. package/dist/engine/preferences.js +62 -0
  72. package/dist/engine/preferences.js.map +1 -0
  73. package/dist/engine/rules-engine.d.ts +31 -0
  74. package/dist/engine/rules-engine.d.ts.map +1 -0
  75. package/dist/engine/rules-engine.js +179 -0
  76. package/dist/engine/rules-engine.js.map +1 -0
  77. package/dist/engine/runtime-manager.d.ts +65 -0
  78. package/dist/engine/runtime-manager.d.ts.map +1 -0
  79. package/dist/engine/runtime-manager.js +181 -0
  80. package/dist/engine/runtime-manager.js.map +1 -0
  81. package/dist/engine/scaffold-orchestrator.d.ts +103 -0
  82. package/dist/engine/scaffold-orchestrator.d.ts.map +1 -0
  83. package/dist/engine/scaffold-orchestrator.js +934 -0
  84. package/dist/engine/scaffold-orchestrator.js.map +1 -0
  85. package/dist/engine/stack-detector.d.ts +21 -0
  86. package/dist/engine/stack-detector.d.ts.map +1 -0
  87. package/dist/engine/stack-detector.js +313 -0
  88. package/dist/engine/stack-detector.js.map +1 -0
  89. package/dist/engine/stack-differ.d.ts +26 -0
  90. package/dist/engine/stack-differ.d.ts.map +1 -0
  91. package/dist/engine/stack-differ.js +80 -0
  92. package/dist/engine/stack-differ.js.map +1 -0
  93. package/dist/engine/stack-engine.d.ts +54 -0
  94. package/dist/engine/stack-engine.d.ts.map +1 -0
  95. package/dist/engine/stack-engine.js +186 -0
  96. package/dist/engine/stack-engine.js.map +1 -0
  97. package/dist/engine/stack-serializer.d.ts +32 -0
  98. package/dist/engine/stack-serializer.d.ts.map +1 -0
  99. package/dist/engine/stack-serializer.js +75 -0
  100. package/dist/engine/stack-serializer.js.map +1 -0
  101. package/dist/engine/standards-linter.d.ts +34 -0
  102. package/dist/engine/standards-linter.d.ts.map +1 -0
  103. package/dist/engine/standards-linter.js +162 -0
  104. package/dist/engine/standards-linter.js.map +1 -0
  105. package/dist/engine/tech-installer.d.ts +37 -0
  106. package/dist/engine/tech-installer.d.ts.map +1 -0
  107. package/dist/engine/tech-installer.js +508 -0
  108. package/dist/engine/tech-installer.js.map +1 -0
  109. package/dist/index.d.ts +39 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +25 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/types/index.d.ts +6 -0
  114. package/dist/types/index.d.ts.map +1 -0
  115. package/dist/types/index.js +2 -0
  116. package/dist/types/index.js.map +1 -0
  117. package/dist/types/project.d.ts +33 -0
  118. package/dist/types/project.d.ts.map +1 -0
  119. package/dist/types/project.js +6 -0
  120. package/dist/types/project.js.map +1 -0
  121. package/dist/types/stack.d.ts +29 -0
  122. package/dist/types/stack.d.ts.map +1 -0
  123. package/dist/types/stack.js +6 -0
  124. package/dist/types/stack.js.map +1 -0
  125. package/dist/types/technology.d.ts +47 -0
  126. package/dist/types/technology.d.ts.map +1 -0
  127. package/dist/types/technology.js +6 -0
  128. package/dist/types/technology.js.map +1 -0
  129. package/dist/types/template.d.ts +34 -0
  130. package/dist/types/template.d.ts.map +1 -0
  131. package/dist/types/template.js +6 -0
  132. package/dist/types/template.js.map +1 -0
  133. package/dist/types/validation.d.ts +20 -0
  134. package/dist/types/validation.d.ts.map +1 -0
  135. package/dist/types/validation.js +5 -0
  136. package/dist/types/validation.js.map +1 -0
  137. package/package.json +39 -0
  138. package/src/__tests__/compatibility-scorer.test.ts +264 -0
  139. package/src/__tests__/rules-engine.test.ts +170 -0
  140. package/src/__tests__/scaffold-orchestrator.test.ts +161 -0
  141. package/src/__tests__/stack-engine.test.ts +328 -0
  142. package/src/db/database.ts +112 -0
  143. package/src/db/index.ts +1 -0
  144. package/src/engine/compatibility-scorer.ts +222 -0
  145. package/src/engine/compose-generator.ts +134 -0
  146. package/src/engine/cost-estimator.ts +498 -0
  147. package/src/engine/env-analyzer.ts +156 -0
  148. package/src/engine/health-checker.ts +421 -0
  149. package/src/engine/index.ts +17 -0
  150. package/src/engine/infra-generator.ts +837 -0
  151. package/src/engine/migration-planner.ts +496 -0
  152. package/src/engine/performance-profiler.ts +354 -0
  153. package/src/engine/plugin-loader.ts +216 -0
  154. package/src/engine/preferences.ts +85 -0
  155. package/src/engine/rules-engine.ts +204 -0
  156. package/src/engine/runtime-manager.ts +207 -0
  157. package/src/engine/scaffold-orchestrator.ts +1052 -0
  158. package/src/engine/stack-detector.ts +345 -0
  159. package/src/engine/stack-differ.ts +118 -0
  160. package/src/engine/stack-engine.ts +258 -0
  161. package/src/engine/stack-serializer.ts +95 -0
  162. package/src/engine/standards-linter.ts +210 -0
  163. package/src/engine/tech-installer.ts +650 -0
  164. package/src/index.ts +78 -0
  165. package/src/types/index.ts +10 -0
  166. package/src/types/project.ts +36 -0
  167. package/src/types/stack.ts +32 -0
  168. package/src/types/technology.ts +58 -0
  169. package/src/types/template.ts +37 -0
  170. package/src/types/validation.ts +22 -0
  171. package/tsconfig.json +10 -0
  172. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility-scorer.js","sourceRoot":"","sources":["../../src/engine/compatibility-scorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Compose Generator — Pure function that generates docker-compose.yml content.
3
+ * No disk I/O — returns structured data for preview or writing.
4
+ */
5
+ export interface ComposePreviewResult {
6
+ yaml: string;
7
+ services: string[];
8
+ ports: Record<string, number>;
9
+ volumes: string[];
10
+ }
11
+ interface ComposeTechnology {
12
+ id: string;
13
+ name: string;
14
+ category?: string;
15
+ dockerImage?: string;
16
+ defaultPort?: number;
17
+ envVars?: Record<string, string>;
18
+ healthCheck?: {
19
+ endpoint?: string;
20
+ command?: string;
21
+ interval?: string;
22
+ timeout?: string;
23
+ retries?: number;
24
+ };
25
+ port?: number;
26
+ }
27
+ /**
28
+ * Generate a docker-compose.yml preview from a list of technologies.
29
+ * Only includes technologies that have a `dockerImage`.
30
+ */
31
+ export declare function generateComposePreview(
32
+ technologies: ComposeTechnology[],
33
+ projectName: string,
34
+ ): ComposePreviewResult;
35
+ //# sourceMappingURL=compose-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-generator.d.ts","sourceRoot":"","sources":["../../src/engine/compose-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AASD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,iBAAiB,EAAE,EACjC,WAAW,EAAE,MAAM,GAClB,oBAAoB,CA0FtB"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Compose Generator — Pure function that generates docker-compose.yml content.
3
+ * No disk I/O — returns structured data for preview or writing.
4
+ */
5
+ const DATA_MOUNTS = {
6
+ postgresql: "/var/lib/postgresql/data",
7
+ mysql: "/var/lib/mysql",
8
+ mongodb: "/data/db",
9
+ redis: "/data",
10
+ };
11
+ /**
12
+ * Generate a docker-compose.yml preview from a list of technologies.
13
+ * Only includes technologies that have a `dockerImage`.
14
+ */
15
+ export function generateComposePreview(technologies, projectName) {
16
+ const services = [];
17
+ const ports = {};
18
+ const volumes = [];
19
+ const lines = ["services:"];
20
+ const networkName = `${projectName.toLowerCase().replace(/[^a-z0-9-]/g, "-")}_net`;
21
+ for (const tech of technologies) {
22
+ if (!tech.dockerImage)
23
+ continue;
24
+ services.push(tech.id);
25
+ const port = tech.port ?? tech.defaultPort;
26
+ lines.push(` ${tech.id}:`);
27
+ lines.push(` image: ${tech.dockerImage}`);
28
+ lines.push(" restart: unless-stopped");
29
+ // Ports
30
+ if (port) {
31
+ lines.push(" ports:");
32
+ lines.push(` - "${port}:${port}"`);
33
+ ports[tech.id] = port;
34
+ }
35
+ // Environment variables
36
+ const envVars = tech.envVars ? Object.entries(tech.envVars) : [];
37
+ if (envVars.length > 0) {
38
+ lines.push(" environment:");
39
+ for (const [key, value] of envVars) {
40
+ lines.push(` ${key}: "${value}"`);
41
+ }
42
+ }
43
+ // Health check
44
+ if (tech.healthCheck) {
45
+ lines.push(" healthcheck:");
46
+ if (tech.healthCheck.command) {
47
+ lines.push(` test: ["CMD-SHELL", "${tech.healthCheck.command}"]`);
48
+ }
49
+ else if (tech.healthCheck.endpoint) {
50
+ lines.push(` test: ["CMD-SHELL", "curl -f ${tech.healthCheck.endpoint} || exit 1"]`);
51
+ }
52
+ if (tech.healthCheck.interval) {
53
+ lines.push(` interval: ${tech.healthCheck.interval}`);
54
+ }
55
+ if (tech.healthCheck.timeout) {
56
+ lines.push(` timeout: ${tech.healthCheck.timeout}`);
57
+ }
58
+ if (tech.healthCheck.retries) {
59
+ lines.push(` retries: ${tech.healthCheck.retries}`);
60
+ }
61
+ }
62
+ // Volumes for databases
63
+ const mountPath = DATA_MOUNTS[tech.id];
64
+ if (mountPath && tech.category === "database") {
65
+ const volName = `${tech.id}_data`;
66
+ lines.push(" volumes:");
67
+ lines.push(` - ${volName}:${mountPath}`);
68
+ volumes.push(volName);
69
+ }
70
+ // Network
71
+ lines.push(" networks:");
72
+ lines.push(` - ${networkName}`);
73
+ lines.push("");
74
+ }
75
+ // Named volumes
76
+ if (volumes.length > 0) {
77
+ lines.push("volumes:");
78
+ for (const vol of volumes) {
79
+ lines.push(` ${vol}:`);
80
+ }
81
+ lines.push("");
82
+ }
83
+ // Network
84
+ lines.push("networks:");
85
+ lines.push(` ${networkName}:`);
86
+ lines.push(" driver: bridge");
87
+ lines.push("");
88
+ return {
89
+ yaml: lines.join("\n"),
90
+ services,
91
+ ports,
92
+ volumes,
93
+ };
94
+ }
95
+ //# sourceMappingURL=compose-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-generator.js","sourceRoot":"","sources":["../../src/engine/compose-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Cost Estimator — Estimates monthly hosting costs for a tech stack.
3
+ */
4
+ import type { Technology } from "../types/technology.js";
5
+ export interface CostItem {
6
+ service: string;
7
+ provider: string;
8
+ monthlyCost: string;
9
+ notes: string;
10
+ }
11
+ export interface CostEstimate {
12
+ monthly: {
13
+ min: number;
14
+ max: number;
15
+ currency: string;
16
+ };
17
+ breakdown: CostItem[];
18
+ tier: "free" | "budget" | "standard" | "premium";
19
+ notes: string[];
20
+ }
21
+ export declare function estimateCost(technologies: Technology[]): CostEstimate;
22
+ //# sourceMappingURL=cost-estimator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-estimator.d.ts","sourceRoot":"","sources":["../../src/engine/cost-estimator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIzD,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IACjD,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAqTD,wBAAgB,YAAY,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,YAAY,CAwKrE"}
@@ -0,0 +1,451 @@
1
+ /**
2
+ * Cost Estimator — Estimates monthly hosting costs for a tech stack.
3
+ */
4
+ const DATABASE_COSTS = {
5
+ postgresql: {
6
+ min: 0,
7
+ max: 30,
8
+ items: [
9
+ {
10
+ service: "PostgreSQL",
11
+ provider: "Neon (free tier)",
12
+ monthlyCost: "$0",
13
+ notes: "500MB storage, 0.25 CU",
14
+ },
15
+ {
16
+ service: "PostgreSQL",
17
+ provider: "Supabase (free)",
18
+ monthlyCost: "$0",
19
+ notes: "500MB, 2 projects",
20
+ },
21
+ {
22
+ service: "PostgreSQL",
23
+ provider: "Self-hosted VPS",
24
+ monthlyCost: "$0-5",
25
+ notes: "Included in VPS cost",
26
+ },
27
+ {
28
+ service: "PostgreSQL",
29
+ provider: "AWS RDS",
30
+ monthlyCost: "$15-30/mo",
31
+ notes: "db.t3.micro, single-AZ",
32
+ },
33
+ ],
34
+ },
35
+ mysql: {
36
+ min: 0,
37
+ max: 25,
38
+ items: [
39
+ {
40
+ service: "MySQL",
41
+ provider: "PlanetScale (free)",
42
+ monthlyCost: "$0",
43
+ notes: "5GB, 1B row reads/mo",
44
+ },
45
+ {
46
+ service: "MySQL",
47
+ provider: "Self-hosted VPS",
48
+ monthlyCost: "$0-5",
49
+ notes: "Included in VPS cost",
50
+ },
51
+ { service: "MySQL", provider: "AWS RDS", monthlyCost: "$15-25/mo", notes: "db.t3.micro" },
52
+ ],
53
+ },
54
+ mariadb: {
55
+ min: 0,
56
+ max: 25,
57
+ items: [
58
+ {
59
+ service: "MariaDB",
60
+ provider: "Self-hosted VPS",
61
+ monthlyCost: "$0-5",
62
+ notes: "Included in VPS cost",
63
+ },
64
+ { service: "MariaDB", provider: "AWS RDS", monthlyCost: "$15-25/mo", notes: "db.t3.micro" },
65
+ ],
66
+ },
67
+ mongodb: {
68
+ min: 0,
69
+ max: 10,
70
+ items: [
71
+ {
72
+ service: "MongoDB",
73
+ provider: "Atlas (free M0)",
74
+ monthlyCost: "$0",
75
+ notes: "512MB, shared cluster",
76
+ },
77
+ {
78
+ service: "MongoDB",
79
+ provider: "Self-hosted VPS",
80
+ monthlyCost: "$5-10",
81
+ notes: "Needs 1GB+ RAM",
82
+ },
83
+ ],
84
+ },
85
+ redis: {
86
+ min: 0,
87
+ max: 25,
88
+ items: [
89
+ {
90
+ service: "Redis",
91
+ provider: "Upstash (free)",
92
+ monthlyCost: "$0",
93
+ notes: "10k commands/day",
94
+ },
95
+ {
96
+ service: "Redis",
97
+ provider: "Self-hosted VPS",
98
+ monthlyCost: "$0-5",
99
+ notes: "Included in VPS cost",
100
+ },
101
+ {
102
+ service: "Redis",
103
+ provider: "AWS ElastiCache",
104
+ monthlyCost: "$10-25/mo",
105
+ notes: "cache.t3.micro",
106
+ },
107
+ ],
108
+ },
109
+ sqlite: {
110
+ min: 0,
111
+ max: 0,
112
+ items: [
113
+ {
114
+ service: "SQLite",
115
+ provider: "Embedded",
116
+ monthlyCost: "$0",
117
+ notes: "File-based, no server needed",
118
+ },
119
+ ],
120
+ },
121
+ };
122
+ const HOSTING_COSTS = {
123
+ docker: {
124
+ min: 5,
125
+ max: 50,
126
+ items: [
127
+ {
128
+ service: "Docker VPS",
129
+ provider: "Basic (Hetzner/DO)",
130
+ monthlyCost: "$5-10/mo",
131
+ notes: "2GB RAM, shared CPU",
132
+ },
133
+ {
134
+ service: "Docker VPS",
135
+ provider: "Production",
136
+ monthlyCost: "$20-50/mo",
137
+ notes: "4-8GB RAM, dedicated CPU",
138
+ },
139
+ ],
140
+ },
141
+ vercel: {
142
+ min: 0,
143
+ max: 20,
144
+ items: [
145
+ {
146
+ service: "Vercel",
147
+ provider: "Hobby",
148
+ monthlyCost: "$0",
149
+ notes: "Personal projects, 100GB bandwidth",
150
+ },
151
+ {
152
+ service: "Vercel",
153
+ provider: "Pro",
154
+ monthlyCost: "$20/mo",
155
+ notes: "Team features, 1TB bandwidth",
156
+ },
157
+ ],
158
+ },
159
+ aws: {
160
+ min: 25,
161
+ max: 60,
162
+ items: [
163
+ {
164
+ service: "AWS ECS Fargate",
165
+ provider: "AWS",
166
+ monthlyCost: "$25-60/mo",
167
+ notes: "0.25 vCPU, 512MB task",
168
+ },
169
+ ],
170
+ },
171
+ gcp: {
172
+ min: 0,
173
+ max: 30,
174
+ items: [
175
+ {
176
+ service: "Cloud Run",
177
+ provider: "GCP",
178
+ monthlyCost: "$0-30/mo",
179
+ notes: "Pay per use, generous free tier",
180
+ },
181
+ ],
182
+ },
183
+ };
184
+ // Categories that are always free (dev tools, frontend static hosting)
185
+ const FREE_CATEGORIES = new Set(["orm", "styling", "auth", "frontend"]);
186
+ const FREE_NOTES = {
187
+ orm: "Dev dependency, no hosting cost",
188
+ styling: "Build-time only, no hosting cost",
189
+ auth: "Library cost is $0, auth service may cost extra",
190
+ frontend: "Static hosting available free (Vercel, Netlify, CF Pages)",
191
+ };
192
+ // ─── Service Costs ────────────────────────────────────
193
+ const SERVICE_COSTS = {
194
+ grafana: {
195
+ min: 0,
196
+ max: 10,
197
+ items: [
198
+ {
199
+ service: "Grafana",
200
+ provider: "Self-hosted",
201
+ monthlyCost: "$0",
202
+ notes: "OSS, included in VPS",
203
+ },
204
+ {
205
+ service: "Grafana",
206
+ provider: "Grafana Cloud (free)",
207
+ monthlyCost: "$0",
208
+ notes: "10k metrics, 50GB logs",
209
+ },
210
+ ],
211
+ },
212
+ prometheus: {
213
+ min: 0,
214
+ max: 5,
215
+ items: [
216
+ {
217
+ service: "Prometheus",
218
+ provider: "Self-hosted",
219
+ monthlyCost: "$0",
220
+ notes: "OSS, included in VPS",
221
+ },
222
+ ],
223
+ },
224
+ elasticsearch: {
225
+ min: 0,
226
+ max: 30,
227
+ items: [
228
+ {
229
+ service: "Elasticsearch",
230
+ provider: "Elastic Cloud (free)",
231
+ monthlyCost: "$0",
232
+ notes: "14-day trial",
233
+ },
234
+ {
235
+ service: "Elasticsearch",
236
+ provider: "Self-hosted",
237
+ monthlyCost: "$10-30/mo",
238
+ notes: "Needs 2-4GB RAM",
239
+ },
240
+ ],
241
+ },
242
+ rabbitmq: {
243
+ min: 0,
244
+ max: 20,
245
+ items: [
246
+ {
247
+ service: "RabbitMQ",
248
+ provider: "CloudAMQP (free)",
249
+ monthlyCost: "$0",
250
+ notes: "Little Lemur, 1M msgs/mo",
251
+ },
252
+ {
253
+ service: "RabbitMQ",
254
+ provider: "Self-hosted",
255
+ monthlyCost: "$5-20/mo",
256
+ notes: "Needs 512MB+ RAM",
257
+ },
258
+ ],
259
+ },
260
+ nginx: {
261
+ min: 0,
262
+ max: 0,
263
+ items: [
264
+ {
265
+ service: "Nginx",
266
+ provider: "Self-hosted",
267
+ monthlyCost: "$0",
268
+ notes: "Included in VPS, minimal resources",
269
+ },
270
+ ],
271
+ },
272
+ traefik: {
273
+ min: 0,
274
+ max: 0,
275
+ items: [
276
+ {
277
+ service: "Traefik",
278
+ provider: "Self-hosted",
279
+ monthlyCost: "$0",
280
+ notes: "Included in Docker setup",
281
+ },
282
+ ],
283
+ },
284
+ };
285
+ // ─── Tier Calculation ─────────────────────────────────
286
+ function calculateTier(min, max) {
287
+ const avg = (min + max) / 2;
288
+ if (avg === 0)
289
+ return "free";
290
+ if (avg < 20)
291
+ return "budget";
292
+ if (avg <= 60)
293
+ return "standard";
294
+ return "premium";
295
+ }
296
+ // ─── Main Function ────────────────────────────────────
297
+ export function estimateCost(technologies) {
298
+ const breakdown = [];
299
+ let totalMin = 0;
300
+ let totalMax = 0;
301
+ const notes = [];
302
+ let hasDocker = false;
303
+ let hasHostingPlatform = false;
304
+ let hasDatabase = false;
305
+ let hasFrontend = false;
306
+ for (const tech of technologies) {
307
+ // Check for Docker
308
+ if (tech.id === "docker" || tech.dockerImage) {
309
+ hasDocker = true;
310
+ }
311
+ // Free categories
312
+ if (FREE_CATEGORIES.has(tech.category)) {
313
+ if (tech.category === "frontend")
314
+ hasFrontend = true;
315
+ breakdown.push({
316
+ service: tech.name,
317
+ provider: "N/A",
318
+ monthlyCost: "$0",
319
+ notes: FREE_NOTES[tech.category] || "No hosting cost",
320
+ });
321
+ continue;
322
+ }
323
+ // Database costs
324
+ if (tech.category === "database") {
325
+ hasDatabase = true;
326
+ const dbCost = DATABASE_COSTS[tech.id];
327
+ if (dbCost) {
328
+ totalMin += dbCost.min;
329
+ totalMax += dbCost.max;
330
+ breakdown.push(...dbCost.items);
331
+ }
332
+ else {
333
+ breakdown.push({
334
+ service: tech.name,
335
+ provider: "Self-hosted",
336
+ monthlyCost: "$5-15/mo",
337
+ notes: "Estimated for unknown database",
338
+ });
339
+ totalMin += 5;
340
+ totalMax += 15;
341
+ }
342
+ continue;
343
+ }
344
+ // Service costs
345
+ if (tech.category === "service") {
346
+ const svcCost = SERVICE_COSTS[tech.id];
347
+ if (svcCost) {
348
+ totalMin += svcCost.min;
349
+ totalMax += svcCost.max;
350
+ breakdown.push(...svcCost.items);
351
+ }
352
+ else {
353
+ breakdown.push({
354
+ service: tech.name,
355
+ provider: "Varies",
356
+ monthlyCost: "$0-20/mo",
357
+ notes: "Cost depends on provider and usage",
358
+ });
359
+ totalMax += 20;
360
+ }
361
+ continue;
362
+ }
363
+ // Hosting platforms (devops category)
364
+ if (tech.category === "devops") {
365
+ const hostCost = HOSTING_COSTS[tech.id];
366
+ if (hostCost) {
367
+ hasHostingPlatform = true;
368
+ totalMin += hostCost.min;
369
+ totalMax += hostCost.max;
370
+ breakdown.push(...hostCost.items);
371
+ }
372
+ continue;
373
+ }
374
+ // Runtime / backend frameworks — no direct cost, but need hosting
375
+ if (tech.category === "runtime" || tech.category === "backend") {
376
+ }
377
+ }
378
+ // If there's a backend/runtime but no hosting platform, add default VPS estimate
379
+ const hasBackend = technologies.some((t) => t.category === "runtime" || t.category === "backend");
380
+ if (hasBackend && !hasHostingPlatform) {
381
+ if (hasDocker) {
382
+ totalMin += 5;
383
+ totalMax += 50;
384
+ breakdown.push({
385
+ service: "Docker VPS",
386
+ provider: "Basic (Hetzner/DO)",
387
+ monthlyCost: "$5-10/mo",
388
+ notes: "2GB RAM, shared CPU",
389
+ }, {
390
+ service: "Docker VPS",
391
+ provider: "Production",
392
+ monthlyCost: "$20-50/mo",
393
+ notes: "4-8GB RAM, dedicated CPU",
394
+ });
395
+ }
396
+ else {
397
+ totalMin += 0;
398
+ totalMax += 20;
399
+ breakdown.push({
400
+ service: "Hosting",
401
+ provider: "Vercel/Netlify (free)",
402
+ monthlyCost: "$0",
403
+ notes: "Serverless, limited",
404
+ }, {
405
+ service: "Hosting",
406
+ provider: "VPS (basic)",
407
+ monthlyCost: "$5-20/mo",
408
+ notes: "Small cloud instance",
409
+ });
410
+ }
411
+ }
412
+ // Frontend static hosting
413
+ if (hasFrontend && !hasHostingPlatform) {
414
+ breakdown.push({
415
+ service: "Static hosting",
416
+ provider: "Vercel/Netlify/CF Pages",
417
+ monthlyCost: "$0",
418
+ notes: "Free tier covers most projects",
419
+ });
420
+ }
421
+ // Domain + SSL
422
+ totalMin += 1;
423
+ totalMax += 1;
424
+ breakdown.push({
425
+ service: "Domain + SSL",
426
+ provider: "Namecheap/Cloudflare",
427
+ monthlyCost: "~$1/mo",
428
+ notes: "$10-15/yr domain, free SSL via Let's Encrypt",
429
+ });
430
+ // Notes
431
+ if (!hasDatabase) {
432
+ notes.push("No database detected — add one if your app needs persistence.");
433
+ }
434
+ if (hasDocker) {
435
+ notes.push("Docker detected — VPS hosting recommended for full control.");
436
+ }
437
+ if (totalMin === 0 || (totalMin <= 1 && !hasDatabase)) {
438
+ notes.push("This stack can run entirely on free tiers for development and small projects.");
439
+ }
440
+ if (totalMax > 60) {
441
+ notes.push("Production costs can be reduced with reserved instances or spot pricing.");
442
+ }
443
+ const tier = calculateTier(totalMin, totalMax);
444
+ return {
445
+ monthly: { min: totalMin, max: totalMax, currency: "USD" },
446
+ breakdown,
447
+ tier,
448
+ notes,
449
+ };
450
+ }
451
+ //# sourceMappingURL=cost-estimator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-estimator.js","sourceRoot":"","sources":["../../src/engine/cost-estimator.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4BH,MAAM,cAAc,GAA8B;IAChD,UAAU,EAAE;QACV,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,EAAE;QACP,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,kBAAkB;gBAC5B,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,wBAAwB;aAChC;YACD;gBACE,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,iBAAiB;gBAC3B,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,mBAAmB;aAC3B;YACD;gBACE,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,iBAAiB;gBAC3B,WAAW,EAAE,MAAM;gBACnB,KAAK,EAAE,sBAAsB;aAC9B;YACD;gBACE,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,SAAS;gBACnB,WAAW,EAAE,WAAW;gBACxB,KAAK,EAAE,wBAAwB;aAChC;SACF;KACF;IACD,KAAK,EAAE;QACL,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,EAAE;QACP,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,oBAAoB;gBAC9B,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,sBAAsB;aAC9B;YACD;gBACE,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,iBAAiB;gBAC3B,WAAW,EAAE,MAAM;gBACnB,KAAK,EAAE,sBAAsB;aAC9B;YACD,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE;SAC1F;KACF;IACD,OAAO,EAAE;QACP,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,EAAE;QACP,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,SAAS;gBAClB,QAAQ,EAAE,iBAAiB;gBAC3B,WAAW,EAAE,MAAM;gBACnB,KAAK,EAAE,sBAAsB;aAC9B;YACD,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE;SAC5F;KACF;IACD,OAAO,EAAE;QACP,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,EAAE;QACP,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,SAAS;gBAClB,QAAQ,EAAE,iBAAiB;gBAC3B,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,uBAAuB;aAC/B;YACD;gBACE,OAAO,EAAE,SAAS;gBAClB,QAAQ,EAAE,iBAAiB;gBAC3B,WAAW,EAAE,OAAO;gBACpB,KAAK,EAAE,gBAAgB;aACxB;SACF;KACF;IACD,KAAK,EAAE;QACL,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,EAAE;QACP,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,gBAAgB;gBAC1B,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,kBAAkB;aAC1B;YACD;gBACE,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,iBAAiB;gBAC3B,WAAW,EAAE,MAAM;gBACnB,KAAK,EAAE,sBAAsB;aAC9B;YACD;gBACE,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,iBAAiB;gBAC3B,WAAW,EAAE,WAAW;gBACxB,KAAK,EAAE,gBAAgB;aACxB;SACF;KACF;IACD,MAAM,EAAE;QACN,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;QACN,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,QAAQ;gBACjB,QAAQ,EAAE,UAAU;gBACpB,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,8BAA8B;aACtC;SACF;KACF;CACF,CAAC;AAEF,MAAM,aAAa,GAA8B;IAC/C,MAAM,EAAE;QACN,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,EAAE;QACP,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,oBAAoB;gBAC9B,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,qBAAqB;aAC7B;YACD;gBACE,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,YAAY;gBACtB,WAAW,EAAE,WAAW;gBACxB,KAAK,EAAE,0BAA0B;aAClC;SACF;KACF;IACD,MAAM,EAAE;QACN,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,EAAE;QACP,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,QAAQ;gBACjB,QAAQ,EAAE,OAAO;gBACjB,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,oCAAoC;aAC5C;YACD;gBACE,OAAO,EAAE,QAAQ;gBACjB,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,QAAQ;gBACrB,KAAK,EAAE,8BAA8B;aACtC;SACF;KACF;IACD,GAAG,EAAE;QACH,GAAG,EAAE,EAAE;QACP,GAAG,EAAE,EAAE;QACP,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,WAAW;gBACxB,KAAK,EAAE,uBAAuB;aAC/B;SACF;KACF;IACD,GAAG,EAAE;QACH,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,EAAE;QACP,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,WAAW;gBACpB,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,iCAAiC;aACzC;SACF;KACF;CACF,CAAC;AAEF,uEAAuE;AACvE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAExE,MAAM,UAAU,GAA2B;IACzC,GAAG,EAAE,iCAAiC;IACtC,OAAO,EAAE,kCAAkC;IAC3C,IAAI,EAAE,iDAAiD;IACvD,QAAQ,EAAE,2DAA2D;CACtE,CAAC;AAEF,yDAAyD;AAEzD,MAAM,aAAa,GAA8B;IAC/C,OAAO,EAAE;QACP,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,EAAE;QACP,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,SAAS;gBAClB,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,sBAAsB;aAC9B;YACD;gBACE,OAAO,EAAE,SAAS;gBAClB,QAAQ,EAAE,sBAAsB;gBAChC,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,wBAAwB;aAChC;SACF;KACF;IACD,UAAU,EAAE;QACV,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;QACN,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,sBAAsB;aAC9B;SACF;KACF;IACD,aAAa,EAAE;QACb,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,EAAE;QACP,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,eAAe;gBACxB,QAAQ,EAAE,sBAAsB;gBAChC,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,cAAc;aACtB;YACD;gBACE,OAAO,EAAE,eAAe;gBACxB,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,WAAW;gBACxB,KAAK,EAAE,iBAAiB;aACzB;SACF;KACF;IACD,QAAQ,EAAE;QACR,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,EAAE;QACP,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,UAAU;gBACnB,QAAQ,EAAE,kBAAkB;gBAC5B,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,0BAA0B;aAClC;YACD;gBACE,OAAO,EAAE,UAAU;gBACnB,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,kBAAkB;aAC1B;SACF;KACF;IACD,KAAK,EAAE;QACL,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;QACN,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,oCAAoC;aAC5C;SACF;KACF;IACD,OAAO,EAAE;QACP,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;QACN,KAAK,EAAE;YACL;gBACE,OAAO,EAAE,SAAS;gBAClB,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,0BAA0B;aAClC;SACF;KACF;CACF,CAAC;AAEF,yDAAyD;AAEzD,SAAS,aAAa,CAAC,GAAW,EAAE,GAAW;IAC7C,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7B,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,UAAU,CAAC;IACjC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,yDAAyD;AAEzD,MAAM,UAAU,YAAY,CAAC,YAA0B;IACrD,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,mBAAmB;QACnB,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7C,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,kBAAkB;QAClB,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU;gBAAE,WAAW,GAAG,IAAI,CAAC;YACrD,SAAS,CAAC,IAAI,CAAC;gBACb,OAAO,EAAE,IAAI,CAAC,IAAI;gBAClB,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,iBAAiB;aACtD,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,iBAAiB;QACjB,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YACjC,WAAW,GAAG,IAAI,CAAC;YACnB,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,MAAM,EAAE,CAAC;gBACX,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC;gBACvB,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC;gBACvB,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC;oBACb,OAAO,EAAE,IAAI,CAAC,IAAI;oBAClB,QAAQ,EAAE,aAAa;oBACvB,WAAW,EAAE,UAAU;oBACvB,KAAK,EAAE,gCAAgC;iBACxC,CAAC,CAAC;gBACH,QAAQ,IAAI,CAAC,CAAC;gBACd,QAAQ,IAAI,EAAE,CAAC;YACjB,CAAC;YACD,SAAS;QACX,CAAC;QAED,gBAAgB;QAChB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,OAAO,EAAE,CAAC;gBACZ,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC;gBACxB,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC;gBACxB,SAAS,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC;oBACb,OAAO,EAAE,IAAI,CAAC,IAAI;oBAClB,QAAQ,EAAE,QAAQ;oBAClB,WAAW,EAAE,UAAU;oBACvB,KAAK,EAAE,oCAAoC;iBAC5C,CAAC,CAAC;gBACH,QAAQ,IAAI,EAAE,CAAC;YACjB,CAAC;YACD,SAAS;QACX,CAAC;QAED,sCAAsC;QACtC,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxC,IAAI,QAAQ,EAAE,CAAC;gBACb,kBAAkB,GAAG,IAAI,CAAC;gBAC1B,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC;gBACzB,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC;gBACzB,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,SAAS;QACX,CAAC;QAED,kEAAkE;QAClE,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjE,CAAC;IACH,CAAC;IAED,iFAAiF;IACjF,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IAClG,IAAI,UAAU,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACtC,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,IAAI,CAAC,CAAC;YACd,QAAQ,IAAI,EAAE,CAAC;YACf,SAAS,CAAC,IAAI,CACZ;gBACE,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,oBAAoB;gBAC9B,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,qBAAqB;aAC7B,EACD;gBACE,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,YAAY;gBACtB,WAAW,EAAE,WAAW;gBACxB,KAAK,EAAE,0BAA0B;aAClC,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,QAAQ,IAAI,CAAC,CAAC;YACd,QAAQ,IAAI,EAAE,CAAC;YACf,SAAS,CAAC,IAAI,CACZ;gBACE,OAAO,EAAE,SAAS;gBAClB,QAAQ,EAAE,uBAAuB;gBACjC,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,qBAAqB;aAC7B,EACD;gBACE,OAAO,EAAE,SAAS;gBAClB,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,sBAAsB;aAC9B,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,WAAW,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACvC,SAAS,CAAC,IAAI,CAAC;YACb,OAAO,EAAE,gBAAgB;YACzB,QAAQ,EAAE,yBAAyB;YACnC,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,gCAAgC;SACxC,CAAC,CAAC;IACL,CAAC;IAED,eAAe;IACf,QAAQ,IAAI,CAAC,CAAC;IACd,QAAQ,IAAI,CAAC,CAAC;IACd,SAAS,CAAC,IAAI,CAAC;QACb,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,sBAAsB;QAChC,WAAW,EAAE,QAAQ;QACrB,KAAK,EAAE,8CAA8C;KACtD,CAAC,CAAC;IAEH,QAAQ;IACR,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE/C,OAAO;QACL,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC1D,SAAS;QACT,IAAI;QACJ,KAAK;KACN,CAAC;AACJ,CAAC"}