@carlesandres/webreel 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 (63) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +206 -0
  3. package/dist/commands/__tests__/record.test.d.ts +2 -0
  4. package/dist/commands/__tests__/record.test.d.ts.map +1 -0
  5. package/dist/commands/__tests__/record.test.js +89 -0
  6. package/dist/commands/__tests__/record.test.js.map +1 -0
  7. package/dist/commands/composite.d.ts +3 -0
  8. package/dist/commands/composite.d.ts.map +1 -0
  9. package/dist/commands/composite.js +43 -0
  10. package/dist/commands/composite.js.map +1 -0
  11. package/dist/commands/init.d.ts +3 -0
  12. package/dist/commands/init.d.ts.map +1 -0
  13. package/dist/commands/init.js +50 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/install.d.ts +3 -0
  16. package/dist/commands/install.d.ts.map +1 -0
  17. package/dist/commands/install.js +71 -0
  18. package/dist/commands/install.js.map +1 -0
  19. package/dist/commands/preview.d.ts +3 -0
  20. package/dist/commands/preview.d.ts.map +1 -0
  21. package/dist/commands/preview.js +30 -0
  22. package/dist/commands/preview.js.map +1 -0
  23. package/dist/commands/record.d.ts +5 -0
  24. package/dist/commands/record.d.ts.map +1 -0
  25. package/dist/commands/record.js +151 -0
  26. package/dist/commands/record.js.map +1 -0
  27. package/dist/commands/validate.d.ts +3 -0
  28. package/dist/commands/validate.d.ts.map +1 -0
  29. package/dist/commands/validate.js +43 -0
  30. package/dist/commands/validate.js.map +1 -0
  31. package/dist/config.d.ts +21 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +5 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +36 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/lib/__tests__/config.test.d.ts +2 -0
  40. package/dist/lib/__tests__/config.test.d.ts.map +1 -0
  41. package/dist/lib/__tests__/config.test.js +600 -0
  42. package/dist/lib/__tests__/config.test.js.map +1 -0
  43. package/dist/lib/__tests__/examples.test.d.ts +2 -0
  44. package/dist/lib/__tests__/examples.test.d.ts.map +1 -0
  45. package/dist/lib/__tests__/examples.test.js +19 -0
  46. package/dist/lib/__tests__/examples.test.js.map +1 -0
  47. package/dist/lib/__tests__/runner.test.d.ts +2 -0
  48. package/dist/lib/__tests__/runner.test.d.ts.map +1 -0
  49. package/dist/lib/__tests__/runner.test.js +141 -0
  50. package/dist/lib/__tests__/runner.test.js.map +1 -0
  51. package/dist/lib/config.d.ts +17 -0
  52. package/dist/lib/config.d.ts.map +1 -0
  53. package/dist/lib/config.js +1002 -0
  54. package/dist/lib/config.js.map +1 -0
  55. package/dist/lib/runner.d.ts +18 -0
  56. package/dist/lib/runner.d.ts.map +1 -0
  57. package/dist/lib/runner.js +401 -0
  58. package/dist/lib/runner.js.map +1 -0
  59. package/dist/lib/types.d.ts +179 -0
  60. package/dist/lib/types.d.ts.map +1 -0
  61. package/dist/lib/types.js +16 -0
  62. package/dist/lib/types.js.map +1 -0
  63. package/package.json +64 -0
@@ -0,0 +1,600 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { validateWebreelConfig, loadWebreelConfig, parseSchemaVersion, resolveConfigPath, formatValidationErrors, buildLineMap, getConfigDir, filterVideosByName, } from "../config.js";
3
+ import { writeFileSync, mkdirSync, rmSync, realpathSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+ describe("validateWebreelConfig videos", () => {
7
+ function wrapVideo(video) {
8
+ return { videos: { x: video } };
9
+ }
10
+ it("requires video url", () => {
11
+ const errors = validateWebreelConfig(wrapVideo({ steps: [] }));
12
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.url" }));
13
+ });
14
+ it("requires steps to be an array", () => {
15
+ const errors = validateWebreelConfig(wrapVideo({ url: "u", steps: "bad" }));
16
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps" }));
17
+ });
18
+ it("validates video viewport dimensions", () => {
19
+ const errors = validateWebreelConfig(wrapVideo({
20
+ url: "u",
21
+ viewport: { width: -1, height: 0 },
22
+ steps: [],
23
+ }));
24
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.viewport.width" }));
25
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.viewport.height" }));
26
+ });
27
+ });
28
+ describe("validateStep", () => {
29
+ function validate(step) {
30
+ return validateWebreelConfig({
31
+ videos: { x: { url: "u", steps: [step] } },
32
+ });
33
+ }
34
+ it("rejects unknown action", () => {
35
+ const errors = validate({ action: "fly" });
36
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0].action" }));
37
+ });
38
+ it("rejects non-object step", () => {
39
+ const errors = validate("bad");
40
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0]" }));
41
+ });
42
+ it("validates pause requires ms", () => {
43
+ const errors = validate({ action: "pause" });
44
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0].ms" }));
45
+ });
46
+ it("validates pause rejects negative ms", () => {
47
+ const errors = validate({ action: "pause", ms: -1 });
48
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0].ms" }));
49
+ });
50
+ it("validates click requires text or selector", () => {
51
+ const errors = validate({ action: "click" });
52
+ expect(errors).toContainEqual(expect.objectContaining({
53
+ path: "videos.x.steps[0]",
54
+ message: expect.stringContaining("text"),
55
+ }));
56
+ });
57
+ it("validates key requires non-empty key", () => {
58
+ const errors = validate({ action: "key", key: "" });
59
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0].key" }));
60
+ });
61
+ it("validates drag from requires text or selector", () => {
62
+ const errors = validate({
63
+ action: "drag",
64
+ from: {},
65
+ to: { text: "x" },
66
+ });
67
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0].from" }));
68
+ });
69
+ it("validates drag to requires text or selector", () => {
70
+ const errors = validate({
71
+ action: "drag",
72
+ from: { text: "x" },
73
+ to: {},
74
+ });
75
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0].to" }));
76
+ });
77
+ it("validates moveTo requires text or selector", () => {
78
+ const errors = validate({ action: "moveTo" });
79
+ expect(errors).toContainEqual(expect.objectContaining({
80
+ path: "videos.x.steps[0]",
81
+ message: expect.stringContaining("text"),
82
+ }));
83
+ });
84
+ it("validates type requires non-empty text", () => {
85
+ const errors = validate({ action: "type", text: "" });
86
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0].text" }));
87
+ });
88
+ it("validates type rejects missing text", () => {
89
+ const errors = validate({ action: "type" });
90
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0].text" }));
91
+ });
92
+ it("validates scroll x must be a number", () => {
93
+ const errors = validate({ action: "scroll", x: "bad" });
94
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0].x" }));
95
+ });
96
+ it("validates wait requires selector or text", () => {
97
+ const errors = validate({ action: "wait" });
98
+ expect(errors).toContainEqual(expect.objectContaining({
99
+ path: "videos.x.steps[0]",
100
+ message: expect.stringContaining("selector"),
101
+ }));
102
+ });
103
+ it("accepts valid wait with text", () => {
104
+ const errors = validate({ action: "wait", text: "loaded" });
105
+ expect(errors).toEqual([]);
106
+ });
107
+ it("accepts valid wait with selector", () => {
108
+ const errors = validate({ action: "wait", selector: ".ready" });
109
+ expect(errors).toEqual([]);
110
+ });
111
+ it("accepts valid scroll with no args", () => {
112
+ const errors = validate({ action: "scroll" });
113
+ expect(errors).toEqual([]);
114
+ });
115
+ it("validates screenshot requires non-empty output", () => {
116
+ const errors = validate({ action: "screenshot", output: "" });
117
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0].output" }));
118
+ });
119
+ it("validates screenshot rejects missing output", () => {
120
+ const errors = validate({ action: "screenshot" });
121
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0].output" }));
122
+ });
123
+ it("accepts valid screenshot", () => {
124
+ const errors = validate({ action: "screenshot", output: "hero.png" });
125
+ expect(errors).toEqual([]);
126
+ });
127
+ it("accepts description field on any step", () => {
128
+ const errors = validate({
129
+ action: "pause",
130
+ ms: 500,
131
+ description: "wait for animation",
132
+ });
133
+ expect(errors).toEqual([]);
134
+ });
135
+ it("rejects non-string description", () => {
136
+ const errors = validate({ action: "pause", ms: 500, description: 123 });
137
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0].description" }));
138
+ });
139
+ });
140
+ describe("unknown property detection", () => {
141
+ function validate(step) {
142
+ return validateWebreelConfig({
143
+ videos: { x: { url: "u", steps: [step] } },
144
+ });
145
+ }
146
+ it("detects unknown step properties with suggestions", () => {
147
+ const errors = validate({ action: "click", text: "Go", seletor: ".btn" });
148
+ expect(errors).toContainEqual(expect.objectContaining({
149
+ path: "videos.x.steps[0].seletor",
150
+ message: expect.stringContaining("did you mean"),
151
+ }));
152
+ });
153
+ it("detects unknown top-level properties", () => {
154
+ const errors = validateWebreelConfig({
155
+ vidos: {},
156
+ videos: { x: { url: "u", steps: [] } },
157
+ });
158
+ expect(errors).toContainEqual(expect.objectContaining({
159
+ path: ".vidos",
160
+ message: expect.stringContaining("did you mean"),
161
+ }));
162
+ });
163
+ it("detects unknown video properties", () => {
164
+ const errors = validateWebreelConfig({
165
+ videos: { x: { url: "u", steps: [], viewprot: { width: 1920, height: 1080 } } },
166
+ });
167
+ expect(errors).toContainEqual(expect.objectContaining({
168
+ path: "videos.x.viewprot",
169
+ message: expect.stringContaining("Unknown property"),
170
+ }));
171
+ });
172
+ });
173
+ describe("include validation", () => {
174
+ it("rejects non-array include at top level", () => {
175
+ const errors = validateWebreelConfig({
176
+ include: "bad",
177
+ videos: { x: { url: "u", steps: [] } },
178
+ });
179
+ expect(errors).toContainEqual(expect.objectContaining({ path: "include" }));
180
+ });
181
+ it("rejects non-array include at video level", () => {
182
+ const errors = validateWebreelConfig({
183
+ videos: { x: { url: "u", steps: [], include: "bad" } },
184
+ });
185
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.include" }));
186
+ });
187
+ it("rejects empty string in include array", () => {
188
+ const errors = validateWebreelConfig({
189
+ videos: { x: { url: "u", steps: [], include: [""] } },
190
+ });
191
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.include[0]" }));
192
+ });
193
+ });
194
+ describe("validateWebreelConfig", () => {
195
+ it("accepts a valid multi-video config", () => {
196
+ const errors = validateWebreelConfig({
197
+ videos: {
198
+ hero: {
199
+ url: "https://example.com",
200
+ steps: [{ action: "pause", ms: 500 }],
201
+ },
202
+ login: {
203
+ url: "https://example.com/login",
204
+ steps: [{ action: "click", text: "Sign In" }],
205
+ },
206
+ },
207
+ });
208
+ expect(errors).toEqual([]);
209
+ });
210
+ it("accepts config with $schema and top-level defaults", () => {
211
+ const errors = validateWebreelConfig({
212
+ $schema: "https://webreel.dev/schema/v1.json",
213
+ outDir: "./videos",
214
+ baseUrl: "https://myapp.com",
215
+ capture: { format: "png" },
216
+ viewport: { width: 1920, height: 1080 },
217
+ videos: {
218
+ hero: {
219
+ url: "/",
220
+ steps: [],
221
+ },
222
+ },
223
+ });
224
+ expect(errors).toEqual([]);
225
+ });
226
+ it("validates top-level capture format", () => {
227
+ const errors = validateWebreelConfig({
228
+ capture: { format: "gif" },
229
+ videos: { x: { url: "u", steps: [] } },
230
+ });
231
+ expect(errors).toContainEqual(expect.objectContaining({ path: "capture.format" }));
232
+ });
233
+ it("validates video-level capture format", () => {
234
+ const errors = validateWebreelConfig({
235
+ videos: { x: { url: "u", capture: { format: "gif" }, steps: [] } },
236
+ });
237
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.capture.format" }));
238
+ });
239
+ it("rejects non-object config", () => {
240
+ const errors = validateWebreelConfig("bad");
241
+ expect(errors).toContainEqual(expect.objectContaining({
242
+ path: "",
243
+ message: expect.stringContaining("object"),
244
+ }));
245
+ });
246
+ it("requires videos object", () => {
247
+ const errors = validateWebreelConfig({});
248
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos" }));
249
+ });
250
+ it("rejects empty videos object", () => {
251
+ const errors = validateWebreelConfig({ videos: {} });
252
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos" }));
253
+ });
254
+ it("rejects videos as array", () => {
255
+ const errors = validateWebreelConfig({ videos: [] });
256
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos" }));
257
+ });
258
+ it("validates video url and steps", () => {
259
+ const errors = validateWebreelConfig({
260
+ videos: { x: {} },
261
+ });
262
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.url" }));
263
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps" }));
264
+ });
265
+ it("validates video steps", () => {
266
+ const errors = validateWebreelConfig({
267
+ videos: {
268
+ x: {
269
+ url: "u",
270
+ steps: [{ action: "pause" }],
271
+ },
272
+ },
273
+ });
274
+ expect(errors).toContainEqual(expect.objectContaining({ path: "videos.x.steps[0].ms" }));
275
+ });
276
+ it("validates top-level viewport", () => {
277
+ const errors = validateWebreelConfig({
278
+ viewport: { width: -1, height: 0 },
279
+ videos: { x: { url: "u", steps: [] } },
280
+ });
281
+ expect(errors).toContainEqual(expect.objectContaining({ path: "viewport.width" }));
282
+ expect(errors).toContainEqual(expect.objectContaining({ path: "viewport.height" }));
283
+ });
284
+ it("validates top-level outDir", () => {
285
+ const errors = validateWebreelConfig({
286
+ outDir: "",
287
+ videos: { x: { url: "u", steps: [] } },
288
+ });
289
+ expect(errors).toContainEqual(expect.objectContaining({ path: "outDir" }));
290
+ });
291
+ it("validates top-level include", () => {
292
+ const errors = validateWebreelConfig({
293
+ include: "bad",
294
+ videos: { x: { url: "u", steps: [] } },
295
+ });
296
+ expect(errors).toContainEqual(expect.objectContaining({ path: "include" }));
297
+ });
298
+ });
299
+ describe("loadWebreelConfig", () => {
300
+ const dir = resolve(tmpdir(), `webreel-cfg-test-${Date.now()}`);
301
+ function cleanup() {
302
+ try {
303
+ rmSync(dir, { recursive: true, force: true });
304
+ }
305
+ catch {
306
+ // ignore
307
+ }
308
+ }
309
+ it("loads a config with videos object", async () => {
310
+ mkdirSync(dir, { recursive: true });
311
+ try {
312
+ writeFileSync(resolve(dir, "webreel.config.json"), JSON.stringify({
313
+ $schema: "https://webreel.dev/schema/v1.json",
314
+ videos: {
315
+ hero: {
316
+ url: "https://example.com",
317
+ steps: [{ action: "pause", ms: 500 }],
318
+ },
319
+ },
320
+ }));
321
+ const config = await loadWebreelConfig(resolve(dir, "webreel.config.json"));
322
+ expect(config.videos).toHaveLength(1);
323
+ expect(config.videos[0].name).toBe("hero");
324
+ }
325
+ finally {
326
+ cleanup();
327
+ }
328
+ });
329
+ it("inherits top-level defaults into videos", async () => {
330
+ mkdirSync(dir, { recursive: true });
331
+ try {
332
+ writeFileSync(resolve(dir, "webreel.config.json"), JSON.stringify({
333
+ baseUrl: "https://myapp.com",
334
+ capture: { format: "png" },
335
+ viewport: { width: 1920, height: 1080 },
336
+ videos: {
337
+ hero: {
338
+ url: "/",
339
+ steps: [],
340
+ },
341
+ },
342
+ }));
343
+ const config = await loadWebreelConfig(resolve(dir, "webreel.config.json"));
344
+ expect(config.videos[0].baseUrl).toBe("https://myapp.com");
345
+ expect(config.videos[0].capture).toEqual({ format: "png" });
346
+ expect(config.videos[0].viewport).toEqual({ width: 1920, height: 1080 });
347
+ }
348
+ finally {
349
+ cleanup();
350
+ }
351
+ });
352
+ it("video-level values override top-level defaults", async () => {
353
+ mkdirSync(dir, { recursive: true });
354
+ try {
355
+ writeFileSync(resolve(dir, "webreel.config.json"), JSON.stringify({
356
+ baseUrl: "https://default.com",
357
+ capture: { format: "jpeg" },
358
+ viewport: { width: 1920, height: 1080 },
359
+ videos: {
360
+ hero: {
361
+ url: "/",
362
+ baseUrl: "https://override.com",
363
+ capture: { format: "png" },
364
+ viewport: { width: 800, height: 600 },
365
+ steps: [],
366
+ },
367
+ },
368
+ }));
369
+ const config = await loadWebreelConfig(resolve(dir, "webreel.config.json"));
370
+ expect(config.videos[0].baseUrl).toBe("https://override.com");
371
+ expect(config.videos[0].capture).toEqual({ format: "png" });
372
+ expect(config.videos[0].viewport).toEqual({ width: 800, height: 600 });
373
+ }
374
+ finally {
375
+ cleanup();
376
+ }
377
+ });
378
+ it("rejects config without videos object", async () => {
379
+ mkdirSync(dir, { recursive: true });
380
+ try {
381
+ writeFileSync(resolve(dir, "invalid.json"), JSON.stringify({
382
+ url: "https://example.com",
383
+ steps: [{ action: "pause", ms: 100 }],
384
+ }));
385
+ await expect(loadWebreelConfig(resolve(dir, "invalid.json"))).rejects.toThrow("Invalid config");
386
+ }
387
+ finally {
388
+ cleanup();
389
+ }
390
+ });
391
+ it("defaults outDir to videos/", async () => {
392
+ mkdirSync(dir, { recursive: true });
393
+ try {
394
+ writeFileSync(resolve(dir, "webreel.config.json"), JSON.stringify({
395
+ videos: {
396
+ hero: {
397
+ url: "https://example.com",
398
+ steps: [],
399
+ },
400
+ },
401
+ }));
402
+ const config = await loadWebreelConfig(resolve(dir, "webreel.config.json"));
403
+ expect(config.videos[0].output).toBe(resolve(dir, "videos", "hero.mp4"));
404
+ }
405
+ finally {
406
+ cleanup();
407
+ }
408
+ });
409
+ it("resolves explicit outDir for video outputs", async () => {
410
+ mkdirSync(dir, { recursive: true });
411
+ try {
412
+ writeFileSync(resolve(dir, "webreel.config.json"), JSON.stringify({
413
+ outDir: "./dist",
414
+ videos: {
415
+ hero: {
416
+ url: "https://example.com",
417
+ steps: [],
418
+ },
419
+ },
420
+ }));
421
+ const config = await loadWebreelConfig(resolve(dir, "webreel.config.json"));
422
+ expect(config.videos[0].output).toBe(resolve(dir, "dist", "hero.mp4"));
423
+ }
424
+ finally {
425
+ cleanup();
426
+ }
427
+ });
428
+ });
429
+ describe("resolveConfigPath", () => {
430
+ const dir = resolve(tmpdir(), `webreel-resolve-test-${Date.now()}`);
431
+ function cleanup() {
432
+ try {
433
+ rmSync(dir, { recursive: true, force: true });
434
+ }
435
+ catch {
436
+ // ignore
437
+ }
438
+ }
439
+ it("finds webreel.config.json in parent directory", () => {
440
+ const child = resolve(dir, "sub", "child");
441
+ mkdirSync(child, { recursive: true });
442
+ const realDir = realpathSync(dir);
443
+ writeFileSync(resolve(realDir, "webreel.config.json"), "{}");
444
+ try {
445
+ const origCwd = process.cwd();
446
+ process.chdir(child);
447
+ try {
448
+ const found = resolveConfigPath();
449
+ expect(found).toBe(resolve(realDir, "webreel.config.json"));
450
+ }
451
+ finally {
452
+ process.chdir(origCwd);
453
+ }
454
+ }
455
+ finally {
456
+ cleanup();
457
+ }
458
+ });
459
+ it("prefers .json over .ts when both exist in same dir", () => {
460
+ mkdirSync(dir, { recursive: true });
461
+ const realDir = realpathSync(dir);
462
+ writeFileSync(resolve(realDir, "webreel.config.json"), "{}");
463
+ writeFileSync(resolve(realDir, "webreel.config.ts"), "export default {}");
464
+ try {
465
+ const origCwd = process.cwd();
466
+ process.chdir(realDir);
467
+ try {
468
+ const found = resolveConfigPath();
469
+ expect(found).toBe(resolve(realDir, "webreel.config.json"));
470
+ }
471
+ finally {
472
+ process.chdir(origCwd);
473
+ }
474
+ }
475
+ finally {
476
+ cleanup();
477
+ }
478
+ });
479
+ });
480
+ describe("parseSchemaVersion", () => {
481
+ it("returns 1 for undefined", () => {
482
+ expect(parseSchemaVersion(undefined)).toBe(1);
483
+ });
484
+ it("returns -1 for unversioned URL", () => {
485
+ expect(parseSchemaVersion("https://webreel.dev/schema.json")).toBe(-1);
486
+ });
487
+ it("returns 1 for versioned v1 URL", () => {
488
+ expect(parseSchemaVersion("https://webreel.dev/schema/v1.json")).toBe(1);
489
+ });
490
+ it("returns 2 for versioned v2 URL", () => {
491
+ expect(parseSchemaVersion("https://webreel.dev/schema/v2.json")).toBe(2);
492
+ });
493
+ it("returns -1 for unknown URL format", () => {
494
+ expect(parseSchemaVersion("https://example.com/something.json")).toBe(-1);
495
+ });
496
+ });
497
+ describe("validateWebreelConfig with version", () => {
498
+ it("rejects unsupported schema versions", () => {
499
+ const errors = validateWebreelConfig({}, 99);
500
+ expect(errors).toHaveLength(1);
501
+ expect(errors[0].path).toBe("$schema");
502
+ expect(errors[0].message).toContain("Unsupported schema version");
503
+ });
504
+ it("validates v1 normally", () => {
505
+ const errors = validateWebreelConfig({
506
+ videos: {
507
+ test: { url: "https://example.com", steps: [] },
508
+ },
509
+ }, 1);
510
+ expect(errors).toHaveLength(0);
511
+ });
512
+ });
513
+ describe("formatValidationErrors", () => {
514
+ it("formats errors with file path and messages", () => {
515
+ const errors = [
516
+ { path: "videos.hero.url", message: "Required" },
517
+ { path: "videos.hero.steps", message: "Must be an array" },
518
+ ];
519
+ const result = formatValidationErrors("webreel.config.json", errors);
520
+ expect(result).toContain("webreel.config.json");
521
+ expect(result).toContain("Required");
522
+ expect(result).toContain("Must be an array");
523
+ });
524
+ it("includes line numbers when lineMap is provided", () => {
525
+ const raw = JSON.stringify({ videos: { hero: { url: "u", steps: "bad" } } }, null, 2);
526
+ const lineMap = buildLineMap(raw);
527
+ const errors = [
528
+ { path: "videos.hero.steps", message: "Must be an array" },
529
+ ];
530
+ const result = formatValidationErrors("test.json", errors, lineMap);
531
+ expect(result).toMatch(/L\d+/);
532
+ });
533
+ });
534
+ describe("getConfigDir", () => {
535
+ it("returns the directory containing the config file", () => {
536
+ const dir = getConfigDir("/home/user/project/webreel.config.json");
537
+ expect(dir).toBe(resolve("/home/user/project"));
538
+ });
539
+ it("handles relative paths", () => {
540
+ const dir = getConfigDir("configs/webreel.config.json");
541
+ expect(dir).toBe(resolve("configs"));
542
+ });
543
+ });
544
+ describe("filterVideosByName", () => {
545
+ const videos = [
546
+ { name: "hero" },
547
+ { name: "login" },
548
+ { name: "dashboard" },
549
+ ];
550
+ it("returns all videos when names is empty", () => {
551
+ const result = filterVideosByName(videos, []);
552
+ expect(result).toEqual(videos);
553
+ });
554
+ it("filters to matching videos", () => {
555
+ const result = filterVideosByName(videos, ["hero", "login"]);
556
+ expect(result).toHaveLength(2);
557
+ expect(result.map((v) => v.name)).toEqual(["hero", "login"]);
558
+ });
559
+ it("throws when a name is not found", () => {
560
+ expect(() => filterVideosByName(videos, ["hero", "missing"])).toThrow("Video(s) not found: missing");
561
+ });
562
+ });
563
+ describe("loadWebreelConfig with env substitution", () => {
564
+ const dir = resolve(tmpdir(), `webreel-env-test-${Date.now()}`);
565
+ function cleanup() {
566
+ try {
567
+ rmSync(dir, { recursive: true, force: true });
568
+ }
569
+ catch {
570
+ // ignore
571
+ }
572
+ }
573
+ it("substitutes $VAR and ${VAR} in JSON config", async () => {
574
+ const originalBase = process.env.BASE_URL;
575
+ process.env.BASE_URL = "https://envtest.com";
576
+ mkdirSync(dir, { recursive: true });
577
+ try {
578
+ writeFileSync(resolve(dir, "webreel.config.json"), JSON.stringify({
579
+ videos: {
580
+ hero: {
581
+ url: "$BASE_URL",
582
+ steps: [],
583
+ },
584
+ },
585
+ }));
586
+ const config = await loadWebreelConfig(resolve(dir, "webreel.config.json"));
587
+ expect(config.videos[0].url).toBe("https://envtest.com");
588
+ }
589
+ finally {
590
+ if (originalBase !== undefined) {
591
+ process.env.BASE_URL = originalBase;
592
+ }
593
+ else {
594
+ delete process.env.BASE_URL;
595
+ }
596
+ cleanup();
597
+ }
598
+ });
599
+ });
600
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=examples.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"examples.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/examples.test.ts"],"names":[],"mappings":""}