blokctl 0.3.0 → 0.6.1

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 (30) hide show
  1. package/dist/commands/check/index.d.ts +2 -0
  2. package/dist/commands/check/index.js +39 -0
  3. package/dist/commands/create/project.js +20 -5
  4. package/dist/commands/create/utils/Examples.d.ts +2 -2
  5. package/dist/commands/create/utils/Examples.js +28 -31
  6. package/dist/commands/dev/index.js +40 -57
  7. package/dist/commands/generate/GenerationAnalytics.js +2 -1
  8. package/dist/commands/generate/e2e/NodeGenerator.e2e.test.js +1 -1
  9. package/dist/commands/generate/e2e/TriggerGenerator.e2e.test.js +1 -1
  10. package/dist/commands/generate/e2e/WorkflowGenerator.e2e.test.js +1 -1
  11. package/dist/commands/migrate/index.js +11 -0
  12. package/dist/commands/migrate/paths.d.ts +2 -0
  13. package/dist/commands/migrate/paths.js +267 -0
  14. package/dist/index.js +14 -1
  15. package/dist/services/local-token-manager.js +1 -1
  16. package/dist/services/runtime-detector.d.ts +1 -0
  17. package/dist/services/runtime-detector.js +12 -0
  18. package/dist/services/runtime-setup.d.ts +12 -1
  19. package/dist/services/runtime-setup.js +28 -0
  20. package/dist/services/semver-utils.d.ts +18 -0
  21. package/dist/services/semver-utils.js +82 -0
  22. package/dist/services/semver-utils.test.d.ts +1 -0
  23. package/dist/services/semver-utils.test.js +233 -0
  24. package/dist/studio-dist/assets/{icons-N5J4OhGx.js → icons-D-BBts99.js} +110 -65
  25. package/dist/studio-dist/assets/index-BD8_9YPN.js +42 -0
  26. package/dist/studio-dist/assets/index-D4Bc9-mb.css +1 -0
  27. package/dist/studio-dist/index.html +3 -3
  28. package/package.json +2 -2
  29. package/dist/studio-dist/assets/index-D6JA5F-X.js +0 -42
  30. package/dist/studio-dist/assets/index-mdQkg9ul.css +0 -1
@@ -0,0 +1,233 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { compareSemver, computeDefaultConstraint, formatVersionMismatch, formatVersionSuccess, parseConstraint, parseSemver, satisfiesConstraint, semverGte, } from "./semver-utils.js";
3
+ describe("parseSemver", () => {
4
+ it("parses a full semver string", () => {
5
+ expect(parseSemver("3.12.0")).toEqual({ major: 3, minor: 12, patch: 0 });
6
+ });
7
+ it("parses a two-part version", () => {
8
+ expect(parseSemver("1.22")).toEqual({ major: 1, minor: 22, patch: 0 });
9
+ });
10
+ it("parses a single-part version", () => {
11
+ expect(parseSemver("17")).toEqual({ major: 17, minor: 0, patch: 0 });
12
+ });
13
+ it("handles 0.x versions", () => {
14
+ expect(parseSemver("0.2.3")).toEqual({ major: 0, minor: 2, patch: 3 });
15
+ expect(parseSemver("0.0.3")).toEqual({ major: 0, minor: 0, patch: 3 });
16
+ });
17
+ it("handles large version numbers", () => {
18
+ expect(parseSemver("17.0.11")).toEqual({ major: 17, minor: 0, patch: 11 });
19
+ });
20
+ it("trims whitespace", () => {
21
+ expect(parseSemver(" 3.12.0 ")).toEqual({ major: 3, minor: 12, patch: 0 });
22
+ });
23
+ });
24
+ describe("compareSemver", () => {
25
+ it("returns 0 for equal versions", () => {
26
+ expect(compareSemver("1.2.3", "1.2.3")).toBe(0);
27
+ });
28
+ it("returns positive when a > b (major)", () => {
29
+ expect(compareSemver("2.0.0", "1.9.9")).toBeGreaterThan(0);
30
+ });
31
+ it("returns positive when a > b (minor)", () => {
32
+ expect(compareSemver("1.3.0", "1.2.9")).toBeGreaterThan(0);
33
+ });
34
+ it("returns positive when a > b (patch)", () => {
35
+ expect(compareSemver("1.2.4", "1.2.3")).toBeGreaterThan(0);
36
+ });
37
+ it("returns negative when a < b", () => {
38
+ expect(compareSemver("1.2.3", "1.2.4")).toBeLessThan(0);
39
+ });
40
+ it("treats missing patch as 0", () => {
41
+ expect(compareSemver("1.22", "1.22.0")).toBe(0);
42
+ });
43
+ });
44
+ describe("semverGte", () => {
45
+ it("returns true for equal versions", () => {
46
+ expect(semverGte({ major: 3, minor: 10, patch: 0 }, { major: 3, minor: 10, patch: 0 })).toBe(true);
47
+ });
48
+ it("returns true when major is greater", () => {
49
+ expect(semverGte({ major: 4, minor: 0, patch: 0 }, { major: 3, minor: 10, patch: 0 })).toBe(true);
50
+ });
51
+ it("returns true when minor is greater", () => {
52
+ expect(semverGte({ major: 3, minor: 11, patch: 0 }, { major: 3, minor: 10, patch: 0 })).toBe(true);
53
+ });
54
+ it("returns true when patch is greater", () => {
55
+ expect(semverGte({ major: 3, minor: 10, patch: 1 }, { major: 3, minor: 10, patch: 0 })).toBe(true);
56
+ });
57
+ it("returns false when less than", () => {
58
+ expect(semverGte({ major: 3, minor: 9, patch: 7 }, { major: 3, minor: 10, patch: 0 })).toBe(false);
59
+ });
60
+ });
61
+ describe("parseConstraint", () => {
62
+ it("parses >= operator", () => {
63
+ const result = parseConstraint(">=3.10.0");
64
+ expect(result.operator).toBe(">=");
65
+ expect(result.version).toBe("3.10.0");
66
+ expect(result.parts).toEqual({ major: 3, minor: 10, patch: 0 });
67
+ });
68
+ it("parses ^ operator", () => {
69
+ const result = parseConstraint("^1.22.0");
70
+ expect(result.operator).toBe("^");
71
+ expect(result.version).toBe("1.22.0");
72
+ });
73
+ it("parses ~ operator", () => {
74
+ const result = parseConstraint("~1.22.0");
75
+ expect(result.operator).toBe("~");
76
+ expect(result.version).toBe("1.22.0");
77
+ });
78
+ it("parses exact version (no operator)", () => {
79
+ const result = parseConstraint("3.12.0");
80
+ expect(result.operator).toBe("");
81
+ expect(result.version).toBe("3.12.0");
82
+ });
83
+ it("parses = operator", () => {
84
+ const result = parseConstraint("=3.12.0");
85
+ expect(result.operator).toBe("=");
86
+ expect(result.version).toBe("3.12.0");
87
+ });
88
+ it("trims whitespace", () => {
89
+ const result = parseConstraint(" >=3.10.0 ");
90
+ expect(result.operator).toBe(">=");
91
+ expect(result.version).toBe("3.10.0");
92
+ });
93
+ });
94
+ describe("satisfiesConstraint", () => {
95
+ describe(">= operator", () => {
96
+ it("satisfies when equal", () => {
97
+ expect(satisfiesConstraint("3.10.0", ">=3.10.0")).toBe(true);
98
+ });
99
+ it("satisfies when greater (patch)", () => {
100
+ expect(satisfiesConstraint("3.10.1", ">=3.10.0")).toBe(true);
101
+ });
102
+ it("satisfies when greater (minor)", () => {
103
+ expect(satisfiesConstraint("3.11.0", ">=3.10.0")).toBe(true);
104
+ });
105
+ it("satisfies when greater (major)", () => {
106
+ expect(satisfiesConstraint("4.0.0", ">=3.10.0")).toBe(true);
107
+ });
108
+ it("fails when less than (minor)", () => {
109
+ expect(satisfiesConstraint("3.9.7", ">=3.10.0")).toBe(false);
110
+ });
111
+ it("fails when less than (major)", () => {
112
+ expect(satisfiesConstraint("2.99.99", ">=3.10.0")).toBe(false);
113
+ });
114
+ it("Python 3.12.0 satisfies >=3.10.0", () => {
115
+ expect(satisfiesConstraint("3.12.0", ">=3.10.0")).toBe(true);
116
+ });
117
+ it("Python 3.9.7 does not satisfy >=3.10.0", () => {
118
+ expect(satisfiesConstraint("3.9.7", ">=3.10.0")).toBe(false);
119
+ });
120
+ it("Go 1.22.5 satisfies >=1.21.0", () => {
121
+ expect(satisfiesConstraint("1.22.5", ">=1.21.0")).toBe(true);
122
+ });
123
+ it("Java 17.0.11 satisfies >=17.0.0", () => {
124
+ expect(satisfiesConstraint("17.0.11", ">=17.0.0")).toBe(true);
125
+ });
126
+ it("Java 11.0.2 does not satisfy >=17.0.0", () => {
127
+ expect(satisfiesConstraint("11.0.2", ">=17.0.0")).toBe(false);
128
+ });
129
+ });
130
+ describe("^ (caret) operator", () => {
131
+ it("satisfies when equal", () => {
132
+ expect(satisfiesConstraint("1.22.0", "^1.22.0")).toBe(true);
133
+ });
134
+ it("satisfies when patch is higher", () => {
135
+ expect(satisfiesConstraint("1.22.5", "^1.22.0")).toBe(true);
136
+ });
137
+ it("satisfies when minor is higher", () => {
138
+ expect(satisfiesConstraint("1.23.0", "^1.22.0")).toBe(true);
139
+ });
140
+ it("fails when major is different", () => {
141
+ expect(satisfiesConstraint("2.0.0", "^1.22.0")).toBe(false);
142
+ });
143
+ it("fails when version is lower", () => {
144
+ expect(satisfiesConstraint("1.21.9", "^1.22.0")).toBe(false);
145
+ });
146
+ it("^0.2.3 requires minor match", () => {
147
+ expect(satisfiesConstraint("0.2.3", "^0.2.3")).toBe(true);
148
+ expect(satisfiesConstraint("0.2.4", "^0.2.3")).toBe(true);
149
+ expect(satisfiesConstraint("0.3.0", "^0.2.3")).toBe(false);
150
+ });
151
+ it("^0.0.3 requires exact patch match", () => {
152
+ expect(satisfiesConstraint("0.0.3", "^0.0.3")).toBe(true);
153
+ expect(satisfiesConstraint("0.0.4", "^0.0.3")).toBe(false);
154
+ });
155
+ });
156
+ describe("~ (tilde) operator", () => {
157
+ it("satisfies when equal", () => {
158
+ expect(satisfiesConstraint("1.22.0", "~1.22.0")).toBe(true);
159
+ });
160
+ it("satisfies when patch is higher", () => {
161
+ expect(satisfiesConstraint("1.22.5", "~1.22.0")).toBe(true);
162
+ });
163
+ it("fails when minor is different", () => {
164
+ expect(satisfiesConstraint("1.23.0", "~1.22.0")).toBe(false);
165
+ });
166
+ it("fails when major is different", () => {
167
+ expect(satisfiesConstraint("2.22.0", "~1.22.0")).toBe(false);
168
+ });
169
+ it("fails when patch is lower", () => {
170
+ expect(satisfiesConstraint("1.22.0", "~1.22.3")).toBe(false);
171
+ });
172
+ });
173
+ describe("exact version", () => {
174
+ it("satisfies when exact match", () => {
175
+ expect(satisfiesConstraint("3.12.0", "3.12.0")).toBe(true);
176
+ });
177
+ it("fails when patch differs", () => {
178
+ expect(satisfiesConstraint("3.12.1", "3.12.0")).toBe(false);
179
+ });
180
+ it("fails when minor differs", () => {
181
+ expect(satisfiesConstraint("3.13.0", "3.12.0")).toBe(false);
182
+ });
183
+ it("works with = prefix", () => {
184
+ expect(satisfiesConstraint("3.12.0", "=3.12.0")).toBe(true);
185
+ expect(satisfiesConstraint("3.12.1", "=3.12.0")).toBe(false);
186
+ });
187
+ });
188
+ });
189
+ describe("computeDefaultConstraint", () => {
190
+ it("computes >=major.minor.0 from full version", () => {
191
+ expect(computeDefaultConstraint("3.12.4")).toBe(">=3.12.0");
192
+ });
193
+ it("computes >=major.minor.0 when patch is already 0", () => {
194
+ expect(computeDefaultConstraint("1.22.0")).toBe(">=1.22.0");
195
+ });
196
+ it("handles two-part version", () => {
197
+ expect(computeDefaultConstraint("1.22")).toBe(">=1.22.0");
198
+ });
199
+ it("handles large major version (Java)", () => {
200
+ expect(computeDefaultConstraint("17.0.11")).toBe(">=17.0.0");
201
+ });
202
+ it("handles 0.x versions", () => {
203
+ expect(computeDefaultConstraint("0.2.3")).toBe(">=0.2.0");
204
+ });
205
+ });
206
+ describe("formatVersionMismatch", () => {
207
+ it("formats a mismatch with install hint", () => {
208
+ const result = formatVersionMismatch("Python 3", "3.9.7", ">=3.10.0", "Install Python 3.10+: https://python.org/downloads/");
209
+ expect(result).toContain("x Python 3");
210
+ expect(result).toContain("Required: >=3.10.0");
211
+ expect(result).toContain("Found: 3.9.7");
212
+ expect(result).toContain("Fix: Install Python 3.10+");
213
+ expect(result).toContain("Or update constraint in .blok/config.json");
214
+ });
215
+ it("formats a mismatch when not installed", () => {
216
+ const result = formatVersionMismatch("Go", undefined, ">=1.22.0", "Install Go: https://go.dev/dl/");
217
+ expect(result).toContain("Found: not installed");
218
+ });
219
+ it("formats without install hint", () => {
220
+ const result = formatVersionMismatch("Rust", "1.70.0", ">=1.75.0");
221
+ expect(result).not.toContain("Fix:");
222
+ expect(result).toContain("Or update constraint");
223
+ });
224
+ });
225
+ describe("formatVersionSuccess", () => {
226
+ it("formats a success message", () => {
227
+ const result = formatVersionSuccess("Python 3", "3.12.0", ">=3.10.0");
228
+ expect(result).toContain("✓");
229
+ expect(result).toContain("Python 3");
230
+ expect(result).toContain("3.12.0");
231
+ expect(result).toContain("requires >=3.10.0");
232
+ });
233
+ });