@zuplo/cli 6.63.34 → 6.63.35

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":"overlay-engine.spec.js","sourceRoot":"","sources":["../../../src/open-api/overlay/overlay-engine.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AAKjC,OAAO,EACL,YAAY,EACZ,WAAW,EACX,SAAS,EACT,SAAS,EACT,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YAEnC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACxC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YAEnC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACxC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEzC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEzC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEzC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,MAAM,GAAG;gBACb,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;oBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE;iBAChC;aACF,CAAC;YACF,MAAM,MAAM,GAAG;gBACb,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE;oBACjD,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE;iBAC9B;aACF,CAAC;YACF,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEzC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE;gBAC7B,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE;oBACjE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE;oBAC/B,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE;iBAC9B;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEzC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;YAC/E,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;YAC9E,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,GAAG,GAAG,EAAE,CAAC;YACf,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAE9C,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,GAAG,GAAG,EAAE,CAAC;YACf,cAAc,CAAC,GAAG,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YAEvE,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE;gBAC1B,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE;aACvD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,GAAG,GAAG,EAAE,CAAC;YACf,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YAE1C,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,GAAG,GAAG,EAAE,CAAC;YACf,cAAc,CAAC,GAAG,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YAEvE,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE;gBAC1B,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE;aACvD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,GAAG,GAAG,EAAE,CAAC;YACf,cAAc,CAAC,GAAG,EAAE,oBAAoB,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YAEpE,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE;gBAC1B,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE;aACpD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAChC,cAAc,CAAC,GAAG,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;YAErD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAA4B,CAAC;YACrD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,GAAG,GAAG,EAAE,CAAC;YACf,cAAc,CAAC,GAAG,EAAE,4CAA4C,EAAE;gBAChE,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE;gBAC1B,UAAU,EAAE;oBACV,OAAO,EAAE;wBACP,IAAI,EAAE;4BACJ,UAAU,EAAE;gCACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;6BACvB;yBACF;qBACF;iBACF;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAkB;gBAC5B,MAAM,EAAE,GAAG;gBACX,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;aACvC,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAExC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE;gBAC/B,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,GAAG,GAAG;gBACV,KAAK,EAAE;oBACL,QAAQ,EAAE;wBACR,GAAG,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE;qBAChC;iBACF;aACF,CAAC;YACF,MAAM,MAAM,GAAkB;gBAC5B,MAAM,EAAE,uBAAuB;gBAC/B,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE;aACjE,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAExC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAA8B,CAAC;YACxE,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YACxD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAkB;gBAC5B,MAAM,EAAE,mBAAmB;gBAC3B,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;aAC1C,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAExC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAgC,CAAC;YACnD,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;gBACtC,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE;aAC9B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,GAAG,GAAG;gBACV,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;oBAC/B,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;iBAChC;aACF,CAAC;YACF,MAAM,MAAM,GAAkB;gBAC5B,MAAM,EAAE,eAAe;gBACvB,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE;aAC7B,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAExC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YACjE,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,GAAG,GAAG;gBACV,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;iBAClC;aACF,CAAC;YACF,MAAM,MAAM,GAAkB;gBAC5B,MAAM,EAAE,0BAA0B;gBAClC,MAAM,EAAE,IAAI;aACb,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAExC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,WAAW,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,GAAG,GAAG;gBACV,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;oBACjC,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;iBAClC;aACF,CAAC;YACF,MAAM,MAAM,GAAkB;gBAC5B,MAAM,EAAE,kBAAkB;gBAC1B,MAAM,EAAE,IAAI;aACb,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAExC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,WAAW,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,CAAC,WAAW,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,GAAG,GAAG;gBACV,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;oBACrB,QAAQ,EAAE,EAAE;oBACZ,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;iBACzB;aACF,CAAC;YACF,MAAM,MAAM,GAAkB;gBAC5B,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;aACxB,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAExC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,EAAE,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,CAAC,WAAW,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,CAAC,EAAE,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,GAAG,GAAG;gBACV,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;oBACzC,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;iBACtB;aACF,CAAC;YACF,MAAM,MAAM,GAAkB;gBAC5B,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE;aACtC,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAExC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,EAAE,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,CAAC,WAAW,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAkB;gBAC5B,MAAM,EAAE,mBAAmB;gBAC3B,MAAM,EAAE,IAAI;aACb,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAExC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,OAAO,GAAoB;gBAC/B,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;gBACzC,OAAO,EAAE;oBACP,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC/C,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC/C,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,EAAE,EAAE,EAAE;oBAChD,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;iBACjC;aACF,CAAC;YAEF,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAExC,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,OAAO,GAAoB;gBAC/B,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;gBACzC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aAC5C,CAAC;YAEF,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAExC,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,MAAM,SAAS,GAAG;gBAChB,SAAS,EAAE,EAAE;gBACb,UAAU,EAAE,EAAE;gBACd,WAAW,EAAE,UAAU;gBACvB,WAAW,EAAE,eAAe;gBAC5B,OAAO,EAAE,WAAW;aACrB,CAAC;YAEF,MAAM,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEjC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACvC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,SAAS,GAAG;gBAChB,SAAS,EAAE,EAAE;gBACb,WAAW,EAAE,UAAU;aACxB,CAAC;YAEF,MAAM,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEjC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,OAAO,GAAG;gBACd,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE;oBACJ,KAAK,EAAE,cAAc;oBACrB,OAAO,EAAE,OAAO;iBACjB;gBACD,KAAK,EAAE;oBACL,QAAQ,EAAE;wBACR,GAAG,EAAE;4BACH,OAAO,EAAE,WAAW;yBACrB;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,OAAO,GAAoB;gBAC/B,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE;oBACJ,KAAK,EAAE,YAAY;oBACnB,OAAO,EAAE,OAAO;iBACjB;gBACD,OAAO,EAAE;oBACP;wBACE,MAAM,EAAE,QAAQ;wBAChB,WAAW,EAAE,iBAAiB;wBAC9B,MAAM,EAAE;4BACN,KAAK,EAAE,aAAa;4BACpB,WAAW,EAAE,gBAAgB;yBAC9B;qBACF;oBACD;wBACE,MAAM,EAAE,uBAAuB;wBAC/B,WAAW,EAAE,kBAAkB;wBAC/B,MAAM,EAAE;4BACN,WAAW,EAAE,UAAU;yBACxB;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEzD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAExC,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;YACpD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAC9C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;YACvD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAgC,CAAC;YACtD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAA4B,CAAC;YAC7D,MAAM,YAAY,GAAG,SAAS,CAAC,GAA8B,CAAC;YAC9D,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,OAAO,GAAG;gBACd,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;gBACtB,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;oBACjC,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;iBACzB;aACF,CAAC;YAEF,MAAM,OAAO,GAAoB;gBAC/B,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;gBAC5C,OAAO,EAAE;oBACP;wBACE,MAAM,EAAE,kBAAkB;wBAC1B,WAAW,EAAE,8BAA8B;wBAC3C,MAAM,EAAE,IAAI;qBACb;oBACD;wBACE,MAAM,EAAE,sBAAsB;wBAC9B,WAAW,EAAE,sBAAsB;wBACnC,MAAM,EAAE,IAAI;qBACb;iBACF;aACF,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEzD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAExC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAgC,CAAC;YACtD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAA4B,CAAC;YAC7D,MAAM,CAAC,WAAW,CAAC,QAAQ,IAAI,SAAS,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,WAAW,IAAI,KAAK,EAAE,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,OAAO,GAAG;gBACd,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;aAC1C,CAAC;YACF,MAAM,cAAc,GAAG;gBACrB,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;aAE3B,CAAC;YAEF,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,cAAyB,CAAC,EACtD,kCAAkC,CACnC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,MAAM,OAAO,GAAG;gBACd,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;aAC1C,CAAC;YACF,MAAM,cAAc,GAAG;gBACrB,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;gBACzC,OAAO,EAAE;oBACP;wBACE,MAAM,EAAE,SAAS;qBAElB;iBACF;aACF,CAAC;YAEF,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,YAAY,CAAC,OAAO,EAAE,cAAyB,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,YAAY,GAAI,KAAe,CAAC,OAAO,CAAC;YAC1C,CAAC;YAED,MAAM,CAAC,EAAE,CACP,YAAY,CAAC,QAAQ,CACnB,yDAAyD,CAC1D,EACD,2CAA2C,YAAY,EAAE,CAC1D,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YAEvD,MAAM,iBAAiB,GAAG;gBAExB,KAAK,EAAE,EAAE;aACV,CAAC;YACF,MAAM,OAAO,GAAG;gBACd,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;gBACzC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;aACnE,CAAC;YAGF,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;YAG5D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAgC,CAAC;YACtD,MAAM,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;YAC3E,MAAM,WAAW,GAAG,kBAAkB,CAAC;YACvC,MAAM,OAAO,GAAG;gBACd,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;gBACzC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC;aAC1D,CAAC;YAEF,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,YAAY,GAAI,KAAe,CAAC,OAAO,CAAC;YAC1C,CAAC;YAED,MAAM,CAAC,EAAE,CACP,YAAY,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAC5D,2DAA2D,YAAY,EAAE,CAC1E,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,OAAO,GAAG;gBACd,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE;aACzC,CAAC;YAEF,MAAM,cAAc,GAAG;gBACrB,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE;gBAClD,OAAO,EAAE,EAAE;aACZ,CAAC;YAEF,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,YAAY,GAAI,KAAe,CAAC,OAAO,CAAC;YAC1C,CAAC;YAED,MAAM,CAAC,EAAE,CACP,YAAY,CAAC,QAAQ,CAAC,0CAA0C,CAAC,EACjE,qDAAqD,YAAY,EAAE,CACpE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,OAAO,GAAG;gBACd,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE;oBACL,QAAQ,EAAE;wBACR,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;wBACrC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;qBACnB;oBACD,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;oBAC/B,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;iBACvD;aACF,CAAC;YAEF,MAAM,OAAO,GAAoB;gBAC/B,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,EAAE;gBACxD,OAAO,EAAE;oBACP;wBACE,MAAM,EAAE,kBAAkB;wBAC1B,WAAW,EAAE,iBAAiB;wBAC9B,MAAM,EAAE,CAAC,QAAQ,CAAC;qBACnB;oBACD;wBACE,MAAM,EAAE,WAAW;wBACnB,WAAW,EAAE,iCAAiC;wBAC9C,MAAM,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE;qBACtC;iBACF;aACF,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAIzD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAErC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAgC,CAAC;YACtD,MAAM,CAAC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;YAC7B,MAAM,CAAC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC;YAChC,MAAM,CAAC,WAAW,CAAC,QAAQ,IAAI,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,OAAO,GAAG;gBACd,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE;gBACxC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC;gBAC7C,KAAK,EAAE,EAAE;aACV,CAAC;YAEF,MAAM,OAAO,GAAoB;gBAC/B,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;gBAC5C,OAAO,EAAE;oBACP;wBACE,MAAM,EAAE,QAAQ;wBAChB,MAAM,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE;qBAC7C;iBACF;aACF,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAElD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACvC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAGpC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;YACpD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,OAAO,GAAG;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE;wBACP,IAAI,EAAE;4BACJ,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE;gCACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;6BACvB;yBACF;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,OAAO,GAAoB;gBAC/B,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE;gBACnD,OAAO,EAAE;oBACP;wBACE,MAAM,EAAE,sCAAsC;wBAC9C,MAAM,EAAE;4BACN,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;yBAC3C;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAElD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAqC,CAAC;YAChE,MAAM,OAAO,GAAG,UAAU,CAAC,OAAkC,CAAC;YAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,IAA+B,CAAC;YAC3D,MAAM,UAAU,GAAG,UAAU,CAAC,UAAqC,CAAC;YACpE,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACzB,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC5B,MAAM,aAAa,GAAG,UAAU,CAAC,KAAgC,CAAC;YAClE,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,OAAO,GAAG;gBACd,OAAO,EAAE;oBACP,EAAE,GAAG,EAAE,0BAA0B,EAAE,WAAW,EAAE,YAAY,EAAE;oBAC9D,EAAE,GAAG,EAAE,6BAA6B,EAAE,WAAW,EAAE,SAAS,EAAE;oBAC9D,EAAE,GAAG,EAAE,yBAAyB,EAAE,WAAW,EAAE,aAAa,EAAE;iBAC/D;aACF,CAAC;YAEF,MAAM,OAAO,GAAoB;gBAC/B,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE;gBACnD,OAAO,EAAE;oBACP;wBACE,MAAM,EAAE,4CAA4C;wBACpD,MAAM,EAAE,IAAI;qBACb;iBACF;aACF,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAElD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAyC,CAAC;YACjE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YACzD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,OAAO,GAAG;gBACd,KAAK,EAAE;oBACL,aAAa,EAAE;wBACb,UAAU,EAAE;4BACV,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;4BAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE;yBAChC;wBACD,GAAG,EAAE,EAAE;qBACR;iBACF;aACF,CAAC;YAEF,MAAM,OAAO,GAAoB;gBAC/B,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE;gBACtD,OAAO,EAAE;oBACP;wBACE,MAAM,EAAE,mCAAmC;wBAC3C,MAAM,EAAE;4BACN;gCACE,IAAI,EAAE,IAAI;gCACV,EAAE,EAAE,MAAM;gCACV,WAAW,EAAE,SAAS;gCACtB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;6BAC3B;4BACD,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE;yBACjE;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAElD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAgC,CAAC;YACtD,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAA4B,CAAC;YAClE,MAAM,MAAM,GAAG,SAAS,CAAC,UAA4C,CAAC;YACtE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAErC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACpD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACnB,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACnD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAE3D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;YAEvB,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YAC9D,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;YACxB,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAClE,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 type OverlayDocument,\n type OverlayAction,\n} from \"../../common/open-api/index.js\";\nimport {\n applyOverlay,\n applyAction,\n deepClone,\n deepMerge,\n checkCondition,\n setValueAtPath,\n extractPathOrder,\n reorderOperationProperties,\n} from \"./overlay-engine.js\";\n\ndescribe(\"OpenAPI Overlay Engine\", () => {\n describe(\"deepClone\", () => {\n it(\"should deep clone an object\", () => {\n const original = { a: 1, b: { c: 2 } };\n const cloned = deepClone(original);\n\n assert.deepStrictEqual(cloned, original);\n assert.notStrictEqual(cloned, original);\n assert.notStrictEqual(cloned.b, original.b);\n });\n\n it(\"should deep clone an array\", () => {\n const original = [1, 2, { a: 3 }];\n const cloned = deepClone(original);\n\n assert.deepStrictEqual(cloned, original);\n assert.notStrictEqual(cloned, original);\n assert.notStrictEqual(cloned[2], original[2]);\n });\n });\n\n describe(\"deepMerge\", () => {\n it(\"should merge two objects\", () => {\n const target = { a: 1, b: 2 };\n const source = { b: 3, c: 4 };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { a: 1, b: 3, c: 4 });\n });\n\n it(\"should merge nested objects\", () => {\n const target = { a: { b: 1, c: 2 } };\n const source = { a: { c: 3, d: 4 } };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { a: { b: 1, c: 3, d: 4 } });\n });\n\n it(\"should concatenate arrays by default\", () => {\n const target = { arr: [1, 2] };\n const source = { arr: [3, 4] };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { arr: [1, 2, 3, 4] });\n });\n\n it(\"should merge OpenAPI parameters by name and in\", () => {\n const target = {\n parameters: [\n { name: \"id\", in: \"path\", required: true },\n { name: \"filter\", in: \"query\" },\n ],\n };\n const source = {\n parameters: [\n { name: \"id\", in: \"path\", description: \"The ID\" },\n { name: \"sort\", in: \"query\" },\n ],\n };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, {\n parameters: [\n { name: \"id\", in: \"path\", required: true, description: \"The ID\" },\n { name: \"filter\", in: \"query\" },\n { name: \"sort\", in: \"query\" },\n ],\n });\n });\n\n it(\"should replace target with source if types differ\", () => {\n const target = { a: [1, 2] };\n const source = { a: \"string\" };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { a: \"string\" });\n });\n });\n\n describe(\"checkCondition\", () => {\n it(\"should return true for empty object when empty condition is true\", () => {\n assert.strictEqual(checkCondition({}, { empty: true }), true);\n });\n\n it(\"should return false for non-empty object when empty condition is true\", () => {\n assert.strictEqual(checkCondition({ a: 1 }, { empty: true }), false);\n });\n\n it(\"should return true for empty array when empty condition is true\", () => {\n assert.strictEqual(checkCondition([], { empty: true }), true);\n });\n\n it(\"should return false for non-empty array when empty condition is true\", () => {\n assert.strictEqual(checkCondition([1], { empty: true }), false);\n });\n\n it(\"should return true when property is missing\", () => {\n const obj = { a: { b: 1 } };\n assert.strictEqual(checkCondition(obj, { missing: \"a.c\" }), true);\n });\n\n it(\"should return false when property exists\", () => {\n const obj = { a: { b: 1 } };\n assert.strictEqual(checkCondition(obj, { missing: \"a.b\" }), false);\n });\n });\n\n describe(\"setValueAtPath\", () => {\n it(\"should set value at simple path\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.info.title\", \"My API\");\n\n assert.deepStrictEqual(doc, { info: { title: \"My API\" } });\n });\n\n it(\"should set value at bracket notation path\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.paths['/users'].get\", { summary: \"Get users\" });\n\n assert.deepStrictEqual(doc, {\n paths: { \"/users\": { get: { summary: \"Get users\" } } },\n });\n });\n\n it(\"should create nested paths as needed\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.a.b.c.d\", \"value\");\n\n assert.deepStrictEqual(doc, { a: { b: { c: { d: \"value\" } } } });\n });\n\n it(\"should handle double-quoted bracket notation\", () => {\n const doc = {};\n setValueAtPath(doc, '$.paths[\"/users\"].get', { summary: \"Get users\" });\n\n assert.deepStrictEqual(doc, {\n paths: { \"/users\": { get: { summary: \"Get users\" } } },\n });\n });\n\n it(\"should handle unquoted bracket notation\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.paths[users].get\", { summary: \"Get users\" });\n\n assert.deepStrictEqual(doc, {\n paths: { users: { get: { summary: \"Get users\" } } },\n });\n });\n\n it(\"should handle numeric indices\", () => {\n const doc = { items: [{}, {}] };\n setValueAtPath(doc, \"$.items[0].name\", \"First Item\");\n\n const item = doc.items[0] as Record<string, unknown>;\n assert.strictEqual(item.name, \"First Item\");\n });\n\n it(\"should handle mixed dot and bracket notation\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.components.schemas['User'].properties.id\", {\n type: \"string\",\n });\n\n assert.deepStrictEqual(doc, {\n components: {\n schemas: {\n User: {\n properties: {\n id: { type: \"string\" },\n },\n },\n },\n },\n });\n });\n });\n\n describe(\"applyAction - update operations\", () => {\n it(\"should update root level properties\", () => {\n const doc = { info: { title: \"Old Title\" } };\n const action: OverlayAction = {\n target: \"$\",\n update: { info: { version: \"1.0.0\" } },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.deepStrictEqual(doc.info, {\n title: \"Old Title\",\n version: \"1.0.0\",\n });\n });\n\n it(\"should update existing nested property\", () => {\n const doc = {\n paths: {\n \"/users\": {\n get: { summary: \"Old summary\" },\n },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths['/users'].get\",\n update: { summary: \"New summary\", description: \"Get all users\" },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n const getOperation = doc.paths[\"/users\"].get as Record<string, unknown>;\n assert.strictEqual(getOperation.summary, \"New summary\");\n assert.strictEqual(getOperation.description, \"Get all users\");\n });\n\n it(\"should create new property if it doesn't exist\", () => {\n const doc = { paths: {} };\n const action: OverlayAction = {\n target: \"$.paths['/users']\",\n update: { get: { summary: \"Get users\" } },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n const paths = doc.paths as Record<string, unknown>;\n assert.deepStrictEqual(paths[\"/users\"], {\n get: { summary: \"Get users\" },\n });\n });\n\n it(\"should update multiple nodes with wildcard\", () => {\n const doc = {\n paths: {\n \"/users\": { get: { tags: [] } },\n \"/posts\": { get: { tags: [] } },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*.get\",\n update: { tags: [\"public\"] },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 2);\n assert.deepStrictEqual(doc.paths[\"/users\"].get.tags, [\"public\"]);\n assert.deepStrictEqual(doc.paths[\"/posts\"].get.tags, [\"public\"]);\n });\n });\n\n describe(\"applyAction - remove operations\", () => {\n it(\"should remove a property from object\", () => {\n const doc = {\n paths: {\n \"/users\": { get: {}, delete: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths['/users'].delete\",\n remove: true,\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.strictEqual(\"delete\" in doc.paths[\"/users\"], false);\n assert.ok(\"get\" in doc.paths[\"/users\"]);\n });\n\n it(\"should remove multiple properties with wildcard\", () => {\n const doc = {\n paths: {\n \"/users\": { get: {}, delete: {} },\n \"/posts\": { get: {}, delete: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*.delete\",\n remove: true,\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 2);\n assert.strictEqual(\"delete\" in doc.paths[\"/users\"], false);\n assert.strictEqual(\"delete\" in doc.paths[\"/posts\"], false);\n });\n\n it(\"should conditionally remove empty objects\", () => {\n const doc = {\n paths: {\n \"/users\": { get: {} },\n \"/posts\": {},\n \"/comments\": { get: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*\",\n remove: { empty: true },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.ok(\"/users\" in doc.paths);\n assert.strictEqual(\"/posts\" in doc.paths, false);\n assert.ok(\"/comments\" in doc.paths);\n });\n\n it(\"should conditionally remove when property is missing\", () => {\n const doc = {\n paths: {\n \"/users\": { get: { \"x-internal\": true } },\n \"/posts\": { get: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*\",\n remove: { missing: \"get.x-internal\" },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.ok(\"/users\" in doc.paths);\n assert.strictEqual(\"/posts\" in doc.paths, false);\n });\n\n it(\"should return false if target not found\", () => {\n const doc = { paths: {} };\n const action: OverlayAction = {\n target: \"$.paths['/users']\",\n remove: true,\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, false);\n assert.strictEqual(result.count, 0);\n });\n });\n\n describe(\"extractPathOrder\", () => {\n it(\"should extract path order from overlay actions\", () => {\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [\n { target: \"$.paths['/users'].get\", update: {} },\n { target: \"$.paths['/posts'].get\", update: {} },\n { target: \"$.paths['/users'].post\", update: {} },\n { target: \"$.info\", update: {} },\n ],\n };\n\n const order = extractPathOrder(overlay);\n\n assert.deepStrictEqual(order, [\"/users\", \"/posts\"]);\n });\n\n it(\"should return empty array if no path actions\", () => {\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [{ target: \"$.info\", update: {} }],\n };\n\n const order = extractPathOrder(overlay);\n\n assert.deepStrictEqual(order, []);\n });\n });\n\n describe(\"reorderOperationProperties\", () => {\n it(\"should reorder operation properties with priority keys first\", () => {\n const operation = {\n responses: {},\n parameters: [],\n operationId: \"getUsers\",\n description: \"Get all users\",\n summary: \"Get users\",\n };\n\n const result = reorderOperationProperties(operation);\n const keys = Object.keys(result);\n\n assert.strictEqual(keys[0], \"summary\");\n assert.strictEqual(keys[1], \"description\");\n assert.strictEqual(keys[2], \"operationId\");\n assert.strictEqual(keys[3], \"responses\");\n assert.strictEqual(keys[4], \"parameters\");\n });\n\n it(\"should handle missing priority keys\", () => {\n const operation = {\n responses: {},\n operationId: \"getUsers\",\n };\n\n const result = reorderOperationProperties(operation);\n const keys = Object.keys(result);\n\n assert.strictEqual(keys[0], \"operationId\");\n assert.strictEqual(keys[1], \"responses\");\n });\n });\n\n describe(\"applyOverlay - full integration\", () => {\n it(\"should apply a complete overlay document\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Get users\",\n },\n },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: {\n title: \"My Overlay\",\n version: \"1.0.0\",\n },\n actions: [\n {\n target: \"$.info\",\n description: \"Update API info\",\n update: {\n title: \"Updated API\",\n description: \"An updated API\",\n },\n },\n {\n target: \"$.paths['/users'].get\",\n description: \"Add operation ID\",\n update: {\n operationId: \"getUsers\",\n },\n },\n ],\n };\n\n const { result, stats } = applyOverlay(openapi, overlay);\n\n assert.strictEqual(stats.applied, 2);\n assert.strictEqual(stats.skipped, 0);\n assert.strictEqual(stats.totalNodes, 2);\n\n const info = result.info as Record<string, unknown>;\n assert.strictEqual(info.title, \"Updated API\");\n assert.strictEqual(info.description, \"An updated API\");\n assert.strictEqual(info.version, \"1.0.0\");\n const paths = result.paths as Record<string, unknown>;\n const usersPath = paths[\"/users\"] as Record<string, unknown>;\n const getOperation = usersPath.get as Record<string, unknown>;\n assert.strictEqual(getOperation.operationId, \"getUsers\");\n });\n\n it(\"should handle overlay with remove actions\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"API\" },\n paths: {\n \"/users\": { get: {}, delete: {} },\n \"/internal\": { get: {} },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths.*.delete\",\n description: \"Remove all delete operations\",\n remove: true,\n },\n {\n target: \"$.paths['/internal']\",\n description: \"Remove internal path\",\n remove: true,\n },\n ],\n };\n\n const { result, stats } = applyOverlay(openapi, overlay);\n\n assert.strictEqual(stats.applied, 2);\n assert.strictEqual(stats.totalNodes, 2);\n\n const paths = result.paths as Record<string, unknown>;\n const usersPath = paths[\"/users\"] as Record<string, unknown>;\n assert.strictEqual(\"delete\" in usersPath, false);\n assert.strictEqual(\"/internal\" in paths, false);\n assert.ok(\"/users\" in paths);\n });\n\n it(\"should throw error for invalid overlay format\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n };\n const invalidOverlay = {\n info: { title: \"Invalid\" },\n // Missing 'overlay' and 'actions'\n };\n\n assert.throws(\n () => applyOverlay(openapi, invalidOverlay as unknown),\n /Invalid OpenAPI Overlay document/\n );\n });\n\n it(\"should throw actionable error for overlay with invalid action\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n };\n const invalidOverlay = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths\",\n // Missing both 'update' and 'remove' - invalid!\n },\n ],\n };\n\n let errorMessage = \"\";\n try {\n applyOverlay(openapi, invalidOverlay as unknown);\n } catch (error) {\n errorMessage = (error as Error).message;\n }\n\n assert.ok(\n errorMessage.includes(\n \"Action must specify exactly one of 'update' or 'remove'\"\n ),\n `Expected actionable error message, got: ${errorMessage}`\n );\n });\n\n it(\"should work with incomplete OpenAPI documents\", () => {\n // The overlay tool should be lenient and work with imperfect OpenAPI files\n const incompleteOpenapi = {\n // Missing 'openapi' and 'info' - but that's OK!\n paths: {},\n };\n const overlay = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [{ target: \"$.paths\", update: { \"/test\": { get: {} } } }],\n };\n\n // Should not throw - lenient validation\n const { result } = applyOverlay(incompleteOpenapi, overlay);\n\n // Should have applied the update\n const paths = result.paths as Record<string, unknown>;\n assert.ok(\"/test\" in paths);\n });\n\n it(\"should reject completely invalid OpenAPI document (not an object)\", () => {\n const notAnObject = \"this is a string\";\n const overlay = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [{ target: \"$.paths\", update: { \"/test\": {} } }],\n };\n\n let errorMessage = \"\";\n try {\n applyOverlay(notAnObject, overlay);\n } catch (error) {\n errorMessage = (error as Error).message;\n }\n\n assert.ok(\n errorMessage.includes(\"must be a valid JSON or YAML object\"),\n `Expected error about document not being an object, got: ${errorMessage}`\n );\n });\n\n it(\"should reject empty actions array\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"API\", version: \"1.0.0\" },\n };\n\n const invalidOverlay = {\n overlay: \"1.0.0\",\n info: { title: \"Empty Overlay\", version: \"1.0.0\" },\n actions: [],\n };\n\n let errorMessage = \"\";\n try {\n applyOverlay(openapi, invalidOverlay);\n } catch (error) {\n errorMessage = (error as Error).message;\n }\n\n assert.ok(\n errorMessage.includes(\"Overlay must contain at least one action\"),\n `Expected validation error for empty actions, got: ${errorMessage}`\n );\n });\n\n it(\"should apply overlay with wildcards and conditions\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n paths: {\n \"/users\": {\n get: { \"x-internal\": true, tags: [] },\n post: { tags: [] },\n },\n \"/posts\": { get: { tags: [] } },\n \"/internal\": { get: { \"x-internal\": true, tags: [] } },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Conditional Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths.*.*.tags\",\n description: \"Add default tag\",\n update: [\"public\"],\n },\n {\n target: \"$.paths.*\",\n description: \"Remove paths without x-internal\",\n remove: { missing: \"get.x-internal\" },\n },\n ],\n };\n\n const { result, stats } = applyOverlay(openapi, overlay);\n\n // First action should update all tags arrays (4 operations)\n // Second action should remove /posts (missing x-internal)\n assert.strictEqual(stats.applied, 2);\n\n const paths = result.paths as Record<string, unknown>;\n assert.ok(\"/users\" in paths);\n assert.ok(\"/internal\" in paths);\n assert.strictEqual(\"/posts\" in paths, false);\n });\n\n it(\"should preserve document structure and order\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"API\", version: \"1.0.0\" },\n servers: [{ url: \"https://api.example.com\" }],\n paths: {},\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.info\",\n update: { description: \"Added description\" },\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const keys = Object.keys(result);\n assert.strictEqual(keys[0], \"openapi\");\n assert.strictEqual(keys[1], \"info\");\n // Priority keys come first: openapi, info, tags (if present)\n // Then other keys in original order\n assert.ok(keys.includes(\"servers\"));\n assert.ok(keys.includes(\"paths\"));\n const info = result.info as Record<string, unknown>;\n assert.strictEqual(info.description, \"Added description\");\n });\n });\n\n describe(\"Complex overlay scenarios\", () => {\n it(\"should handle deep nested updates\", () => {\n const openapi = {\n components: {\n schemas: {\n User: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n },\n },\n },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Schema Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.components.schemas.User.properties\",\n update: {\n name: { type: \"string\" },\n email: { type: \"string\", format: \"email\" },\n },\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const components = result.components as Record<string, unknown>;\n const schemas = components.schemas as Record<string, unknown>;\n const userSchema = schemas.User as Record<string, unknown>;\n const properties = userSchema.properties as Record<string, unknown>;\n assert.ok(properties.id);\n assert.ok(properties.name);\n assert.ok(properties.email);\n const emailProperty = properties.email as Record<string, unknown>;\n assert.strictEqual(emailProperty.format, \"email\");\n });\n\n it(\"should handle array element removal\", () => {\n const openapi = {\n servers: [\n { url: \"https://prod.example.com\", description: \"Production\" },\n { url: \"https://staging.example.com\", description: \"Staging\" },\n { url: \"https://dev.example.com\", description: \"Development\" },\n ],\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Server Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.servers[?(@.description=='Development')]\",\n remove: true,\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const servers = result.servers as Array<Record<string, unknown>>;\n assert.strictEqual(servers.length, 2);\n assert.strictEqual(servers[0].description, \"Production\");\n assert.strictEqual(servers[1].description, \"Staging\");\n });\n\n it(\"should handle parameter merging correctly\", () => {\n const openapi = {\n paths: {\n \"/users/{id}\": {\n parameters: [\n { name: \"id\", in: \"path\", required: true },\n { name: \"fields\", in: \"query\" },\n ],\n get: {},\n },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Parameter Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths['/users/{id}'].parameters\",\n update: [\n {\n name: \"id\",\n in: \"path\",\n description: \"User ID\",\n schema: { type: \"string\" },\n },\n { name: \"include\", in: \"query\", description: \"Include related\" },\n ],\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const paths = result.paths as Record<string, unknown>;\n const usersPath = paths[\"/users/{id}\"] as Record<string, unknown>;\n const params = usersPath.parameters as Array<Record<string, unknown>>;\n assert.strictEqual(params.length, 3);\n\n const idParam = params.find((p) => p.name === \"id\");\n assert.ok(idParam);\n assert.strictEqual(idParam.required, true);\n assert.strictEqual(idParam.description, \"User ID\");\n assert.deepStrictEqual(idParam.schema, { type: \"string\" });\n\n const fieldsParam = params.find((p) => p.name === \"fields\");\n assert.ok(fieldsParam);\n\n const includeParam = params.find((p) => p.name === \"include\");\n assert.ok(includeParam);\n assert.strictEqual(includeParam.description, \"Include related\");\n });\n });\n});\n"]}
1
+ {"version":3,"file":"overlay-engine.spec.js","sourceRoot":"","sources":["../../../src/open-api/overlay/overlay-engine.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert\";\nimport { describe, it } from \"node:test\";\nimport {\n type OverlayAction,\n type OverlayDocument,\n} from \"../../common/open-api/index.js\";\nimport {\n applyAction,\n applyOverlay,\n checkCondition,\n deepClone,\n deepMerge,\n extractPathOrder,\n reorderOperationProperties,\n setValueAtPath,\n} from \"./overlay-engine.js\";\n\ndescribe(\"OpenAPI Overlay Engine\", () => {\n describe(\"deepClone\", () => {\n it(\"should deep clone an object\", () => {\n const original = { a: 1, b: { c: 2 } };\n const cloned = deepClone(original);\n\n assert.deepStrictEqual(cloned, original);\n assert.notStrictEqual(cloned, original);\n assert.notStrictEqual(cloned.b, original.b);\n });\n\n it(\"should deep clone an array\", () => {\n const original = [1, 2, { a: 3 }];\n const cloned = deepClone(original);\n\n assert.deepStrictEqual(cloned, original);\n assert.notStrictEqual(cloned, original);\n assert.notStrictEqual(cloned[2], original[2]);\n });\n });\n\n describe(\"deepMerge\", () => {\n it(\"should merge two objects\", () => {\n const target = { a: 1, b: 2 };\n const source = { b: 3, c: 4 };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { a: 1, b: 3, c: 4 });\n });\n\n it(\"should merge nested objects\", () => {\n const target = { a: { b: 1, c: 2 } };\n const source = { a: { c: 3, d: 4 } };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { a: { b: 1, c: 3, d: 4 } });\n });\n\n it(\"should concatenate arrays by default\", () => {\n const target = { arr: [1, 2] };\n const source = { arr: [3, 4] };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { arr: [1, 2, 3, 4] });\n });\n\n it(\"should merge OpenAPI parameters by name and in\", () => {\n const target = {\n parameters: [\n { name: \"id\", in: \"path\", required: true },\n { name: \"filter\", in: \"query\" },\n ],\n };\n const source = {\n parameters: [\n { name: \"id\", in: \"path\", description: \"The ID\" },\n { name: \"sort\", in: \"query\" },\n ],\n };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, {\n parameters: [\n { name: \"id\", in: \"path\", required: true, description: \"The ID\" },\n { name: \"filter\", in: \"query\" },\n { name: \"sort\", in: \"query\" },\n ],\n });\n });\n\n it(\"should replace target with source if types differ\", () => {\n const target = { a: [1, 2] };\n const source = { a: \"string\" };\n const result = deepMerge(target, source);\n\n assert.deepStrictEqual(result, { a: \"string\" });\n });\n });\n\n describe(\"checkCondition\", () => {\n it(\"should return true for empty object when empty condition is true\", () => {\n assert.strictEqual(checkCondition({}, { empty: true }), true);\n });\n\n it(\"should return false for non-empty object when empty condition is true\", () => {\n assert.strictEqual(checkCondition({ a: 1 }, { empty: true }), false);\n });\n\n it(\"should return true for empty array when empty condition is true\", () => {\n assert.strictEqual(checkCondition([], { empty: true }), true);\n });\n\n it(\"should return false for non-empty array when empty condition is true\", () => {\n assert.strictEqual(checkCondition([1], { empty: true }), false);\n });\n\n it(\"should return true when property is missing\", () => {\n const obj = { a: { b: 1 } };\n assert.strictEqual(checkCondition(obj, { missing: \"a.c\" }), true);\n });\n\n it(\"should return false when property exists\", () => {\n const obj = { a: { b: 1 } };\n assert.strictEqual(checkCondition(obj, { missing: \"a.b\" }), false);\n });\n });\n\n describe(\"setValueAtPath\", () => {\n it(\"should set value at simple path\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.info.title\", \"My API\");\n\n assert.deepStrictEqual(doc, { info: { title: \"My API\" } });\n });\n\n it(\"should set value at bracket notation path\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.paths['/users'].get\", { summary: \"Get users\" });\n\n assert.deepStrictEqual(doc, {\n paths: { \"/users\": { get: { summary: \"Get users\" } } },\n });\n });\n\n it(\"should create nested paths as needed\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.a.b.c.d\", \"value\");\n\n assert.deepStrictEqual(doc, { a: { b: { c: { d: \"value\" } } } });\n });\n\n it(\"should handle double-quoted bracket notation\", () => {\n const doc = {};\n setValueAtPath(doc, '$.paths[\"/users\"].get', { summary: \"Get users\" });\n\n assert.deepStrictEqual(doc, {\n paths: { \"/users\": { get: { summary: \"Get users\" } } },\n });\n });\n\n it(\"should handle unquoted bracket notation\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.paths[users].get\", { summary: \"Get users\" });\n\n assert.deepStrictEqual(doc, {\n paths: { users: { get: { summary: \"Get users\" } } },\n });\n });\n\n it(\"should handle numeric indices\", () => {\n const doc = { items: [{}, {}] };\n setValueAtPath(doc, \"$.items[0].name\", \"First Item\");\n\n const item = doc.items[0] as Record<string, unknown>;\n assert.strictEqual(item.name, \"First Item\");\n });\n\n it(\"should handle mixed dot and bracket notation\", () => {\n const doc = {};\n setValueAtPath(doc, \"$.components.schemas['User'].properties.id\", {\n type: \"string\",\n });\n\n assert.deepStrictEqual(doc, {\n components: {\n schemas: {\n User: {\n properties: {\n id: { type: \"string\" },\n },\n },\n },\n },\n });\n });\n });\n\n describe(\"applyAction - update operations\", () => {\n it(\"should update root level properties\", () => {\n const doc = { info: { title: \"Old Title\" } };\n const action: OverlayAction = {\n target: \"$\",\n update: { info: { version: \"1.0.0\" } },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.deepStrictEqual(doc.info, {\n title: \"Old Title\",\n version: \"1.0.0\",\n });\n });\n\n it(\"should update existing nested property\", () => {\n const doc = {\n paths: {\n \"/users\": {\n get: { summary: \"Old summary\" },\n },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths['/users'].get\",\n update: { summary: \"New summary\", description: \"Get all users\" },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n const getOperation = doc.paths[\"/users\"].get as Record<string, unknown>;\n assert.strictEqual(getOperation.summary, \"New summary\");\n assert.strictEqual(getOperation.description, \"Get all users\");\n });\n\n it(\"should create new property if it doesn't exist\", () => {\n const doc = { paths: {} };\n const action: OverlayAction = {\n target: \"$.paths['/users']\",\n update: { get: { summary: \"Get users\" } },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n const paths = doc.paths as Record<string, unknown>;\n assert.deepStrictEqual(paths[\"/users\"], {\n get: { summary: \"Get users\" },\n });\n });\n\n it(\"should update multiple nodes with wildcard\", () => {\n const doc = {\n paths: {\n \"/users\": { get: { tags: [] } },\n \"/posts\": { get: { tags: [] } },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*.get\",\n update: { tags: [\"public\"] },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 2);\n assert.deepStrictEqual(doc.paths[\"/users\"].get.tags, [\"public\"]);\n assert.deepStrictEqual(doc.paths[\"/posts\"].get.tags, [\"public\"]);\n });\n });\n\n describe(\"applyAction - remove operations\", () => {\n it(\"should remove a property from object\", () => {\n const doc = {\n paths: {\n \"/users\": { get: {}, delete: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths['/users'].delete\",\n remove: true,\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.strictEqual(\"delete\" in doc.paths[\"/users\"], false);\n assert.ok(\"get\" in doc.paths[\"/users\"]);\n });\n\n it(\"should remove multiple properties with wildcard\", () => {\n const doc = {\n paths: {\n \"/users\": { get: {}, delete: {} },\n \"/posts\": { get: {}, delete: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*.delete\",\n remove: true,\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 2);\n assert.strictEqual(\"delete\" in doc.paths[\"/users\"], false);\n assert.strictEqual(\"delete\" in doc.paths[\"/posts\"], false);\n });\n\n it(\"should conditionally remove empty objects\", () => {\n const doc = {\n paths: {\n \"/users\": { get: {} },\n \"/posts\": {},\n \"/comments\": { get: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*\",\n remove: { empty: true },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.ok(\"/users\" in doc.paths);\n assert.strictEqual(\"/posts\" in doc.paths, false);\n assert.ok(\"/comments\" in doc.paths);\n });\n\n it(\"should conditionally remove when property is missing\", () => {\n const doc = {\n paths: {\n \"/users\": { get: { \"x-internal\": true } },\n \"/posts\": { get: {} },\n },\n };\n const action: OverlayAction = {\n target: \"$.paths.*\",\n remove: { missing: \"get.x-internal\" },\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, true);\n assert.strictEqual(result.count, 1);\n assert.ok(\"/users\" in doc.paths);\n assert.strictEqual(\"/posts\" in doc.paths, false);\n });\n\n it(\"should return false if target not found\", () => {\n const doc = { paths: {} };\n const action: OverlayAction = {\n target: \"$.paths['/users']\",\n remove: true,\n };\n\n const result = applyAction(doc, action);\n\n assert.strictEqual(result.applied, false);\n assert.strictEqual(result.count, 0);\n });\n });\n\n describe(\"extractPathOrder\", () => {\n it(\"should extract path order from overlay actions\", () => {\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [\n { target: \"$.paths['/users'].get\", update: {} },\n { target: \"$.paths['/posts'].get\", update: {} },\n { target: \"$.paths['/users'].post\", update: {} },\n { target: \"$.info\", update: {} },\n ],\n };\n\n const order = extractPathOrder(overlay);\n\n assert.deepStrictEqual(order, [\"/users\", \"/posts\"]);\n });\n\n it(\"should return empty array if no path actions\", () => {\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [{ target: \"$.info\", update: {} }],\n };\n\n const order = extractPathOrder(overlay);\n\n assert.deepStrictEqual(order, []);\n });\n });\n\n describe(\"reorderOperationProperties\", () => {\n it(\"should reorder operation properties with priority keys first\", () => {\n const operation = {\n responses: {},\n parameters: [],\n operationId: \"getUsers\",\n description: \"Get all users\",\n summary: \"Get users\",\n };\n\n const result = reorderOperationProperties(operation);\n const keys = Object.keys(result);\n\n assert.strictEqual(keys[0], \"summary\");\n assert.strictEqual(keys[1], \"description\");\n assert.strictEqual(keys[2], \"operationId\");\n assert.strictEqual(keys[3], \"responses\");\n assert.strictEqual(keys[4], \"parameters\");\n });\n\n it(\"should handle missing priority keys\", () => {\n const operation = {\n responses: {},\n operationId: \"getUsers\",\n };\n\n const result = reorderOperationProperties(operation);\n const keys = Object.keys(result);\n\n assert.strictEqual(keys[0], \"operationId\");\n assert.strictEqual(keys[1], \"responses\");\n });\n });\n\n describe(\"applyOverlay - full integration\", () => {\n it(\"should apply a complete overlay document\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: {\n title: \"Original API\",\n version: \"1.0.0\",\n },\n paths: {\n \"/users\": {\n get: {\n summary: \"Get users\",\n },\n },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: {\n title: \"My Overlay\",\n version: \"1.0.0\",\n },\n actions: [\n {\n target: \"$.info\",\n description: \"Update API info\",\n update: {\n title: \"Updated API\",\n description: \"An updated API\",\n },\n },\n {\n target: \"$.paths['/users'].get\",\n description: \"Add operation ID\",\n update: {\n operationId: \"getUsers\",\n },\n },\n ],\n };\n\n const { result, stats } = applyOverlay(openapi, overlay);\n\n assert.strictEqual(stats.applied, 2);\n assert.strictEqual(stats.skipped, 0);\n assert.strictEqual(stats.totalNodes, 2);\n\n const info = result.info as Record<string, unknown>;\n assert.strictEqual(info.title, \"Updated API\");\n assert.strictEqual(info.description, \"An updated API\");\n assert.strictEqual(info.version, \"1.0.0\");\n const paths = result.paths as Record<string, unknown>;\n const usersPath = paths[\"/users\"] as Record<string, unknown>;\n const getOperation = usersPath.get as Record<string, unknown>;\n assert.strictEqual(getOperation.operationId, \"getUsers\");\n });\n\n it(\"should handle overlay with remove actions\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"API\" },\n paths: {\n \"/users\": { get: {}, delete: {} },\n \"/internal\": { get: {} },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths.*.delete\",\n description: \"Remove all delete operations\",\n remove: true,\n },\n {\n target: \"$.paths['/internal']\",\n description: \"Remove internal path\",\n remove: true,\n },\n ],\n };\n\n const { result, stats } = applyOverlay(openapi, overlay);\n\n assert.strictEqual(stats.applied, 2);\n assert.strictEqual(stats.totalNodes, 2);\n\n const paths = result.paths as Record<string, unknown>;\n const usersPath = paths[\"/users\"] as Record<string, unknown>;\n assert.strictEqual(\"delete\" in usersPath, false);\n assert.strictEqual(\"/internal\" in paths, false);\n assert.ok(\"/users\" in paths);\n });\n\n it(\"should throw error for invalid overlay format\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n };\n const invalidOverlay = {\n info: { title: \"Invalid\" },\n // Missing 'overlay' and 'actions'\n };\n\n assert.throws(\n () => applyOverlay(openapi, invalidOverlay as unknown),\n /Invalid OpenAPI Overlay document/\n );\n });\n\n it(\"should throw actionable error for overlay with invalid action\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n };\n const invalidOverlay = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths\",\n // Missing both 'update' and 'remove' - invalid!\n },\n ],\n };\n\n let errorMessage = \"\";\n try {\n applyOverlay(openapi, invalidOverlay as unknown);\n } catch (error) {\n errorMessage = (error as Error).message;\n }\n\n assert.ok(\n errorMessage.includes(\n \"Action must specify exactly one of 'update' or 'remove'\"\n ),\n `Expected actionable error message, got: ${errorMessage}`\n );\n });\n\n it(\"should work with incomplete OpenAPI documents\", () => {\n // The overlay tool should be lenient and work with imperfect OpenAPI files\n const incompleteOpenapi = {\n // Missing 'openapi' and 'info' - but that's OK!\n paths: {},\n };\n const overlay = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [{ target: \"$.paths\", update: { \"/test\": { get: {} } } }],\n };\n\n // Should not throw - lenient validation\n const { result } = applyOverlay(incompleteOpenapi, overlay);\n\n // Should have applied the update\n const paths = result.paths as Record<string, unknown>;\n assert.ok(\"/test\" in paths);\n });\n\n it(\"should reject completely invalid OpenAPI document (not an object)\", () => {\n const notAnObject = \"this is a string\";\n const overlay = {\n overlay: \"1.0.0\",\n info: { title: \"Test\", version: \"1.0.0\" },\n actions: [{ target: \"$.paths\", update: { \"/test\": {} } }],\n };\n\n let errorMessage = \"\";\n try {\n applyOverlay(notAnObject, overlay);\n } catch (error) {\n errorMessage = (error as Error).message;\n }\n\n assert.ok(\n errorMessage.includes(\"must be a valid JSON or YAML object\"),\n `Expected error about document not being an object, got: ${errorMessage}`\n );\n });\n\n it(\"should reject empty actions array\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"API\", version: \"1.0.0\" },\n };\n\n const invalidOverlay = {\n overlay: \"1.0.0\",\n info: { title: \"Empty Overlay\", version: \"1.0.0\" },\n actions: [],\n };\n\n let errorMessage = \"\";\n try {\n applyOverlay(openapi, invalidOverlay);\n } catch (error) {\n errorMessage = (error as Error).message;\n }\n\n assert.ok(\n errorMessage.includes(\"Overlay must contain at least one action\"),\n `Expected validation error for empty actions, got: ${errorMessage}`\n );\n });\n\n it(\"should apply overlay with wildcards and conditions\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n paths: {\n \"/users\": {\n get: { \"x-internal\": true, tags: [] },\n post: { tags: [] },\n },\n \"/posts\": { get: { tags: [] } },\n \"/internal\": { get: { \"x-internal\": true, tags: [] } },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Conditional Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths.*.*.tags\",\n description: \"Add default tag\",\n update: [\"public\"],\n },\n {\n target: \"$.paths.*\",\n description: \"Remove paths without x-internal\",\n remove: { missing: \"get.x-internal\" },\n },\n ],\n };\n\n const { result, stats } = applyOverlay(openapi, overlay);\n\n // First action should update all tags arrays (4 operations)\n // Second action should remove /posts (missing x-internal)\n assert.strictEqual(stats.applied, 2);\n\n const paths = result.paths as Record<string, unknown>;\n assert.ok(\"/users\" in paths);\n assert.ok(\"/internal\" in paths);\n assert.strictEqual(\"/posts\" in paths, false);\n });\n\n it(\"should preserve document structure and order\", () => {\n const openapi = {\n openapi: \"3.1.0\",\n info: { title: \"API\", version: \"1.0.0\" },\n servers: [{ url: \"https://api.example.com\" }],\n paths: {},\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.info\",\n update: { description: \"Added description\" },\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const keys = Object.keys(result);\n assert.strictEqual(keys[0], \"openapi\");\n assert.strictEqual(keys[1], \"info\");\n // Priority keys come first: openapi, info, tags (if present)\n // Then other keys in original order\n assert.ok(keys.includes(\"servers\"));\n assert.ok(keys.includes(\"paths\"));\n const info = result.info as Record<string, unknown>;\n assert.strictEqual(info.description, \"Added description\");\n });\n });\n\n describe(\"Complex overlay scenarios\", () => {\n it(\"should handle deep nested updates\", () => {\n const openapi = {\n components: {\n schemas: {\n User: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n },\n },\n },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Schema Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.components.schemas.User.properties\",\n update: {\n name: { type: \"string\" },\n email: { type: \"string\", format: \"email\" },\n },\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const components = result.components as Record<string, unknown>;\n const schemas = components.schemas as Record<string, unknown>;\n const userSchema = schemas.User as Record<string, unknown>;\n const properties = userSchema.properties as Record<string, unknown>;\n assert.ok(properties.id);\n assert.ok(properties.name);\n assert.ok(properties.email);\n const emailProperty = properties.email as Record<string, unknown>;\n assert.strictEqual(emailProperty.format, \"email\");\n });\n\n it(\"should handle array element removal\", () => {\n const openapi = {\n servers: [\n { url: \"https://prod.example.com\", description: \"Production\" },\n { url: \"https://staging.example.com\", description: \"Staging\" },\n { url: \"https://dev.example.com\", description: \"Development\" },\n ],\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Server Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.servers[?(@.description=='Development')]\",\n remove: true,\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const servers = result.servers as Array<Record<string, unknown>>;\n assert.strictEqual(servers.length, 2);\n assert.strictEqual(servers[0].description, \"Production\");\n assert.strictEqual(servers[1].description, \"Staging\");\n });\n\n it(\"should handle parameter merging correctly\", () => {\n const openapi = {\n paths: {\n \"/users/{id}\": {\n parameters: [\n { name: \"id\", in: \"path\", required: true },\n { name: \"fields\", in: \"query\" },\n ],\n get: {},\n },\n },\n };\n\n const overlay: OverlayDocument = {\n overlay: \"1.0.0\",\n info: { title: \"Parameter Overlay\", version: \"1.0.0\" },\n actions: [\n {\n target: \"$.paths['/users/{id}'].parameters\",\n update: [\n {\n name: \"id\",\n in: \"path\",\n description: \"User ID\",\n schema: { type: \"string\" },\n },\n { name: \"include\", in: \"query\", description: \"Include related\" },\n ],\n },\n ],\n };\n\n const { result } = applyOverlay(openapi, overlay);\n\n const paths = result.paths as Record<string, unknown>;\n const usersPath = paths[\"/users/{id}\"] as Record<string, unknown>;\n const params = usersPath.parameters as Array<Record<string, unknown>>;\n assert.strictEqual(params.length, 3);\n\n const idParam = params.find((p) => p.name === \"id\");\n assert.ok(idParam);\n assert.strictEqual(idParam.required, true);\n assert.strictEqual(idParam.description, \"User ID\");\n assert.deepStrictEqual(idParam.schema, { type: \"string\" });\n\n const fieldsParam = params.find((p) => p.name === \"fields\");\n assert.ok(fieldsParam);\n\n const includeParam = params.find((p) => p.name === \"include\");\n assert.ok(includeParam);\n assert.strictEqual(includeParam.description, \"Include related\");\n });\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/source/migrate/dev-portal/handler.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,SAAS,EAMV,MAAM,YAAY,CAAC;AAoBpB,eAAO,MAAM,gBAAgB,GAAU,MAAM,SAAS,kBAkErD,CAAC"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/source/migrate/dev-portal/handler.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,SAAS,EAMV,MAAM,YAAY,CAAC;AAiBpB,eAAO,MAAM,gBAAgB,GAAU,MAAM,SAAS,kBAkErD,CAAC"}
@@ -1,10 +1,10 @@
1
- import { readFile, writeFile, stat, mkdir, rename, unlink, } from "node:fs/promises";
2
- import path from "node:path";
3
1
  import { exec } from "node:child_process";
2
+ import { mkdir, readFile, rename, stat, unlink, writeFile, } from "node:fs/promises";
3
+ import path from "node:path";
4
4
  import { promisify } from "node:util";
5
+ import chalk from "chalk";
5
6
  import glob from "fast-glob";
6
7
  import { format } from "prettier";
7
- import chalk from "chalk";
8
8
  import { printDiagnosticsToConsole } from "../../../common/output.js";
9
9
  import { PluginResult, runPlugins } from "../../../common/runner.js";
10
10
  import { stringifyConfig } from "../../../common/utils/stringify-config.js";
@@ -647,8 +647,11 @@ const createDevPortalRedirectConfig = async (config) => {
647
647
  "x-zuplo-route": {
648
648
  corsPolicy: "none",
649
649
  handler: {
650
- export: "redirectLegacyDevPortal",
650
+ export: "legacyDevPortalHandler",
651
651
  module: "$import(@zuplo/runtime)",
652
+ options: {
653
+ mode: "redirect",
654
+ },
652
655
  },
653
656
  policies: {
654
657
  inbound: [],
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../../src/source/migrate/dev-portal/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n readFile,\n writeFile,\n stat,\n mkdir,\n rename,\n unlink,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport glob from \"fast-glob\";\nimport type {\n DevPortalConfig,\n DevPortalAuthConfig,\n SidebarConfig,\n} from \"@zuplo/types\";\nimport { format } from \"prettier\";\nimport chalk from \"chalk\";\nimport type {\n Arguments,\n MigrationConfig,\n MigrationData,\n MigrationPlugin,\n ZudokuConfig,\n ZudokuNavigationItem,\n} from \"./types.js\";\nimport { printDiagnosticsToConsole } from \"../../../common/output.js\";\nimport { PluginResult, runPlugins } from \"../../../common/runner.js\";\nimport { stringifyConfig } from \"../../../common/utils/stringify-config.js\";\n\nconst exists = (path: string) =>\n stat(path)\n .then(() => true)\n .catch(() => false);\n\nconst deleteUndefinedValues = (obj: Record<string, unknown>) => {\n Object.entries(obj).forEach(([key, value]) => {\n if (value === undefined) {\n delete obj[key];\n }\n });\n};\n\nconst execAsync = promisify(exec);\n\nexport const migrateDevPortal = async (args: Arguments) => {\n const absoluteBaseDir = path.resolve(args.dir);\n\n const tasks = [\n checkGitStatus,\n loadInputFiles,\n validateDevPortalEnabled,\n convertBasicConfig,\n convertSidebar,\n handleApiReferences,\n handleAuthentication,\n handleAdditionalFeatures,\n updatePackageJsonWorkspaces,\n createPackageJson,\n createTsConfig,\n moveMarkdownFiles,\n writeConfigFile,\n createDevPortalRedirectConfig,\n cleanupOldFiles,\n ];\n\n const pluginConfig: MigrationConfig = {\n absoluteBaseDir,\n force: args.force,\n };\n\n const { errors, warnings, notes } = await runPlugins<\n MigrationConfig,\n MigrationData\n >(tasks, pluginConfig);\n\n // Handle plugin errors first (these are execution failures)\n if (errors.length > 0) {\n printDiagnosticsToConsole(\"❌ Migration failed with errors:\");\n errors.forEach((error) =>\n printDiagnosticsToConsole(`- [${error.pluginName}] ${error.message}`)\n );\n process.exit(1);\n }\n\n printDiagnosticsToConsole(\n chalk.green(\"\\n✅ Migration completed successfully! 🎉\")\n );\n\n if (notes.length > 0) {\n printDiagnosticsToConsole(\"\\n📝 Migration notes:\");\n notes.forEach((note) => printDiagnosticsToConsole(`- ${note}`));\n }\n\n if (warnings.length > 0) {\n printDiagnosticsToConsole(\"\\n⚠️ Plugin warnings:\");\n warnings.forEach((warning) =>\n printDiagnosticsToConsole(`- [${warning.pluginName}] ${warning.message}`)\n );\n }\n\n printDiagnosticsToConsole(\"\\nNext steps:\");\n printDiagnosticsToConsole(\"1. Switch to the docs directory:\");\n printDiagnosticsToConsole(\n ` ${chalk.cyan(`cd ${path.join(absoluteBaseDir, \"docs\")}`)}`\n );\n printDiagnosticsToConsole(\"\\n2. Install dependencies:\");\n printDiagnosticsToConsole(` ${chalk.cyan(\"npm install\")}`);\n printDiagnosticsToConsole(\"\\n3. Start the dev portal:\");\n printDiagnosticsToConsole(` ${chalk.cyan(\"npm run dev\")}`);\n printDiagnosticsToConsole(\"\");\n};\n\nconst checkGitStatus: MigrationPlugin = async (config) => {\n if (config.force) return new PluginResult();\n\n try {\n // Check if we're in a git repository first\n await execAsync(\"git rev-parse --git-dir\", { cwd: config.absoluteBaseDir });\n\n // Check for uncommitted changes\n const status = await execAsync(\"git status --porcelain\", {\n cwd: config.absoluteBaseDir,\n });\n if (status.stdout.trim() !== \"\") {\n return new PluginResult({\n pluginName: \"check-git-status\",\n message:\n \"There are uncommitted changes in the repository.\\nCommit or stash them before running the migration, or use --force to proceed anyway.\",\n severity: \"error\",\n });\n }\n } catch {\n // If git command fails, likely not a git repository - continue silently\n }\n return new PluginResult();\n};\n\nconst loadInputFiles: MigrationPlugin = async (config, { data }) => {\n const dir = config.absoluteBaseDir;\n\n try {\n const packageJson = JSON.parse(\n await readFile(path.join(dir, \"package.json\"), \"utf-8\")\n );\n const inputFile = path.join(dir, \"config/dev-portal.json\");\n const sidebarFile = path.join(dir, \"docs/sidebar.json\");\n\n const devPortalConfig: DevPortalConfig = JSON.parse(\n await readFile(inputFile, \"utf-8\")\n );\n\n const sidebar: SidebarConfig = JSON.parse(\n await readFile(sidebarFile, \"utf-8\")\n );\n\n const themeCssFilePath = path.join(dir, \"docs/theme.css\");\n if (await exists(themeCssFilePath)) {\n data.themeCss = await readFile(themeCssFilePath, \"utf-8\");\n }\n\n data.packageJson = packageJson;\n data.devPortalConfig = devPortalConfig;\n data.sidebar = sidebar;\n\n return new PluginResult();\n } catch (error) {\n return new PluginResult({\n pluginName: \"load-input-files\",\n message: `Failed to load input files: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst validateDevPortalEnabled: MigrationPlugin = async (_, { data }) => {\n if (data.devPortalConfig?.enabled === false) {\n return new PluginResult({\n pluginName: \"validate-dev-portal-enabled\",\n message: \"Dev portal is not enabled in the config\",\n severity: \"error\",\n });\n }\n\n return new PluginResult();\n};\n\nconst convertBasicConfig: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.devPortalConfig) {\n return new PluginResult({\n pluginName: \"convert-basic-config\",\n message: \"Dev portal config not found\",\n severity: \"error\",\n });\n }\n\n const zudokuConfig: ZudokuConfig = {\n site: {\n title: data.devPortalConfig.pageTitle || \"Developer Portal\",\n logo: {\n src: {\n light: \"https://cdn.zuplo.com/assets/my-dev-portal-light.svg\",\n dark: \"https://cdn.zuplo.com/assets/my-dev-portal-dark.svg\",\n },\n alt: data.devPortalConfig.pageTitle || \"Developer Portal\",\n href: \"/\",\n },\n },\n };\n\n // Map favicon\n if (data.devPortalConfig.faviconUrl) {\n zudokuConfig.metadata = {\n ...zudokuConfig.metadata,\n favicon: data.devPortalConfig.faviconUrl,\n };\n }\n\n // Map page title\n if (data.devPortalConfig.pageTitle) {\n zudokuConfig.metadata = {\n ...zudokuConfig.metadata,\n title: data.devPortalConfig.pageTitle,\n };\n }\n\n // Map site pathname to basePath\n if (data.devPortalConfig.sitePathname) {\n zudokuConfig.basePath = data.devPortalConfig.sitePathname;\n }\n\n // Extract logo URL from theme CSS if available\n if (data.themeCss) {\n try {\n const logoUrlMatch = data.themeCss.match(\n /--logo-url\\s*:\\s*url\\((.*?)\\)/\n );\n if (logoUrlMatch?.[1]) {\n const logoUrl = logoUrlMatch[1].trim();\n zudokuConfig.site = zudokuConfig.site || {};\n zudokuConfig.site.logo = {\n ...zudokuConfig.site.logo,\n src: {\n light: logoUrl,\n dark: logoUrl,\n },\n alt: zudokuConfig.site.title || \"Developer Portal\",\n href: \"/\",\n width: 200,\n };\n }\n } catch (error) {\n // Log warning but don't fail the migration\n const result = new PluginResult();\n result.warnings.push({\n message: `Failed to extract logo URL from theme.css. You will need to set the logo manually.`,\n pluginName: \"convert-basic-config\",\n severity: \"warning\",\n });\n data.zudokuConfig = zudokuConfig;\n return result;\n }\n }\n\n data.zudokuConfig = zudokuConfig;\n return new PluginResult();\n } catch (error) {\n return new PluginResult({\n pluginName: \"convert-basic-config\",\n message: `Failed to convert basic config: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst convertSidebar: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.sidebar || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"convert-sidebar\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n const convertSidebarToNavigation = (\n oldSidebar: SidebarConfig\n ): ZudokuNavigationItem[] => {\n const navigation: ZudokuNavigationItem[] = [];\n\n if (!oldSidebar.docs) {\n return navigation;\n }\n\n for (const item of oldSidebar.docs) {\n if (typeof item === \"string\") {\n navigation.push(item);\n } else if (item.type === \"doc\") {\n const docItem: ZudokuNavigationItem = {\n type: \"doc\",\n file: item.id,\n label: item.label,\n };\n\n if (\"defaultPage\" in item && item.defaultPage) {\n docItem.path = \"/\";\n }\n\n navigation.push(docItem);\n } else if (item.type === \"category\") {\n const category: ZudokuNavigationItem = {\n type: \"category\",\n label: item.label,\n items: [],\n };\n\n if (item.link) {\n if (typeof item.link === \"string\") {\n category.link = item.link;\n } else if (item.link.type === \"doc\") {\n category.link = { type: \"doc\", file: item.link.id };\n }\n }\n\n if (item.items) {\n category.items = [];\n for (const subItem of item.items) {\n if (typeof subItem === \"string\") {\n category.items.push({\n type: \"doc\",\n file: subItem,\n });\n } else if (subItem.type === \"doc\") {\n category.items.push({\n type: \"doc\",\n file: subItem.id,\n label: subItem.label,\n });\n }\n }\n }\n\n navigation.push(category);\n }\n }\n\n return navigation;\n };\n\n const navigation = convertSidebarToNavigation(data.sidebar);\n data.zudokuConfig = {\n ...data.zudokuConfig,\n navigation,\n };\n\n const result = new PluginResult();\n if (navigation.length > 0) {\n result.notes.push(\n `Converted sidebar navigation: ${navigation.length} navigation items`\n );\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"convert-sidebar\",\n message: `Failed to convert sidebar: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst handleApiReferences: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.sidebar || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"handle-api-references\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n const apiRefItems = data.sidebar.docs?.filter(\n (item) => typeof item !== \"string\" && item.type === \"api-ref\"\n );\n\n const result = new PluginResult();\n\n if (!apiRefItems || apiRefItems.length === 0) {\n return result;\n }\n\n data.zudokuConfig.apis = apiRefItems.map((apiRefItem, index) => {\n const specInput = apiRefItem.defaultSpec\n ? `../config/${apiRefItem.defaultSpec}.oas.json`\n : \"../config/routes.oas.json\";\n\n const apiPath = index === 0 ? \"/api\" : `/api-${index + 1}`;\n\n result.notes.push(`Migrated API reference to ${apiPath}`);\n\n return {\n type: \"file\" as const,\n input: specInput,\n path: apiPath,\n };\n });\n\n if (apiRefItems.length > 1) {\n result.warnings.push({\n message:\n \"Multiple API references found. Adding multiple links to the navigation. For advanced use cases you can use an API catalog. See: https://zuplo.com/docs/dev-portal/zudoku/configuration/api-catalog.\",\n pluginName: \"handle-api-references\",\n severity: \"warning\",\n });\n }\n\n const navigationLinks = apiRefItems.map((apiRefItem, index) => {\n const apiPath = index === 0 ? \"/api\" : `/api-${index + 1}`;\n return {\n type: \"link\" as const,\n to: apiPath,\n label: apiRefItem.label,\n };\n });\n\n // Add API navigation links to the existing navigation\n data.zudokuConfig.navigation = [\n ...(data.zudokuConfig.navigation || []),\n ...navigationLinks,\n ];\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"handle-api-references\",\n message: `Failed to handle API references: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst handleAuthentication: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.devPortalConfig || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"handle-authentication\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n if (data.devPortalConfig.authentication) {\n const auth = data.devPortalConfig.authentication as DevPortalAuthConfig;\n\n // Extract client info - handle both current and legacy structures\n let clientId: string | undefined;\n let audience: string | undefined;\n let issuer: string | undefined;\n let scope: string | undefined;\n\n if (\"clientId\" in auth) {\n // Current format\n clientId = auth.clientId;\n audience = auth.audience;\n issuer = auth.issuer;\n scope = auth.scope;\n } else if (\"devPortalClient\" in auth) {\n // Legacy format\n clientId = auth.devPortalClient?.clientId;\n audience = auth.devPortalClient?.audience;\n issuer = auth.authority;\n }\n\n if (auth.provider === \"auth0\") {\n data.zudokuConfig.authentication = {\n type: \"auth0\",\n clientId,\n domain: issuer?.replace(\"https://\", \"\").replace(\"/\", \"\"),\n audience,\n scopes: scope?.split(\" \"),\n };\n } else if (auth.provider === \"clerk\") {\n const clerkPubKey = issuer?.match(/clerk\\.accounts\\.dev/)?.[0]\n ? issuer.split(\"://\")[1]?.split(\".\")[0]\n : undefined;\n\n data.zudokuConfig.authentication = {\n type: \"clerk\",\n clerkPubKey: clerkPubKey || clientId,\n };\n } else {\n // All other providers (azure-ad, okta, oidc, etc.) use OpenID Connect\n data.zudokuConfig.authentication = {\n type: \"openid\",\n clientId,\n issuer,\n audience,\n scopes: scope?.split(\" \"),\n };\n }\n }\n\n if (data.zudokuConfig.authentication) {\n deleteUndefinedValues(data.zudokuConfig.authentication);\n }\n\n const result = new PluginResult();\n if (data.zudokuConfig.authentication) {\n result.notes.push(\n `Configured ${data.zudokuConfig.authentication.type} authentication`\n );\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"handle-authentication\",\n message: `Failed to handle authentication: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst handleAdditionalFeatures: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.devPortalConfig || !data.sidebar || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"handle-additional-features\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n const result = new PluginResult();\n\n // Handle API keys\n if (data.devPortalConfig.apiKeys) {\n data.zudokuConfig.apiKeys = {\n enabled: true,\n };\n }\n\n // Check for unsupported specs filtering\n const hasSpecsFiltering = data.sidebar.docs?.some((item) => {\n if (typeof item === \"string\") return false;\n if (item.type === \"doc\" && \"specs\" in item && item.specs) return true;\n if (item.type === \"category\" && \"specs\" in item && item.specs)\n return true;\n if (item.type === \"category\" && item.items) {\n return item.items.some(\n (subItem) =>\n typeof subItem !== \"string\" && \"specs\" in subItem && subItem.specs\n );\n }\n return false;\n });\n\n if (hasSpecsFiltering) {\n result.warnings.push({\n message:\n \"The 'specs' property for filtering docs by OpenAPI specification is not supported in Zudoku\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n\n if (data.devPortalConfig.monetization) {\n result.warnings.push({\n message:\n \"Monetization configuration is not supported in the new dev portal.\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n if (data.devPortalConfig.enableMetering) {\n result.warnings.push({\n message: \"Metering is not supported in the new dev portal.\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n if (\n data.devPortalConfig.authorizePathname &&\n data.devPortalConfig.authorizePathname !== \"/oauth/authorize\"\n ) {\n result.warnings.push({\n message:\n \"Custom authorize pathname is not configurable in the new dev portal.\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n\n // Add notes for successfully configured features\n if (data.zudokuConfig.apiKeys?.enabled) {\n result.notes.push(\"Enabled API keys support\");\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"handle-additional-features\",\n message: `Failed to handle additional features: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst createPackageJson: MigrationPlugin = async (config) => {\n try {\n const packageJsonFile = path.join(\n config.absoluteBaseDir,\n \"docs/package.json\"\n );\n\n if (!config.force && (await exists(packageJsonFile))) {\n return new PluginResult({\n pluginName: \"create-package-json\",\n message: \"package.json already exists\",\n severity: \"warning\",\n });\n }\n\n // get the version of zudoku from npm online:\n const zudokuPackageJson = await fetch(\n \"https://cdn.jsdelivr.net/npm/zudoku/package.json\"\n ).then((res) => res.json());\n\n const packageJsonContent = {\n name: \"docs\",\n version: \"1.0.0\",\n type: \"module\",\n private: true,\n scripts: {\n dev: \"zudoku dev --zuplo\",\n build: \"zudoku build\",\n start: \"zudoku start\",\n },\n dependencies: {\n zudoku: zudokuPackageJson.version || \"latest\",\n react: zudokuPackageJson.dependencies.react || \"^19.0.0\",\n \"react-dom\": zudokuPackageJson.dependencies[\"react-dom\"] || \"^19.0.0\",\n },\n devDependencies: {\n \"@types/node\": \"^22\",\n \"@types/react\": \">=19\",\n \"@types/react-dom\": \">=19\",\n typescript: zudokuPackageJson.devDependencies.typescript || \"^5\",\n },\n };\n\n await writeFile(\n packageJsonFile,\n JSON.stringify(packageJsonContent, null, 2)\n );\n\n const result = new PluginResult();\n result.notes.push(\"Wrote docs/package.json\");\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"create-package-json\",\n message: `Failed to create package.json: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst createTsConfig: MigrationPlugin = async (config) => {\n try {\n const tsConfigFile = path.join(\n config.absoluteBaseDir,\n \"docs/tsconfig.json\"\n );\n\n if (!config.force && (await exists(tsConfigFile))) {\n return new PluginResult({\n pluginName: \"create-tsconfig\",\n message: \"tsconfig.json already exists\",\n severity: \"warning\",\n });\n }\n\n const tsConfigContent = await fetch(\n \"https://cdn.jsdelivr.net/npm/create-zudoku/dist/templates/zuplo/tsconfig.json\"\n ).then((res) => res.text());\n\n await writeFile(tsConfigFile, tsConfigContent);\n\n const result = new PluginResult();\n result.notes.push(\"Wrote docs/tsconfig.json\");\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"create-tsconfig\",\n message: `Failed to create tsconfig.json: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst updatePackageJsonWorkspaces: MigrationPlugin = async (config) => {\n try {\n const packageJsonFile = path.join(config.absoluteBaseDir, \"package.json\");\n\n if (!(await exists(packageJsonFile))) {\n return new PluginResult({\n pluginName: \"update-package-json-workspaces\",\n message: \"Root package.json not found\",\n severity: \"warning\",\n });\n }\n\n const packageJsonContent = JSON.parse(\n await readFile(packageJsonFile, \"utf-8\")\n );\n\n if (Array.isArray(packageJsonContent.workspaces)) {\n if (!packageJsonContent.workspaces.includes(\"docs\")) {\n packageJsonContent.workspaces.push(\"docs\");\n }\n } else if (!packageJsonContent.workspaces) {\n packageJsonContent.workspaces = [\"docs\"];\n }\n\n packageJsonContent.scripts = packageJsonContent.scripts || {};\n if (!packageJsonContent.scripts[\"docs\"]) {\n packageJsonContent.scripts[\"docs\"] = \"npm run dev --workspace docs\";\n }\n\n await writeFile(\n packageJsonFile,\n JSON.stringify(packageJsonContent, null, 2)\n );\n\n const result = new PluginResult();\n result.notes.push(\"Updated package.json workspaces\");\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"update-package-json-workspaces\",\n message: `Failed to update package.json workspaces: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst moveMarkdownFiles: MigrationPlugin = async (config) => {\n try {\n const docsDir = path.join(config.absoluteBaseDir, \"docs\");\n const pagesDir = path.join(docsDir, \"pages\");\n\n const markdownFiles = await glob([\"*.md\", \"*.mdx\"], {\n cwd: docsDir,\n absolute: false,\n });\n\n try {\n await mkdir(pagesDir, { recursive: true });\n } catch {\n // directory might already exist, that's okay\n }\n\n const result = new PluginResult();\n const movedFiles: string[] = [];\n\n for (const file of markdownFiles) {\n const sourcePath = path.join(docsDir, file);\n const targetPath = path.join(pagesDir, file);\n\n try {\n await rename(sourcePath, targetPath);\n movedFiles.push(file);\n } catch (error) {\n result.warnings.push({\n message: `Failed to move ${file}: ${(error as Error).message}`,\n pluginName: \"move-markdown-files\",\n severity: \"warning\",\n });\n }\n }\n\n if (movedFiles.length > 0) {\n result.notes.push(\n `Moved ${movedFiles.length} markdown files to docs/pages/`\n );\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"move-markdown-files\",\n message: `Failed to move markdown files: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst createDevPortalRedirectConfig: MigrationPlugin = async (config) => {\n try {\n const devPortalOasFile = path.join(\n config.absoluteBaseDir,\n \"config\",\n \"dev-portal.oas.json\"\n );\n\n const oasContent = {\n openapi: \"3.1.0\",\n info: {\n version: \"1.0.0\",\n title: \"Dev Portal Redirect\",\n },\n paths: {\n \"/docs(.*)\": {\n \"x-zuplo-path\": {\n pathMode: \"url-pattern\",\n },\n get: {\n summary: \"Redirect\",\n description: \"Redirect to the new Dev Portal domain\",\n \"x-zuplo-route\": {\n corsPolicy: \"none\",\n handler: {\n export: \"redirectLegacyDevPortal\",\n module: \"$import(@zuplo/runtime)\",\n },\n policies: {\n inbound: [],\n },\n },\n operationId: \"dev-portal-redirect\",\n \"x-internal\": true,\n },\n },\n },\n };\n\n await writeFile(devPortalOasFile, JSON.stringify(oasContent, null, 2));\n\n const result = new PluginResult();\n result.notes.push(\n \"Created config/dev-portal.oas.json for legacy dev portal redirects\"\n );\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"create-dev-portal-redirect-config\",\n message: `Failed to create dev-portal.oas.json: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst cleanupOldFiles: MigrationPlugin = async (config) => {\n try {\n const filesToCleanup = [\n path.join(config.absoluteBaseDir, \"config/dev-portal.json\"),\n path.join(config.absoluteBaseDir, \"docs/sidebar.json\"),\n path.join(config.absoluteBaseDir, \"docs/theme.css\"),\n ];\n\n const result = new PluginResult();\n const cleanedFiles: string[] = [];\n\n for (const filePath of filesToCleanup) {\n try {\n if (await exists(filePath)) {\n await unlink(filePath);\n cleanedFiles.push(path.relative(config.absoluteBaseDir, filePath));\n }\n } catch (error) {\n result.warnings.push({\n message: `Failed to remove ${path.relative(config.absoluteBaseDir, filePath)}: ${(error as Error).message}`,\n pluginName: \"cleanup-old-files\",\n severity: \"warning\",\n });\n }\n }\n\n if (cleanedFiles.length > 0) {\n result.notes.push(`Cleaned up old files: ${cleanedFiles.join(\", \")}`);\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"cleanup-old-files\",\n message: `Failed to cleanup old files: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst writeConfigFile: MigrationPlugin = async (config, { data }) => {\n try {\n if (!data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"write-output-file\",\n message: \"Zudoku config not found\",\n severity: \"error\",\n });\n }\n\n const outputFile = path.join(\n config.absoluteBaseDir,\n \"docs/zudoku.config.tsx\"\n );\n\n const configContent = [];\n\n configContent.push(`// This file was generated by the Zuplo CLI migrate-dev-portal command.\n// It is used to configure the Zuplo dev portal.\n// You can edit this file to customize the dev portal.\n// For more information, see https://zuplo.com/docs/dev-portal/zudoku/configuration/overview`);\n\n configContent.push(`import type { ZudokuConfig } from \"zudoku\";\\n`);\n configContent.push(\n `const config: ZudokuConfig = ${stringifyConfig(data.zudokuConfig)}`\n );\n configContent.push(`export default config;`);\n\n await writeFile(\n outputFile,\n await format(configContent.join(\"\\n\"), { parser: \"typescript\" })\n );\n\n const result = new PluginResult();\n result.notes.push(\"Wrote docs/zudoku.config.tsx\");\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"write-output-file\",\n message: `Failed to write output file: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../../src/source/migrate/dev-portal/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { exec } from \"node:child_process\";\nimport {\n mkdir,\n readFile,\n rename,\n stat,\n unlink,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type {\n DevPortalAuthConfig,\n DevPortalConfig,\n SidebarConfig,\n} from \"@zuplo/types\";\nimport chalk from \"chalk\";\nimport glob from \"fast-glob\";\nimport { format } from \"prettier\";\nimport { printDiagnosticsToConsole } from \"../../../common/output.js\";\nimport { PluginResult, runPlugins } from \"../../../common/runner.js\";\nimport { stringifyConfig } from \"../../../common/utils/stringify-config.js\";\nimport type {\n Arguments,\n MigrationConfig,\n MigrationData,\n MigrationPlugin,\n ZudokuConfig,\n ZudokuNavigationItem,\n} from \"./types.js\";\n\nconst exists = (path: string) =>\n stat(path)\n .then(() => true)\n .catch(() => false);\n\nconst deleteUndefinedValues = (obj: Record<string, unknown>) => {\n Object.entries(obj).forEach(([key, value]) => {\n if (value === undefined) {\n delete obj[key];\n }\n });\n};\n\nconst execAsync = promisify(exec);\n\nexport const migrateDevPortal = async (args: Arguments) => {\n const absoluteBaseDir = path.resolve(args.dir);\n\n const tasks = [\n checkGitStatus,\n loadInputFiles,\n validateDevPortalEnabled,\n convertBasicConfig,\n convertSidebar,\n handleApiReferences,\n handleAuthentication,\n handleAdditionalFeatures,\n updatePackageJsonWorkspaces,\n createPackageJson,\n createTsConfig,\n moveMarkdownFiles,\n writeConfigFile,\n createDevPortalRedirectConfig,\n cleanupOldFiles,\n ];\n\n const pluginConfig: MigrationConfig = {\n absoluteBaseDir,\n force: args.force,\n };\n\n const { errors, warnings, notes } = await runPlugins<\n MigrationConfig,\n MigrationData\n >(tasks, pluginConfig);\n\n // Handle plugin errors first (these are execution failures)\n if (errors.length > 0) {\n printDiagnosticsToConsole(\"❌ Migration failed with errors:\");\n errors.forEach((error) =>\n printDiagnosticsToConsole(`- [${error.pluginName}] ${error.message}`)\n );\n process.exit(1);\n }\n\n printDiagnosticsToConsole(\n chalk.green(\"\\n✅ Migration completed successfully! 🎉\")\n );\n\n if (notes.length > 0) {\n printDiagnosticsToConsole(\"\\n📝 Migration notes:\");\n notes.forEach((note) => printDiagnosticsToConsole(`- ${note}`));\n }\n\n if (warnings.length > 0) {\n printDiagnosticsToConsole(\"\\n⚠️ Plugin warnings:\");\n warnings.forEach((warning) =>\n printDiagnosticsToConsole(`- [${warning.pluginName}] ${warning.message}`)\n );\n }\n\n printDiagnosticsToConsole(\"\\nNext steps:\");\n printDiagnosticsToConsole(\"1. Switch to the docs directory:\");\n printDiagnosticsToConsole(\n ` ${chalk.cyan(`cd ${path.join(absoluteBaseDir, \"docs\")}`)}`\n );\n printDiagnosticsToConsole(\"\\n2. Install dependencies:\");\n printDiagnosticsToConsole(` ${chalk.cyan(\"npm install\")}`);\n printDiagnosticsToConsole(\"\\n3. Start the dev portal:\");\n printDiagnosticsToConsole(` ${chalk.cyan(\"npm run dev\")}`);\n printDiagnosticsToConsole(\"\");\n};\n\nconst checkGitStatus: MigrationPlugin = async (config) => {\n if (config.force) return new PluginResult();\n\n try {\n // Check if we're in a git repository first\n await execAsync(\"git rev-parse --git-dir\", { cwd: config.absoluteBaseDir });\n\n // Check for uncommitted changes\n const status = await execAsync(\"git status --porcelain\", {\n cwd: config.absoluteBaseDir,\n });\n if (status.stdout.trim() !== \"\") {\n return new PluginResult({\n pluginName: \"check-git-status\",\n message:\n \"There are uncommitted changes in the repository.\\nCommit or stash them before running the migration, or use --force to proceed anyway.\",\n severity: \"error\",\n });\n }\n } catch {\n // If git command fails, likely not a git repository - continue silently\n }\n return new PluginResult();\n};\n\nconst loadInputFiles: MigrationPlugin = async (config, { data }) => {\n const dir = config.absoluteBaseDir;\n\n try {\n const packageJson = JSON.parse(\n await readFile(path.join(dir, \"package.json\"), \"utf-8\")\n );\n const inputFile = path.join(dir, \"config/dev-portal.json\");\n const sidebarFile = path.join(dir, \"docs/sidebar.json\");\n\n const devPortalConfig: DevPortalConfig = JSON.parse(\n await readFile(inputFile, \"utf-8\")\n );\n\n const sidebar: SidebarConfig = JSON.parse(\n await readFile(sidebarFile, \"utf-8\")\n );\n\n const themeCssFilePath = path.join(dir, \"docs/theme.css\");\n if (await exists(themeCssFilePath)) {\n data.themeCss = await readFile(themeCssFilePath, \"utf-8\");\n }\n\n data.packageJson = packageJson;\n data.devPortalConfig = devPortalConfig;\n data.sidebar = sidebar;\n\n return new PluginResult();\n } catch (error) {\n return new PluginResult({\n pluginName: \"load-input-files\",\n message: `Failed to load input files: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst validateDevPortalEnabled: MigrationPlugin = async (_, { data }) => {\n if (data.devPortalConfig?.enabled === false) {\n return new PluginResult({\n pluginName: \"validate-dev-portal-enabled\",\n message: \"Dev portal is not enabled in the config\",\n severity: \"error\",\n });\n }\n\n return new PluginResult();\n};\n\nconst convertBasicConfig: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.devPortalConfig) {\n return new PluginResult({\n pluginName: \"convert-basic-config\",\n message: \"Dev portal config not found\",\n severity: \"error\",\n });\n }\n\n const zudokuConfig: ZudokuConfig = {\n site: {\n title: data.devPortalConfig.pageTitle || \"Developer Portal\",\n logo: {\n src: {\n light: \"https://cdn.zuplo.com/assets/my-dev-portal-light.svg\",\n dark: \"https://cdn.zuplo.com/assets/my-dev-portal-dark.svg\",\n },\n alt: data.devPortalConfig.pageTitle || \"Developer Portal\",\n href: \"/\",\n },\n },\n };\n\n // Map favicon\n if (data.devPortalConfig.faviconUrl) {\n zudokuConfig.metadata = {\n ...zudokuConfig.metadata,\n favicon: data.devPortalConfig.faviconUrl,\n };\n }\n\n // Map page title\n if (data.devPortalConfig.pageTitle) {\n zudokuConfig.metadata = {\n ...zudokuConfig.metadata,\n title: data.devPortalConfig.pageTitle,\n };\n }\n\n // Map site pathname to basePath\n if (data.devPortalConfig.sitePathname) {\n zudokuConfig.basePath = data.devPortalConfig.sitePathname;\n }\n\n // Extract logo URL from theme CSS if available\n if (data.themeCss) {\n try {\n const logoUrlMatch = data.themeCss.match(\n /--logo-url\\s*:\\s*url\\((.*?)\\)/\n );\n if (logoUrlMatch?.[1]) {\n const logoUrl = logoUrlMatch[1].trim();\n zudokuConfig.site = zudokuConfig.site || {};\n zudokuConfig.site.logo = {\n ...zudokuConfig.site.logo,\n src: {\n light: logoUrl,\n dark: logoUrl,\n },\n alt: zudokuConfig.site.title || \"Developer Portal\",\n href: \"/\",\n width: 200,\n };\n }\n } catch (error) {\n // Log warning but don't fail the migration\n const result = new PluginResult();\n result.warnings.push({\n message: `Failed to extract logo URL from theme.css. You will need to set the logo manually.`,\n pluginName: \"convert-basic-config\",\n severity: \"warning\",\n });\n data.zudokuConfig = zudokuConfig;\n return result;\n }\n }\n\n data.zudokuConfig = zudokuConfig;\n return new PluginResult();\n } catch (error) {\n return new PluginResult({\n pluginName: \"convert-basic-config\",\n message: `Failed to convert basic config: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst convertSidebar: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.sidebar || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"convert-sidebar\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n const convertSidebarToNavigation = (\n oldSidebar: SidebarConfig\n ): ZudokuNavigationItem[] => {\n const navigation: ZudokuNavigationItem[] = [];\n\n if (!oldSidebar.docs) {\n return navigation;\n }\n\n for (const item of oldSidebar.docs) {\n if (typeof item === \"string\") {\n navigation.push(item);\n } else if (item.type === \"doc\") {\n const docItem: ZudokuNavigationItem = {\n type: \"doc\",\n file: item.id,\n label: item.label,\n };\n\n if (\"defaultPage\" in item && item.defaultPage) {\n docItem.path = \"/\";\n }\n\n navigation.push(docItem);\n } else if (item.type === \"category\") {\n const category: ZudokuNavigationItem = {\n type: \"category\",\n label: item.label,\n items: [],\n };\n\n if (item.link) {\n if (typeof item.link === \"string\") {\n category.link = item.link;\n } else if (item.link.type === \"doc\") {\n category.link = { type: \"doc\", file: item.link.id };\n }\n }\n\n if (item.items) {\n category.items = [];\n for (const subItem of item.items) {\n if (typeof subItem === \"string\") {\n category.items.push({\n type: \"doc\",\n file: subItem,\n });\n } else if (subItem.type === \"doc\") {\n category.items.push({\n type: \"doc\",\n file: subItem.id,\n label: subItem.label,\n });\n }\n }\n }\n\n navigation.push(category);\n }\n }\n\n return navigation;\n };\n\n const navigation = convertSidebarToNavigation(data.sidebar);\n data.zudokuConfig = {\n ...data.zudokuConfig,\n navigation,\n };\n\n const result = new PluginResult();\n if (navigation.length > 0) {\n result.notes.push(\n `Converted sidebar navigation: ${navigation.length} navigation items`\n );\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"convert-sidebar\",\n message: `Failed to convert sidebar: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst handleApiReferences: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.sidebar || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"handle-api-references\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n const apiRefItems = data.sidebar.docs?.filter(\n (item) => typeof item !== \"string\" && item.type === \"api-ref\"\n );\n\n const result = new PluginResult();\n\n if (!apiRefItems || apiRefItems.length === 0) {\n return result;\n }\n\n data.zudokuConfig.apis = apiRefItems.map((apiRefItem, index) => {\n const specInput = apiRefItem.defaultSpec\n ? `../config/${apiRefItem.defaultSpec}.oas.json`\n : \"../config/routes.oas.json\";\n\n const apiPath = index === 0 ? \"/api\" : `/api-${index + 1}`;\n\n result.notes.push(`Migrated API reference to ${apiPath}`);\n\n return {\n type: \"file\" as const,\n input: specInput,\n path: apiPath,\n };\n });\n\n if (apiRefItems.length > 1) {\n result.warnings.push({\n message:\n \"Multiple API references found. Adding multiple links to the navigation. For advanced use cases you can use an API catalog. See: https://zuplo.com/docs/dev-portal/zudoku/configuration/api-catalog.\",\n pluginName: \"handle-api-references\",\n severity: \"warning\",\n });\n }\n\n const navigationLinks = apiRefItems.map((apiRefItem, index) => {\n const apiPath = index === 0 ? \"/api\" : `/api-${index + 1}`;\n return {\n type: \"link\" as const,\n to: apiPath,\n label: apiRefItem.label,\n };\n });\n\n // Add API navigation links to the existing navigation\n data.zudokuConfig.navigation = [\n ...(data.zudokuConfig.navigation || []),\n ...navigationLinks,\n ];\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"handle-api-references\",\n message: `Failed to handle API references: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst handleAuthentication: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.devPortalConfig || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"handle-authentication\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n if (data.devPortalConfig.authentication) {\n const auth = data.devPortalConfig.authentication as DevPortalAuthConfig;\n\n // Extract client info - handle both current and legacy structures\n let clientId: string | undefined;\n let audience: string | undefined;\n let issuer: string | undefined;\n let scope: string | undefined;\n\n if (\"clientId\" in auth) {\n // Current format\n clientId = auth.clientId;\n audience = auth.audience;\n issuer = auth.issuer;\n scope = auth.scope;\n } else if (\"devPortalClient\" in auth) {\n // Legacy format\n clientId = auth.devPortalClient?.clientId;\n audience = auth.devPortalClient?.audience;\n issuer = auth.authority;\n }\n\n if (auth.provider === \"auth0\") {\n data.zudokuConfig.authentication = {\n type: \"auth0\",\n clientId,\n domain: issuer?.replace(\"https://\", \"\").replace(\"/\", \"\"),\n audience,\n scopes: scope?.split(\" \"),\n };\n } else if (auth.provider === \"clerk\") {\n const clerkPubKey = issuer?.match(/clerk\\.accounts\\.dev/)?.[0]\n ? issuer.split(\"://\")[1]?.split(\".\")[0]\n : undefined;\n\n data.zudokuConfig.authentication = {\n type: \"clerk\",\n clerkPubKey: clerkPubKey || clientId,\n };\n } else {\n // All other providers (azure-ad, okta, oidc, etc.) use OpenID Connect\n data.zudokuConfig.authentication = {\n type: \"openid\",\n clientId,\n issuer,\n audience,\n scopes: scope?.split(\" \"),\n };\n }\n }\n\n if (data.zudokuConfig.authentication) {\n deleteUndefinedValues(data.zudokuConfig.authentication);\n }\n\n const result = new PluginResult();\n if (data.zudokuConfig.authentication) {\n result.notes.push(\n `Configured ${data.zudokuConfig.authentication.type} authentication`\n );\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"handle-authentication\",\n message: `Failed to handle authentication: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst handleAdditionalFeatures: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.devPortalConfig || !data.sidebar || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"handle-additional-features\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n const result = new PluginResult();\n\n // Handle API keys\n if (data.devPortalConfig.apiKeys) {\n data.zudokuConfig.apiKeys = {\n enabled: true,\n };\n }\n\n // Check for unsupported specs filtering\n const hasSpecsFiltering = data.sidebar.docs?.some((item) => {\n if (typeof item === \"string\") return false;\n if (item.type === \"doc\" && \"specs\" in item && item.specs) return true;\n if (item.type === \"category\" && \"specs\" in item && item.specs)\n return true;\n if (item.type === \"category\" && item.items) {\n return item.items.some(\n (subItem) =>\n typeof subItem !== \"string\" && \"specs\" in subItem && subItem.specs\n );\n }\n return false;\n });\n\n if (hasSpecsFiltering) {\n result.warnings.push({\n message:\n \"The 'specs' property for filtering docs by OpenAPI specification is not supported in Zudoku\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n\n if (data.devPortalConfig.monetization) {\n result.warnings.push({\n message:\n \"Monetization configuration is not supported in the new dev portal.\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n if (data.devPortalConfig.enableMetering) {\n result.warnings.push({\n message: \"Metering is not supported in the new dev portal.\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n if (\n data.devPortalConfig.authorizePathname &&\n data.devPortalConfig.authorizePathname !== \"/oauth/authorize\"\n ) {\n result.warnings.push({\n message:\n \"Custom authorize pathname is not configurable in the new dev portal.\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n\n // Add notes for successfully configured features\n if (data.zudokuConfig.apiKeys?.enabled) {\n result.notes.push(\"Enabled API keys support\");\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"handle-additional-features\",\n message: `Failed to handle additional features: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst createPackageJson: MigrationPlugin = async (config) => {\n try {\n const packageJsonFile = path.join(\n config.absoluteBaseDir,\n \"docs/package.json\"\n );\n\n if (!config.force && (await exists(packageJsonFile))) {\n return new PluginResult({\n pluginName: \"create-package-json\",\n message: \"package.json already exists\",\n severity: \"warning\",\n });\n }\n\n // get the version of zudoku from npm online:\n const zudokuPackageJson = await fetch(\n \"https://cdn.jsdelivr.net/npm/zudoku/package.json\"\n ).then((res) => res.json());\n\n const packageJsonContent = {\n name: \"docs\",\n version: \"1.0.0\",\n type: \"module\",\n private: true,\n scripts: {\n dev: \"zudoku dev --zuplo\",\n build: \"zudoku build\",\n start: \"zudoku start\",\n },\n dependencies: {\n zudoku: zudokuPackageJson.version || \"latest\",\n react: zudokuPackageJson.dependencies.react || \"^19.0.0\",\n \"react-dom\": zudokuPackageJson.dependencies[\"react-dom\"] || \"^19.0.0\",\n },\n devDependencies: {\n \"@types/node\": \"^22\",\n \"@types/react\": \">=19\",\n \"@types/react-dom\": \">=19\",\n typescript: zudokuPackageJson.devDependencies.typescript || \"^5\",\n },\n };\n\n await writeFile(\n packageJsonFile,\n JSON.stringify(packageJsonContent, null, 2)\n );\n\n const result = new PluginResult();\n result.notes.push(\"Wrote docs/package.json\");\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"create-package-json\",\n message: `Failed to create package.json: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst createTsConfig: MigrationPlugin = async (config) => {\n try {\n const tsConfigFile = path.join(\n config.absoluteBaseDir,\n \"docs/tsconfig.json\"\n );\n\n if (!config.force && (await exists(tsConfigFile))) {\n return new PluginResult({\n pluginName: \"create-tsconfig\",\n message: \"tsconfig.json already exists\",\n severity: \"warning\",\n });\n }\n\n const tsConfigContent = await fetch(\n \"https://cdn.jsdelivr.net/npm/create-zudoku/dist/templates/zuplo/tsconfig.json\"\n ).then((res) => res.text());\n\n await writeFile(tsConfigFile, tsConfigContent);\n\n const result = new PluginResult();\n result.notes.push(\"Wrote docs/tsconfig.json\");\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"create-tsconfig\",\n message: `Failed to create tsconfig.json: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst updatePackageJsonWorkspaces: MigrationPlugin = async (config) => {\n try {\n const packageJsonFile = path.join(config.absoluteBaseDir, \"package.json\");\n\n if (!(await exists(packageJsonFile))) {\n return new PluginResult({\n pluginName: \"update-package-json-workspaces\",\n message: \"Root package.json not found\",\n severity: \"warning\",\n });\n }\n\n const packageJsonContent = JSON.parse(\n await readFile(packageJsonFile, \"utf-8\")\n );\n\n if (Array.isArray(packageJsonContent.workspaces)) {\n if (!packageJsonContent.workspaces.includes(\"docs\")) {\n packageJsonContent.workspaces.push(\"docs\");\n }\n } else if (!packageJsonContent.workspaces) {\n packageJsonContent.workspaces = [\"docs\"];\n }\n\n packageJsonContent.scripts = packageJsonContent.scripts || {};\n if (!packageJsonContent.scripts[\"docs\"]) {\n packageJsonContent.scripts[\"docs\"] = \"npm run dev --workspace docs\";\n }\n\n await writeFile(\n packageJsonFile,\n JSON.stringify(packageJsonContent, null, 2)\n );\n\n const result = new PluginResult();\n result.notes.push(\"Updated package.json workspaces\");\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"update-package-json-workspaces\",\n message: `Failed to update package.json workspaces: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst moveMarkdownFiles: MigrationPlugin = async (config) => {\n try {\n const docsDir = path.join(config.absoluteBaseDir, \"docs\");\n const pagesDir = path.join(docsDir, \"pages\");\n\n const markdownFiles = await glob([\"*.md\", \"*.mdx\"], {\n cwd: docsDir,\n absolute: false,\n });\n\n try {\n await mkdir(pagesDir, { recursive: true });\n } catch {\n // directory might already exist, that's okay\n }\n\n const result = new PluginResult();\n const movedFiles: string[] = [];\n\n for (const file of markdownFiles) {\n const sourcePath = path.join(docsDir, file);\n const targetPath = path.join(pagesDir, file);\n\n try {\n await rename(sourcePath, targetPath);\n movedFiles.push(file);\n } catch (error) {\n result.warnings.push({\n message: `Failed to move ${file}: ${(error as Error).message}`,\n pluginName: \"move-markdown-files\",\n severity: \"warning\",\n });\n }\n }\n\n if (movedFiles.length > 0) {\n result.notes.push(\n `Moved ${movedFiles.length} markdown files to docs/pages/`\n );\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"move-markdown-files\",\n message: `Failed to move markdown files: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst createDevPortalRedirectConfig: MigrationPlugin = async (config) => {\n try {\n const devPortalOasFile = path.join(\n config.absoluteBaseDir,\n \"config\",\n \"dev-portal.oas.json\"\n );\n\n const oasContent = {\n openapi: \"3.1.0\",\n info: {\n version: \"1.0.0\",\n title: \"Dev Portal Redirect\",\n },\n paths: {\n \"/docs(.*)\": {\n \"x-zuplo-path\": {\n pathMode: \"url-pattern\",\n },\n get: {\n summary: \"Redirect\",\n description: \"Redirect to the new Dev Portal domain\",\n \"x-zuplo-route\": {\n corsPolicy: \"none\",\n handler: {\n export: \"legacyDevPortalHandler\",\n module: \"$import(@zuplo/runtime)\",\n options: {\n mode: \"redirect\",\n },\n },\n policies: {\n inbound: [],\n },\n },\n operationId: \"dev-portal-redirect\",\n \"x-internal\": true,\n },\n },\n },\n };\n\n await writeFile(devPortalOasFile, JSON.stringify(oasContent, null, 2));\n\n const result = new PluginResult();\n result.notes.push(\n \"Created config/dev-portal.oas.json for legacy dev portal redirects\"\n );\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"create-dev-portal-redirect-config\",\n message: `Failed to create dev-portal.oas.json: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst cleanupOldFiles: MigrationPlugin = async (config) => {\n try {\n const filesToCleanup = [\n path.join(config.absoluteBaseDir, \"config/dev-portal.json\"),\n path.join(config.absoluteBaseDir, \"docs/sidebar.json\"),\n path.join(config.absoluteBaseDir, \"docs/theme.css\"),\n ];\n\n const result = new PluginResult();\n const cleanedFiles: string[] = [];\n\n for (const filePath of filesToCleanup) {\n try {\n if (await exists(filePath)) {\n await unlink(filePath);\n cleanedFiles.push(path.relative(config.absoluteBaseDir, filePath));\n }\n } catch (error) {\n result.warnings.push({\n message: `Failed to remove ${path.relative(config.absoluteBaseDir, filePath)}: ${(error as Error).message}`,\n pluginName: \"cleanup-old-files\",\n severity: \"warning\",\n });\n }\n }\n\n if (cleanedFiles.length > 0) {\n result.notes.push(`Cleaned up old files: ${cleanedFiles.join(\", \")}`);\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"cleanup-old-files\",\n message: `Failed to cleanup old files: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst writeConfigFile: MigrationPlugin = async (config, { data }) => {\n try {\n if (!data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"write-output-file\",\n message: \"Zudoku config not found\",\n severity: \"error\",\n });\n }\n\n const outputFile = path.join(\n config.absoluteBaseDir,\n \"docs/zudoku.config.tsx\"\n );\n\n const configContent = [];\n\n configContent.push(`// This file was generated by the Zuplo CLI migrate-dev-portal command.\n// It is used to configure the Zuplo dev portal.\n// You can edit this file to customize the dev portal.\n// For more information, see https://zuplo.com/docs/dev-portal/zudoku/configuration/overview`);\n\n configContent.push(`import type { ZudokuConfig } from \"zudoku\";\\n`);\n configContent.push(\n `const config: ZudokuConfig = ${stringifyConfig(data.zudokuConfig)}`\n );\n configContent.push(`export default config;`);\n\n await writeFile(\n outputFile,\n await format(configContent.join(\"\\n\"), { parser: \"typescript\" })\n );\n\n const result = new PluginResult();\n result.notes.push(\"Wrote docs/zudoku.config.tsx\");\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"write-output-file\",\n message: `Failed to write output file: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zuplo/cli",
3
- "version": "6.63.34",
3
+ "version": "6.63.35",
4
4
  "repository": "https://github.com/zuplo/zuplo",
5
5
  "author": "Zuplo, Inc.",
6
6
  "type": "module",
@@ -29,10 +29,10 @@
29
29
  "@opentelemetry/api": "1.9.0",
30
30
  "@sentry/node": "9.22.0",
31
31
  "@swc/core": "1.10.18",
32
- "@zuplo/core": "6.63.34",
32
+ "@zuplo/core": "6.63.35",
33
33
  "@zuplo/editor": "~1.0.0",
34
- "@zuplo/openapi-tools": "6.63.34",
35
- "@zuplo/runtime": "6.63.34",
34
+ "@zuplo/openapi-tools": "6.63.35",
35
+ "@zuplo/runtime": "6.63.35",
36
36
  "as-table": "1.0.55",
37
37
  "chalk": "5.4.1",
38
38
  "chokidar": "3.5.3",