@zuplo/cli 6.63.4 → 6.63.6
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.
- package/dist/cmds/mtls-certificates/create.js +8 -8
- package/dist/cmds/mtls-certificates/create.js.map +1 -1
- package/dist/cmds/mtls-certificates/disable.d.ts +9 -0
- package/dist/cmds/mtls-certificates/disable.d.ts.map +1 -0
- package/dist/cmds/mtls-certificates/disable.js +57 -0
- package/dist/cmds/mtls-certificates/disable.js.map +1 -0
- package/dist/cmds/mtls-certificates/index.d.ts.map +1 -1
- package/dist/cmds/mtls-certificates/index.js +2 -0
- package/dist/cmds/mtls-certificates/index.js.map +1 -1
- package/dist/cmds/mtls-certificates/update.js +8 -8
- package/dist/cmds/mtls-certificates/update.js.map +1 -1
- package/dist/cmds/open-api/overlay.js +1 -1
- package/dist/cmds/open-api/overlay.js.map +1 -1
- package/dist/common/open-api/constants.d.ts +13 -0
- package/dist/common/open-api/constants.d.ts.map +1 -0
- package/dist/common/open-api/constants.js +16 -0
- package/dist/common/open-api/constants.js.map +1 -0
- package/dist/common/open-api/index.d.ts +3 -0
- package/dist/common/open-api/index.d.ts.map +1 -0
- package/dist/common/open-api/index.js +3 -0
- package/dist/common/open-api/index.js.map +1 -0
- package/dist/common/open-api/validation.d.ts +297 -0
- package/dist/common/open-api/validation.d.ts.map +1 -0
- package/dist/common/open-api/validation.js +88 -0
- package/dist/common/open-api/validation.js.map +1 -0
- package/dist/deploy/handler.js +3 -2
- package/dist/deploy/handler.js.map +1 -1
- package/dist/mtls-certificates/create/handler.js +1 -1
- package/dist/mtls-certificates/create/handler.js.map +1 -1
- package/dist/mtls-certificates/describe/handler.js +3 -3
- package/dist/mtls-certificates/describe/handler.js.map +1 -1
- package/dist/mtls-certificates/disable/handler.d.ts +3 -0
- package/dist/mtls-certificates/disable/handler.d.ts.map +1 -0
- package/dist/mtls-certificates/disable/handler.js +32 -0
- package/dist/mtls-certificates/disable/handler.js.map +1 -0
- package/dist/mtls-certificates/list/handler.js +3 -3
- package/dist/mtls-certificates/list/handler.js.map +1 -1
- package/dist/mtls-certificates/models.d.ts +8 -2
- package/dist/mtls-certificates/models.d.ts.map +1 -1
- package/dist/mtls-certificates/models.js.map +1 -1
- package/dist/mtls-certificates/update/handler.js +2 -2
- package/dist/mtls-certificates/update/handler.js.map +1 -1
- package/dist/open-api/merge/merge-engine.d.ts +2 -5
- package/dist/open-api/merge/merge-engine.d.ts.map +1 -1
- package/dist/open-api/merge/merge-engine.js +2 -1
- package/dist/open-api/merge/merge-engine.js.map +1 -1
- package/dist/open-api/merge/utils.d.ts +0 -1
- package/dist/open-api/merge/utils.d.ts.map +1 -1
- package/dist/open-api/merge/utils.js +2 -11
- package/dist/open-api/merge/utils.js.map +1 -1
- package/dist/open-api/overlay/handler.d.ts.map +1 -1
- package/dist/open-api/overlay/handler.js +33 -33
- package/dist/open-api/overlay/handler.js.map +1 -1
- package/dist/open-api/overlay/overlay-engine.d.ts +20 -30
- package/dist/open-api/overlay/overlay-engine.d.ts.map +1 -1
- package/dist/open-api/overlay/overlay-engine.js +75 -46
- package/dist/open-api/overlay/overlay-engine.js.map +1 -1
- package/dist/open-api/overlay/overlay-engine.spec.js +109 -31
- package/dist/open-api/overlay/overlay-engine.spec.js.map +1 -1
- package/dist/source/migrate/dev-portal/handler.d.ts.map +1 -1
- package/dist/source/migrate/dev-portal/handler.js +48 -1
- package/dist/source/migrate/dev-portal/handler.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -5
|
@@ -123,7 +123,8 @@ describe("OpenAPI Overlay Engine", () => {
|
|
|
123
123
|
it("should handle numeric indices", () => {
|
|
124
124
|
const doc = { items: [{}, {}] };
|
|
125
125
|
setValueAtPath(doc, "$.items[0].name", "First Item");
|
|
126
|
-
|
|
126
|
+
const item = doc.items[0];
|
|
127
|
+
assert.strictEqual(item.name, "First Item");
|
|
127
128
|
});
|
|
128
129
|
it("should handle mixed dot and bracket notation", () => {
|
|
129
130
|
const doc = {};
|
|
@@ -173,8 +174,9 @@ describe("OpenAPI Overlay Engine", () => {
|
|
|
173
174
|
const result = applyAction(doc, action);
|
|
174
175
|
assert.strictEqual(result.applied, true);
|
|
175
176
|
assert.strictEqual(result.count, 1);
|
|
176
|
-
|
|
177
|
-
assert.strictEqual(
|
|
177
|
+
const getOperation = doc.paths["/users"].get;
|
|
178
|
+
assert.strictEqual(getOperation.summary, "New summary");
|
|
179
|
+
assert.strictEqual(getOperation.description, "Get all users");
|
|
178
180
|
});
|
|
179
181
|
it("should create new property if it doesn't exist", () => {
|
|
180
182
|
const doc = { paths: {} };
|
|
@@ -185,7 +187,8 @@ describe("OpenAPI Overlay Engine", () => {
|
|
|
185
187
|
const result = applyAction(doc, action);
|
|
186
188
|
assert.strictEqual(result.applied, true);
|
|
187
189
|
assert.strictEqual(result.count, 1);
|
|
188
|
-
|
|
190
|
+
const paths = doc.paths;
|
|
191
|
+
assert.deepStrictEqual(paths["/users"], {
|
|
189
192
|
get: { summary: "Get users" },
|
|
190
193
|
});
|
|
191
194
|
});
|
|
@@ -385,10 +388,14 @@ describe("OpenAPI Overlay Engine", () => {
|
|
|
385
388
|
assert.strictEqual(stats.applied, 2);
|
|
386
389
|
assert.strictEqual(stats.skipped, 0);
|
|
387
390
|
assert.strictEqual(stats.totalNodes, 2);
|
|
388
|
-
|
|
389
|
-
assert.strictEqual(
|
|
390
|
-
assert.strictEqual(
|
|
391
|
-
assert.strictEqual(
|
|
391
|
+
const info = result.info;
|
|
392
|
+
assert.strictEqual(info.title, "Updated API");
|
|
393
|
+
assert.strictEqual(info.description, "An updated API");
|
|
394
|
+
assert.strictEqual(info.version, "1.0.0");
|
|
395
|
+
const paths = result.paths;
|
|
396
|
+
const usersPath = paths["/users"];
|
|
397
|
+
const getOperation = usersPath.get;
|
|
398
|
+
assert.strictEqual(getOperation.operationId, "getUsers");
|
|
392
399
|
});
|
|
393
400
|
it("should handle overlay with remove actions", () => {
|
|
394
401
|
const openapi = {
|
|
@@ -418,31 +425,92 @@ describe("OpenAPI Overlay Engine", () => {
|
|
|
418
425
|
const { result, stats } = applyOverlay(openapi, overlay);
|
|
419
426
|
assert.strictEqual(stats.applied, 2);
|
|
420
427
|
assert.strictEqual(stats.totalNodes, 2);
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
assert.
|
|
428
|
+
const paths = result.paths;
|
|
429
|
+
const usersPath = paths["/users"];
|
|
430
|
+
assert.strictEqual("delete" in usersPath, false);
|
|
431
|
+
assert.strictEqual("/internal" in paths, false);
|
|
432
|
+
assert.ok("/users" in paths);
|
|
424
433
|
});
|
|
425
434
|
it("should throw error for invalid overlay format", () => {
|
|
426
|
-
const openapi = {
|
|
435
|
+
const openapi = {
|
|
436
|
+
openapi: "3.1.0",
|
|
437
|
+
info: { title: "Test", version: "1.0.0" },
|
|
438
|
+
};
|
|
427
439
|
const invalidOverlay = {
|
|
428
440
|
info: { title: "Invalid" },
|
|
429
441
|
};
|
|
430
|
-
assert.throws(() => applyOverlay(openapi, invalidOverlay), /Invalid
|
|
442
|
+
assert.throws(() => applyOverlay(openapi, invalidOverlay), /Invalid OpenAPI Overlay document/);
|
|
431
443
|
});
|
|
432
|
-
it("should
|
|
444
|
+
it("should throw actionable error for overlay with invalid action", () => {
|
|
433
445
|
const openapi = {
|
|
434
446
|
openapi: "3.1.0",
|
|
435
|
-
info: { title: "
|
|
447
|
+
info: { title: "Test", version: "1.0.0" },
|
|
448
|
+
};
|
|
449
|
+
const invalidOverlay = {
|
|
450
|
+
overlay: "1.0.0",
|
|
451
|
+
info: { title: "Test", version: "1.0.0" },
|
|
452
|
+
actions: [
|
|
453
|
+
{
|
|
454
|
+
target: "$.paths",
|
|
455
|
+
},
|
|
456
|
+
],
|
|
457
|
+
};
|
|
458
|
+
let errorMessage = "";
|
|
459
|
+
try {
|
|
460
|
+
applyOverlay(openapi, invalidOverlay);
|
|
461
|
+
}
|
|
462
|
+
catch (error) {
|
|
463
|
+
errorMessage = error.message;
|
|
464
|
+
}
|
|
465
|
+
assert.ok(errorMessage.includes("Action must specify exactly one of 'update' or 'remove'"), `Expected actionable error message, got: ${errorMessage}`);
|
|
466
|
+
});
|
|
467
|
+
it("should work with incomplete OpenAPI documents", () => {
|
|
468
|
+
const incompleteOpenapi = {
|
|
469
|
+
paths: {},
|
|
470
|
+
};
|
|
471
|
+
const overlay = {
|
|
472
|
+
overlay: "1.0.0",
|
|
473
|
+
info: { title: "Test", version: "1.0.0" },
|
|
474
|
+
actions: [{ target: "$.paths", update: { "/test": { get: {} } } }],
|
|
436
475
|
};
|
|
476
|
+
const { result } = applyOverlay(incompleteOpenapi, overlay);
|
|
477
|
+
const paths = result.paths;
|
|
478
|
+
assert.ok("/test" in paths);
|
|
479
|
+
});
|
|
480
|
+
it("should reject completely invalid OpenAPI document (not an object)", () => {
|
|
481
|
+
const notAnObject = "this is a string";
|
|
437
482
|
const overlay = {
|
|
483
|
+
overlay: "1.0.0",
|
|
484
|
+
info: { title: "Test", version: "1.0.0" },
|
|
485
|
+
actions: [{ target: "$.paths", update: { "/test": {} } }],
|
|
486
|
+
};
|
|
487
|
+
let errorMessage = "";
|
|
488
|
+
try {
|
|
489
|
+
applyOverlay(notAnObject, overlay);
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
errorMessage = error.message;
|
|
493
|
+
}
|
|
494
|
+
assert.ok(errorMessage.includes("must be a valid JSON or YAML object"), `Expected error about document not being an object, got: ${errorMessage}`);
|
|
495
|
+
});
|
|
496
|
+
it("should reject empty actions array", () => {
|
|
497
|
+
const openapi = {
|
|
498
|
+
openapi: "3.1.0",
|
|
499
|
+
info: { title: "API", version: "1.0.0" },
|
|
500
|
+
};
|
|
501
|
+
const invalidOverlay = {
|
|
438
502
|
overlay: "1.0.0",
|
|
439
503
|
info: { title: "Empty Overlay", version: "1.0.0" },
|
|
440
504
|
actions: [],
|
|
441
505
|
};
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
506
|
+
let errorMessage = "";
|
|
507
|
+
try {
|
|
508
|
+
applyOverlay(openapi, invalidOverlay);
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
errorMessage = error.message;
|
|
512
|
+
}
|
|
513
|
+
assert.ok(errorMessage.includes("Overlay must contain at least one action"), `Expected validation error for empty actions, got: ${errorMessage}`);
|
|
446
514
|
});
|
|
447
515
|
it("should apply overlay with wildcards and conditions", () => {
|
|
448
516
|
const openapi = {
|
|
@@ -474,9 +542,10 @@ describe("OpenAPI Overlay Engine", () => {
|
|
|
474
542
|
};
|
|
475
543
|
const { result, stats } = applyOverlay(openapi, overlay);
|
|
476
544
|
assert.strictEqual(stats.applied, 2);
|
|
477
|
-
|
|
478
|
-
assert.ok("/
|
|
479
|
-
assert.
|
|
545
|
+
const paths = result.paths;
|
|
546
|
+
assert.ok("/users" in paths);
|
|
547
|
+
assert.ok("/internal" in paths);
|
|
548
|
+
assert.strictEqual("/posts" in paths, false);
|
|
480
549
|
});
|
|
481
550
|
it("should preserve document structure and order", () => {
|
|
482
551
|
const openapi = {
|
|
@@ -501,7 +570,8 @@ describe("OpenAPI Overlay Engine", () => {
|
|
|
501
570
|
assert.strictEqual(keys[1], "info");
|
|
502
571
|
assert.ok(keys.includes("servers"));
|
|
503
572
|
assert.ok(keys.includes("paths"));
|
|
504
|
-
|
|
573
|
+
const info = result.info;
|
|
574
|
+
assert.strictEqual(info.description, "Added description");
|
|
505
575
|
});
|
|
506
576
|
});
|
|
507
577
|
describe("Complex overlay scenarios", () => {
|
|
@@ -532,10 +602,15 @@ describe("OpenAPI Overlay Engine", () => {
|
|
|
532
602
|
],
|
|
533
603
|
};
|
|
534
604
|
const { result } = applyOverlay(openapi, overlay);
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
605
|
+
const components = result.components;
|
|
606
|
+
const schemas = components.schemas;
|
|
607
|
+
const userSchema = schemas.User;
|
|
608
|
+
const properties = userSchema.properties;
|
|
609
|
+
assert.ok(properties.id);
|
|
610
|
+
assert.ok(properties.name);
|
|
611
|
+
assert.ok(properties.email);
|
|
612
|
+
const emailProperty = properties.email;
|
|
613
|
+
assert.strictEqual(emailProperty.format, "email");
|
|
539
614
|
});
|
|
540
615
|
it("should handle array element removal", () => {
|
|
541
616
|
const openapi = {
|
|
@@ -556,9 +631,10 @@ describe("OpenAPI Overlay Engine", () => {
|
|
|
556
631
|
],
|
|
557
632
|
};
|
|
558
633
|
const { result } = applyOverlay(openapi, overlay);
|
|
559
|
-
|
|
560
|
-
assert.strictEqual(
|
|
561
|
-
assert.strictEqual(
|
|
634
|
+
const servers = result.servers;
|
|
635
|
+
assert.strictEqual(servers.length, 2);
|
|
636
|
+
assert.strictEqual(servers[0].description, "Production");
|
|
637
|
+
assert.strictEqual(servers[1].description, "Staging");
|
|
562
638
|
});
|
|
563
639
|
it("should handle parameter merging correctly", () => {
|
|
564
640
|
const openapi = {
|
|
@@ -591,7 +667,9 @@ describe("OpenAPI Overlay Engine", () => {
|
|
|
591
667
|
],
|
|
592
668
|
};
|
|
593
669
|
const { result } = applyOverlay(openapi, overlay);
|
|
594
|
-
const
|
|
670
|
+
const paths = result.paths;
|
|
671
|
+
const usersPath = paths["/users/{id}"];
|
|
672
|
+
const params = usersPath.parameters;
|
|
595
673
|
assert.strictEqual(params.length, 3);
|
|
596
674
|
const idParam = params.find((p) => p.name === "id");
|
|
597
675
|
assert.ok(idParam);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay-engine.spec.js","sourceRoot":"","sources":["../../../src/open-api/overlay/overlay-engine.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it } from \"node:test\";\nimport assert from \"node:assert\";\nimport {\n applyOverlay,\n applyAction,\n deepClone,\n deepMerge,\n checkCondition,\n setValueAtPath,\n extractPathOrder,\n reorderOperationProperties,\n type OverlayDocument,\n type OverlayAction,\n} from \"./overlay-engine.js\";\n\ndescribe(\"OpenAPI Overlay Engine\", () => {\n describe(\"deepClone\", () => {\n it(\"should deep clone an object\", () => {\n const original = { a: 1, b: { c: 2 } };\n const cloned = deepClone(original);\n\n assert.deepStrictEqual(cloned, original);\n assert.notStrictEqual(cloned, original);\n assert.notStrictEqual(cloned.b, original.b);\n });\n\n it(\"should deep clone an array\", () => {\n const original = [1, 2, { a: 3 }];\n const cloned = deepClone(original);\n\n assert.deepStrictEqual(cloned, original);\n assert.notStrictEqual(cloned, original);\n assert.notStrictEqual(cloned[2], original[2]);\n });\n });\n\n describe(\"deepMerge\", () => {\n it(\"should merge two objects\", () => {\n const target = { a: 1, b: 2 };\n const source = { b: 3, c: 4 };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { a: 1, b: 3, c: 4 });\n });\n\n it(\"should merge nested objects\", () => {\n const target = { a: { b: 1, c: 2 } };\n const source = { a: { c: 3, d: 4 } };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { a: { b: 1, c: 3, d: 4 } });\n });\n\n it(\"should concatenate arrays by default\", () => {\n const target = { arr: [1, 2] };\n const source = { arr: [3, 4] };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { arr: [1, 2, 3, 4] });\n });\n\n it(\"should merge OpenAPI parameters by name and in\", () => {\n const target = {\n parameters: [\n { name: \"id\", in: \"path\", required: true },\n { name: \"filter\", in: \"query\" },\n ],\n };\n const source = {\n parameters: [\n { name: \"id\", in: \"path\", description: \"The ID\" },\n { name: \"sort\", in: \"query\" },\n ],\n };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, {\n parameters: [\n { name: \"id\", in: \"path\", required: true, description: \"The ID\" },\n { name: \"filter\", in: \"query\" },\n { name: \"sort\", in: \"query\" },\n ],\n });\n });\n\n it(\"should replace target with source if types differ\", () => {\n const target = { a: [1, 2] };\n const source = { a: \"string\" };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { a: \"string\" });\n });\n });\n\n describe(\"checkCondition\", () => {\n it(\"should return true for empty object when empty condition is true\", () => {\n assert.strictEqual(checkCondition({}, { empty: true }), true);\n });\n\n it(\"should return false for non-empty object when empty condition is true\", () => {\n assert.strictEqual(checkCondition({ a: 1 }, { empty: true }), false);\n });\n\n it(\"should return true for empty array when empty condition is true\", () => {\n assert.strictEqual(checkCondition([], { empty: true }), true);\n });\n\n it(\"should return false for non-empty array when empty condition is true\", () => {\n assert.strictEqual(checkCondition([1], { empty: true }), false);\n });\n\n it(\"should return true when property is missing\", () => {\n const obj = { a: { b: 1 } };\n assert.strictEqual(checkCondition(obj, { missing: \"a.c\" }), true);\n });\n\n it(\"should return false when property exists\", () => {\n const obj = { a: { b: 1 } };\n assert.strictEqual(checkCondition(obj, { missing: \"a.b\" }), false);\n });\n });\n\n describe(\"setValueAtPath\", () => {\n it(\"should set value at simple path\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.info.title\", \"My API\");\n\n assert.deepStrictEqual(doc, { info: { title: \"My API\" } });\n });\n\n it(\"should set value at bracket notation path\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.paths['/users'].get\", { summary: \"Get users\" });\n\n assert.deepStrictEqual(doc, {\n paths: { \"/users\": { get: { summary: \"Get users\" } } },\n });\n });\n\n it(\"should create nested paths as needed\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.a.b.c.d\", \"value\");\n\n assert.deepStrictEqual(doc, { a: { b: { c: { d: \"value\" } } } });\n });\n\n it(\"should handle double-quoted bracket notation\", () => {\n const doc = {};\n setValueAtPath(doc, '$.paths[\"/users\"].get', { summary: \"Get users\" });\n\n assert.deepStrictEqual(doc, {\n paths: { \"/users\": { get: { summary: \"Get users\" } } },\n });\n });\n\n it(\"should handle unquoted bracket notation\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.paths[users].get\", { summary: \"Get users\" });\n\n assert.deepStrictEqual(doc, {\n paths: { users: { get: { summary: \"Get users\" } } },\n });\n });\n\n it(\"should handle numeric indices\", () => {\n const doc = { items: [{}, {}] };\n setValueAtPath(doc, \"$.items[0].name\", \"First Item\");\n\n assert.strictEqual((doc.items[0] as any).name, \"First Item\");\n });\n\n it(\"should handle mixed dot and bracket notation\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.components.schemas['User'].properties.id\", {\n type: \"string\",\n });\n\n assert.deepStrictEqual(doc, {\n components: {\n schemas: {\n User: {\n properties: {\n id: { type: \"string\" },\n },\n },\n },\n },\n });\n });\n });\n\n describe(\"applyAction - update operations\", () => {\n it(\"should update root level properties\", () => {\n const doc = { info: { title: \"Old Title\" } };\n const action: OverlayAction = {\n target: \"$\",\n update: { info: { version: \"1.0.0\" } },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.deepStrictEqual(doc.info, {\n title: \"Old Title\",\n version: \"1.0.0\",\n });\n });\n\n it(\"should update existing nested property\", () => {\n const doc = {\n paths: {\n \"/users\": {\n get: { summary: \"Old summary\" },\n },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths['/users'].get\",\n update: { summary: \"New summary\", description: \"Get all users\" },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.strictEqual(\n (doc.paths[\"/users\"].get as any).summary,\n \"New summary\"\n );\n assert.strictEqual(\n (doc.paths[\"/users\"].get as any).description,\n \"Get all users\"\n );\n });\n\n it(\"should create new property if it doesn't exist\", () => {\n const doc = { paths: {} };\n const action: OverlayAction = {\n target: \"$.paths['/users']\",\n update: { get: { summary: \"Get users\" } },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.deepStrictEqual((doc.paths as any)[\"/users\"], {\n get: { summary: \"Get users\" },\n });\n });\n\n it(\"should update multiple nodes with wildcard\", () => {\n const doc = {\n paths: {\n \"/users\": { get: { tags: [] } },\n \"/posts\": { get: { tags: [] } },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*.get\",\n update: { tags: [\"public\"] },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 2);\n assert.deepStrictEqual(doc.paths[\"/users\"].get.tags, [\"public\"]);\n assert.deepStrictEqual(doc.paths[\"/posts\"].get.tags, [\"public\"]);\n });\n });\n\n describe(\"applyAction - remove operations\", () => {\n it(\"should remove a property from object\", () => {\n const doc = {\n paths: {\n \"/users\": { get: {}, delete: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths['/users'].delete\",\n remove: true,\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.strictEqual(\"delete\" in doc.paths[\"/users\"], false);\n assert.ok(\"get\" in doc.paths[\"/users\"]);\n });\n\n it(\"should remove multiple properties with wildcard\", () => {\n const doc = {\n paths: {\n \"/users\": { get: {}, delete: {} },\n \"/posts\": { get: {}, delete: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*.delete\",\n remove: true,\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 2);\n assert.strictEqual(\"delete\" in doc.paths[\"/users\"], false);\n assert.strictEqual(\"delete\" in doc.paths[\"/posts\"], false);\n });\n\n it(\"should conditionally remove empty objects\", () => {\n const doc = {\n paths: {\n \"/users\": { get: {} },\n \"/posts\": {},\n \"/comments\": { get: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*\",\n remove: { empty: true },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.ok(\"/users\" in doc.paths);\n assert.strictEqual(\"/posts\" in doc.paths, false);\n assert.ok(\"/comments\" in doc.paths);\n });\n\n it(\"should conditionally remove when property is missing\", () => {\n const doc = {\n paths: {\n \"/users\": { get: { \"x-internal\": true } },\n \"/posts\": { get: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*\",\n remove: { missing: \"get.x-internal\" },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.ok(\"/users\" in doc.paths);\n assert.strictEqual(\"/posts\" in doc.paths, false);\n });\n\n it(\"should return false if target not found\", () => {\n const doc = { paths: {} };\n const action: OverlayAction = {\n target: \"$.paths['/users']\",\n remove: true,\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, false);\n assert.strictEqual(result.count, 0);\n });\n });\n\n describe(\"extractPathOrder\", () => {\n it(\"should extract path order from overlay actions\", () => {\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [\n { target: \"$.paths['/users'].get\", update: {} },\n { target: \"$.paths['/posts'].get\", update: {} },\n { target: \"$.paths['/users'].post\", update: {} },\n { target: \"$.info\", update: {} },\n ],\n };\n\n const order = extractPathOrder(overlay);\n\n assert.deepStrictEqual(order, [\"/users\", \"/posts\"]);\n });\n\n it(\"should return empty array if no path actions\", () => {\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [{ target: \"$.info\", update: {} }],\n };\n\n const order = extractPathOrder(overlay);\n\n assert.deepStrictEqual(order, []);\n });\n });\n\n describe(\"reorderOperationProperties\", () => {\n it(\"should reorder operation properties with priority keys first\", () => {\n const operation = {\n responses: {},\n parameters: [],\n operationId: \"getUsers\",\n description: \"Get all users\",\n summary: \"Get users\",\n };\n\n const result = reorderOperationProperties(operation);\n const keys = Object.keys(result);\n\n assert.strictEqual(keys[0], \"summary\");\n assert.strictEqual(keys[1], \"description\");\n assert.strictEqual(keys[2], \"operationId\");\n assert.strictEqual(keys[3], \"responses\");\n assert.strictEqual(keys[4], \"parameters\");\n });\n\n it(\"should handle missing priority keys\", () => {\n const operation = {\n responses: {},\n operationId: \"getUsers\",\n };\n\n const result = reorderOperationProperties(operation);\n const keys = Object.keys(result);\n\n assert.strictEqual(keys[0], \"operationId\");\n assert.strictEqual(keys[1], \"responses\");\n });\n });\n\n describe(\"applyOverlay - full integration\", () => {\n it(\"should apply a complete overlay document\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Get users\",\n },\n },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: {\n title: \"My Overlay\",\n version: \"1.0.0\",\n },\n actions: [\n {\n target: \"$.info\",\n description: \"Update API info\",\n update: {\n title: \"Updated API\",\n description: \"An updated API\",\n },\n },\n {\n target: \"$.paths['/users'].get\",\n description: \"Add operation ID\",\n update: {\n operationId: \"getUsers\",\n },\n },\n ],\n };\n\n const { result, stats } = applyOverlay(openapi, overlay);\n\n assert.strictEqual(stats.applied, 2);\n assert.strictEqual(stats.skipped, 0);\n assert.strictEqual(stats.totalNodes, 2);\n\n assert.strictEqual(result.info.title, \"Updated API\");\n assert.strictEqual(result.info.description, \"An updated API\");\n assert.strictEqual(result.info.version, \"1.0.0\");\n assert.strictEqual(result.paths[\"/users\"].get.operationId, \"getUsers\");\n });\n\n it(\"should handle overlay with remove actions\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"API\" },\n paths: {\n \"/users\": { get: {}, delete: {} },\n \"/internal\": { get: {} },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths.*.delete\",\n description: \"Remove all delete operations\",\n remove: true,\n },\n {\n target: \"$.paths['/internal']\",\n description: \"Remove internal path\",\n remove: true,\n },\n ],\n };\n\n const { result, stats } = applyOverlay(openapi, overlay);\n\n assert.strictEqual(stats.applied, 2);\n assert.strictEqual(stats.totalNodes, 2);\n\n assert.strictEqual(\"delete\" in result.paths[\"/users\"], false);\n assert.strictEqual(\"/internal\" in result.paths, false);\n assert.ok(\"/users\" in result.paths);\n });\n\n it(\"should throw error for invalid overlay format\", () => {\n const openapi = { openapi: \"3.1.0\" };\n const invalidOverlay = {\n info: { title: \"Invalid\" },\n // Missing 'overlay' and 'actions'\n };\n\n assert.throws(\n () => applyOverlay(openapi, invalidOverlay as any),\n /Invalid overlay format/\n );\n });\n\n it(\"should handle empty actions array\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"API\" },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Empty Overlay\", version: \"1.0.0\" },\n actions: [],\n };\n\n const { result, stats } = applyOverlay(openapi, overlay);\n\n assert.strictEqual(stats.applied, 0);\n assert.strictEqual(stats.skipped, 0);\n assert.deepStrictEqual(result.info, openapi.info);\n });\n\n it(\"should apply overlay with wildcards and conditions\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n paths: {\n \"/users\": {\n get: { \"x-internal\": true, tags: [] },\n post: { tags: [] },\n },\n \"/posts\": { get: { tags: [] } },\n \"/internal\": { get: { \"x-internal\": true, tags: [] } },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Conditional Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths.*.*.tags\",\n description: \"Add default tag\",\n update: [\"public\"],\n },\n {\n target: \"$.paths.*\",\n description: \"Remove paths without x-internal\",\n remove: { missing: \"get.x-internal\" },\n },\n ],\n };\n\n const { result, stats } = applyOverlay(openapi, overlay);\n\n // First action should update all tags arrays (4 operations)\n // Second action should remove /posts (missing x-internal)\n assert.strictEqual(stats.applied, 2);\n\n assert.ok(\"/users\" in result.paths);\n assert.ok(\"/internal\" in result.paths);\n assert.strictEqual(\"/posts\" in result.paths, false);\n });\n\n it(\"should preserve document structure and order\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"API\", version: \"1.0.0\" },\n servers: [{ url: \"https://api.example.com\" }],\n paths: {},\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.info\",\n update: { description: \"Added description\" },\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const keys = Object.keys(result);\n assert.strictEqual(keys[0], \"openapi\");\n assert.strictEqual(keys[1], \"info\");\n // Priority keys come first: openapi, info, tags (if present)\n // Then other keys in original order\n assert.ok(keys.includes(\"servers\"));\n assert.ok(keys.includes(\"paths\"));\n assert.strictEqual(result.info.description, \"Added description\");\n });\n });\n\n describe(\"Complex overlay scenarios\", () => {\n it(\"should handle deep nested updates\", () => {\n const openapi = {\n components: {\n schemas: {\n User: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n },\n },\n },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Schema Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.components.schemas.User.properties\",\n update: {\n name: { type: \"string\" },\n email: { type: \"string\", format: \"email\" },\n },\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n assert.ok(result.components.schemas.User.properties.id);\n assert.ok(result.components.schemas.User.properties.name);\n assert.ok(result.components.schemas.User.properties.email);\n assert.strictEqual(\n result.components.schemas.User.properties.email.format,\n \"email\"\n );\n });\n\n it(\"should handle array element removal\", () => {\n const openapi = {\n servers: [\n { url: \"https://prod.example.com\", description: \"Production\" },\n { url: \"https://staging.example.com\", description: \"Staging\" },\n { url: \"https://dev.example.com\", description: \"Development\" },\n ],\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Server Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.servers[?(@.description=='Development')]\",\n remove: true,\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n assert.strictEqual(result.servers.length, 2);\n assert.strictEqual(result.servers[0].description, \"Production\");\n assert.strictEqual(result.servers[1].description, \"Staging\");\n });\n\n it(\"should handle parameter merging correctly\", () => {\n const openapi = {\n paths: {\n \"/users/{id}\": {\n parameters: [\n { name: \"id\", in: \"path\", required: true },\n { name: \"fields\", in: \"query\" },\n ],\n get: {},\n },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Parameter Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths['/users/{id}'].parameters\",\n update: [\n {\n name: \"id\",\n in: \"path\",\n description: \"User ID\",\n schema: { type: \"string\" },\n },\n { name: \"include\", in: \"query\", description: \"Include related\" },\n ],\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const params = result.paths[\"/users/{id}\"].parameters;\n assert.strictEqual(params.length, 3);\n\n const idParam = params.find((p: any) => p.name === \"id\");\n assert.ok(idParam);\n assert.strictEqual(idParam.required, true);\n assert.strictEqual(idParam.description, \"User ID\");\n assert.deepStrictEqual(idParam.schema, { type: \"string\" });\n\n const fieldsParam = params.find((p: any) => p.name === \"fields\");\n assert.ok(fieldsParam);\n\n const includeParam = params.find((p: any) => p.name === \"include\");\n assert.ok(includeParam);\n assert.strictEqual(includeParam.description, \"Include related\");\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"overlay-engine.spec.js","sourceRoot":"","sources":["../../../src/open-api/overlay/overlay-engine.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it } from \"node:test\";\nimport assert from \"node:assert\";\nimport {\n type OverlayDocument,\n type OverlayAction,\n} from \"../../common/open-api/index.js\";\nimport {\n applyOverlay,\n applyAction,\n deepClone,\n deepMerge,\n checkCondition,\n setValueAtPath,\n extractPathOrder,\n reorderOperationProperties,\n} from \"./overlay-engine.js\";\n\ndescribe(\"OpenAPI Overlay Engine\", () => {\n describe(\"deepClone\", () => {\n it(\"should deep clone an object\", () => {\n const original = { a: 1, b: { c: 2 } };\n const cloned = deepClone(original);\n\n assert.deepStrictEqual(cloned, original);\n assert.notStrictEqual(cloned, original);\n assert.notStrictEqual(cloned.b, original.b);\n });\n\n it(\"should deep clone an array\", () => {\n const original = [1, 2, { a: 3 }];\n const cloned = deepClone(original);\n\n assert.deepStrictEqual(cloned, original);\n assert.notStrictEqual(cloned, original);\n assert.notStrictEqual(cloned[2], original[2]);\n });\n });\n\n describe(\"deepMerge\", () => {\n it(\"should merge two objects\", () => {\n const target = { a: 1, b: 2 };\n const source = { b: 3, c: 4 };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { a: 1, b: 3, c: 4 });\n });\n\n it(\"should merge nested objects\", () => {\n const target = { a: { b: 1, c: 2 } };\n const source = { a: { c: 3, d: 4 } };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { a: { b: 1, c: 3, d: 4 } });\n });\n\n it(\"should concatenate arrays by default\", () => {\n const target = { arr: [1, 2] };\n const source = { arr: [3, 4] };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { arr: [1, 2, 3, 4] });\n });\n\n it(\"should merge OpenAPI parameters by name and in\", () => {\n const target = {\n parameters: [\n { name: \"id\", in: \"path\", required: true },\n { name: \"filter\", in: \"query\" },\n ],\n };\n const source = {\n parameters: [\n { name: \"id\", in: \"path\", description: \"The ID\" },\n { name: \"sort\", in: \"query\" },\n ],\n };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, {\n parameters: [\n { name: \"id\", in: \"path\", required: true, description: \"The ID\" },\n { name: \"filter\", in: \"query\" },\n { name: \"sort\", in: \"query\" },\n ],\n });\n });\n\n it(\"should replace target with source if types differ\", () => {\n const target = { a: [1, 2] };\n const source = { a: \"string\" };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { a: \"string\" });\n });\n });\n\n describe(\"checkCondition\", () => {\n it(\"should return true for empty object when empty condition is true\", () => {\n assert.strictEqual(checkCondition({}, { empty: true }), true);\n });\n\n it(\"should return false for non-empty object when empty condition is true\", () => {\n assert.strictEqual(checkCondition({ a: 1 }, { empty: true }), false);\n });\n\n it(\"should return true for empty array when empty condition is true\", () => {\n assert.strictEqual(checkCondition([], { empty: true }), true);\n });\n\n it(\"should return false for non-empty array when empty condition is true\", () => {\n assert.strictEqual(checkCondition([1], { empty: true }), false);\n });\n\n it(\"should return true when property is missing\", () => {\n const obj = { a: { b: 1 } };\n assert.strictEqual(checkCondition(obj, { missing: \"a.c\" }), true);\n });\n\n it(\"should return false when property exists\", () => {\n const obj = { a: { b: 1 } };\n assert.strictEqual(checkCondition(obj, { missing: \"a.b\" }), false);\n });\n });\n\n describe(\"setValueAtPath\", () => {\n it(\"should set value at simple path\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.info.title\", \"My API\");\n\n assert.deepStrictEqual(doc, { info: { title: \"My API\" } });\n });\n\n it(\"should set value at bracket notation path\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.paths['/users'].get\", { summary: \"Get users\" });\n\n assert.deepStrictEqual(doc, {\n paths: { \"/users\": { get: { summary: \"Get users\" } } },\n });\n });\n\n it(\"should create nested paths as needed\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.a.b.c.d\", \"value\");\n\n assert.deepStrictEqual(doc, { a: { b: { c: { d: \"value\" } } } });\n });\n\n it(\"should handle double-quoted bracket notation\", () => {\n const doc = {};\n setValueAtPath(doc, '$.paths[\"/users\"].get', { summary: \"Get users\" });\n\n assert.deepStrictEqual(doc, {\n paths: { \"/users\": { get: { summary: \"Get users\" } } },\n });\n });\n\n it(\"should handle unquoted bracket notation\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.paths[users].get\", { summary: \"Get users\" });\n\n assert.deepStrictEqual(doc, {\n paths: { users: { get: { summary: \"Get users\" } } },\n });\n });\n\n it(\"should handle numeric indices\", () => {\n const doc = { items: [{}, {}] };\n setValueAtPath(doc, \"$.items[0].name\", \"First Item\");\n\n const item = doc.items[0] as Record<string, unknown>;\n assert.strictEqual(item.name, \"First Item\");\n });\n\n it(\"should handle mixed dot and bracket notation\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.components.schemas['User'].properties.id\", {\n type: \"string\",\n });\n\n assert.deepStrictEqual(doc, {\n components: {\n schemas: {\n User: {\n properties: {\n id: { type: \"string\" },\n },\n },\n },\n },\n });\n });\n });\n\n describe(\"applyAction - update operations\", () => {\n it(\"should update root level properties\", () => {\n const doc = { info: { title: \"Old Title\" } };\n const action: OverlayAction = {\n target: \"$\",\n update: { info: { version: \"1.0.0\" } },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.deepStrictEqual(doc.info, {\n title: \"Old Title\",\n version: \"1.0.0\",\n });\n });\n\n it(\"should update existing nested property\", () => {\n const doc = {\n paths: {\n \"/users\": {\n get: { summary: \"Old summary\" },\n },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths['/users'].get\",\n update: { summary: \"New summary\", description: \"Get all users\" },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n const getOperation = doc.paths[\"/users\"].get as Record<string, unknown>;\n assert.strictEqual(getOperation.summary, \"New summary\");\n assert.strictEqual(getOperation.description, \"Get all users\");\n });\n\n it(\"should create new property if it doesn't exist\", () => {\n const doc = { paths: {} };\n const action: OverlayAction = {\n target: \"$.paths['/users']\",\n update: { get: { summary: \"Get users\" } },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n const paths = doc.paths as Record<string, unknown>;\n assert.deepStrictEqual(paths[\"/users\"], {\n get: { summary: \"Get users\" },\n });\n });\n\n it(\"should update multiple nodes with wildcard\", () => {\n const doc = {\n paths: {\n \"/users\": { get: { tags: [] } },\n \"/posts\": { get: { tags: [] } },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*.get\",\n update: { tags: [\"public\"] },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 2);\n assert.deepStrictEqual(doc.paths[\"/users\"].get.tags, [\"public\"]);\n assert.deepStrictEqual(doc.paths[\"/posts\"].get.tags, [\"public\"]);\n });\n });\n\n describe(\"applyAction - remove operations\", () => {\n it(\"should remove a property from object\", () => {\n const doc = {\n paths: {\n \"/users\": { get: {}, delete: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths['/users'].delete\",\n remove: true,\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.strictEqual(\"delete\" in doc.paths[\"/users\"], false);\n assert.ok(\"get\" in doc.paths[\"/users\"]);\n });\n\n it(\"should remove multiple properties with wildcard\", () => {\n const doc = {\n paths: {\n \"/users\": { get: {}, delete: {} },\n \"/posts\": { get: {}, delete: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*.delete\",\n remove: true,\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 2);\n assert.strictEqual(\"delete\" in doc.paths[\"/users\"], false);\n assert.strictEqual(\"delete\" in doc.paths[\"/posts\"], false);\n });\n\n it(\"should conditionally remove empty objects\", () => {\n const doc = {\n paths: {\n \"/users\": { get: {} },\n \"/posts\": {},\n \"/comments\": { get: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*\",\n remove: { empty: true },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.ok(\"/users\" in doc.paths);\n assert.strictEqual(\"/posts\" in doc.paths, false);\n assert.ok(\"/comments\" in doc.paths);\n });\n\n it(\"should conditionally remove when property is missing\", () => {\n const doc = {\n paths: {\n \"/users\": { get: { \"x-internal\": true } },\n \"/posts\": { get: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*\",\n remove: { missing: \"get.x-internal\" },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.ok(\"/users\" in doc.paths);\n assert.strictEqual(\"/posts\" in doc.paths, false);\n });\n\n it(\"should return false if target not found\", () => {\n const doc = { paths: {} };\n const action: OverlayAction = {\n target: \"$.paths['/users']\",\n remove: true,\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, false);\n assert.strictEqual(result.count, 0);\n });\n });\n\n describe(\"extractPathOrder\", () => {\n it(\"should extract path order from overlay actions\", () => {\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [\n { target: \"$.paths['/users'].get\", update: {} },\n { target: \"$.paths['/posts'].get\", update: {} },\n { target: \"$.paths['/users'].post\", update: {} },\n { target: \"$.info\", update: {} },\n ],\n };\n\n const order = extractPathOrder(overlay);\n\n assert.deepStrictEqual(order, [\"/users\", \"/posts\"]);\n });\n\n it(\"should return empty array if no path actions\", () => {\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [{ target: \"$.info\", update: {} }],\n };\n\n const order = extractPathOrder(overlay);\n\n assert.deepStrictEqual(order, []);\n });\n });\n\n describe(\"reorderOperationProperties\", () => {\n it(\"should reorder operation properties with priority keys first\", () => {\n const operation = {\n responses: {},\n parameters: [],\n operationId: \"getUsers\",\n description: \"Get all users\",\n summary: \"Get users\",\n };\n\n const result = reorderOperationProperties(operation);\n const keys = Object.keys(result);\n\n assert.strictEqual(keys[0], \"summary\");\n assert.strictEqual(keys[1], \"description\");\n assert.strictEqual(keys[2], \"operationId\");\n assert.strictEqual(keys[3], \"responses\");\n assert.strictEqual(keys[4], \"parameters\");\n });\n\n it(\"should handle missing priority keys\", () => {\n const operation = {\n responses: {},\n operationId: \"getUsers\",\n };\n\n const result = reorderOperationProperties(operation);\n const keys = Object.keys(result);\n\n assert.strictEqual(keys[0], \"operationId\");\n assert.strictEqual(keys[1], \"responses\");\n });\n });\n\n describe(\"applyOverlay - full integration\", () => {\n it(\"should apply a complete overlay document\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Get users\",\n },\n },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: {\n title: \"My Overlay\",\n version: \"1.0.0\",\n },\n actions: [\n {\n target: \"$.info\",\n description: \"Update API info\",\n update: {\n title: \"Updated API\",\n description: \"An updated API\",\n },\n },\n {\n target: \"$.paths['/users'].get\",\n description: \"Add operation ID\",\n update: {\n operationId: \"getUsers\",\n },\n },\n ],\n };\n\n const { result, stats } = applyOverlay(openapi, overlay);\n\n assert.strictEqual(stats.applied, 2);\n assert.strictEqual(stats.skipped, 0);\n assert.strictEqual(stats.totalNodes, 2);\n\n const info = result.info as Record<string, unknown>;\n assert.strictEqual(info.title, \"Updated API\");\n assert.strictEqual(info.description, \"An updated API\");\n assert.strictEqual(info.version, \"1.0.0\");\n const paths = result.paths as Record<string, unknown>;\n const usersPath = paths[\"/users\"] as Record<string, unknown>;\n const getOperation = usersPath.get as Record<string, unknown>;\n assert.strictEqual(getOperation.operationId, \"getUsers\");\n });\n\n it(\"should handle overlay with remove actions\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"API\" },\n paths: {\n \"/users\": { get: {}, delete: {} },\n \"/internal\": { get: {} },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths.*.delete\",\n description: \"Remove all delete operations\",\n remove: true,\n },\n {\n target: \"$.paths['/internal']\",\n description: \"Remove internal path\",\n remove: true,\n },\n ],\n };\n\n const { result, stats } = applyOverlay(openapi, overlay);\n\n assert.strictEqual(stats.applied, 2);\n assert.strictEqual(stats.totalNodes, 2);\n\n const paths = result.paths as Record<string, unknown>;\n const usersPath = paths[\"/users\"] as Record<string, unknown>;\n assert.strictEqual(\"delete\" in usersPath, false);\n assert.strictEqual(\"/internal\" in paths, false);\n assert.ok(\"/users\" in paths);\n });\n\n it(\"should throw error for invalid overlay format\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n };\n const invalidOverlay = {\n info: { title: \"Invalid\" },\n // Missing 'overlay' and 'actions'\n };\n\n assert.throws(\n () => applyOverlay(openapi, invalidOverlay as unknown),\n /Invalid OpenAPI Overlay document/\n );\n });\n\n it(\"should throw actionable error for overlay with invalid action\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n };\n const invalidOverlay = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths\",\n // Missing both 'update' and 'remove' - invalid!\n },\n ],\n };\n\n let errorMessage = \"\";\n try {\n applyOverlay(openapi, invalidOverlay as unknown);\n } catch (error) {\n errorMessage = (error as Error).message;\n }\n\n assert.ok(\n errorMessage.includes(\n \"Action must specify exactly one of 'update' or 'remove'\"\n ),\n `Expected actionable error message, got: ${errorMessage}`\n );\n });\n\n it(\"should work with incomplete OpenAPI documents\", () => {\n // The overlay tool should be lenient and work with imperfect OpenAPI files\n const incompleteOpenapi = {\n // Missing 'openapi' and 'info' - but that's OK!\n paths: {},\n };\n const overlay = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [{ target: \"$.paths\", update: { \"/test\": { get: {} } } }],\n };\n\n // Should not throw - lenient validation\n const { result } = applyOverlay(incompleteOpenapi, overlay);\n\n // Should have applied the update\n const paths = result.paths as Record<string, unknown>;\n assert.ok(\"/test\" in paths);\n });\n\n it(\"should reject completely invalid OpenAPI document (not an object)\", () => {\n const notAnObject = \"this is a string\";\n const overlay = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [{ target: \"$.paths\", update: { \"/test\": {} } }],\n };\n\n let errorMessage = \"\";\n try {\n applyOverlay(notAnObject, overlay);\n } catch (error) {\n errorMessage = (error as Error).message;\n }\n\n assert.ok(\n errorMessage.includes(\"must be a valid JSON or YAML object\"),\n `Expected error about document not being an object, got: ${errorMessage}`\n );\n });\n\n it(\"should reject empty actions array\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"API\", version: \"1.0.0\" },\n };\n\n const invalidOverlay = {\n overlay: \"1.0.0\",\n info: { title: \"Empty Overlay\", version: \"1.0.0\" },\n actions: [],\n };\n\n let errorMessage = \"\";\n try {\n applyOverlay(openapi, invalidOverlay);\n } catch (error) {\n errorMessage = (error as Error).message;\n }\n\n assert.ok(\n errorMessage.includes(\"Overlay must contain at least one action\"),\n `Expected validation error for empty actions, got: ${errorMessage}`\n );\n });\n\n it(\"should apply overlay with wildcards and conditions\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n paths: {\n \"/users\": {\n get: { \"x-internal\": true, tags: [] },\n post: { tags: [] },\n },\n \"/posts\": { get: { tags: [] } },\n \"/internal\": { get: { \"x-internal\": true, tags: [] } },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Conditional Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths.*.*.tags\",\n description: \"Add default tag\",\n update: [\"public\"],\n },\n {\n target: \"$.paths.*\",\n description: \"Remove paths without x-internal\",\n remove: { missing: \"get.x-internal\" },\n },\n ],\n };\n\n const { result, stats } = applyOverlay(openapi, overlay);\n\n // First action should update all tags arrays (4 operations)\n // Second action should remove /posts (missing x-internal)\n assert.strictEqual(stats.applied, 2);\n\n const paths = result.paths as Record<string, unknown>;\n assert.ok(\"/users\" in paths);\n assert.ok(\"/internal\" in paths);\n assert.strictEqual(\"/posts\" in paths, false);\n });\n\n it(\"should preserve document structure and order\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"API\", version: \"1.0.0\" },\n servers: [{ url: \"https://api.example.com\" }],\n paths: {},\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.info\",\n update: { description: \"Added description\" },\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const keys = Object.keys(result);\n assert.strictEqual(keys[0], \"openapi\");\n assert.strictEqual(keys[1], \"info\");\n // Priority keys come first: openapi, info, tags (if present)\n // Then other keys in original order\n assert.ok(keys.includes(\"servers\"));\n assert.ok(keys.includes(\"paths\"));\n const info = result.info as Record<string, unknown>;\n assert.strictEqual(info.description, \"Added description\");\n });\n });\n\n describe(\"Complex overlay scenarios\", () => {\n it(\"should handle deep nested updates\", () => {\n const openapi = {\n components: {\n schemas: {\n User: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n },\n },\n },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Schema Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.components.schemas.User.properties\",\n update: {\n name: { type: \"string\" },\n email: { type: \"string\", format: \"email\" },\n },\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const components = result.components as Record<string, unknown>;\n const schemas = components.schemas as Record<string, unknown>;\n const userSchema = schemas.User as Record<string, unknown>;\n const properties = userSchema.properties as Record<string, unknown>;\n assert.ok(properties.id);\n assert.ok(properties.name);\n assert.ok(properties.email);\n const emailProperty = properties.email as Record<string, unknown>;\n assert.strictEqual(emailProperty.format, \"email\");\n });\n\n it(\"should handle array element removal\", () => {\n const openapi = {\n servers: [\n { url: \"https://prod.example.com\", description: \"Production\" },\n { url: \"https://staging.example.com\", description: \"Staging\" },\n { url: \"https://dev.example.com\", description: \"Development\" },\n ],\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Server Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.servers[?(@.description=='Development')]\",\n remove: true,\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const servers = result.servers as Array<Record<string, unknown>>;\n assert.strictEqual(servers.length, 2);\n assert.strictEqual(servers[0].description, \"Production\");\n assert.strictEqual(servers[1].description, \"Staging\");\n });\n\n it(\"should handle parameter merging correctly\", () => {\n const openapi = {\n paths: {\n \"/users/{id}\": {\n parameters: [\n { name: \"id\", in: \"path\", required: true },\n { name: \"fields\", in: \"query\" },\n ],\n get: {},\n },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Parameter Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths['/users/{id}'].parameters\",\n update: [\n {\n name: \"id\",\n in: \"path\",\n description: \"User ID\",\n schema: { type: \"string\" },\n },\n { name: \"include\", in: \"query\", description: \"Include related\" },\n ],\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const paths = result.paths as Record<string, unknown>;\n const usersPath = paths[\"/users/{id}\"] as Record<string, unknown>;\n const params = usersPath.parameters as Array<Record<string, unknown>>;\n assert.strictEqual(params.length, 3);\n\n const idParam = params.find((p) => p.name === \"id\");\n assert.ok(idParam);\n assert.strictEqual(idParam.required, true);\n assert.strictEqual(idParam.description, \"User ID\");\n assert.deepStrictEqual(idParam.schema, { type: \"string\" });\n\n const fieldsParam = params.find((p) => p.name === \"fields\");\n assert.ok(fieldsParam);\n\n const includeParam = params.find((p) => p.name === \"include\");\n assert.ok(includeParam);\n assert.strictEqual(includeParam.description, \"Include related\");\n });\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/source/migrate/dev-portal/handler.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,SAAS,EAMV,MAAM,YAAY,CAAC;AAoBpB,eAAO,MAAM,gBAAgB,GAAU,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/source/migrate/dev-portal/handler.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,SAAS,EAMV,MAAM,YAAY,CAAC;AAoBpB,eAAO,MAAM,gBAAgB,GAAU,MAAM,SAAS,kBAkErD,CAAC"}
|
|
@@ -35,6 +35,7 @@ export const migrateDevPortal = async (args) => {
|
|
|
35
35
|
createTsConfig,
|
|
36
36
|
moveMarkdownFiles,
|
|
37
37
|
writeConfigFile,
|
|
38
|
+
createDevPortalRedirectConfig,
|
|
38
39
|
cleanupOldFiles,
|
|
39
40
|
];
|
|
40
41
|
const pluginConfig = {
|
|
@@ -494,7 +495,7 @@ const createPackageJson = async (config) => {
|
|
|
494
495
|
type: "module",
|
|
495
496
|
private: true,
|
|
496
497
|
scripts: {
|
|
497
|
-
dev: "zudoku dev",
|
|
498
|
+
dev: "zudoku dev --zuplo",
|
|
498
499
|
build: "zudoku build",
|
|
499
500
|
start: "zudoku start",
|
|
500
501
|
},
|
|
@@ -626,6 +627,52 @@ const moveMarkdownFiles = async (config) => {
|
|
|
626
627
|
});
|
|
627
628
|
}
|
|
628
629
|
};
|
|
630
|
+
const createDevPortalRedirectConfig = async (config) => {
|
|
631
|
+
try {
|
|
632
|
+
const devPortalOasFile = path.join(config.absoluteBaseDir, "config", "dev-portal.oas.json");
|
|
633
|
+
const oasContent = {
|
|
634
|
+
openapi: "3.1.0",
|
|
635
|
+
info: {
|
|
636
|
+
version: "1.0.0",
|
|
637
|
+
title: "Dev Portal Redirect",
|
|
638
|
+
},
|
|
639
|
+
paths: {
|
|
640
|
+
"/docs(.*)": {
|
|
641
|
+
"x-zuplo-path": {
|
|
642
|
+
pathMode: "url-pattern",
|
|
643
|
+
},
|
|
644
|
+
get: {
|
|
645
|
+
summary: "Redirect",
|
|
646
|
+
description: "Redirect to the new Dev Portal domain",
|
|
647
|
+
"x-zuplo-route": {
|
|
648
|
+
corsPolicy: "none",
|
|
649
|
+
handler: {
|
|
650
|
+
export: "redirectLegacyDevPortal",
|
|
651
|
+
module: "$import(@zuplo/runtime)",
|
|
652
|
+
},
|
|
653
|
+
policies: {
|
|
654
|
+
inbound: [],
|
|
655
|
+
},
|
|
656
|
+
},
|
|
657
|
+
operationId: "dev-portal-redirect",
|
|
658
|
+
"x-internal": true,
|
|
659
|
+
},
|
|
660
|
+
},
|
|
661
|
+
},
|
|
662
|
+
};
|
|
663
|
+
await writeFile(devPortalOasFile, JSON.stringify(oasContent, null, 2));
|
|
664
|
+
const result = new PluginResult();
|
|
665
|
+
result.notes.push("Created config/dev-portal.oas.json for legacy dev portal redirects");
|
|
666
|
+
return result;
|
|
667
|
+
}
|
|
668
|
+
catch (error) {
|
|
669
|
+
return new PluginResult({
|
|
670
|
+
pluginName: "create-dev-portal-redirect-config",
|
|
671
|
+
message: `Failed to create dev-portal.oas.json: ${error.message}`,
|
|
672
|
+
severity: "error",
|
|
673
|
+
});
|
|
674
|
+
}
|
|
675
|
+
};
|
|
629
676
|
const cleanupOldFiles = async (config) => {
|
|
630
677
|
try {
|
|
631
678
|
const filesToCleanup = [
|