apify-schema-tools 3.1.0 → 3.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 (130) hide show
  1. package/.node-version +1 -1
  2. package/CHANGELOG.md +7 -1
  3. package/biome.json +8 -2
  4. package/dist/apify-schema-tools.js +12 -9
  5. package/dist/apify-schema-tools.js.map +1 -1
  6. package/dist/apify.d.ts +1 -1
  7. package/dist/apify.d.ts.map +1 -1
  8. package/dist/apify.js +19 -5
  9. package/dist/apify.js.map +1 -1
  10. package/dist/cli/check.d.ts +5 -0
  11. package/dist/cli/check.d.ts.map +1 -0
  12. package/dist/cli/check.js +86 -0
  13. package/dist/cli/check.js.map +1 -0
  14. package/dist/cli/init.d.ts +5 -0
  15. package/dist/cli/init.d.ts.map +1 -0
  16. package/dist/cli/init.js +92 -0
  17. package/dist/cli/init.js.map +1 -0
  18. package/dist/cli/sync.d.ts +5 -0
  19. package/dist/cli/sync.d.ts.map +1 -0
  20. package/dist/cli/sync.js +112 -0
  21. package/dist/cli/sync.js.map +1 -0
  22. package/dist/configuration.d.ts +14 -5
  23. package/dist/configuration.d.ts.map +1 -1
  24. package/dist/configuration.js +9 -5
  25. package/dist/configuration.js.map +1 -1
  26. package/dist/main.d.ts +4 -0
  27. package/dist/main.d.ts.map +1 -0
  28. package/dist/main.js +19 -0
  29. package/dist/main.js.map +1 -0
  30. package/dist/middle-schema/compare-schemas.d.ts +3 -0
  31. package/dist/middle-schema/compare-schemas.d.ts.map +1 -0
  32. package/dist/middle-schema/compare-schemas.js +90 -0
  33. package/dist/middle-schema/compare-schemas.js.map +1 -0
  34. package/dist/middle-schema/generate-typescript.d.ts +7 -0
  35. package/dist/middle-schema/generate-typescript.d.ts.map +1 -0
  36. package/dist/middle-schema/generate-typescript.js +70 -0
  37. package/dist/middle-schema/generate-typescript.js.map +1 -0
  38. package/dist/middle-schema/parse-json-schema.d.ts +4 -0
  39. package/dist/middle-schema/parse-json-schema.d.ts.map +1 -0
  40. package/dist/middle-schema/parse-json-schema.js +65 -0
  41. package/dist/middle-schema/parse-json-schema.js.map +1 -0
  42. package/dist/middle-schema/parse-typescript.d.ts +4 -0
  43. package/dist/middle-schema/parse-typescript.d.ts.map +1 -0
  44. package/dist/middle-schema/parse-typescript.js +199 -0
  45. package/dist/middle-schema/parse-typescript.js.map +1 -0
  46. package/dist/middle-schema/schema-types.d.ts +24 -0
  47. package/dist/middle-schema/schema-types.d.ts.map +1 -0
  48. package/dist/middle-schema/schema-types.js +14 -0
  49. package/dist/middle-schema/schema-types.js.map +1 -0
  50. package/dist/middle-schema/schema.d.ts +24 -0
  51. package/dist/middle-schema/schema.d.ts.map +1 -0
  52. package/dist/middle-schema/schema.js +14 -0
  53. package/dist/middle-schema/schema.js.map +1 -0
  54. package/dist/schema/entities/abstract-entity.d.ts +5 -0
  55. package/dist/schema/entities/abstract-entity.d.ts.map +1 -0
  56. package/dist/schema/entities/abstract-entity.js +3 -0
  57. package/dist/schema/entities/abstract-entity.js.map +1 -0
  58. package/dist/schema/entities/primitive-union.d.ts +12 -0
  59. package/dist/schema/entities/primitive-union.d.ts.map +1 -0
  60. package/dist/schema/entities/primitive-union.js +74 -0
  61. package/dist/schema/entities/primitive-union.js.map +1 -0
  62. package/dist/schema/entities/primitive.d.ts +15 -0
  63. package/dist/schema/entities/primitive.d.ts.map +1 -0
  64. package/dist/schema/entities/primitive.js +54 -0
  65. package/dist/schema/entities/primitive.js.map +1 -0
  66. package/dist/schema/parsers/json-schema.d.ts +4 -0
  67. package/dist/schema/parsers/json-schema.d.ts.map +1 -0
  68. package/dist/schema/parsers/json-schema.js +12 -0
  69. package/dist/schema/parsers/json-schema.js.map +1 -0
  70. package/dist/schema/parsers/typescript.d.ts +3 -0
  71. package/dist/schema/parsers/typescript.d.ts.map +1 -0
  72. package/dist/schema/parsers/typescript.js +24 -0
  73. package/dist/schema/parsers/typescript.js.map +1 -0
  74. package/dist/schemas/input.d.ts +840 -0
  75. package/dist/schemas/input.d.ts.map +1 -0
  76. package/dist/schemas/input.js +349 -0
  77. package/dist/schemas/input.js.map +1 -0
  78. package/dist/utils/filesystem.d.ts +8 -0
  79. package/dist/utils/filesystem.d.ts.map +1 -0
  80. package/dist/utils/filesystem.js +16 -0
  81. package/dist/utils/filesystem.js.map +1 -0
  82. package/dist/utils/json-schemas-interactive-conflict.d.ts +16 -0
  83. package/dist/utils/json-schemas-interactive-conflict.d.ts.map +1 -0
  84. package/dist/utils/json-schemas-interactive-conflict.js +165 -0
  85. package/dist/utils/json-schemas-interactive-conflict.js.map +1 -0
  86. package/dist/utils/json-schemas.d.ts +42 -0
  87. package/dist/utils/json-schemas.d.ts.map +1 -0
  88. package/dist/utils/json-schemas.js +162 -0
  89. package/dist/utils/json-schemas.js.map +1 -0
  90. package/dist/zod/schemas/input.d.ts +840 -0
  91. package/dist/zod/schemas/input.d.ts.map +1 -0
  92. package/dist/zod/schemas/input.js +393 -0
  93. package/dist/zod/schemas/input.js.map +1 -0
  94. package/package.json +12 -12
  95. package/samples/all-defaults/.actor/input_schema.json +32 -3
  96. package/samples/all-defaults/src-schemas/input.json +2 -1
  97. package/samples/deep-merged-schemas/.actor/input_schema.json +36 -3
  98. package/samples/merged-schemas/.actor/input_schema.json +27 -3
  99. package/samples/package-json-config/.actor/input_schema.json +32 -3
  100. package/samples/package-json-config-merged/.actor/input_schema.json +36 -3
  101. package/src/apify.ts +21 -6
  102. package/src/cli/check.ts +114 -0
  103. package/src/cli/init.ts +125 -0
  104. package/src/cli/sync.ts +164 -0
  105. package/src/configuration.ts +17 -7
  106. package/src/main.ts +25 -0
  107. package/src/middle-schema/compare-schemas.ts +113 -0
  108. package/src/middle-schema/generate-typescript.ts +88 -0
  109. package/src/middle-schema/parse-json-schema.ts +104 -0
  110. package/src/middle-schema/parse-typescript.ts +239 -0
  111. package/src/middle-schema/schema-types.ts +40 -0
  112. package/test/apify.test.ts +410 -2
  113. package/test/cli/check.test.ts +1571 -0
  114. package/test/cli/init.test.ts +459 -0
  115. package/test/cli/sync.test.ts +341 -0
  116. package/test/common.ts +68 -0
  117. package/test/configuration.test.ts +8 -8
  118. package/test/middle-schema/compare-schemas.test.ts +585 -0
  119. package/test/middle-schema/generate-typescript.test.ts +191 -0
  120. package/test/middle-schema/parse-json-schema.test.ts +178 -0
  121. package/test/middle-schema/parse-typescript.test.ts +143 -0
  122. package/test/{json-schema-conflicts.test.ts → utils/json-schemas-interactive-conflict.test.ts} +2 -2
  123. package/test/{json-schemas.test.ts → utils/json-schemas.test.ts} +3 -3
  124. package/src/apify-schema-tools.ts +0 -420
  125. package/src/typescript.ts +0 -563
  126. package/test/apify-schema-tools.test.ts +0 -2216
  127. package/test/typescript.test.ts +0 -1079
  128. /package/src/{filesystem.ts → utils/filesystem.ts} +0 -0
  129. /package/src/{json-schema-conflicts.ts → utils/json-schemas-interactive-conflict.ts} +0 -0
  130. /package/src/{json-schemas.ts → utils/json-schemas.ts} +0 -0
@@ -0,0 +1,585 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { compareMiddleObjects } from "../../src/middle-schema/compare-schemas.js";
3
+ import type { MiddleObject } from "../../src/middle-schema/schema.js";
4
+
5
+ describe("Compare-schemas utilities", () => {
6
+ describe("compareMiddleObjects", () => {
7
+ const baseSchema: MiddleObject = {
8
+ doc: "Base schema",
9
+ isRequired: true,
10
+ isArray: false,
11
+ properties: {
12
+ name: {
13
+ doc: "User name",
14
+ isRequired: true,
15
+ isArray: false,
16
+ type: "string",
17
+ },
18
+ age: {
19
+ doc: undefined,
20
+ isRequired: false,
21
+ isArray: false,
22
+ type: "number",
23
+ },
24
+ },
25
+ };
26
+
27
+ it("should return true for identical schemas", () => {
28
+ const schemaA: MiddleObject = {
29
+ doc: "Test schema",
30
+ isRequired: true,
31
+ isArray: false,
32
+ properties: {
33
+ name: {
34
+ doc: "User name",
35
+ isRequired: true,
36
+ isArray: false,
37
+ type: "string",
38
+ },
39
+ age: {
40
+ doc: undefined,
41
+ isRequired: false,
42
+ isArray: false,
43
+ type: "number",
44
+ },
45
+ },
46
+ };
47
+ const schemaB: MiddleObject = {
48
+ doc: "Test schema",
49
+ isRequired: true,
50
+ isArray: false,
51
+ properties: {
52
+ name: {
53
+ doc: "User name",
54
+ isRequired: true,
55
+ isArray: false,
56
+ type: "string",
57
+ },
58
+ age: {
59
+ doc: undefined,
60
+ isRequired: false,
61
+ isArray: false,
62
+ type: "number",
63
+ },
64
+ },
65
+ };
66
+
67
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(true);
68
+ });
69
+
70
+ it("should return false for schemas with different number of properties", () => {
71
+ const schemaA = baseSchema;
72
+ const schemaB: MiddleObject = {
73
+ doc: "Test schema",
74
+ isRequired: true,
75
+ isArray: false,
76
+ properties: {
77
+ name: {
78
+ doc: "User name",
79
+ isRequired: true,
80
+ isArray: false,
81
+ type: "string",
82
+ },
83
+ age: {
84
+ doc: undefined,
85
+ isRequired: false,
86
+ isArray: false,
87
+ type: "number",
88
+ },
89
+ email: {
90
+ doc: undefined,
91
+ isRequired: true,
92
+ isArray: false,
93
+ type: "string",
94
+ },
95
+ },
96
+ };
97
+
98
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(false);
99
+ });
100
+
101
+ it("should return false for schemas with different property names", () => {
102
+ const schemaA = baseSchema;
103
+ const schemaB: MiddleObject = {
104
+ doc: "Test schema",
105
+ isRequired: true,
106
+ isArray: false,
107
+ properties: {
108
+ fullName: {
109
+ doc: "User name",
110
+ isRequired: true,
111
+ isArray: false,
112
+ type: "string",
113
+ },
114
+ age: {
115
+ doc: undefined,
116
+ isRequired: false,
117
+ isArray: false,
118
+ type: "number",
119
+ },
120
+ },
121
+ };
122
+
123
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(false);
124
+ });
125
+
126
+ it("should return false for schemas with different additionalProperties", () => {
127
+ const schemaA = baseSchema;
128
+ const schemaB: MiddleObject = {
129
+ doc: "Test schema",
130
+ isRequired: true,
131
+ isArray: false,
132
+ properties: {
133
+ name: {
134
+ doc: "User name",
135
+ isRequired: true,
136
+ isArray: false,
137
+ type: "string",
138
+ },
139
+ age: {
140
+ doc: undefined,
141
+ isRequired: false,
142
+ isArray: false,
143
+ type: "number",
144
+ },
145
+ },
146
+ additionalProperties: {
147
+ doc: "Additional properties",
148
+ isRequired: true,
149
+ isArray: false,
150
+ type: "boolean",
151
+ },
152
+ };
153
+
154
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(false);
155
+ });
156
+
157
+ it("should return false for properties with different types", () => {
158
+ const schemaA = baseSchema;
159
+ const schemaB: MiddleObject = {
160
+ doc: "Test schema",
161
+ isRequired: true,
162
+ isArray: false,
163
+ properties: {
164
+ name: {
165
+ doc: "User name",
166
+ isRequired: true,
167
+ isArray: false,
168
+ type: "string",
169
+ },
170
+ age: {
171
+ doc: undefined,
172
+ isRequired: false,
173
+ isArray: false,
174
+ type: "string", // Different type
175
+ },
176
+ },
177
+ };
178
+
179
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(false);
180
+ });
181
+
182
+ it("should return false for properties with different isRequired values", () => {
183
+ const schemaA = baseSchema;
184
+ const schemaB: MiddleObject = {
185
+ doc: "Test schema",
186
+ isRequired: true,
187
+ isArray: false,
188
+ properties: {
189
+ name: {
190
+ doc: "User name",
191
+ isRequired: false, // Different isRequired
192
+ isArray: false,
193
+ type: "string",
194
+ },
195
+ age: {
196
+ doc: undefined,
197
+ isRequired: false,
198
+ isArray: false,
199
+ type: "number",
200
+ },
201
+ },
202
+ };
203
+
204
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(false);
205
+ });
206
+
207
+ it("should return false for properties with different isArray values", () => {
208
+ const schemaA = baseSchema;
209
+ const schemaB: MiddleObject = {
210
+ doc: "Test schema",
211
+ isRequired: true,
212
+ isArray: false,
213
+ properties: {
214
+ name: {
215
+ doc: "User name",
216
+ isRequired: true,
217
+ isArray: true, // Different isArray
218
+ type: "string",
219
+ },
220
+ age: {
221
+ doc: undefined,
222
+ isRequired: false,
223
+ isArray: false,
224
+ type: "number",
225
+ },
226
+ },
227
+ };
228
+
229
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(false);
230
+ });
231
+
232
+ it("should return false for properties with different documentation when ignoreDocs is false", () => {
233
+ const schemaA = baseSchema;
234
+ const schemaB: MiddleObject = {
235
+ doc: "Test schema",
236
+ isRequired: true,
237
+ isArray: false,
238
+ properties: {
239
+ name: {
240
+ doc: "Different documentation", // Different doc
241
+ isRequired: true,
242
+ isArray: false,
243
+ type: "string",
244
+ },
245
+ age: {
246
+ doc: undefined,
247
+ isRequired: false,
248
+ isArray: false,
249
+ type: "number",
250
+ },
251
+ },
252
+ };
253
+
254
+ expect(compareMiddleObjects(schemaA, schemaB, false)).toBe(false);
255
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(false); // Default is false
256
+ });
257
+
258
+ it("should return true for properties with different documentation when ignoreDocs is true", () => {
259
+ const schemaA = baseSchema;
260
+ const schemaB: MiddleObject = {
261
+ doc: "Test schema",
262
+ isRequired: true,
263
+ isArray: false,
264
+ properties: {
265
+ name: {
266
+ doc: "Different documentation", // Different doc
267
+ isRequired: true,
268
+ isArray: false,
269
+ type: "string",
270
+ },
271
+ age: {
272
+ doc: "Different age doc", // Different doc
273
+ isRequired: false,
274
+ isArray: false,
275
+ type: "number",
276
+ },
277
+ },
278
+ };
279
+
280
+ expect(compareMiddleObjects(schemaA, schemaB, true)).toBe(true);
281
+ });
282
+
283
+ it("should handle enum properties correctly", () => {
284
+ const schemaA: MiddleObject = {
285
+ doc: undefined,
286
+ isRequired: true,
287
+ isArray: false,
288
+ properties: {
289
+ status: {
290
+ doc: undefined,
291
+ isRequired: true,
292
+ isArray: false,
293
+ enum: ["active", "inactive", "pending"],
294
+ },
295
+ },
296
+ };
297
+ const schemaB: MiddleObject = {
298
+ doc: undefined,
299
+ isRequired: true,
300
+ isArray: false,
301
+ properties: {
302
+ status: {
303
+ doc: undefined,
304
+ isRequired: true,
305
+ isArray: false,
306
+ enum: ["active", "inactive", "pending"],
307
+ },
308
+ },
309
+ };
310
+
311
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(true);
312
+ });
313
+
314
+ it("should return false for enum properties with different values", () => {
315
+ const schemaA: MiddleObject = {
316
+ doc: undefined,
317
+ isRequired: true,
318
+ isArray: false,
319
+ properties: {
320
+ status: {
321
+ doc: undefined,
322
+ isRequired: true,
323
+ isArray: false,
324
+ enum: ["active", "inactive", "pending"],
325
+ },
326
+ },
327
+ };
328
+ const schemaB: MiddleObject = {
329
+ doc: undefined,
330
+ isRequired: true,
331
+ isArray: false,
332
+ properties: {
333
+ status: {
334
+ doc: undefined,
335
+ isRequired: true,
336
+ isArray: false,
337
+ enum: ["active", "inactive", "cancelled"], // Different enum value
338
+ },
339
+ },
340
+ };
341
+
342
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(false);
343
+ });
344
+
345
+ it("should handle nested object properties correctly", () => {
346
+ const schemaA: MiddleObject = {
347
+ doc: undefined,
348
+ isRequired: true,
349
+ isArray: false,
350
+ properties: {
351
+ user: {
352
+ doc: undefined,
353
+ isRequired: true,
354
+ isArray: false,
355
+ properties: {
356
+ name: {
357
+ doc: undefined,
358
+ isRequired: true,
359
+ isArray: false,
360
+ type: "string",
361
+ },
362
+ age: {
363
+ doc: undefined,
364
+ isRequired: false,
365
+ isArray: false,
366
+ type: "number",
367
+ },
368
+ },
369
+ },
370
+ },
371
+ };
372
+ const schemaB: MiddleObject = {
373
+ doc: undefined,
374
+ isRequired: true,
375
+ isArray: false,
376
+ properties: {
377
+ user: {
378
+ doc: undefined,
379
+ isRequired: true,
380
+ isArray: false,
381
+ properties: {
382
+ name: {
383
+ doc: undefined,
384
+ isRequired: true,
385
+ isArray: false,
386
+ type: "string",
387
+ },
388
+ age: {
389
+ doc: undefined,
390
+ isRequired: false,
391
+ isArray: false,
392
+ type: "number",
393
+ },
394
+ },
395
+ },
396
+ },
397
+ };
398
+
399
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(true);
400
+ });
401
+
402
+ it("should return false for nested schemas with different structures", () => {
403
+ const schemaA: MiddleObject = {
404
+ doc: undefined,
405
+ isRequired: true,
406
+ isArray: false,
407
+ properties: {
408
+ user: {
409
+ doc: undefined,
410
+ isRequired: true,
411
+ isArray: false,
412
+ properties: {
413
+ name: {
414
+ doc: undefined,
415
+ isRequired: true,
416
+ isArray: false,
417
+ type: "string",
418
+ },
419
+ age: {
420
+ doc: undefined,
421
+ isRequired: false,
422
+ isArray: false,
423
+ type: "number",
424
+ },
425
+ },
426
+ },
427
+ },
428
+ };
429
+ const schemaB: MiddleObject = {
430
+ doc: undefined,
431
+ isRequired: true,
432
+ isArray: false,
433
+ properties: {
434
+ user: {
435
+ doc: undefined,
436
+ isRequired: true,
437
+ isArray: false,
438
+ properties: {
439
+ name: {
440
+ doc: undefined,
441
+ isRequired: true,
442
+ isArray: false,
443
+ type: "string",
444
+ },
445
+ // Missing age property
446
+ },
447
+ },
448
+ },
449
+ };
450
+
451
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(false);
452
+ });
453
+
454
+ it("should handle union types correctly", () => {
455
+ const schemaA: MiddleObject = {
456
+ doc: undefined,
457
+ isRequired: true,
458
+ isArray: false,
459
+ properties: {
460
+ value: {
461
+ doc: undefined,
462
+ isRequired: true,
463
+ isArray: false,
464
+ type: ["string", "number"],
465
+ },
466
+ },
467
+ };
468
+ const schemaB: MiddleObject = {
469
+ doc: undefined,
470
+ isRequired: true,
471
+ isArray: false,
472
+ properties: {
473
+ value: {
474
+ doc: undefined,
475
+ isRequired: true,
476
+ isArray: false,
477
+ type: ["string", "number"],
478
+ },
479
+ },
480
+ };
481
+
482
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(true);
483
+ });
484
+
485
+ it("should return false for union types with different order", () => {
486
+ const schemaA: MiddleObject = {
487
+ doc: undefined,
488
+ isRequired: true,
489
+ isArray: false,
490
+ properties: {
491
+ value: {
492
+ doc: undefined,
493
+ isRequired: true,
494
+ isArray: false,
495
+ type: ["string", "number"],
496
+ },
497
+ },
498
+ };
499
+ const schemaB: MiddleObject = {
500
+ doc: undefined,
501
+ isRequired: true,
502
+ isArray: false,
503
+ properties: {
504
+ value: {
505
+ doc: undefined,
506
+ isRequired: true,
507
+ isArray: false,
508
+ type: ["number", "string"], // Different order
509
+ },
510
+ },
511
+ };
512
+
513
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(false);
514
+ });
515
+
516
+ it("should return false when comparing object property to basic var property", () => {
517
+ const schemaA: MiddleObject = {
518
+ doc: undefined,
519
+ isRequired: true,
520
+ isArray: false,
521
+ properties: {
522
+ data: {
523
+ doc: undefined,
524
+ isRequired: true,
525
+ isArray: false,
526
+ properties: {
527
+ name: {
528
+ doc: undefined,
529
+ isRequired: true,
530
+ isArray: false,
531
+ type: "string",
532
+ },
533
+ },
534
+ },
535
+ },
536
+ };
537
+ const schemaB: MiddleObject = {
538
+ doc: undefined,
539
+ isRequired: true,
540
+ isArray: false,
541
+ properties: {
542
+ data: {
543
+ doc: undefined,
544
+ isRequired: true,
545
+ isArray: false,
546
+ type: "string", // Basic var instead of object
547
+ },
548
+ },
549
+ };
550
+
551
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(false);
552
+ });
553
+
554
+ it("should return false when comparing enum property to basic var property", () => {
555
+ const schemaA: MiddleObject = {
556
+ doc: undefined,
557
+ isRequired: true,
558
+ isArray: false,
559
+ properties: {
560
+ status: {
561
+ doc: undefined,
562
+ isRequired: true,
563
+ isArray: false,
564
+ enum: ["active", "inactive"],
565
+ },
566
+ },
567
+ };
568
+ const schemaB: MiddleObject = {
569
+ doc: undefined,
570
+ isRequired: true,
571
+ isArray: false,
572
+ properties: {
573
+ status: {
574
+ doc: undefined,
575
+ isRequired: true,
576
+ isArray: false,
577
+ type: "string", // Basic var instead of enum
578
+ },
579
+ },
580
+ };
581
+
582
+ expect(compareMiddleObjects(schemaA, schemaB)).toBe(false);
583
+ });
584
+ });
585
+ });