@zuplo/cli 6.63.34 → 6.63.36

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 (117) hide show
  1. package/dist/__tests__/archive-utils.test.js.map +1 -1
  2. package/dist/__tests__/import-openapi-utils.test.js +1 -1
  3. package/dist/__tests__/import-openapi-utils.test.js.map +1 -1
  4. package/dist/__tests__/import-openapi.test.js.map +1 -1
  5. package/dist/__tests__/integration/delete.integration.test.js +1 -1
  6. package/dist/__tests__/integration/delete.integration.test.js.map +1 -1
  7. package/dist/__tests__/integration/deploy.integration.test.js +1 -1
  8. package/dist/__tests__/integration/deploy.integration.test.js.map +1 -1
  9. package/dist/__tests__/integration/link.integration.test.js +1 -1
  10. package/dist/__tests__/integration/link.integration.test.js.map +1 -1
  11. package/dist/__tests__/integration/list.integration.test.js +1 -1
  12. package/dist/__tests__/integration/list.integration.test.js.map +1 -1
  13. package/dist/__tests__/integration/tunnel.integration.test.js +1 -1
  14. package/dist/__tests__/integration/tunnel.integration.test.js.map +1 -1
  15. package/dist/__tests__/integration/variable.integration.test.js +1 -1
  16. package/dist/__tests__/integration/variable.integration.test.js.map +1 -1
  17. package/dist/__tests__/populate.test.js +4 -4
  18. package/dist/__tests__/populate.test.js.map +1 -1
  19. package/dist/cli.js +2 -2
  20. package/dist/cli.js.map +1 -1
  21. package/dist/cmds/delete.js +2 -2
  22. package/dist/cmds/delete.js.map +1 -1
  23. package/dist/cmds/deploy.js +3 -3
  24. package/dist/cmds/deploy.js.map +1 -1
  25. package/dist/cmds/link.js +3 -3
  26. package/dist/cmds/link.js.map +1 -1
  27. package/dist/cmds/list.js +2 -2
  28. package/dist/cmds/list.js.map +1 -1
  29. package/dist/cmds/mtls-certificates/create.js +2 -2
  30. package/dist/cmds/mtls-certificates/create.js.map +1 -1
  31. package/dist/cmds/mtls-certificates/delete.js +2 -2
  32. package/dist/cmds/mtls-certificates/delete.js.map +1 -1
  33. package/dist/cmds/mtls-certificates/describe.js +2 -2
  34. package/dist/cmds/mtls-certificates/describe.js.map +1 -1
  35. package/dist/cmds/mtls-certificates/disable.js +2 -2
  36. package/dist/cmds/mtls-certificates/disable.js.map +1 -1
  37. package/dist/cmds/mtls-certificates/list.js +2 -2
  38. package/dist/cmds/mtls-certificates/list.js.map +1 -1
  39. package/dist/cmds/mtls-certificates/update.js +2 -2
  40. package/dist/cmds/mtls-certificates/update.js.map +1 -1
  41. package/dist/cmds/project/create.d.ts.map +1 -1
  42. package/dist/cmds/project/create.js +3 -3
  43. package/dist/cmds/project/create.js.map +1 -1
  44. package/dist/cmds/source/migrate.d.ts.map +1 -1
  45. package/dist/cmds/source/migrate.js +2 -2
  46. package/dist/cmds/source/migrate.js.map +1 -1
  47. package/dist/cmds/tunnel/create.js +2 -2
  48. package/dist/cmds/tunnel/create.js.map +1 -1
  49. package/dist/cmds/tunnel/delete.js +2 -2
  50. package/dist/cmds/tunnel/delete.js.map +1 -1
  51. package/dist/cmds/tunnel/describe.js +2 -2
  52. package/dist/cmds/tunnel/describe.js.map +1 -1
  53. package/dist/cmds/tunnel/list.js +2 -2
  54. package/dist/cmds/tunnel/list.js.map +1 -1
  55. package/dist/cmds/tunnel/rotate-token.js +2 -2
  56. package/dist/cmds/tunnel/rotate-token.js.map +1 -1
  57. package/dist/cmds/tunnel/services/describe.js +2 -2
  58. package/dist/cmds/tunnel/services/describe.js.map +1 -1
  59. package/dist/cmds/tunnel/services/update.js +2 -2
  60. package/dist/cmds/tunnel/services/update.js.map +1 -1
  61. package/dist/cmds/variable/create.js +2 -2
  62. package/dist/cmds/variable/create.js.map +1 -1
  63. package/dist/cmds/variable/update.js +2 -2
  64. package/dist/cmds/variable/update.js.map +1 -1
  65. package/dist/common/middleware/get-project-param.js +3 -3
  66. package/dist/common/middleware/get-project-param.js.map +1 -1
  67. package/dist/common/populate.d.ts.map +1 -1
  68. package/dist/common/populate.js.map +1 -1
  69. package/dist/common/utils/stringify-config.test.js +1 -1
  70. package/dist/common/utils/stringify-config.test.js.map +1 -1
  71. package/dist/common/worker-output.d.ts.map +1 -1
  72. package/dist/common/worker-output.js +1 -1
  73. package/dist/common/worker-output.js.map +1 -1
  74. package/dist/delete/handler.js +1 -1
  75. package/dist/delete/handler.js.map +1 -1
  76. package/dist/deploy/archive.js.map +1 -1
  77. package/dist/deploy/archive.test.js +2 -2
  78. package/dist/deploy/archive.test.js.map +1 -1
  79. package/dist/deploy/handler.d.ts.map +1 -1
  80. package/dist/deploy/handler.js +2 -2
  81. package/dist/deploy/handler.js.map +1 -1
  82. package/dist/dev/handler.js +1 -1
  83. package/dist/dev/handler.js.map +1 -1
  84. package/dist/editor/handler.js +2 -2
  85. package/dist/editor/handler.js.map +1 -1
  86. package/dist/login/login.js +1 -1
  87. package/dist/login/login.js.map +1 -1
  88. package/dist/open-api/convert/convert-engine.d.ts +1 -1
  89. package/dist/open-api/convert/convert-engine.d.ts.map +1 -1
  90. package/dist/open-api/convert/convert-engine.js.map +1 -1
  91. package/dist/open-api/convert/convert-engine.spec.js +2 -2
  92. package/dist/open-api/convert/convert-engine.spec.js.map +1 -1
  93. package/dist/open-api/convert/handler.js +2 -2
  94. package/dist/open-api/convert/handler.js.map +1 -1
  95. package/dist/open-api/convert/handler.spec.js +1 -1
  96. package/dist/open-api/convert/handler.spec.js.map +1 -1
  97. package/dist/open-api/merge/handler.d.ts.map +1 -1
  98. package/dist/open-api/merge/handler.js +1 -1
  99. package/dist/open-api/merge/handler.js.map +1 -1
  100. package/dist/open-api/merge/handler.spec.js +1 -1
  101. package/dist/open-api/merge/handler.spec.js.map +1 -1
  102. package/dist/open-api/merge/merge-engine.spec.js +2 -2
  103. package/dist/open-api/merge/merge-engine.spec.js.map +1 -1
  104. package/dist/open-api/merge/utils.js +1 -1
  105. package/dist/open-api/merge/utils.js.map +1 -1
  106. package/dist/open-api/overlay/handler.js +1 -1
  107. package/dist/open-api/overlay/handler.js.map +1 -1
  108. package/dist/open-api/overlay/handler.spec.js +1 -1
  109. package/dist/open-api/overlay/handler.spec.js.map +1 -1
  110. package/dist/open-api/overlay/overlay-engine.d.ts.map +1 -1
  111. package/dist/open-api/overlay/overlay-engine.js.map +1 -1
  112. package/dist/open-api/overlay/overlay-engine.spec.js +2 -2
  113. package/dist/open-api/overlay/overlay-engine.spec.js.map +1 -1
  114. package/dist/source/migrate/dev-portal/handler.d.ts.map +1 -1
  115. package/dist/source/migrate/dev-portal/handler.js +7 -4
  116. package/dist/source/migrate/dev-portal/handler.js.map +1 -1
  117. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"handler.spec.js","sourceRoot":"","sources":["../../../src/open-api/merge/handler.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\nimport { fileURLToPath } from \"node:url\";\nimport assert from \"node:assert\";\nimport { importOpenApi } from \"./handler.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst testTmpPath = path.join(\n __dirname,\n \"..\",\n \"..\",\n \"__tests__\",\n \"test-tmp\",\n \"merge-handler\"\n);\n\ndescribe(\"Merge Handler\", () => {\n beforeEach(async () => {\n // Ensure test-tmp directory exists\n await fs.mkdir(testTmpPath, { recursive: true });\n });\n\n afterEach(async () => {\n // Clean up test files\n try {\n await fs.rm(testTmpPath, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n });\n\n describe(\"importOpenApi\", () => {\n it(\"should merge source into new destination file\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Get users\",\n operationId: \"getUsers\",\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n assert.strictEqual(result.openapi, \"3.1.0\");\n assert.strictEqual(result.paths[\"/users\"].get.summary, \"Get users\");\n assert.strictEqual(result.paths[\"/users\"].get.operationId, \"getUsers\");\n });\n\n it(\"should merge source into existing destination file\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n const existingDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Existing API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/products\": {\n get: {\n summary: \"Get products\",\n operationId: \"getProducts\",\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Get users\",\n operationId: \"getUsers\",\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n await fs.writeFile(destPath, JSON.stringify(existingDoc, null, 2));\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n assert.strictEqual(result.paths[\"/products\"].get.summary, \"Get products\");\n assert.strictEqual(result.paths[\"/users\"].get.summary, \"Get users\");\n });\n\n it(\"should support YAML source files\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.yaml\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n const sourceDoc = `openapi: 3.1.0\ninfo:\n title: Source API\n version: 1.0.0\npaths:\n /users:\n get:\n summary: Get users\n operationId: getUsers\n responses:\n '200':\n description: Success`;\n\n await fs.writeFile(sourcePath, sourceDoc);\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n assert.strictEqual(result.paths[\"/users\"].get.summary, \"Get users\");\n });\n\n it(\"should use path-method merge mode by default\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n const existingDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Existing API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Original summary\",\n operationId: \"getUsers\",\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Updated summary\",\n operationId: \"getUsersUpdated\",\n responses: {\n \"200\": {\n description: \"Updated Success\",\n },\n },\n },\n },\n },\n };\n\n await fs.writeFile(destPath, JSON.stringify(existingDoc, null, 2));\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n // In path-method mode, matching path+method should be merged\n assert.strictEqual(result.paths[\"/users\"].get.summary, \"Updated summary\");\n });\n\n it(\"should support operation-id merge mode\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n const existingDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Existing API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Original summary\",\n operationId: \"getUsers\",\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/v2/users\": {\n get: {\n summary: \"Updated summary\",\n operationId: \"getUsers\",\n responses: {\n \"200\": {\n description: \"Updated Success\",\n },\n },\n },\n },\n },\n };\n\n await fs.writeFile(destPath, JSON.stringify(existingDoc, null, 2));\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n \"merge-mode\": \"operation-id\",\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n // In operation-id mode, matching operationId should be merged\n // Original path should be removed, new path should exist\n assert.strictEqual(result.paths[\"/users\"], undefined);\n assert.strictEqual(\n result.paths[\"/v2/users\"].get.summary,\n \"Updated summary\"\n );\n });\n\n it(\"should create output directory if it doesn't exist\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"nested\", \"dir\", \"dest.oas.json\");\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Get users\",\n operationId: \"getUsers\",\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n assert.strictEqual(result.paths[\"/users\"].get.summary, \"Get users\");\n });\n\n it(\"should add operation IDs if missing\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Get users\",\n // No operationId\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n // Operation ID should be auto-generated\n assert.strictEqual(\n typeof result.paths[\"/users\"].get.operationId,\n \"string\"\n );\n assert.strictEqual(\n result.paths[\"/users\"].get.operationId.length > 0,\n true\n );\n });\n\n it(\"should throw error when source file does not exist\", async () => {\n const sourcePath = path.join(testTmpPath, \"nonexistent.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n await assert.rejects(\n () =>\n importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n }),\n /does not exist/\n );\n });\n\n it(\"should throw error when destination doesn't end with .oas.json\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.json\");\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await assert.rejects(\n () =>\n importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n }),\n /must end with '.oas.json'/\n );\n });\n });\n});\n"]}
1
+ {"version":3,"file":"handler.spec.js","sourceRoot":"","sources":["../../../src/open-api/merge/handler.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\nimport { fileURLToPath } from \"node:url\";\nimport { importOpenApi } from \"./handler.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst testTmpPath = path.join(\n __dirname,\n \"..\",\n \"..\",\n \"__tests__\",\n \"test-tmp\",\n \"merge-handler\"\n);\n\ndescribe(\"Merge Handler\", () => {\n beforeEach(async () => {\n // Ensure test-tmp directory exists\n await fs.mkdir(testTmpPath, { recursive: true });\n });\n\n afterEach(async () => {\n // Clean up test files\n try {\n await fs.rm(testTmpPath, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n });\n\n describe(\"importOpenApi\", () => {\n it(\"should merge source into new destination file\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Get users\",\n operationId: \"getUsers\",\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n assert.strictEqual(result.openapi, \"3.1.0\");\n assert.strictEqual(result.paths[\"/users\"].get.summary, \"Get users\");\n assert.strictEqual(result.paths[\"/users\"].get.operationId, \"getUsers\");\n });\n\n it(\"should merge source into existing destination file\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n const existingDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Existing API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/products\": {\n get: {\n summary: \"Get products\",\n operationId: \"getProducts\",\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Get users\",\n operationId: \"getUsers\",\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n await fs.writeFile(destPath, JSON.stringify(existingDoc, null, 2));\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n assert.strictEqual(result.paths[\"/products\"].get.summary, \"Get products\");\n assert.strictEqual(result.paths[\"/users\"].get.summary, \"Get users\");\n });\n\n it(\"should support YAML source files\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.yaml\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n const sourceDoc = `openapi: 3.1.0\ninfo:\n title: Source API\n version: 1.0.0\npaths:\n /users:\n get:\n summary: Get users\n operationId: getUsers\n responses:\n '200':\n description: Success`;\n\n await fs.writeFile(sourcePath, sourceDoc);\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n assert.strictEqual(result.paths[\"/users\"].get.summary, \"Get users\");\n });\n\n it(\"should use path-method merge mode by default\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n const existingDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Existing API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Original summary\",\n operationId: \"getUsers\",\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Updated summary\",\n operationId: \"getUsersUpdated\",\n responses: {\n \"200\": {\n description: \"Updated Success\",\n },\n },\n },\n },\n },\n };\n\n await fs.writeFile(destPath, JSON.stringify(existingDoc, null, 2));\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n // In path-method mode, matching path+method should be merged\n assert.strictEqual(result.paths[\"/users\"].get.summary, \"Updated summary\");\n });\n\n it(\"should support operation-id merge mode\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n const existingDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Existing API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Original summary\",\n operationId: \"getUsers\",\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/v2/users\": {\n get: {\n summary: \"Updated summary\",\n operationId: \"getUsers\",\n responses: {\n \"200\": {\n description: \"Updated Success\",\n },\n },\n },\n },\n },\n };\n\n await fs.writeFile(destPath, JSON.stringify(existingDoc, null, 2));\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n \"merge-mode\": \"operation-id\",\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n // In operation-id mode, matching operationId should be merged\n // Original path should be removed, new path should exist\n assert.strictEqual(result.paths[\"/users\"], undefined);\n assert.strictEqual(\n result.paths[\"/v2/users\"].get.summary,\n \"Updated summary\"\n );\n });\n\n it(\"should create output directory if it doesn't exist\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"nested\", \"dir\", \"dest.oas.json\");\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Get users\",\n operationId: \"getUsers\",\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n assert.strictEqual(result.paths[\"/users\"].get.summary, \"Get users\");\n });\n\n it(\"should add operation IDs if missing\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Get users\",\n // No operationId\n responses: {\n \"200\": {\n description: \"Success\",\n },\n },\n },\n },\n },\n };\n\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n });\n\n const result = JSON.parse(await fs.readFile(destPath, \"utf-8\"));\n // Operation ID should be auto-generated\n assert.strictEqual(\n typeof result.paths[\"/users\"].get.operationId,\n \"string\"\n );\n assert.strictEqual(\n result.paths[\"/users\"].get.operationId.length > 0,\n true\n );\n });\n\n it(\"should throw error when source file does not exist\", async () => {\n const sourcePath = path.join(testTmpPath, \"nonexistent.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.oas.json\");\n\n await assert.rejects(\n () =>\n importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n }),\n /does not exist/\n );\n });\n\n it(\"should throw error when destination doesn't end with .oas.json\", async () => {\n const sourcePath = path.join(testTmpPath, \"source.oas.json\");\n const destPath = path.join(testTmpPath, \"dest.json\");\n\n const sourceDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Source API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n await fs.writeFile(sourcePath, JSON.stringify(sourceDoc, null, 2));\n\n await assert.rejects(\n () =>\n importOpenApi({\n source: sourcePath,\n destination: destPath,\n prompt: false,\n }),\n /must end with '.oas.json'/\n );\n });\n });\n});\n"]}
@@ -1,6 +1,6 @@
1
- import { describe, it } from "node:test";
2
1
  import assert from "node:assert";
3
- import { isUrl, guessFileNameFromUrl, detectFormat, detectFormatFromContent, } from "./merge-engine.js";
2
+ import { describe, it } from "node:test";
3
+ import { detectFormat, detectFormatFromContent, guessFileNameFromUrl, isUrl, } from "./merge-engine.js";
4
4
  describe("Merge Engine", () => {
5
5
  describe("isUrl", () => {
6
6
  it("should return true for valid HTTP URLs", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"merge-engine.spec.js","sourceRoot":"","sources":["../../../src/open-api/merge/merge-engine.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EACL,KAAK,EACL,oBAAoB,EACpB,YAAY,EACZ,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAC;YAC/D,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,wCAAwC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,8BAA8B,CAAC,EAAE,IAAI,CAAC,CAAC;YAChE,MAAM,CAAC,WAAW,CAChB,KAAK,CAAC,yCAAyC,CAAC,EAChD,IAAI,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,qCAAqC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvE,MAAM,CAAC,WAAW,CAChB,KAAK,CAAC,+CAA+C,CAAC,EACtD,IAAI,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,iCAAiC,CAAC,EAAE,IAAI,CAAC,CAAC;YACnE,MAAM,CAAC,WAAW,CAChB,KAAK,CAAC,0CAA0C,CAAC,EACjD,IAAI,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,8BAA8B,CAAC,EAAE,IAAI,CAAC,CAAC;YAChE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,oCAAoC,CAAC,EAAE,IAAI,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,+BAA+B,CAAC,EAAE,KAAK,CAAC,CAAC;QAGpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,WAAW,CAChB,oBAAoB,CAAC,8BAA8B,CAAC,EACpD,KAAK,CACN,CAAC;YACF,MAAM,CAAC,WAAW,CAChB,oBAAoB,CAAC,kCAAkC,CAAC,EACxD,SAAS,CACV,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,MAAM,CAAC,WAAW,CAChB,oBAAoB,CAAC,uCAAuC,CAAC,EAC7D,KAAK,CACN,CAAC;YACF,MAAM,CAAC,WAAW,CAChB,oBAAoB,CAAC,8CAA8C,CAAC,EACpE,SAAS,CACV,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,CAAC,WAAW,CAChB,oBAAoB,CAAC,wCAAwC,CAAC,EAC9D,KAAK,CACN,CAAC;YACF,MAAM,CAAC,WAAW,CAChB,oBAAoB,CAClB,kDAAkD,CACnD,EACD,SAAS,CACV,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,CAAC,WAAW,CAChB,oBAAoB,CAAC,sCAAsC,CAAC,EAC5D,KAAK,CACN,CAAC;YACF,MAAM,CAAC,WAAW,CAChB,oBAAoB,CAAC,2CAA2C,CAAC,EACjE,MAAM,CACP,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,CAAC,WAAW,CAChB,oBAAoB,CAAC,yBAAyB,CAAC,EAC/C,KAAK,CACN,CAAC;YACF,MAAM,CAAC,WAAW,CAChB,oBAAoB,CAAC,gCAAgC,CAAC,EACtD,SAAS,CACV,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAE9C,MAAM,MAAM,GAAG,oBAAoB,CAAC,0BAA0B,CAAC,CAAC;YAChE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAG,oBAAoB,CAAC,sBAAsB,CAAC,CAAC;YAC5D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;YACzD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,CAAC,WAAW,CAChB,oBAAoB,CAAC,mCAAmC,CAAC,EACzD,UAAU,CACX,CAAC;YACF,MAAM,CAAC,WAAW,CAChB,oBAAoB,CAAC,sCAAsC,CAAC,EAC5D,aAAa,CACd,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,WAAW,CAChB,oBAAoB,CAClB,oEAAoE,CACrE,EACD,SAAS,CACV,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,GAAG,GAAG,sBAAsB,CAAC;YACnC,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACtD,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;QACjE,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,OAAO,GAAG,sBAAsB,CAAC;YACvC,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,OAAO,GAAG,sCAAsC,CAAC;YACvD,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,OAAO,GAAG,6BAA6B,CAAC;YAC9C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,uBAAuB,CAAC,OAAO,CAAC,EACtC,yBAAyB,CAC1B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, it } from \"node:test\";\nimport assert from \"node:assert\";\nimport {\n isUrl,\n guessFileNameFromUrl,\n detectFormat,\n detectFormatFromContent,\n} from \"./merge-engine.js\";\n\ndescribe(\"Merge Engine\", () => {\n describe(\"isUrl\", () => {\n it(\"should return true for valid HTTP URLs\", () => {\n assert.strictEqual(isUrl(\"http://example.com\"), true);\n assert.strictEqual(isUrl(\"http://example.com/api.json\"), true);\n assert.strictEqual(isUrl(\"http://api.example.com/v1/openapi.yaml\"), true);\n });\n\n it(\"should return true for valid HTTPS URLs\", () => {\n assert.strictEqual(isUrl(\"https://example.com\"), true);\n assert.strictEqual(isUrl(\"https://example.com/api.json\"), true);\n assert.strictEqual(\n isUrl(\"https://api.example.com/v1/openapi.yaml\"),\n true\n );\n });\n\n it(\"should return true for URLs with query parameters\", () => {\n assert.strictEqual(isUrl(\"https://example.com/api?version=1.0\"), true);\n assert.strictEqual(\n isUrl(\"https://example.com/api?format=json&version=2\"),\n true\n );\n });\n\n it(\"should return true for URLs with fragments\", () => {\n assert.strictEqual(isUrl(\"https://example.com/api#section\"), true);\n assert.strictEqual(\n isUrl(\"https://example.com/api.json#definitions\"),\n true\n );\n });\n\n it(\"should return true for URLs with ports\", () => {\n assert.strictEqual(isUrl(\"https://example.com:8080/api\"), true);\n assert.strictEqual(isUrl(\"http://localhost:3000/openapi.json\"), true);\n });\n\n it(\"should return false for relative file paths\", () => {\n assert.strictEqual(isUrl(\"./api.json\"), false);\n assert.strictEqual(isUrl(\"../specs/openapi.yaml\"), false);\n assert.strictEqual(isUrl(\"docs/api.json\"), false);\n });\n\n it(\"should return false for absolute file paths\", () => {\n assert.strictEqual(isUrl(\"/path/to/api.json\"), false);\n assert.strictEqual(isUrl(\"/Users/name/docs/openapi.yaml\"), false);\n // Windows absolute paths with drive letters may be interpreted as URLs with protocol\n // This is expected behavior from the URL constructor\n });\n\n it(\"should return false for filenames without paths\", () => {\n assert.strictEqual(isUrl(\"api.json\"), false);\n assert.strictEqual(isUrl(\"openapi.yaml\"), false);\n });\n\n it(\"should return false for empty strings\", () => {\n assert.strictEqual(isUrl(\"\"), false);\n });\n });\n\n describe(\"guessFileNameFromUrl\", () => {\n it(\"should extract filename from URL path\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/api.json\"),\n \"api\"\n );\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/openapi.yaml\"),\n \"openapi\"\n );\n });\n\n it(\"should extract filename from URL with multiple path segments\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/v1/specs/api.json\"),\n \"api\"\n );\n assert.strictEqual(\n guessFileNameFromUrl(\"https://api.example.com/docs/v2/openapi.yaml\"),\n \"openapi\"\n );\n });\n\n it(\"should extract filename from URL with query parameters\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/api.json?version=1\"),\n \"api\"\n );\n assert.strictEqual(\n guessFileNameFromUrl(\n \"https://example.com/openapi.yaml?format=json&v=2\"\n ),\n \"openapi\"\n );\n });\n\n it(\"should extract filename from URL with fragments\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/api.json#section\"),\n \"api\"\n );\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/spec.yaml#definitions\"),\n \"spec\"\n );\n });\n\n it(\"should handle URLs with no file extension\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/api\"),\n \"api\"\n );\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/v1/openapi\"),\n \"openapi\"\n );\n });\n\n it(\"should handle URLs ending with slash\", () => {\n // When URL ends with slash, pop() returns empty string, should use base64\n const result = guessFileNameFromUrl(\"https://example.com/api/\");\n assert.strictEqual(result.startsWith(\"imported-\"), true);\n });\n\n it(\"should generate base64 name for root URLs\", () => {\n const result = guessFileNameFromUrl(\"https://example.com/\");\n assert.strictEqual(result.startsWith(\"imported-\"), true);\n assert.strictEqual(result.length > 9, true); // \"imported-\" is 9 chars\n });\n\n it(\"should handle filenames with multiple dots\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/api.v1.0.json\"),\n \"api.v1.0\"\n );\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/my.api.spec.yaml\"),\n \"my.api.spec\"\n );\n });\n\n it(\"should handle complex URLs\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\n \"https://api.example.com:8080/v2/specs/openapi.json?auth=token#info\"\n ),\n \"openapi\"\n );\n });\n\n it(\"should generate consistent base64 names for same URL\", () => {\n const url = \"https://example.com/\";\n const name1 = guessFileNameFromUrl(url);\n const name2 = guessFileNameFromUrl(url);\n assert.strictEqual(name1, name2);\n });\n });\n\n describe(\"detectFormat (re-exported from common)\", () => {\n it(\"should detect JSON format\", () => {\n assert.strictEqual(detectFormat(\"api.json\"), \"json\");\n assert.strictEqual(detectFormat(\"/path/to/api.json\"), \"json\");\n });\n\n it(\"should detect YAML format\", () => {\n assert.strictEqual(detectFormat(\"api.yaml\"), \"yaml\");\n assert.strictEqual(detectFormat(\"api.yml\"), \"yaml\");\n });\n\n it(\"should return null for unknown extensions\", () => {\n assert.strictEqual(detectFormat(\"api.txt\"), null);\n });\n });\n\n describe(\"detectFormatFromContent (re-exported from common)\", () => {\n it(\"should detect JSON content\", () => {\n const content = '{\"openapi\": \"3.1.0\"}';\n assert.strictEqual(detectFormatFromContent(content), \"json\");\n });\n\n it(\"should detect YAML content\", () => {\n const content = \"openapi: 3.1.0\\ninfo:\\n title: Test\";\n assert.strictEqual(detectFormatFromContent(content), \"yaml\");\n });\n\n it(\"should throw error for invalid content\", () => {\n const content = \"not valid json or yaml: : :\";\n assert.throws(\n () => detectFormatFromContent(content),\n /Failed to parse content/\n );\n });\n });\n});\n"]}
1
+ {"version":3,"file":"merge-engine.spec.js","sourceRoot":"","sources":["../../../src/open-api/merge/merge-engine.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert\";\nimport { describe, it } from \"node:test\";\nimport {\n detectFormat,\n detectFormatFromContent,\n guessFileNameFromUrl,\n isUrl,\n} from \"./merge-engine.js\";\n\ndescribe(\"Merge Engine\", () => {\n describe(\"isUrl\", () => {\n it(\"should return true for valid HTTP URLs\", () => {\n assert.strictEqual(isUrl(\"http://example.com\"), true);\n assert.strictEqual(isUrl(\"http://example.com/api.json\"), true);\n assert.strictEqual(isUrl(\"http://api.example.com/v1/openapi.yaml\"), true);\n });\n\n it(\"should return true for valid HTTPS URLs\", () => {\n assert.strictEqual(isUrl(\"https://example.com\"), true);\n assert.strictEqual(isUrl(\"https://example.com/api.json\"), true);\n assert.strictEqual(\n isUrl(\"https://api.example.com/v1/openapi.yaml\"),\n true\n );\n });\n\n it(\"should return true for URLs with query parameters\", () => {\n assert.strictEqual(isUrl(\"https://example.com/api?version=1.0\"), true);\n assert.strictEqual(\n isUrl(\"https://example.com/api?format=json&version=2\"),\n true\n );\n });\n\n it(\"should return true for URLs with fragments\", () => {\n assert.strictEqual(isUrl(\"https://example.com/api#section\"), true);\n assert.strictEqual(\n isUrl(\"https://example.com/api.json#definitions\"),\n true\n );\n });\n\n it(\"should return true for URLs with ports\", () => {\n assert.strictEqual(isUrl(\"https://example.com:8080/api\"), true);\n assert.strictEqual(isUrl(\"http://localhost:3000/openapi.json\"), true);\n });\n\n it(\"should return false for relative file paths\", () => {\n assert.strictEqual(isUrl(\"./api.json\"), false);\n assert.strictEqual(isUrl(\"../specs/openapi.yaml\"), false);\n assert.strictEqual(isUrl(\"docs/api.json\"), false);\n });\n\n it(\"should return false for absolute file paths\", () => {\n assert.strictEqual(isUrl(\"/path/to/api.json\"), false);\n assert.strictEqual(isUrl(\"/Users/name/docs/openapi.yaml\"), false);\n // Windows absolute paths with drive letters may be interpreted as URLs with protocol\n // This is expected behavior from the URL constructor\n });\n\n it(\"should return false for filenames without paths\", () => {\n assert.strictEqual(isUrl(\"api.json\"), false);\n assert.strictEqual(isUrl(\"openapi.yaml\"), false);\n });\n\n it(\"should return false for empty strings\", () => {\n assert.strictEqual(isUrl(\"\"), false);\n });\n });\n\n describe(\"guessFileNameFromUrl\", () => {\n it(\"should extract filename from URL path\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/api.json\"),\n \"api\"\n );\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/openapi.yaml\"),\n \"openapi\"\n );\n });\n\n it(\"should extract filename from URL with multiple path segments\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/v1/specs/api.json\"),\n \"api\"\n );\n assert.strictEqual(\n guessFileNameFromUrl(\"https://api.example.com/docs/v2/openapi.yaml\"),\n \"openapi\"\n );\n });\n\n it(\"should extract filename from URL with query parameters\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/api.json?version=1\"),\n \"api\"\n );\n assert.strictEqual(\n guessFileNameFromUrl(\n \"https://example.com/openapi.yaml?format=json&v=2\"\n ),\n \"openapi\"\n );\n });\n\n it(\"should extract filename from URL with fragments\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/api.json#section\"),\n \"api\"\n );\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/spec.yaml#definitions\"),\n \"spec\"\n );\n });\n\n it(\"should handle URLs with no file extension\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/api\"),\n \"api\"\n );\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/v1/openapi\"),\n \"openapi\"\n );\n });\n\n it(\"should handle URLs ending with slash\", () => {\n // When URL ends with slash, pop() returns empty string, should use base64\n const result = guessFileNameFromUrl(\"https://example.com/api/\");\n assert.strictEqual(result.startsWith(\"imported-\"), true);\n });\n\n it(\"should generate base64 name for root URLs\", () => {\n const result = guessFileNameFromUrl(\"https://example.com/\");\n assert.strictEqual(result.startsWith(\"imported-\"), true);\n assert.strictEqual(result.length > 9, true); // \"imported-\" is 9 chars\n });\n\n it(\"should handle filenames with multiple dots\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/api.v1.0.json\"),\n \"api.v1.0\"\n );\n assert.strictEqual(\n guessFileNameFromUrl(\"https://example.com/my.api.spec.yaml\"),\n \"my.api.spec\"\n );\n });\n\n it(\"should handle complex URLs\", () => {\n assert.strictEqual(\n guessFileNameFromUrl(\n \"https://api.example.com:8080/v2/specs/openapi.json?auth=token#info\"\n ),\n \"openapi\"\n );\n });\n\n it(\"should generate consistent base64 names for same URL\", () => {\n const url = \"https://example.com/\";\n const name1 = guessFileNameFromUrl(url);\n const name2 = guessFileNameFromUrl(url);\n assert.strictEqual(name1, name2);\n });\n });\n\n describe(\"detectFormat (re-exported from common)\", () => {\n it(\"should detect JSON format\", () => {\n assert.strictEqual(detectFormat(\"api.json\"), \"json\");\n assert.strictEqual(detectFormat(\"/path/to/api.json\"), \"json\");\n });\n\n it(\"should detect YAML format\", () => {\n assert.strictEqual(detectFormat(\"api.yaml\"), \"yaml\");\n assert.strictEqual(detectFormat(\"api.yml\"), \"yaml\");\n });\n\n it(\"should return null for unknown extensions\", () => {\n assert.strictEqual(detectFormat(\"api.txt\"), null);\n });\n });\n\n describe(\"detectFormatFromContent (re-exported from common)\", () => {\n it(\"should detect JSON content\", () => {\n const content = '{\"openapi\": \"3.1.0\"}';\n assert.strictEqual(detectFormatFromContent(content), \"json\");\n });\n\n it(\"should detect YAML content\", () => {\n const content = \"openapi: 3.1.0\\ninfo:\\n title: Test\";\n assert.strictEqual(detectFormatFromContent(content), \"yaml\");\n });\n\n it(\"should throw error for invalid content\", () => {\n const content = \"not valid json or yaml: : :\";\n assert.throws(\n () => detectFormatFromContent(content),\n /Failed to parse content/\n );\n });\n });\n});\n"]}
@@ -1,6 +1,6 @@
1
1
  import yaml from "js-yaml";
2
2
  import { v4 } from "uuid";
3
- import { OPEN_API_FILE_TYPES, HTTP_METHODS, } from "../../common/open-api/index.js";
3
+ import { HTTP_METHODS, OPEN_API_FILE_TYPES, } from "../../common/open-api/index.js";
4
4
  export const OPERATION_PATH_MERGE_DELIMITER = ">";
5
5
  export const parseOpenApiFile = async (extName, fileText) => {
6
6
  if (!OPEN_API_FILE_TYPES.includes(extName)) {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/open-api/merge/utils.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,YAAY,GACb,MAAM,gCAAgC,CAAC;AAGxC,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAAe,EAAE,QAAgB,EAAE,EAAE;IAC1E,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,gDAAgD,mBAAmB,CAAC,IAAI,CACtE,IAAI,CACL,EAAE,CACJ,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAgD,CAAC;IAC7E,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAgD,CAAC;AAC5E,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,OAAoD,EACpD,EAAE;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,YAAoD,CAAC;QACrE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;gBACxC,SAAS,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAC","sourcesContent":["import yaml from \"js-yaml\";\nimport { OpenAPIV3_1 } from \"openapi-types\";\nimport { v4 } from \"uuid\";\nimport {\n OPEN_API_FILE_TYPES,\n HTTP_METHODS,\n} from \"../../common/open-api/index.js\";\nimport { ZuploOpenApiDocument } from \"./interfaces.js\";\n\nexport const OPERATION_PATH_MERGE_DELIMITER = \">\";\n\nexport const parseOpenApiFile = async (extName: string, fileText: string) => {\n if (!OPEN_API_FILE_TYPES.includes(extName)) {\n throw new Error(\n `Invalid file type. Supported file types are: ${OPEN_API_FILE_TYPES.join(\n \", \"\n )}`\n );\n }\n if (extName.includes(\"json\")) {\n return JSON.parse(fileText) as OpenAPIV3_1.Document | ZuploOpenApiDocument;\n }\n return yaml.load(fileText) as OpenAPIV3_1.Document | ZuploOpenApiDocument;\n};\n\n/**\n * Add operation ID to any operations that don't have one, this makes\n * onboarding smoother for new users\n */\nexport const addOperationIdsAsNecessary = (\n openApi: OpenAPIV3_1.Document | ZuploOpenApiDocument\n) => {\n const paths = openApi.paths;\n if (!paths) {\n return;\n }\n for (const path of Object.keys(paths)) {\n const pathItem = paths[path];\n if (!pathItem) {\n continue;\n }\n const methods = HTTP_METHODS as unknown as OpenAPIV3_1.HttpMethods[];\n for (const method of methods) {\n const operation = pathItem[method];\n if (operation && !operation.operationId) {\n operation.operationId = v4();\n }\n }\n }\n};\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/open-api/merge/utils.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AAGxC,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAAe,EAAE,QAAgB,EAAE,EAAE;IAC1E,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,gDAAgD,mBAAmB,CAAC,IAAI,CACtE,IAAI,CACL,EAAE,CACJ,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAgD,CAAC;IAC7E,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAgD,CAAC;AAC5E,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,OAAoD,EACpD,EAAE;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,YAAoD,CAAC;QACrE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;gBACxC,SAAS,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAC","sourcesContent":["import yaml from \"js-yaml\";\nimport { OpenAPIV3_1 } from \"openapi-types\";\nimport { v4 } from \"uuid\";\nimport {\n HTTP_METHODS,\n OPEN_API_FILE_TYPES,\n} from \"../../common/open-api/index.js\";\nimport { ZuploOpenApiDocument } from \"./interfaces.js\";\n\nexport const OPERATION_PATH_MERGE_DELIMITER = \">\";\n\nexport const parseOpenApiFile = async (extName: string, fileText: string) => {\n if (!OPEN_API_FILE_TYPES.includes(extName)) {\n throw new Error(\n `Invalid file type. Supported file types are: ${OPEN_API_FILE_TYPES.join(\n \", \"\n )}`\n );\n }\n if (extName.includes(\"json\")) {\n return JSON.parse(fileText) as OpenAPIV3_1.Document | ZuploOpenApiDocument;\n }\n return yaml.load(fileText) as OpenAPIV3_1.Document | ZuploOpenApiDocument;\n};\n\n/**\n * Add operation ID to any operations that don't have one, this makes\n * onboarding smoother for new users\n */\nexport const addOperationIdsAsNecessary = (\n openApi: OpenAPIV3_1.Document | ZuploOpenApiDocument\n) => {\n const paths = openApi.paths;\n if (!paths) {\n return;\n }\n for (const path of Object.keys(paths)) {\n const pathItem = paths[path];\n if (!pathItem) {\n continue;\n }\n const methods = HTTP_METHODS as unknown as OpenAPIV3_1.HttpMethods[];\n for (const method of methods) {\n const operation = pathItem[method];\n if (operation && !operation.operationId) {\n operation.operationId = v4();\n }\n }\n }\n};\n"]}
@@ -1,8 +1,8 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { detectFormatFromExtension, parseFile, serializeContent, } from "../../common/file-format.js";
4
- import { printDiagnosticsToConsole } from "../../common/output.js";
5
4
  import { logger } from "../../common/logger.js";
5
+ import { printDiagnosticsToConsole } from "../../common/output.js";
6
6
  import { applyOverlay as applyOverlayEngine } from "./overlay-engine.js";
7
7
  function applyOverlayWithProgress(openapi, overlay) {
8
8
  let validatedOverlay;
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/open-api/overlay/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,yBAAyB,EACzB,SAAS,EACT,gBAAgB,GAEjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAezE,SAAS,wBAAwB,CAC/B,OAAgB,EAChB,OAAgB;IAGhB,IAAI,gBAAuD,CAAC;IAE5D,IAAI,CAAC;QACH,gBAAgB,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAEf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,yBAAyB,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAC;IAG3C,yBAAyB,CAAC,mBAAmB,CAAC,CAAC;IAC/C,yBAAyB,CACvB,YAAY,KAAK,CAAC,OAAO,UAAU,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpE,CAAC;IACF,yBAAyB,CACvB,aAAa,KAAK,CAAC,UAAU,QAAQ,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACzE,CAAC;IACF,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QACtB,yBAAyB,CACvB,YAAY,KAAK,CAAC,OAAO,UAAU,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAe;IAChD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAG7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,WAAW,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,WAAW,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,yBAAyB,CAAC,4BAA4B,CAAC,CAAC;IACxD,yBAAyB,CAAC,6BAA6B,CAAC,CAAC;IACzD,yBAAyB,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IAC1D,yBAAyB,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IAC1D,yBAAyB,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;IAEzD,IAAI,CAAC;QAEH,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAG7D,IAAI,OAAgB,CAAC;QACrB,IAAI,OAAgB,CAAC;QAErB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YACtD,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,WAAW,GAAG,EAAE;gBAC/D,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YACtD,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,WAAW,GAAG,EAAE;gBAC/D,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;QAID,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAG1D,IAAI,YAAwB,CAAC;QAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,YAAY,GAAG,MAAM,CAAC;QACxB,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,YAAY,GAAG,MAAM,CAAC;QACxB,CAAC;aAAM,CAAC;YAEN,MAAM,aAAa,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;YAC5D,YAAY,GAAG,aAAa,IAAI,MAAM,CAAC;QACzC,CAAC;QAGD,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAG7D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QAErD,yBAAyB,CACvB,0BAA0B,UAAU,KAAK,YAAY,CAAC,WAAW,EAAE,GAAG,CACvE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;QAC9C,yBAAyB,CAAC,UAAW,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["/** biome-ignore-all lint/suspicious/noConsole: CLI output file */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n detectFormatFromExtension,\n parseFile,\n serializeContent,\n type FileFormat,\n} from \"../../common/file-format.js\";\nimport { printDiagnosticsToConsole } from \"../../common/output.js\";\nimport { logger } from \"../../common/logger.js\";\nimport { applyOverlay as applyOverlayEngine } from \"./overlay-engine.js\";\n\nexport interface Arguments {\n overlay: string;\n input: string;\n output: string;\n format?: \"json\" | \"yaml\";\n json?: boolean;\n yaml?: boolean;\n}\n\n/**\n * Apply overlay to OpenAPI document with console output\n * Validates inputs and provides progress feedback\n */\nfunction applyOverlayWithProgress(\n openapi: unknown,\n overlay: unknown\n): Record<string, unknown> {\n // Apply overlay (includes validation)\n let validatedOverlay: ReturnType<typeof applyOverlayEngine>;\n\n try {\n validatedOverlay = applyOverlayEngine(openapi, overlay);\n } catch (error) {\n // Re-throw with better context for CLI users\n if (error instanceof Error) {\n printDiagnosticsToConsole(`\\n${error.message}`);\n }\n throw error;\n }\n\n const { result, stats } = validatedOverlay;\n\n // Show summary\n printDiagnosticsToConsole(`\\n=== Summary ===`);\n printDiagnosticsToConsole(\n `Applied: ${stats.applied} action${stats.applied !== 1 ? \"s\" : \"\"}`\n );\n printDiagnosticsToConsole(\n `Modified: ${stats.totalNodes} node${stats.totalNodes !== 1 ? \"s\" : \"\"}`\n );\n if (stats.skipped > 0) {\n printDiagnosticsToConsole(\n `Skipped: ${stats.skipped} action${stats.skipped !== 1 ? \"s\" : \"\"}`\n );\n }\n\n return result;\n}\n\n/**\n * Main handler function\n */\nexport async function applyOverlay(args: Arguments): Promise<void> {\n const openapiPath = path.resolve(args.input);\n const overlayPath = path.resolve(args.overlay);\n const outputPath = path.resolve(args.output);\n\n // Validate input files exist\n if (!fs.existsSync(openapiPath)) {\n throw new Error(`OpenAPI file not found: ${openapiPath}`);\n }\n\n if (!fs.existsSync(overlayPath)) {\n throw new Error(`Overlay file not found: ${overlayPath}`);\n }\n\n printDiagnosticsToConsole(\"OpenAPI Overlay Applicator\");\n printDiagnosticsToConsole(\"===========================\");\n printDiagnosticsToConsole(`OpenAPI file: ${openapiPath}`);\n printDiagnosticsToConsole(`Overlay file: ${overlayPath}`);\n printDiagnosticsToConsole(`Output file: ${outputPath}`);\n\n try {\n // Load files with flexible parsing\n const openapiContent = fs.readFileSync(openapiPath, \"utf-8\");\n const overlayContent = fs.readFileSync(overlayPath, \"utf-8\");\n\n // Parse with automatic format detection\n let openapi: unknown;\n let overlay: unknown;\n\n try {\n const parsed = parseFile(openapiContent, openapiPath);\n openapi = parsed.document;\n } catch (error) {\n throw new Error(`Failed to parse OpenAPI file '${openapiPath}'`, {\n cause: error,\n });\n }\n\n try {\n const parsed = parseFile(overlayContent, overlayPath);\n overlay = parsed.document;\n } catch (error) {\n throw new Error(`Failed to parse overlay file '${overlayPath}'`, {\n cause: error,\n });\n }\n\n // Apply overlay with progress output\n // Validation happens inside applyOverlayWithProgress\n const result = applyOverlayWithProgress(openapi, overlay);\n\n // Determine output format\n let outputFormat: FileFormat;\n if (args.format) {\n outputFormat = args.format;\n } else if (args.json) {\n outputFormat = \"json\";\n } else if (args.yaml) {\n outputFormat = \"yaml\";\n } else {\n // Try to detect from output file extension\n const formatFromExt = detectFormatFromExtension(outputPath);\n outputFormat = formatFromExt || \"json\"; // Default to JSON if no extension\n }\n\n // Serialize output\n const outputContent = serializeContent(result, outputFormat);\n\n // Create output directory if it doesn't exist\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n fs.writeFileSync(outputPath, outputContent, \"utf-8\");\n\n printDiagnosticsToConsole(\n `\\n✓ Output written to: ${outputPath} (${outputFormat.toUpperCase()})`\n );\n } catch (error) {\n logger.error(error, \"Error applying overlay\");\n printDiagnosticsToConsole(`Error: ${(error as Error).message}`);\n throw error;\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/open-api/overlay/handler.ts"],"names":[],"mappings":"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","sourcesContent":["/** biome-ignore-all lint/suspicious/noConsole: CLI output file */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n detectFormatFromExtension,\n type FileFormat,\n parseFile,\n serializeContent,\n} from \"../../common/file-format.js\";\nimport { logger } from \"../../common/logger.js\";\nimport { printDiagnosticsToConsole } from \"../../common/output.js\";\nimport { applyOverlay as applyOverlayEngine } from \"./overlay-engine.js\";\n\nexport interface Arguments {\n overlay: string;\n input: string;\n output: string;\n format?: \"json\" | \"yaml\";\n json?: boolean;\n yaml?: boolean;\n}\n\n/**\n * Apply overlay to OpenAPI document with console output\n * Validates inputs and provides progress feedback\n */\nfunction applyOverlayWithProgress(\n openapi: unknown,\n overlay: unknown\n): Record<string, unknown> {\n // Apply overlay (includes validation)\n let validatedOverlay: ReturnType<typeof applyOverlayEngine>;\n\n try {\n validatedOverlay = applyOverlayEngine(openapi, overlay);\n } catch (error) {\n // Re-throw with better context for CLI users\n if (error instanceof Error) {\n printDiagnosticsToConsole(`\\n${error.message}`);\n }\n throw error;\n }\n\n const { result, stats } = validatedOverlay;\n\n // Show summary\n printDiagnosticsToConsole(`\\n=== Summary ===`);\n printDiagnosticsToConsole(\n `Applied: ${stats.applied} action${stats.applied !== 1 ? \"s\" : \"\"}`\n );\n printDiagnosticsToConsole(\n `Modified: ${stats.totalNodes} node${stats.totalNodes !== 1 ? \"s\" : \"\"}`\n );\n if (stats.skipped > 0) {\n printDiagnosticsToConsole(\n `Skipped: ${stats.skipped} action${stats.skipped !== 1 ? \"s\" : \"\"}`\n );\n }\n\n return result;\n}\n\n/**\n * Main handler function\n */\nexport async function applyOverlay(args: Arguments): Promise<void> {\n const openapiPath = path.resolve(args.input);\n const overlayPath = path.resolve(args.overlay);\n const outputPath = path.resolve(args.output);\n\n // Validate input files exist\n if (!fs.existsSync(openapiPath)) {\n throw new Error(`OpenAPI file not found: ${openapiPath}`);\n }\n\n if (!fs.existsSync(overlayPath)) {\n throw new Error(`Overlay file not found: ${overlayPath}`);\n }\n\n printDiagnosticsToConsole(\"OpenAPI Overlay Applicator\");\n printDiagnosticsToConsole(\"===========================\");\n printDiagnosticsToConsole(`OpenAPI file: ${openapiPath}`);\n printDiagnosticsToConsole(`Overlay file: ${overlayPath}`);\n printDiagnosticsToConsole(`Output file: ${outputPath}`);\n\n try {\n // Load files with flexible parsing\n const openapiContent = fs.readFileSync(openapiPath, \"utf-8\");\n const overlayContent = fs.readFileSync(overlayPath, \"utf-8\");\n\n // Parse with automatic format detection\n let openapi: unknown;\n let overlay: unknown;\n\n try {\n const parsed = parseFile(openapiContent, openapiPath);\n openapi = parsed.document;\n } catch (error) {\n throw new Error(`Failed to parse OpenAPI file '${openapiPath}'`, {\n cause: error,\n });\n }\n\n try {\n const parsed = parseFile(overlayContent, overlayPath);\n overlay = parsed.document;\n } catch (error) {\n throw new Error(`Failed to parse overlay file '${overlayPath}'`, {\n cause: error,\n });\n }\n\n // Apply overlay with progress output\n // Validation happens inside applyOverlayWithProgress\n const result = applyOverlayWithProgress(openapi, overlay);\n\n // Determine output format\n let outputFormat: FileFormat;\n if (args.format) {\n outputFormat = args.format;\n } else if (args.json) {\n outputFormat = \"json\";\n } else if (args.yaml) {\n outputFormat = \"yaml\";\n } else {\n // Try to detect from output file extension\n const formatFromExt = detectFormatFromExtension(outputPath);\n outputFormat = formatFromExt || \"json\"; // Default to JSON if no extension\n }\n\n // Serialize output\n const outputContent = serializeContent(result, outputFormat);\n\n // Create output directory if it doesn't exist\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n fs.writeFileSync(outputPath, outputContent, \"utf-8\");\n\n printDiagnosticsToConsole(\n `\\n✓ Output written to: ${outputPath} (${outputFormat.toUpperCase()})`\n );\n } catch (error) {\n logger.error(error, \"Error applying overlay\");\n printDiagnosticsToConsole(`Error: ${(error as Error).message}`);\n throw error;\n }\n}\n"]}
@@ -1,8 +1,8 @@
1
+ import assert from "node:assert";
1
2
  import fs from "node:fs/promises";
2
3
  import path from "node:path";
3
4
  import { afterEach, beforeEach, describe, it } from "node:test";
4
5
  import { fileURLToPath } from "node:url";
5
- import assert from "node:assert";
6
6
  import { applyOverlay } from "./handler.js";
7
7
  const __filename = fileURLToPath(import.meta.url);
8
8
  const __dirname = path.dirname(__filename);
@@ -1 +1 @@
1
- {"version":3,"file":"handler.spec.js","sourceRoot":"","sources":["../../../src/open-api/overlay/handler.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\nimport { fileURLToPath } from \"node:url\";\nimport assert from \"node:assert\";\nimport { applyOverlay } from \"./handler.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst testTmpPath = path.join(\n __dirname,\n \"..\",\n \"..\",\n \"__tests__\",\n \"test-tmp\",\n \"overlay-handler\"\n);\n\ndescribe(\"Overlay Handler\", () => {\n beforeEach(async () => {\n // Ensure test-tmp directory exists\n await fs.mkdir(testTmpPath, { recursive: true });\n });\n\n afterEach(async () => {\n // Clean up test files\n try {\n await fs.rm(testTmpPath, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n });\n\n describe(\"applyOverlay\", () => {\n it(\"should apply overlay to OpenAPI document (JSON to JSON)\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.json\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [\n {\n target: \"$.info.title\",\n update: \"Updated API\",\n },\n ],\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n });\n\n const result = JSON.parse(await fs.readFile(outputPath, \"utf-8\"));\n assert.strictEqual(result.info.title, \"Updated API\");\n assert.strictEqual(result.openapi, \"3.1.0\");\n });\n\n it(\"should support YAML input and JSON output\", async () => {\n const inputPath = path.join(testTmpPath, \"input.yaml\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.json\");\n\n const inputDoc = `openapi: 3.1.0\ninfo:\n title: Original API\n version: 1.0.0\npaths: {}`;\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [\n {\n target: \"$.info.version\",\n update: \"2.0.0\",\n },\n ],\n };\n\n await fs.writeFile(inputPath, inputDoc);\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n });\n\n const result = JSON.parse(await fs.readFile(outputPath, \"utf-8\"));\n assert.strictEqual(result.info.version, \"2.0.0\");\n });\n\n it(\"should support JSON input and YAML output\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.yaml\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [],\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n });\n\n const result = await fs.readFile(outputPath, \"utf-8\");\n assert.strictEqual(result.includes(\"openapi: 3.1.0\"), true);\n assert.strictEqual(result.includes(\"title: Original API\"), true);\n });\n\n it(\"should support --format flag to override output format\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.txt\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [],\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n format: \"yaml\",\n });\n\n const result = await fs.readFile(outputPath, \"utf-8\");\n assert.strictEqual(result.includes(\"openapi: 3.1.0\"), true);\n });\n\n it(\"should support --json flag\", async () => {\n const inputPath = path.join(testTmpPath, \"input.yaml\");\n const overlayPath = path.join(testTmpPath, \"overlay.yaml\");\n const outputPath = path.join(testTmpPath, \"output.txt\");\n\n const inputDoc = `openapi: 3.1.0\ninfo:\n title: Original API\n version: 1.0.0\npaths: {}`;\n\n const overlayDoc = `overlay: 1.0.0\ninfo:\n title: Test Overlay\n version: 1.0.0\nactions: []`;\n\n await fs.writeFile(inputPath, inputDoc);\n await fs.writeFile(overlayPath, overlayDoc);\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n json: true,\n });\n\n const result = await fs.readFile(outputPath, \"utf-8\");\n const parsed = JSON.parse(result);\n assert.strictEqual(parsed.openapi, \"3.1.0\");\n });\n\n it(\"should support --yaml flag\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.txt\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [],\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n yaml: true,\n });\n\n const result = await fs.readFile(outputPath, \"utf-8\");\n assert.strictEqual(result.includes(\"openapi: 3.1.0\"), true);\n });\n\n it(\"should create output directory if it doesn't exist\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"nested\", \"dir\", \"output.json\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [],\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n });\n\n const result = JSON.parse(await fs.readFile(outputPath, \"utf-8\"));\n assert.strictEqual(result.openapi, \"3.1.0\");\n });\n\n it(\"should throw error when input file does not exist\", async () => {\n const inputPath = path.join(testTmpPath, \"nonexistent.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.json\");\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [],\n };\n\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await assert.rejects(\n () =>\n applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n }),\n /OpenAPI file not found/\n );\n });\n\n it(\"should throw error when overlay file does not exist\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"nonexistent.json\");\n const outputPath = path.join(testTmpPath, \"output.json\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n\n await assert.rejects(\n () =>\n applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n }),\n /Overlay file not found/\n );\n });\n\n it(\"should throw error when overlay is invalid\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.json\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n const invalidOverlay = {\n info: {\n title: \"Missing overlay version\",\n },\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n await fs.writeFile(overlayPath, JSON.stringify(invalidOverlay, null, 2));\n\n await assert.rejects(\n () =>\n applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n }),\n /Invalid overlay format/\n );\n });\n });\n});\n"]}
1
+ {"version":3,"file":"handler.spec.js","sourceRoot":"","sources":["../../../src/open-api/overlay/handler.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\nimport { fileURLToPath } from \"node:url\";\nimport { applyOverlay } from \"./handler.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst testTmpPath = path.join(\n __dirname,\n \"..\",\n \"..\",\n \"__tests__\",\n \"test-tmp\",\n \"overlay-handler\"\n);\n\ndescribe(\"Overlay Handler\", () => {\n beforeEach(async () => {\n // Ensure test-tmp directory exists\n await fs.mkdir(testTmpPath, { recursive: true });\n });\n\n afterEach(async () => {\n // Clean up test files\n try {\n await fs.rm(testTmpPath, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n });\n\n describe(\"applyOverlay\", () => {\n it(\"should apply overlay to OpenAPI document (JSON to JSON)\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.json\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [\n {\n target: \"$.info.title\",\n update: \"Updated API\",\n },\n ],\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n });\n\n const result = JSON.parse(await fs.readFile(outputPath, \"utf-8\"));\n assert.strictEqual(result.info.title, \"Updated API\");\n assert.strictEqual(result.openapi, \"3.1.0\");\n });\n\n it(\"should support YAML input and JSON output\", async () => {\n const inputPath = path.join(testTmpPath, \"input.yaml\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.json\");\n\n const inputDoc = `openapi: 3.1.0\ninfo:\n title: Original API\n version: 1.0.0\npaths: {}`;\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [\n {\n target: \"$.info.version\",\n update: \"2.0.0\",\n },\n ],\n };\n\n await fs.writeFile(inputPath, inputDoc);\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n });\n\n const result = JSON.parse(await fs.readFile(outputPath, \"utf-8\"));\n assert.strictEqual(result.info.version, \"2.0.0\");\n });\n\n it(\"should support JSON input and YAML output\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.yaml\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [],\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n });\n\n const result = await fs.readFile(outputPath, \"utf-8\");\n assert.strictEqual(result.includes(\"openapi: 3.1.0\"), true);\n assert.strictEqual(result.includes(\"title: Original API\"), true);\n });\n\n it(\"should support --format flag to override output format\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.txt\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [],\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n format: \"yaml\",\n });\n\n const result = await fs.readFile(outputPath, \"utf-8\");\n assert.strictEqual(result.includes(\"openapi: 3.1.0\"), true);\n });\n\n it(\"should support --json flag\", async () => {\n const inputPath = path.join(testTmpPath, \"input.yaml\");\n const overlayPath = path.join(testTmpPath, \"overlay.yaml\");\n const outputPath = path.join(testTmpPath, \"output.txt\");\n\n const inputDoc = `openapi: 3.1.0\ninfo:\n title: Original API\n version: 1.0.0\npaths: {}`;\n\n const overlayDoc = `overlay: 1.0.0\ninfo:\n title: Test Overlay\n version: 1.0.0\nactions: []`;\n\n await fs.writeFile(inputPath, inputDoc);\n await fs.writeFile(overlayPath, overlayDoc);\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n json: true,\n });\n\n const result = await fs.readFile(outputPath, \"utf-8\");\n const parsed = JSON.parse(result);\n assert.strictEqual(parsed.openapi, \"3.1.0\");\n });\n\n it(\"should support --yaml flag\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.txt\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [],\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n yaml: true,\n });\n\n const result = await fs.readFile(outputPath, \"utf-8\");\n assert.strictEqual(result.includes(\"openapi: 3.1.0\"), true);\n });\n\n it(\"should create output directory if it doesn't exist\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"nested\", \"dir\", \"output.json\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [],\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n });\n\n const result = JSON.parse(await fs.readFile(outputPath, \"utf-8\"));\n assert.strictEqual(result.openapi, \"3.1.0\");\n });\n\n it(\"should throw error when input file does not exist\", async () => {\n const inputPath = path.join(testTmpPath, \"nonexistent.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.json\");\n\n const overlayDoc = {\n overlay: \"1.0.0\",\n info: {\n title: \"Test Overlay\",\n version: \"1.0.0\",\n },\n actions: [],\n };\n\n await fs.writeFile(overlayPath, JSON.stringify(overlayDoc, null, 2));\n\n await assert.rejects(\n () =>\n applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n }),\n /OpenAPI file not found/\n );\n });\n\n it(\"should throw error when overlay file does not exist\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"nonexistent.json\");\n const outputPath = path.join(testTmpPath, \"output.json\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n\n await assert.rejects(\n () =>\n applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n }),\n /Overlay file not found/\n );\n });\n\n it(\"should throw error when overlay is invalid\", async () => {\n const inputPath = path.join(testTmpPath, \"input.json\");\n const overlayPath = path.join(testTmpPath, \"overlay.json\");\n const outputPath = path.join(testTmpPath, \"output.json\");\n\n const inputDoc = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {},\n };\n\n const invalidOverlay = {\n info: {\n title: \"Missing overlay version\",\n },\n };\n\n await fs.writeFile(inputPath, JSON.stringify(inputDoc, null, 2));\n await fs.writeFile(overlayPath, JSON.stringify(invalidOverlay, null, 2));\n\n await assert.rejects(\n () =>\n applyOverlay({\n input: inputPath,\n overlay: overlayPath,\n output: outputPath,\n }),\n /Invalid overlay format/\n );\n });\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-engine.d.ts","sourceRoot":"","sources":["../../../src/open-api/overlay/overlay-engine.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAmBD,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAKtC;AAQD,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CA+DnE;AAKD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,eAAe,GACzB,OAAO,CAgCT;AAyCD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,IAAI,CAyCN;AAKD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,WAAW,CA2F5E;AAMD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,EAAE,CAiBnE;AAMD,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,OAAO,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBzB;AAMD,wBAAgB,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,CAkD9D;AAOD,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,OAAO,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBzB;AAmBD,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GACf;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CA6B1D"}
1
+ {"version":3,"file":"overlay-engine.d.ts","sourceRoot":"","sources":["../../../src/open-api/overlay/overlay-engine.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,eAAe,EAGrB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAmBD,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAKtC;AAQD,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CA+DnE;AAKD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,eAAe,GACzB,OAAO,CAgCT;AAyCD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,IAAI,CAyCN;AAKD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,WAAW,CA2F5E;AAMD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,EAAE,CAiBnE;AAMD,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,OAAO,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBzB;AAMD,wBAAgB,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,CAkD9D;AAOD,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,OAAO,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBzB;AAmBD,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GACf;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CA6B1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-engine.js","sourceRoot":"","sources":["../../../src/open-api/overlay/overlay-engine.ts"],"names":[],"mappings":"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","sourcesContent":["import { JSONPath } from \"jsonpath-plus\";\nimport {\n HTTP_METHODS,\n validateOpenApiDocument,\n validateOverlayDocument,\n type OverlayAction,\n type OverlayDocument,\n type RemoveCondition,\n} from \"../../common/open-api/index.js\";\n\nexport interface ApplyResult {\n applied: boolean;\n count: number;\n}\n\nexport interface OverlayStats {\n applied: number;\n skipped: number;\n totalNodes: number;\n}\n\n/**\n * Safely validate and return a generic object\n * Used internally for dynamic JSON manipulation\n */\nfunction toRecord(value: unknown, context: string): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\n `Expected object at ${context}, but got ${Array.isArray(value) ? \"array\" : typeof value}`\n );\n }\n return value as Record<string, unknown>;\n}\n\n/**\n * Deep clone an object using structuredClone for better performance and correctness\n * Falls back to JSON parse/stringify for environments without structuredClone\n */\nexport function deepClone<T>(obj: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(obj);\n }\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Deep merge two objects\n * Special handling for OpenAPI parameters (merge by name+in)\n * Returns the merged result, which will have the shape of source if target is not an object,\n * or a merged object/array if both are objects/arrays\n */\nexport function deepMerge(target: unknown, source: unknown): unknown {\n if (!source || typeof source !== \"object\") {\n return source;\n }\n\n if (!target || typeof target !== \"object\") {\n return deepClone(source);\n }\n\n if (Array.isArray(source)) {\n if (!Array.isArray(target)) {\n return deepClone(source);\n }\n\n // Special case for OpenAPI parameters - merge by name+in\n if (\n source.length > 0 &&\n typeof source[0] === \"object\" &&\n source[0] !== null &&\n \"name\" in source[0] &&\n \"in\" in source[0]\n ) {\n const merged = [...target];\n for (const sourceParam of source) {\n if (typeof sourceParam !== \"object\" || sourceParam === null) continue;\n const existingIndex = merged.findIndex(\n (p) =>\n typeof p === \"object\" &&\n p !== null &&\n \"name\" in p &&\n \"in\" in p &&\n \"name\" in sourceParam &&\n \"in\" in sourceParam &&\n p.name === sourceParam.name &&\n p.in === sourceParam.in\n );\n if (existingIndex >= 0) {\n merged[existingIndex] = deepMerge(merged[existingIndex], sourceParam);\n } else {\n merged.push(deepClone(sourceParam));\n }\n }\n return merged;\n }\n\n // For other arrays, concatenate\n return [...target, ...deepClone(source)];\n }\n\n // Both are objects at this point (checked above)\n const targetObj = target as Record<string, unknown>;\n const sourceObj = source as Record<string, unknown>;\n const result = { ...targetObj };\n\n for (const [key, value] of Object.entries(sourceObj)) {\n if (key in result) {\n result[key] = deepMerge(result[key], value);\n } else {\n result[key] = deepClone(value);\n }\n }\n\n return result;\n}\n\n/**\n * Check if a condition is met for conditional removal\n */\nexport function checkCondition(\n value: unknown,\n condition: RemoveCondition\n): boolean {\n // Support \"empty\" condition to check if object has no keys\n if (condition.empty) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return Object.keys(value).length === 0;\n }\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n return false;\n }\n\n // Support \"missing\" condition to check if a property doesn't exist\n if (condition.missing) {\n const parts = condition.missing.split(\".\");\n let current: unknown = value;\n for (const part of parts) {\n if (\n current &&\n typeof current === \"object\" &&\n !Array.isArray(current) &&\n part in current\n ) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return true; // Property is missing\n }\n }\n return false; // Property exists\n }\n\n return false;\n}\n\n/**\n * Regular expression for parsing JSONPath segments\n * Matches: word, or [quoted], or ['quoted'], or [\"quoted\"], or numeric indices [0]\n */\nconst JSONPATH_SEGMENT_PATTERN = /[^.[]+|\\[[^\\]]+\\]/g;\n\n/**\n * Extract key from bracket notation, handling various formats:\n * - ['key'] -> key\n * - [\"key\"] -> key\n * - [key] -> key\n * - [0] -> 0 (as string for consistency)\n */\nfunction extractBracketKey(bracketNotation: string): string {\n const inner = bracketNotation.slice(1, -1); // Remove [ and ]\n\n // Handle single-quoted: ['key'] -> key\n if (inner.startsWith(\"'\") && inner.endsWith(\"'\")) {\n return inner.slice(1, -1);\n }\n\n // Handle double-quoted: [\"key\"] -> key\n if (inner.startsWith('\"') && inner.endsWith('\"')) {\n return inner.slice(1, -1);\n }\n\n // Handle unquoted: [key] or [0] -> key or 0\n return inner;\n}\n\n/**\n * Set a value at a JSONPath, creating parent paths as needed\n * Handles patterns like:\n * $.paths['/route'].method\n * $.components.parameters['name']\n * $.paths[\"/users\"].get\n * $.paths[users].get\n * $.items[0].value\n */\nexport function setValueAtPath(\n doc: unknown,\n target: string,\n value: unknown\n): void {\n // Parse the path manually to handle both bracket and dot notation\n // Example: $.paths['/route'].post -> [\"paths\", \"['/route']\", \"post\"]\n\n // Remove leading $.\n const targetPath = target.replace(/^\\$\\./, \"\");\n\n // Split by dots, but keep bracket notation together\n const parts = targetPath.match(JSONPATH_SEGMENT_PATTERN) || [];\n\n let current = toRecord(doc, \"setValueAtPath document\");\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n\n // Handle bracket notation\n if (part.startsWith(\"[\")) {\n const key = extractBracketKey(part);\n if (!(key in current)) {\n current[key] = {};\n }\n const next = current[key];\n current = toRecord(next, `setValueAtPath at ${target}[${i}]`);\n } else {\n // Handle regular property\n if (!(part in current)) {\n current[part] = {};\n }\n const next = current[part];\n current = toRecord(next, `setValueAtPath at ${target}.${part}`);\n }\n }\n\n // Set the final value\n const lastPart = parts[parts.length - 1];\n if (lastPart.startsWith(\"[\")) {\n const key = extractBracketKey(lastPart);\n current[key] = value;\n } else {\n current[lastPart] = value;\n }\n}\n\n/**\n * Apply a single overlay action to the document\n */\nexport function applyAction(doc: unknown, action: OverlayAction): ApplyResult {\n const docRecord = toRecord(doc, \"applyAction document\");\n\n if (action.update) {\n // Handle root level updates specially\n if (action.target === \"$\") {\n Object.assign(docRecord, deepMerge(doc, action.update));\n return { applied: true, count: 1 };\n }\n\n try {\n // Try to find existing nodes\n const results = JSONPath({\n path: action.target,\n // biome-ignore lint/suspicious/noExplicitAny: JSONPath library requires loose typing\n json: doc as any,\n resultType: \"all\",\n }) as Array<{ parent: unknown; parentProperty: unknown; value: unknown }>;\n\n if (results.length > 0) {\n // Path exists, merge the update\n let count = 0;\n for (const result of results) {\n const { parent, parentProperty } = result;\n if (\n parent &&\n typeof parent === \"object\" &&\n !Array.isArray(parent) &&\n parentProperty !== undefined\n ) {\n const parentRecord = parent as Record<string, unknown>;\n parentRecord[parentProperty as string] = deepMerge(\n parentRecord[parentProperty as string],\n action.update\n );\n count++;\n }\n }\n return { applied: true, count };\n }\n\n // Path doesn't exist, create it manually\n setValueAtPath(doc, action.target, action.update);\n return { applied: true, count: 1 };\n } catch (cause) {\n throw new Error(\"Failed to apply update\", { cause });\n }\n } else if (action.remove) {\n try {\n const results = JSONPath({\n path: action.target,\n // biome-ignore lint/suspicious/noExplicitAny: JSONPath library requires loose typing\n json: doc as any,\n resultType: \"all\",\n }) as Array<{ parent: unknown; parentProperty: unknown; value: unknown }>;\n\n if (results.length === 0) {\n return { applied: false, count: 0 };\n }\n\n let count = 0;\n // Process in reverse to avoid index issues when removing\n for (let i = results.length - 1; i >= 0; i--) {\n const result = results[i];\n const { parent, parentProperty, value } = result;\n\n // Check condition if specified\n const shouldRemove =\n typeof action.remove === \"object\"\n ? checkCondition(value, action.remove)\n : true;\n\n if (shouldRemove && parent && parentProperty !== undefined) {\n if (Array.isArray(parent)) {\n parent.splice(parentProperty as number, 1);\n } else if (typeof parent === \"object\" && parent !== null) {\n delete (parent as Record<string, unknown>)[\n parentProperty as string\n ];\n }\n count++;\n }\n }\n\n return { applied: true, count };\n } catch (cause) {\n throw new Error(\"Failed to remove\", { cause });\n }\n }\n\n return { applied: false, count: 0 };\n}\n\n/**\n * Extract path order from overlay actions\n * Returns array of paths in the order they appear in overlay\n */\nexport function extractPathOrder(overlay: OverlayDocument): string[] {\n const pathOrder: string[] = [];\n const seenPaths = new Set<string>();\n\n for (const action of overlay.actions) {\n // Match patterns like $.paths['/route'].method\n const match = action.target.match(/^\\$\\.paths\\['([^']+)'\\]/);\n if (match) {\n const targetPath = match[1];\n if (!seenPaths.has(targetPath)) {\n pathOrder.push(targetPath);\n seenPaths.add(targetPath);\n }\n }\n }\n\n return pathOrder;\n}\n\n/**\n * Reorder operation properties so summary, description, operationId come first\n * Returns a new object with reordered keys\n */\nexport function reorderOperationProperties(\n operation: unknown\n): Record<string, unknown> {\n const operationObj = toRecord(operation, \"reorderOperationProperties\");\n const priorityKeys = [\"summary\", \"description\", \"operationId\"];\n const reordered: Record<string, unknown> = {};\n\n // Add priority keys first (in order)\n for (const key of priorityKeys) {\n if (key in operationObj) {\n reordered[key] = operationObj[key];\n }\n }\n\n // Add remaining keys\n for (const [key, value] of Object.entries(operationObj)) {\n if (!priorityKeys.includes(key)) {\n reordered[key] = value;\n }\n }\n\n return reordered;\n}\n\n/**\n * Reorder paths object to match the order from overlay\n * Modifies the document in place and returns it\n */\nexport function reorderPaths<T>(doc: T, pathOrder: string[]): T {\n // Early return if no paths to reorder\n if (\n typeof doc !== \"object\" ||\n doc === null ||\n !(\"paths\" in doc) ||\n pathOrder.length === 0\n ) {\n return doc;\n }\n\n const docRecord = doc as Record<string, unknown>;\n const originalPaths = toRecord(docRecord.paths, \"paths\");\n const reorderedPaths: Record<string, unknown> = {};\n\n // First, add paths in the order specified by overlay\n for (const targetPath of pathOrder) {\n if (targetPath in originalPaths) {\n reorderedPaths[targetPath] = originalPaths[targetPath];\n }\n }\n\n // Then add any remaining paths that weren't in the overlay\n for (const [targetPath, value] of Object.entries(originalPaths)) {\n if (!(targetPath in reorderedPaths)) {\n reorderedPaths[targetPath] = value;\n }\n }\n\n // Reorder operation properties within each path\n for (const pathItem of Object.values(reorderedPaths)) {\n if (typeof pathItem !== \"object\" || pathItem === null) continue;\n\n const pathItemRecord = pathItem as Record<string, unknown>;\n\n for (const method of HTTP_METHODS) {\n if (\n method in pathItemRecord &&\n typeof pathItemRecord[method] === \"object\" &&\n pathItemRecord[method] !== null\n ) {\n pathItemRecord[method] = reorderOperationProperties(\n pathItemRecord[method]\n );\n }\n }\n }\n\n docRecord.paths = reorderedPaths;\n return doc;\n}\n\n/**\n * Reorder top-level document properties to ensure proper ordering\n * OpenAPI spec should have: openapi, info, tags, servers, paths, components, etc.\n * Returns a new object with reordered keys\n */\nexport function reorderDocumentProperties(\n doc: unknown\n): Record<string, unknown> {\n const docObj = toRecord(doc, \"reorderDocumentProperties\");\n const priorityKeys = [\"openapi\", \"info\", \"tags\"];\n const reordered: Record<string, unknown> = {};\n\n // Add priority keys first\n for (const key of priorityKeys) {\n if (key in docObj) {\n reordered[key] = docObj[key];\n }\n }\n\n // Add remaining keys\n for (const [key, value] of Object.entries(docObj)) {\n if (!priorityKeys.includes(key)) {\n reordered[key] = value;\n }\n }\n\n return reordered;\n}\n\n/**\n * Apply overlay to OpenAPI document\n *\n * Validates both the OpenAPI document and overlay upfront, then applies\n * all actions defined in the overlay to produce a modified OpenAPI document.\n *\n * @param openapi The OpenAPI document to modify (will be validated)\n * @param overlay The overlay document to apply (will be validated)\n * @returns The modified OpenAPI document and statistics about what was applied\n * @throws {Error} if either document is invalid, with actionable error messages\n *\n * @example\n * ```typescript\n * const result = applyOverlay(openapiDoc, overlayDoc);\n * console.log(`Applied ${result.stats.applied} actions`);\n * ```\n */\nexport function applyOverlay(\n openapi: unknown,\n overlay: unknown\n): { result: Record<string, unknown>; stats: OverlayStats } {\n // Validate inputs upfront with actionable error messages\n const validatedOverlay = validateOverlayDocument(overlay);\n const validatedOpenApi = validateOpenApiDocument(openapi);\n\n // Clone the document for modification\n const result = deepClone(validatedOpenApi);\n const stats: OverlayStats = { applied: 0, skipped: 0, totalNodes: 0 };\n\n // Apply each action\n for (const action of validatedOverlay.actions) {\n const { applied, count } = applyAction(result, action);\n\n if (applied) {\n stats.applied++;\n stats.totalNodes += count;\n } else {\n stats.skipped++;\n }\n }\n\n // Reorder paths to match overlay order\n const pathOrder = extractPathOrder(validatedOverlay);\n reorderPaths(result, pathOrder);\n\n // Reorder top-level document properties\n const reordered = reorderDocumentProperties(result);\n\n return { result: reordered, stats };\n}\n"]}
1
+ {"version":3,"file":"overlay-engine.js","sourceRoot":"","sources":["../../../src/open-api/overlay/overlay-engine.ts"],"names":[],"mappings":"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","sourcesContent":["import { JSONPath } from \"jsonpath-plus\";\nimport {\n HTTP_METHODS,\n type OverlayAction,\n type OverlayDocument,\n type RemoveCondition,\n validateOpenApiDocument,\n validateOverlayDocument,\n} from \"../../common/open-api/index.js\";\n\nexport interface ApplyResult {\n applied: boolean;\n count: number;\n}\n\nexport interface OverlayStats {\n applied: number;\n skipped: number;\n totalNodes: number;\n}\n\n/**\n * Safely validate and return a generic object\n * Used internally for dynamic JSON manipulation\n */\nfunction toRecord(value: unknown, context: string): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\n `Expected object at ${context}, but got ${Array.isArray(value) ? \"array\" : typeof value}`\n );\n }\n return value as Record<string, unknown>;\n}\n\n/**\n * Deep clone an object using structuredClone for better performance and correctness\n * Falls back to JSON parse/stringify for environments without structuredClone\n */\nexport function deepClone<T>(obj: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(obj);\n }\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Deep merge two objects\n * Special handling for OpenAPI parameters (merge by name+in)\n * Returns the merged result, which will have the shape of source if target is not an object,\n * or a merged object/array if both are objects/arrays\n */\nexport function deepMerge(target: unknown, source: unknown): unknown {\n if (!source || typeof source !== \"object\") {\n return source;\n }\n\n if (!target || typeof target !== \"object\") {\n return deepClone(source);\n }\n\n if (Array.isArray(source)) {\n if (!Array.isArray(target)) {\n return deepClone(source);\n }\n\n // Special case for OpenAPI parameters - merge by name+in\n if (\n source.length > 0 &&\n typeof source[0] === \"object\" &&\n source[0] !== null &&\n \"name\" in source[0] &&\n \"in\" in source[0]\n ) {\n const merged = [...target];\n for (const sourceParam of source) {\n if (typeof sourceParam !== \"object\" || sourceParam === null) continue;\n const existingIndex = merged.findIndex(\n (p) =>\n typeof p === \"object\" &&\n p !== null &&\n \"name\" in p &&\n \"in\" in p &&\n \"name\" in sourceParam &&\n \"in\" in sourceParam &&\n p.name === sourceParam.name &&\n p.in === sourceParam.in\n );\n if (existingIndex >= 0) {\n merged[existingIndex] = deepMerge(merged[existingIndex], sourceParam);\n } else {\n merged.push(deepClone(sourceParam));\n }\n }\n return merged;\n }\n\n // For other arrays, concatenate\n return [...target, ...deepClone(source)];\n }\n\n // Both are objects at this point (checked above)\n const targetObj = target as Record<string, unknown>;\n const sourceObj = source as Record<string, unknown>;\n const result = { ...targetObj };\n\n for (const [key, value] of Object.entries(sourceObj)) {\n if (key in result) {\n result[key] = deepMerge(result[key], value);\n } else {\n result[key] = deepClone(value);\n }\n }\n\n return result;\n}\n\n/**\n * Check if a condition is met for conditional removal\n */\nexport function checkCondition(\n value: unknown,\n condition: RemoveCondition\n): boolean {\n // Support \"empty\" condition to check if object has no keys\n if (condition.empty) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return Object.keys(value).length === 0;\n }\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n return false;\n }\n\n // Support \"missing\" condition to check if a property doesn't exist\n if (condition.missing) {\n const parts = condition.missing.split(\".\");\n let current: unknown = value;\n for (const part of parts) {\n if (\n current &&\n typeof current === \"object\" &&\n !Array.isArray(current) &&\n part in current\n ) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return true; // Property is missing\n }\n }\n return false; // Property exists\n }\n\n return false;\n}\n\n/**\n * Regular expression for parsing JSONPath segments\n * Matches: word, or [quoted], or ['quoted'], or [\"quoted\"], or numeric indices [0]\n */\nconst JSONPATH_SEGMENT_PATTERN = /[^.[]+|\\[[^\\]]+\\]/g;\n\n/**\n * Extract key from bracket notation, handling various formats:\n * - ['key'] -> key\n * - [\"key\"] -> key\n * - [key] -> key\n * - [0] -> 0 (as string for consistency)\n */\nfunction extractBracketKey(bracketNotation: string): string {\n const inner = bracketNotation.slice(1, -1); // Remove [ and ]\n\n // Handle single-quoted: ['key'] -> key\n if (inner.startsWith(\"'\") && inner.endsWith(\"'\")) {\n return inner.slice(1, -1);\n }\n\n // Handle double-quoted: [\"key\"] -> key\n if (inner.startsWith('\"') && inner.endsWith('\"')) {\n return inner.slice(1, -1);\n }\n\n // Handle unquoted: [key] or [0] -> key or 0\n return inner;\n}\n\n/**\n * Set a value at a JSONPath, creating parent paths as needed\n * Handles patterns like:\n * $.paths['/route'].method\n * $.components.parameters['name']\n * $.paths[\"/users\"].get\n * $.paths[users].get\n * $.items[0].value\n */\nexport function setValueAtPath(\n doc: unknown,\n target: string,\n value: unknown\n): void {\n // Parse the path manually to handle both bracket and dot notation\n // Example: $.paths['/route'].post -> [\"paths\", \"['/route']\", \"post\"]\n\n // Remove leading $.\n const targetPath = target.replace(/^\\$\\./, \"\");\n\n // Split by dots, but keep bracket notation together\n const parts = targetPath.match(JSONPATH_SEGMENT_PATTERN) || [];\n\n let current = toRecord(doc, \"setValueAtPath document\");\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n\n // Handle bracket notation\n if (part.startsWith(\"[\")) {\n const key = extractBracketKey(part);\n if (!(key in current)) {\n current[key] = {};\n }\n const next = current[key];\n current = toRecord(next, `setValueAtPath at ${target}[${i}]`);\n } else {\n // Handle regular property\n if (!(part in current)) {\n current[part] = {};\n }\n const next = current[part];\n current = toRecord(next, `setValueAtPath at ${target}.${part}`);\n }\n }\n\n // Set the final value\n const lastPart = parts[parts.length - 1];\n if (lastPart.startsWith(\"[\")) {\n const key = extractBracketKey(lastPart);\n current[key] = value;\n } else {\n current[lastPart] = value;\n }\n}\n\n/**\n * Apply a single overlay action to the document\n */\nexport function applyAction(doc: unknown, action: OverlayAction): ApplyResult {\n const docRecord = toRecord(doc, \"applyAction document\");\n\n if (action.update) {\n // Handle root level updates specially\n if (action.target === \"$\") {\n Object.assign(docRecord, deepMerge(doc, action.update));\n return { applied: true, count: 1 };\n }\n\n try {\n // Try to find existing nodes\n const results = JSONPath({\n path: action.target,\n // biome-ignore lint/suspicious/noExplicitAny: JSONPath library requires loose typing\n json: doc as any,\n resultType: \"all\",\n }) as Array<{ parent: unknown; parentProperty: unknown; value: unknown }>;\n\n if (results.length > 0) {\n // Path exists, merge the update\n let count = 0;\n for (const result of results) {\n const { parent, parentProperty } = result;\n if (\n parent &&\n typeof parent === \"object\" &&\n !Array.isArray(parent) &&\n parentProperty !== undefined\n ) {\n const parentRecord = parent as Record<string, unknown>;\n parentRecord[parentProperty as string] = deepMerge(\n parentRecord[parentProperty as string],\n action.update\n );\n count++;\n }\n }\n return { applied: true, count };\n }\n\n // Path doesn't exist, create it manually\n setValueAtPath(doc, action.target, action.update);\n return { applied: true, count: 1 };\n } catch (cause) {\n throw new Error(\"Failed to apply update\", { cause });\n }\n } else if (action.remove) {\n try {\n const results = JSONPath({\n path: action.target,\n // biome-ignore lint/suspicious/noExplicitAny: JSONPath library requires loose typing\n json: doc as any,\n resultType: \"all\",\n }) as Array<{ parent: unknown; parentProperty: unknown; value: unknown }>;\n\n if (results.length === 0) {\n return { applied: false, count: 0 };\n }\n\n let count = 0;\n // Process in reverse to avoid index issues when removing\n for (let i = results.length - 1; i >= 0; i--) {\n const result = results[i];\n const { parent, parentProperty, value } = result;\n\n // Check condition if specified\n const shouldRemove =\n typeof action.remove === \"object\"\n ? checkCondition(value, action.remove)\n : true;\n\n if (shouldRemove && parent && parentProperty !== undefined) {\n if (Array.isArray(parent)) {\n parent.splice(parentProperty as number, 1);\n } else if (typeof parent === \"object\" && parent !== null) {\n delete (parent as Record<string, unknown>)[\n parentProperty as string\n ];\n }\n count++;\n }\n }\n\n return { applied: true, count };\n } catch (cause) {\n throw new Error(\"Failed to remove\", { cause });\n }\n }\n\n return { applied: false, count: 0 };\n}\n\n/**\n * Extract path order from overlay actions\n * Returns array of paths in the order they appear in overlay\n */\nexport function extractPathOrder(overlay: OverlayDocument): string[] {\n const pathOrder: string[] = [];\n const seenPaths = new Set<string>();\n\n for (const action of overlay.actions) {\n // Match patterns like $.paths['/route'].method\n const match = action.target.match(/^\\$\\.paths\\['([^']+)'\\]/);\n if (match) {\n const targetPath = match[1];\n if (!seenPaths.has(targetPath)) {\n pathOrder.push(targetPath);\n seenPaths.add(targetPath);\n }\n }\n }\n\n return pathOrder;\n}\n\n/**\n * Reorder operation properties so summary, description, operationId come first\n * Returns a new object with reordered keys\n */\nexport function reorderOperationProperties(\n operation: unknown\n): Record<string, unknown> {\n const operationObj = toRecord(operation, \"reorderOperationProperties\");\n const priorityKeys = [\"summary\", \"description\", \"operationId\"];\n const reordered: Record<string, unknown> = {};\n\n // Add priority keys first (in order)\n for (const key of priorityKeys) {\n if (key in operationObj) {\n reordered[key] = operationObj[key];\n }\n }\n\n // Add remaining keys\n for (const [key, value] of Object.entries(operationObj)) {\n if (!priorityKeys.includes(key)) {\n reordered[key] = value;\n }\n }\n\n return reordered;\n}\n\n/**\n * Reorder paths object to match the order from overlay\n * Modifies the document in place and returns it\n */\nexport function reorderPaths<T>(doc: T, pathOrder: string[]): T {\n // Early return if no paths to reorder\n if (\n typeof doc !== \"object\" ||\n doc === null ||\n !(\"paths\" in doc) ||\n pathOrder.length === 0\n ) {\n return doc;\n }\n\n const docRecord = doc as Record<string, unknown>;\n const originalPaths = toRecord(docRecord.paths, \"paths\");\n const reorderedPaths: Record<string, unknown> = {};\n\n // First, add paths in the order specified by overlay\n for (const targetPath of pathOrder) {\n if (targetPath in originalPaths) {\n reorderedPaths[targetPath] = originalPaths[targetPath];\n }\n }\n\n // Then add any remaining paths that weren't in the overlay\n for (const [targetPath, value] of Object.entries(originalPaths)) {\n if (!(targetPath in reorderedPaths)) {\n reorderedPaths[targetPath] = value;\n }\n }\n\n // Reorder operation properties within each path\n for (const pathItem of Object.values(reorderedPaths)) {\n if (typeof pathItem !== \"object\" || pathItem === null) continue;\n\n const pathItemRecord = pathItem as Record<string, unknown>;\n\n for (const method of HTTP_METHODS) {\n if (\n method in pathItemRecord &&\n typeof pathItemRecord[method] === \"object\" &&\n pathItemRecord[method] !== null\n ) {\n pathItemRecord[method] = reorderOperationProperties(\n pathItemRecord[method]\n );\n }\n }\n }\n\n docRecord.paths = reorderedPaths;\n return doc;\n}\n\n/**\n * Reorder top-level document properties to ensure proper ordering\n * OpenAPI spec should have: openapi, info, tags, servers, paths, components, etc.\n * Returns a new object with reordered keys\n */\nexport function reorderDocumentProperties(\n doc: unknown\n): Record<string, unknown> {\n const docObj = toRecord(doc, \"reorderDocumentProperties\");\n const priorityKeys = [\"openapi\", \"info\", \"tags\"];\n const reordered: Record<string, unknown> = {};\n\n // Add priority keys first\n for (const key of priorityKeys) {\n if (key in docObj) {\n reordered[key] = docObj[key];\n }\n }\n\n // Add remaining keys\n for (const [key, value] of Object.entries(docObj)) {\n if (!priorityKeys.includes(key)) {\n reordered[key] = value;\n }\n }\n\n return reordered;\n}\n\n/**\n * Apply overlay to OpenAPI document\n *\n * Validates both the OpenAPI document and overlay upfront, then applies\n * all actions defined in the overlay to produce a modified OpenAPI document.\n *\n * @param openapi The OpenAPI document to modify (will be validated)\n * @param overlay The overlay document to apply (will be validated)\n * @returns The modified OpenAPI document and statistics about what was applied\n * @throws {Error} if either document is invalid, with actionable error messages\n *\n * @example\n * ```typescript\n * const result = applyOverlay(openapiDoc, overlayDoc);\n * console.log(`Applied ${result.stats.applied} actions`);\n * ```\n */\nexport function applyOverlay(\n openapi: unknown,\n overlay: unknown\n): { result: Record<string, unknown>; stats: OverlayStats } {\n // Validate inputs upfront with actionable error messages\n const validatedOverlay = validateOverlayDocument(overlay);\n const validatedOpenApi = validateOpenApiDocument(openapi);\n\n // Clone the document for modification\n const result = deepClone(validatedOpenApi);\n const stats: OverlayStats = { applied: 0, skipped: 0, totalNodes: 0 };\n\n // Apply each action\n for (const action of validatedOverlay.actions) {\n const { applied, count } = applyAction(result, action);\n\n if (applied) {\n stats.applied++;\n stats.totalNodes += count;\n } else {\n stats.skipped++;\n }\n }\n\n // Reorder paths to match overlay order\n const pathOrder = extractPathOrder(validatedOverlay);\n reorderPaths(result, pathOrder);\n\n // Reorder top-level document properties\n const reordered = reorderDocumentProperties(result);\n\n return { result: reordered, stats };\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { describe, it } from "node:test";
2
1
  import assert from "node:assert";
3
- import { applyOverlay, applyAction, deepClone, deepMerge, checkCondition, setValueAtPath, extractPathOrder, reorderOperationProperties, } from "./overlay-engine.js";
2
+ import { describe, it } from "node:test";
3
+ import { applyAction, applyOverlay, checkCondition, deepClone, deepMerge, extractPathOrder, reorderOperationProperties, setValueAtPath, } from "./overlay-engine.js";
4
4
  describe("OpenAPI Overlay Engine", () => {
5
5
  describe("deepClone", () => {
6
6
  it("should deep clone an object", () => {