@tecture/core 0.0.6 → 0.0.8

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 (115) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +30 -0
  3. package/dist/cli.js +77 -3
  4. package/dist/cli.js.map +1 -1
  5. package/dist/index.d.ts +10 -0
  6. package/dist/index.js +8 -4
  7. package/dist/index.js.map +1 -1
  8. package/dist/public/assets/{_baseUniq-Dhw8ANLN.js → _baseUniq-CUITAAZ7.js} +2 -2
  9. package/dist/public/assets/{_baseUniq-Dhw8ANLN.js.map → _baseUniq-CUITAAZ7.js.map} +1 -1
  10. package/dist/public/assets/{arc-DHr716eG.js → arc-DyFMcdgg.js} +2 -2
  11. package/dist/public/assets/{arc-DHr716eG.js.map → arc-DyFMcdgg.js.map} +1 -1
  12. package/dist/public/assets/{architectureDiagram-Q4EWVU46-CiupZxBl.js → architectureDiagram-Q4EWVU46-DZTi6y6q.js} +2 -2
  13. package/dist/public/assets/{architectureDiagram-Q4EWVU46-CiupZxBl.js.map → architectureDiagram-Q4EWVU46-DZTi6y6q.js.map} +1 -1
  14. package/dist/public/assets/{blockDiagram-DXYQGD6D-CZsYmXdZ.js → blockDiagram-DXYQGD6D-C5DgUxsA.js} +2 -2
  15. package/dist/public/assets/{blockDiagram-DXYQGD6D-CZsYmXdZ.js.map → blockDiagram-DXYQGD6D-C5DgUxsA.js.map} +1 -1
  16. package/dist/public/assets/{c4Diagram-AHTNJAMY-oYpz_hY-.js → c4Diagram-AHTNJAMY-BF_SaG8K.js} +2 -2
  17. package/dist/public/assets/{c4Diagram-AHTNJAMY-oYpz_hY-.js.map → c4Diagram-AHTNJAMY-BF_SaG8K.js.map} +1 -1
  18. package/dist/public/assets/channel-Chx65KuQ.js +2 -0
  19. package/dist/public/assets/{channel-D4DHyqBz.js.map → channel-Chx65KuQ.js.map} +1 -1
  20. package/dist/public/assets/{chunk-4BX2VUAB-BJASz7t9.js → chunk-4BX2VUAB-JU2t15qH.js} +2 -2
  21. package/dist/public/assets/{chunk-4BX2VUAB-BJASz7t9.js.map → chunk-4BX2VUAB-JU2t15qH.js.map} +1 -1
  22. package/dist/public/assets/{chunk-4TB4RGXK-BmBuFub9.js → chunk-4TB4RGXK-BqjiENIB.js} +2 -2
  23. package/dist/public/assets/{chunk-4TB4RGXK-BmBuFub9.js.map → chunk-4TB4RGXK-BqjiENIB.js.map} +1 -1
  24. package/dist/public/assets/chunk-55IACEB6-CwPOewiq.js +2 -0
  25. package/dist/public/assets/{chunk-55IACEB6-DpRX_xgZ.js.map → chunk-55IACEB6-CwPOewiq.js.map} +1 -1
  26. package/dist/public/assets/{chunk-EDXVE4YY-CjyvbsHL.js → chunk-EDXVE4YY-CeAdKClT.js} +2 -2
  27. package/dist/public/assets/{chunk-EDXVE4YY-CjyvbsHL.js.map → chunk-EDXVE4YY-CeAdKClT.js.map} +1 -1
  28. package/dist/public/assets/{chunk-FMBD7UC4-CopKIX9d.js → chunk-FMBD7UC4-BmV52drU.js} +2 -2
  29. package/dist/public/assets/{chunk-FMBD7UC4-CopKIX9d.js.map → chunk-FMBD7UC4-BmV52drU.js.map} +1 -1
  30. package/dist/public/assets/{chunk-OYMX7WX6-Qy94MD6F.js → chunk-OYMX7WX6-DMQ6OBmH.js} +2 -2
  31. package/dist/public/assets/{chunk-OYMX7WX6-Qy94MD6F.js.map → chunk-OYMX7WX6-DMQ6OBmH.js.map} +1 -1
  32. package/dist/public/assets/{chunk-QZHKN3VN-q0VhU4fD.js → chunk-QZHKN3VN-BbECxIVF.js} +2 -2
  33. package/dist/public/assets/{chunk-QZHKN3VN-q0VhU4fD.js.map → chunk-QZHKN3VN-BbECxIVF.js.map} +1 -1
  34. package/dist/public/assets/{chunk-YZCP3GAM-CLHu-ytS.js → chunk-YZCP3GAM-LV4b5o7A.js} +2 -2
  35. package/dist/public/assets/{chunk-YZCP3GAM-CLHu-ytS.js.map → chunk-YZCP3GAM-LV4b5o7A.js.map} +1 -1
  36. package/dist/public/assets/classDiagram-6PBFFD2Q-CuGjbxVu.js +2 -0
  37. package/dist/public/assets/{classDiagram-6PBFFD2Q-C_GcL8CY.js.map → classDiagram-6PBFFD2Q-CuGjbxVu.js.map} +1 -1
  38. package/dist/public/assets/classDiagram-v2-HSJHXN6E-CuGjbxVu.js +2 -0
  39. package/dist/public/assets/{classDiagram-v2-HSJHXN6E-C_GcL8CY.js.map → classDiagram-v2-HSJHXN6E-CuGjbxVu.js.map} +1 -1
  40. package/dist/public/assets/clone-B5zl9853.js +2 -0
  41. package/dist/public/assets/{clone-Cpn4E8-V.js.map → clone-B5zl9853.js.map} +1 -1
  42. package/dist/public/assets/{cose-bilkent-S5V4N54A-BCNrUYFS.js → cose-bilkent-S5V4N54A-NxYN3t_X.js} +2 -2
  43. package/dist/public/assets/{cose-bilkent-S5V4N54A-BCNrUYFS.js.map → cose-bilkent-S5V4N54A-NxYN3t_X.js.map} +1 -1
  44. package/dist/public/assets/{dagre-KV5264BT-BVapQShq.js → dagre-KV5264BT-DTQ94K2e.js} +2 -2
  45. package/dist/public/assets/{dagre-KV5264BT-BVapQShq.js.map → dagre-KV5264BT-DTQ94K2e.js.map} +1 -1
  46. package/dist/public/assets/{diagram-5BDNPKRD-D6B3PE9C.js → diagram-5BDNPKRD-BI7YTuYk.js} +2 -2
  47. package/dist/public/assets/{diagram-5BDNPKRD-D6B3PE9C.js.map → diagram-5BDNPKRD-BI7YTuYk.js.map} +1 -1
  48. package/dist/public/assets/{diagram-G4DWMVQ6-BaWJIFI_.js → diagram-G4DWMVQ6-CRfC6IFe.js} +2 -2
  49. package/dist/public/assets/{diagram-G4DWMVQ6-BaWJIFI_.js.map → diagram-G4DWMVQ6-CRfC6IFe.js.map} +1 -1
  50. package/dist/public/assets/{diagram-MMDJMWI5-CCy9j0cK.js → diagram-MMDJMWI5-CfWU0Xcy.js} +2 -2
  51. package/dist/public/assets/{diagram-MMDJMWI5-CCy9j0cK.js.map → diagram-MMDJMWI5-CfWU0Xcy.js.map} +1 -1
  52. package/dist/public/assets/{diagram-TYMM5635-Dlu7NmTQ.js → diagram-TYMM5635-DUUA764g.js} +2 -2
  53. package/dist/public/assets/{diagram-TYMM5635-Dlu7NmTQ.js.map → diagram-TYMM5635-DUUA764g.js.map} +1 -1
  54. package/dist/public/assets/{erDiagram-SMLLAGMA-X6FgEuRR.js → erDiagram-SMLLAGMA-CC6HpSJv.js} +2 -2
  55. package/dist/public/assets/{erDiagram-SMLLAGMA-X6FgEuRR.js.map → erDiagram-SMLLAGMA-CC6HpSJv.js.map} +1 -1
  56. package/dist/public/assets/{flowDiagram-DWJPFMVM-Bu3JFQlu.js → flowDiagram-DWJPFMVM-BcUwc3Qv.js} +2 -2
  57. package/dist/public/assets/{flowDiagram-DWJPFMVM-Bu3JFQlu.js.map → flowDiagram-DWJPFMVM-BcUwc3Qv.js.map} +1 -1
  58. package/dist/public/assets/{ganttDiagram-T4ZO3ILL-n168zCl5.js → ganttDiagram-T4ZO3ILL-BQ0OUFDb.js} +2 -2
  59. package/dist/public/assets/{ganttDiagram-T4ZO3ILL-n168zCl5.js.map → ganttDiagram-T4ZO3ILL-BQ0OUFDb.js.map} +1 -1
  60. package/dist/public/assets/{gitGraphDiagram-UUTBAWPF-DArjnyo2.js → gitGraphDiagram-UUTBAWPF-BMtxQA7c.js} +2 -2
  61. package/dist/public/assets/{gitGraphDiagram-UUTBAWPF-DArjnyo2.js.map → gitGraphDiagram-UUTBAWPF-BMtxQA7c.js.map} +1 -1
  62. package/dist/public/assets/{graph-Bfm3kqd3.js → graph-D-_LAAxI.js} +2 -2
  63. package/dist/public/assets/{graph-Bfm3kqd3.js.map → graph-D-_LAAxI.js.map} +1 -1
  64. package/dist/public/assets/{index-DMY07AUl.js → index-B08bCLVX.js} +3 -3
  65. package/dist/public/assets/{index-DMY07AUl.js.map → index-B08bCLVX.js.map} +1 -1
  66. package/dist/public/assets/{infoDiagram-42DDH7IO-pBrtdPq_.js → infoDiagram-42DDH7IO-Bamzqbzk.js} +2 -2
  67. package/dist/public/assets/{infoDiagram-42DDH7IO-pBrtdPq_.js.map → infoDiagram-42DDH7IO-Bamzqbzk.js.map} +1 -1
  68. package/dist/public/assets/{ishikawaDiagram-UXIWVN3A-BDIZnWTx.js → ishikawaDiagram-UXIWVN3A-zKsJsf_v.js} +2 -2
  69. package/dist/public/assets/{ishikawaDiagram-UXIWVN3A-BDIZnWTx.js.map → ishikawaDiagram-UXIWVN3A-zKsJsf_v.js.map} +1 -1
  70. package/dist/public/assets/{journeyDiagram-VCZTEJTY-DmSjb-PU.js → journeyDiagram-VCZTEJTY-C-6pvS6y.js} +2 -2
  71. package/dist/public/assets/{journeyDiagram-VCZTEJTY-DmSjb-PU.js.map → journeyDiagram-VCZTEJTY-C-6pvS6y.js.map} +1 -1
  72. package/dist/public/assets/{kanban-definition-6JOO6SKY-C8FgUjbs.js → kanban-definition-6JOO6SKY-DS7zW-ig.js} +2 -2
  73. package/dist/public/assets/{kanban-definition-6JOO6SKY-C8FgUjbs.js.map → kanban-definition-6JOO6SKY-DS7zW-ig.js.map} +1 -1
  74. package/dist/public/assets/{layout-DJh2njKG.js → layout-CVDJjYNO.js} +2 -2
  75. package/dist/public/assets/{layout-DJh2njKG.js.map → layout-CVDJjYNO.js.map} +1 -1
  76. package/dist/public/assets/{linear-kYTx6SLx.js → linear-lUY0N4kd.js} +2 -2
  77. package/dist/public/assets/{linear-kYTx6SLx.js.map → linear-lUY0N4kd.js.map} +1 -1
  78. package/dist/public/assets/{mermaid.core-sEG8CMeA.js → mermaid.core-H7Dmb05b.js} +5 -5
  79. package/dist/public/assets/{mermaid.core-sEG8CMeA.js.map → mermaid.core-H7Dmb05b.js.map} +1 -1
  80. package/dist/public/assets/{min-Cxji_8ZQ.js → min-CXznxZeM.js} +2 -2
  81. package/dist/public/assets/{min-Cxji_8ZQ.js.map → min-CXznxZeM.js.map} +1 -1
  82. package/dist/public/assets/{mindmap-definition-QFDTVHPH-B0-J9mrb.js → mindmap-definition-QFDTVHPH-jXt705eB.js} +2 -2
  83. package/dist/public/assets/{mindmap-definition-QFDTVHPH-B0-J9mrb.js.map → mindmap-definition-QFDTVHPH-jXt705eB.js.map} +1 -1
  84. package/dist/public/assets/{pieDiagram-DEJITSTG-CDZHsOGg.js → pieDiagram-DEJITSTG-Cs44d6OE.js} +2 -2
  85. package/dist/public/assets/{pieDiagram-DEJITSTG-CDZHsOGg.js.map → pieDiagram-DEJITSTG-Cs44d6OE.js.map} +1 -1
  86. package/dist/public/assets/{quadrantDiagram-34T5L4WZ-Cr3XLn8k.js → quadrantDiagram-34T5L4WZ-CpymTeDv.js} +2 -2
  87. package/dist/public/assets/{quadrantDiagram-34T5L4WZ-Cr3XLn8k.js.map → quadrantDiagram-34T5L4WZ-CpymTeDv.js.map} +1 -1
  88. package/dist/public/assets/{requirementDiagram-MS252O5E-DhckNPK2.js → requirementDiagram-MS252O5E-RyLqPw4W.js} +2 -2
  89. package/dist/public/assets/{requirementDiagram-MS252O5E-DhckNPK2.js.map → requirementDiagram-MS252O5E-RyLqPw4W.js.map} +1 -1
  90. package/dist/public/assets/{sankeyDiagram-XADWPNL6-Cst7lZQ5.js → sankeyDiagram-XADWPNL6-DamuB2BV.js} +2 -2
  91. package/dist/public/assets/{sankeyDiagram-XADWPNL6-Cst7lZQ5.js.map → sankeyDiagram-XADWPNL6-DamuB2BV.js.map} +1 -1
  92. package/dist/public/assets/{sequenceDiagram-FGHM5R23-BSz6hk1R.js → sequenceDiagram-FGHM5R23-6-TOylZP.js} +2 -2
  93. package/dist/public/assets/{sequenceDiagram-FGHM5R23-BSz6hk1R.js.map → sequenceDiagram-FGHM5R23-6-TOylZP.js.map} +1 -1
  94. package/dist/public/assets/{stateDiagram-FHFEXIEX-racSpEdx.js → stateDiagram-FHFEXIEX-B6cKPsIC.js} +2 -2
  95. package/dist/public/assets/{stateDiagram-FHFEXIEX-racSpEdx.js.map → stateDiagram-FHFEXIEX-B6cKPsIC.js.map} +1 -1
  96. package/dist/public/assets/stateDiagram-v2-QKLJ7IA2-CXb0Znc0.js +2 -0
  97. package/dist/public/assets/{stateDiagram-v2-QKLJ7IA2-C8oha-gC.js.map → stateDiagram-v2-QKLJ7IA2-CXb0Znc0.js.map} +1 -1
  98. package/dist/public/assets/{timeline-definition-GMOUNBTQ-pBR5gxYm.js → timeline-definition-GMOUNBTQ-CdeBXF6y.js} +2 -2
  99. package/dist/public/assets/{timeline-definition-GMOUNBTQ-pBR5gxYm.js.map → timeline-definition-GMOUNBTQ-CdeBXF6y.js.map} +1 -1
  100. package/dist/public/assets/{vennDiagram-DHZGUBPP-OCE87T_5.js → vennDiagram-DHZGUBPP-D8DqpbrW.js} +2 -2
  101. package/dist/public/assets/{vennDiagram-DHZGUBPP-OCE87T_5.js.map → vennDiagram-DHZGUBPP-D8DqpbrW.js.map} +1 -1
  102. package/dist/public/assets/{wardley-RL74JXVD-691yvuUx.js → wardley-RL74JXVD-B1MU-JlC.js} +2 -2
  103. package/dist/public/assets/{wardley-RL74JXVD-691yvuUx.js.map → wardley-RL74JXVD-B1MU-JlC.js.map} +1 -1
  104. package/dist/public/assets/{wardleyDiagram-NUSXRM2D-CewxpYfR.js → wardleyDiagram-NUSXRM2D-MYKM6CF8.js} +2 -2
  105. package/dist/public/assets/{wardleyDiagram-NUSXRM2D-CewxpYfR.js.map → wardleyDiagram-NUSXRM2D-MYKM6CF8.js.map} +1 -1
  106. package/dist/public/assets/{xychartDiagram-5P7HB3ND-C_kdNFR1.js → xychartDiagram-5P7HB3ND-Brec7d4F.js} +2 -2
  107. package/dist/public/assets/{xychartDiagram-5P7HB3ND-C_kdNFR1.js.map → xychartDiagram-5P7HB3ND-Brec7d4F.js.map} +1 -1
  108. package/dist/public/index.html +1 -1
  109. package/package.json +1 -1
  110. package/dist/public/assets/channel-D4DHyqBz.js +0 -2
  111. package/dist/public/assets/chunk-55IACEB6-DpRX_xgZ.js +0 -2
  112. package/dist/public/assets/classDiagram-6PBFFD2Q-C_GcL8CY.js +0 -2
  113. package/dist/public/assets/classDiagram-v2-HSJHXN6E-C_GcL8CY.js +0 -2
  114. package/dist/public/assets/clone-Cpn4E8-V.js +0 -2
  115. package/dist/public/assets/stateDiagram-v2-QKLJ7IA2-C8oha-gC.js +0 -2
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../src/routes/health.ts","../src/routes/architecture.ts","../../shared/src/validators.ts","../../shared/src/deepDive.ts","../src/source/fs.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport express, { type Express, type Request } from \"express\";\nimport { healthRouter } from \"./routes/health.js\";\nimport {\n architectureErrorHandler,\n createArchitectureRouter,\n type LayoutStoreResolver,\n type SourceResolver,\n} from \"./routes/architecture.js\";\nimport type {\n ArchitectureDataSource,\n LayoutStore,\n} from \"./source/types.js\";\n\nexport interface CreateAppOptions {\n source: ArchitectureDataSource | SourceResolver;\n layoutStore?: LayoutStore | LayoutStoreResolver | null;\n}\n\nfunction toSourceResolver(\n value: ArchitectureDataSource | SourceResolver,\n): SourceResolver {\n if (typeof value === \"function\") return value as SourceResolver;\n return () => value;\n}\n\nfunction toLayoutStoreResolver(\n value: LayoutStore | LayoutStoreResolver | null | undefined,\n): LayoutStoreResolver | undefined {\n if (value == null) return undefined;\n if (typeof value === \"function\") return value as LayoutStoreResolver;\n return () => value;\n}\n\nexport function createApp(options: CreateAppOptions): Express {\n const app = express();\n\n app.use(express.json({ limit: \"256kb\" }));\n app.use(\"/api/health\", healthRouter);\n app.use(\n \"/api/architecture\",\n createArchitectureRouter({\n resolveSource: toSourceResolver(options.source),\n resolveLayoutStore: toLayoutStoreResolver(options.layoutStore),\n }),\n );\n app.use(\"/api/architecture\", architectureErrorHandler);\n\n const publicDir = fileURLToPath(new URL(\"./public\", import.meta.url));\n\n if (existsSync(publicDir)) {\n app.use(express.static(publicDir));\n app.get(\"*\", (req: Request, res, next) => {\n if (req.path.startsWith(\"/api/\")) return next();\n res.sendFile(fileURLToPath(new URL(\"./public/index.html\", import.meta.url)));\n });\n }\n\n return app;\n}\n","import { Router } from \"express\";\nimport type { ApiHealthResponse } from \"@tecture/shared\";\n\nexport const healthRouter: Router = Router();\n\nhealthRouter.get(\"/\", (_req, res) => {\n const body: ApiHealthResponse = {\n status: \"ok\",\n uptime: process.uptime(),\n timestamp: new Date().toISOString(),\n };\n res.json(body);\n});\n","import { Router, type Request, type Response, type NextFunction } from \"express\";\nimport type {\n ApiArchitectureError,\n ApiDiagram,\n ApiDiagramEdges,\n ApiDiagramLayout,\n ApiDiagramLayoutUpdate,\n ApiDiagramNodes,\n ApiNodeDetail,\n ManifestFile,\n} from \"@tecture/shared\";\nimport {\n type ArchitectureDataSource,\n DescriptionNotFoundError,\n DiagramNotFoundError,\n type LayoutStore,\n LayoutInvalidError,\n NodeNotFoundError,\n SLUG_RE,\n buildArchitectureSummary,\n emptyLayout,\n findNode,\n} from \"../source/types.js\";\n\nexport type SourceResolver = (\n req: Request,\n) => ArchitectureDataSource | Promise<ArchitectureDataSource>;\n\nexport type LayoutStoreResolver = (\n req: Request,\n) => LayoutStore | null | Promise<LayoutStore | null>;\n\nexport interface ArchitectureRouterOptions {\n resolveSource: SourceResolver;\n resolveLayoutStore?: LayoutStoreResolver;\n}\n\nfunction send501(res: Response, body: ApiArchitectureError): void {\n res.status(501).json(body);\n}\n\nfunction send404(res: Response, body: ApiArchitectureError): void {\n res.status(404).json(body);\n}\n\nfunction send400(res: Response, body: ApiArchitectureError): void {\n res.status(400).json(body);\n}\n\nexport function createArchitectureRouter(\n opts: ArchitectureRouterOptions,\n): Router {\n const router = Router();\n const { resolveSource, resolveLayoutStore } = opts;\n\n router.get(\"/\", async (req, res, next) => {\n try {\n const source = await resolveSource(req);\n const summary = await buildArchitectureSummary(source);\n res.json(summary);\n } catch (err) {\n next(err);\n }\n });\n\n router.get(\"/manifest\", async (req, res, next) => {\n try {\n const source = await resolveSource(req);\n const manifest: ManifestFile = await source.loadManifest();\n res.json(manifest);\n } catch (err) {\n next(err);\n }\n });\n\n router.get(\"/diagrams\", async (req, res, next) => {\n try {\n const source = await resolveSource(req);\n const summary = await buildArchitectureSummary(source);\n res.json(summary.diagrams);\n } catch (err) {\n next(err);\n }\n });\n\n router.get(\"/diagrams/:diagramId\", async (req, res, next) => {\n const { diagramId } = req.params;\n if (!SLUG_RE.test(diagramId)) {\n return send404(res, { error: \"diagram_not_found\", slug: diagramId });\n }\n try {\n const source = await resolveSource(req);\n const diagram = await source.loadDiagram(diagramId);\n const body: ApiDiagram = {\n slug: diagramId,\n name: diagram.name,\n level: diagram.level,\n meta: diagram.meta,\n nodes: diagram.nodes,\n edges: diagram.edges ?? [],\n };\n res.json(body);\n } catch (err) {\n if (err instanceof DiagramNotFoundError) {\n return send404(res, { error: \"diagram_not_found\", slug: err.slug });\n }\n next(err);\n }\n });\n\n router.get(\"/diagrams/:diagramId/nodes\", async (req, res, next) => {\n const { diagramId } = req.params;\n if (!SLUG_RE.test(diagramId)) {\n return send404(res, { error: \"diagram_not_found\", slug: diagramId });\n }\n try {\n const source = await resolveSource(req);\n const diagram = await source.loadDiagram(diagramId);\n const body: ApiDiagramNodes = { diagramId, nodes: diagram.nodes };\n res.json(body);\n } catch (err) {\n if (err instanceof DiagramNotFoundError) {\n return send404(res, { error: \"diagram_not_found\", slug: err.slug });\n }\n next(err);\n }\n });\n\n router.get(\"/diagrams/:diagramId/edges\", async (req, res, next) => {\n const { diagramId } = req.params;\n if (!SLUG_RE.test(diagramId)) {\n return send404(res, { error: \"diagram_not_found\", slug: diagramId });\n }\n try {\n const source = await resolveSource(req);\n const diagram = await source.loadDiagram(diagramId);\n const body: ApiDiagramEdges = { diagramId, edges: diagram.edges ?? [] };\n res.json(body);\n } catch (err) {\n if (err instanceof DiagramNotFoundError) {\n return send404(res, { error: \"diagram_not_found\", slug: err.slug });\n }\n next(err);\n }\n });\n\n router.get(\"/diagrams/:diagramId/layout\", async (req, res, next) => {\n const { diagramId } = req.params;\n if (!SLUG_RE.test(diagramId)) {\n return send404(res, { error: \"diagram_not_found\", slug: diagramId });\n }\n try {\n const source = await resolveSource(req);\n await source.loadDiagram(diagramId);\n const store = resolveLayoutStore ? await resolveLayoutStore(req) : null;\n const layout: ApiDiagramLayout = store\n ? await store.loadLayout(diagramId)\n : emptyLayout(diagramId);\n res.json(layout);\n } catch (err) {\n if (err instanceof DiagramNotFoundError) {\n return send404(res, { error: \"diagram_not_found\", slug: err.slug });\n }\n next(err);\n }\n });\n\n router.put(\"/diagrams/:diagramId/layout\", async (req, res, next) => {\n const { diagramId } = req.params;\n if (!SLUG_RE.test(diagramId)) {\n return send404(res, { error: \"diagram_not_found\", slug: diagramId });\n }\n try {\n const source = await resolveSource(req);\n await source.loadDiagram(diagramId);\n const store = resolveLayoutStore ? await resolveLayoutStore(req) : null;\n if (!store) {\n return send501(res, {\n error: \"layout_not_supported\",\n message: \"Layout persistence is not configured for this data source\",\n });\n }\n const update = req.body as ApiDiagramLayoutUpdate;\n const saved = await store.saveLayout(diagramId, update);\n res.json(saved);\n } catch (err) {\n if (err instanceof DiagramNotFoundError) {\n return send404(res, { error: \"diagram_not_found\", slug: err.slug });\n }\n if (err instanceof LayoutInvalidError) {\n return send400(res, { error: \"layout_invalid\", message: err.message });\n }\n next(err);\n }\n });\n\n router.get(\"/nodes/:nodeId\", async (req, res, next) => {\n const { nodeId } = req.params;\n if (!SLUG_RE.test(nodeId)) {\n return send404(res, { error: \"node_not_found\", id: nodeId });\n }\n try {\n const source = await resolveSource(req);\n const { node, diagramId } = await findNode(source, nodeId);\n const description = await source.loadDescription(nodeId);\n const body: ApiNodeDetail = { ...node, diagramId, description };\n res.json(body);\n } catch (err) {\n if (err instanceof NodeNotFoundError) {\n return send404(res, { error: \"node_not_found\", id: err.id });\n }\n if (err instanceof DescriptionNotFoundError) {\n return send404(res, { error: \"description_not_found\", id: err.id });\n }\n next(err);\n }\n });\n\n router.get(\"/nodes/:nodeId/description\", async (req, res, next) => {\n const { nodeId } = req.params;\n if (!SLUG_RE.test(nodeId)) {\n return send404(res, { error: \"description_not_found\", id: nodeId });\n }\n try {\n const source = await resolveSource(req);\n await findNode(source, nodeId);\n const markdown = await source.loadDescription(nodeId);\n res.type(\"text/markdown; charset=utf-8\").send(markdown);\n } catch (err) {\n if (err instanceof NodeNotFoundError) {\n return send404(res, { error: \"node_not_found\", id: err.id });\n }\n if (err instanceof DescriptionNotFoundError) {\n return send404(res, { error: \"description_not_found\", id: err.id });\n }\n next(err);\n }\n });\n\n return router;\n}\n\nexport function architectureErrorHandler(\n err: unknown,\n _req: Request,\n res: Response,\n next: NextFunction,\n): void {\n if (res.headersSent) return next(err);\n const message = err instanceof Error ? err.message : String(err);\n const body: ApiArchitectureError = {\n error: \"architecture_unreadable\",\n message,\n };\n res.status(500).json(body);\n}\n","import type {\n ApiArchitectureSummary,\n ApiDiagramLayoutUpdate,\n ApiDiagramSummary,\n ArchitectureNode,\n DiagramFile,\n DiagramLayoutFile,\n ManifestFile,\n NodeLayoutEntry,\n SourceHost,\n} from \"./index\";\n\nexport const SLUG_RE = /^[a-z0-9]+(-[a-z0-9]+)*$/;\n\nexport class DiagramNotFoundError extends Error {\n constructor(public readonly slug: string) {\n super(`Diagram not found: ${slug}`);\n this.name = \"DiagramNotFoundError\";\n }\n}\n\nexport class NodeNotFoundError extends Error {\n constructor(public readonly id: string) {\n super(`Node not found: ${id}`);\n this.name = \"NodeNotFoundError\";\n }\n}\n\nexport class DescriptionNotFoundError extends Error {\n constructor(public readonly id: string) {\n super(`Description not found: ${id}`);\n this.name = \"DescriptionNotFoundError\";\n }\n}\n\nexport class LayoutInvalidError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LayoutInvalidError\";\n }\n}\n\nexport interface ArchitectureDataSource {\n loadManifest(): Promise<ManifestFile>;\n loadDiagram(slug: string): Promise<DiagramFile>;\n loadDescription(nodeId: string): Promise<string>;\n}\n\nexport interface LayoutStore {\n loadLayout(slug: string): Promise<DiagramLayoutFile>;\n saveLayout(\n slug: string,\n update: ApiDiagramLayoutUpdate,\n ): Promise<DiagramLayoutFile>;\n}\n\nexport function isFiniteNumber(v: unknown): v is number {\n return typeof v === \"number\" && Number.isFinite(v);\n}\n\nexport function isValidLayoutEntry(v: unknown): v is NodeLayoutEntry {\n if (!v || typeof v !== \"object\") return false;\n const e = v as Record<string, unknown>;\n if (!isFiniteNumber(e.x) || !isFiniteNumber(e.y)) return false;\n if (\"width\" in e && e.width !== undefined && !isFiniteNumber(e.width)) return false;\n if (\"height\" in e && e.height !== undefined && !isFiniteNumber(e.height)) return false;\n return true;\n}\n\nexport function emptyLayout(slug: string): DiagramLayoutFile {\n return { version: 1, diagramId: slug, updatedAt: \"\", nodes: {} };\n}\n\nexport function normalizeLayoutUpdate(\n slug: string,\n update: ApiDiagramLayoutUpdate,\n): DiagramLayoutFile {\n if (!SLUG_RE.test(slug)) {\n throw new LayoutInvalidError(`invalid diagram slug: ${slug}`);\n }\n if (\n !update ||\n typeof update !== \"object\" ||\n !update.nodes ||\n typeof update.nodes !== \"object\"\n ) {\n throw new LayoutInvalidError(\n \"body must be { nodes: Record<string, { x, y, width?, height? }> }\",\n );\n }\n const nodes: Record<string, NodeLayoutEntry> = {};\n for (const [id, entry] of Object.entries(update.nodes)) {\n if (!SLUG_RE.test(id)) {\n throw new LayoutInvalidError(`invalid node id: ${id}`);\n }\n if (!isValidLayoutEntry(entry)) {\n throw new LayoutInvalidError(`invalid layout entry for ${id}`);\n }\n const out: NodeLayoutEntry = { x: entry.x, y: entry.y };\n if (isFiniteNumber(entry.width)) out.width = entry.width;\n if (isFiniteNumber(entry.height)) out.height = entry.height;\n nodes[id] = out;\n }\n return {\n version: 1,\n diagramId: slug,\n updatedAt: new Date().toISOString(),\n nodes,\n };\n}\n\nexport async function buildArchitectureSummary(\n source: ArchitectureDataSource,\n): Promise<ApiArchitectureSummary> {\n const manifest = await source.loadManifest();\n const diagrams = await Promise.all(\n manifest.diagrams.map(async (slug): Promise<ApiDiagramSummary> => {\n const diagram = await source.loadDiagram(slug);\n return {\n slug,\n name: diagram.name,\n level: diagram.level,\n nodeCount: diagram.nodes?.length ?? 0,\n edgeCount: diagram.edges?.length ?? 0,\n };\n }),\n );\n return {\n name: manifest.name,\n description: manifest.description,\n source: manifest.source,\n sourceHost: manifest.sourceHost,\n topDiagram: manifest.topDiagram,\n diagrams,\n };\n}\n\nconst HOST_DOMAINS: Array<{ host: SourceHost; match: RegExp }> = [\n { host: \"github\", match: /(^|\\.)github\\.com$/i },\n { host: \"gitlab\", match: /(^|\\.)gitlab\\.com$/i },\n { host: \"bitbucket\", match: /(^|\\.)bitbucket\\.org$/i },\n];\n\nfunction inferSourceHost(source: string): SourceHost | undefined {\n // Extract the hostname without relying on the URL global (kept lib-agnostic for shared):\n // scheme://[userinfo@]host[:port]/...\n const hostname = /^[a-z][a-z0-9+.-]*:\\/\\/(?:[^@/]*@)?([^:/?#]+)/i.exec(source)?.[1];\n if (!hostname) return undefined;\n return HOST_DOMAINS.find(({ match }) => match.test(hostname))?.host;\n}\n\n/**\n * Build a web URL that views `path` (a repo-root-relative file or directory, trailing \"/\" = dir)\n * on the source repo host. `HEAD` resolves to the default branch so links stay current. Falls back\n * to the repo root when the host is unknown, and returns undefined when there is no source.\n */\nexport function buildSourceUrl(\n source: string | undefined,\n host: SourceHost | undefined,\n path: string,\n): string | undefined {\n if (!source) return undefined;\n const base = source.replace(/\\/+$/, \"\").replace(/\\.git$/i, \"\");\n const resolvedHost = host ?? inferSourceHost(base);\n const isDir = path.endsWith(\"/\");\n const encoded = path\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\")\n .split(\"/\")\n .map(encodeURIComponent)\n .join(\"/\");\n if (!encoded) return base;\n switch (resolvedHost) {\n case \"github\":\n return `${base}/${isDir ? \"tree\" : \"blob\"}/HEAD/${encoded}`;\n case \"gitlab\":\n return `${base}/-/${isDir ? \"tree\" : \"blob\"}/HEAD/${encoded}`;\n case \"bitbucket\":\n return `${base}/src/HEAD/${encoded}`;\n default:\n return base;\n }\n}\n\nexport async function findNode(\n source: ArchitectureDataSource,\n nodeId: string,\n): Promise<{ node: ArchitectureNode; diagramId: string }> {\n if (!SLUG_RE.test(nodeId)) throw new NodeNotFoundError(nodeId);\n const manifest = await source.loadManifest();\n for (const slug of manifest.diagrams) {\n let diagram: DiagramFile;\n try {\n diagram = await source.loadDiagram(slug);\n } catch (err) {\n if (err instanceof DiagramNotFoundError) continue;\n throw err;\n }\n const match = diagram.nodes?.find((n) => n.id === nodeId);\n if (match) return { node: match, diagramId: slug };\n }\n throw new NodeNotFoundError(nodeId);\n}\n","import type { ArchitectureNode, NodeMetaType } from \"./index\";\n\n/** Node types that map to first-party code worth a deep-dive. */\nconst CODE_NODE_TYPES: ReadonlySet<NodeMetaType> = new Set([\n \"service\",\n \"frontend\",\n \"gateway\",\n]);\n\n/**\n * Whether a node is worth deep-diving — i.e. first-party code the team owns.\n * True when the node carries a repo `path`, or its type is a code container\n * (service / frontend / gateway). People, external SaaS, and managed infra\n * (database / cache / queue / storage) have nothing in the repo to investigate.\n */\nexport function isDeepDivable(\n node: Pick<ArchitectureNode, \"path\" | \"meta\">,\n): boolean {\n if (node.path) return true;\n const type = node.meta?.type;\n return type !== undefined && CODE_NODE_TYPES.has(type);\n}\n\n/**\n * Build the prompt a user copies into a coding agent to enrich one component's\n * description. It only *invokes* the skill's deep-dive, keyed on the node `id`\n * (unambiguous) — it deliberately does not restate how to deep-dive, since the\n * tecture skill already owns that (which files to read, dependencies to trace,\n * the target description file, prose-only, etc.).\n */\nexport function buildDeepDivePrompt(\n node: Pick<ArchitectureNode, \"id\" | \"label\">,\n): string {\n const named = node.label && node.label !== node.id ? ` (${node.label})` : \"\";\n return `Use the tecture skill to deep-dive the architecture component \\`${node.id}\\`${named}.`;\n}\n","import { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport type {\n ApiDiagramLayoutUpdate,\n DiagramFile,\n DiagramLayoutFile,\n ManifestFile,\n NodeLayoutEntry,\n} from \"@tecture/shared\";\nimport {\n type ArchitectureDataSource,\n DescriptionNotFoundError,\n DiagramNotFoundError,\n type LayoutStore,\n SLUG_RE,\n emptyLayout,\n isFiniteNumber,\n isValidLayoutEntry,\n normalizeLayoutUpdate,\n} from \"./types.js\";\n\nexport function safeJoin(root: string, ...segments: string[]): string {\n const absRoot = resolve(root);\n const candidate = resolve(join(absRoot, ...segments));\n const guard = absRoot.endsWith(sep) ? absRoot : absRoot + sep;\n if (candidate !== absRoot && !candidate.startsWith(guard)) {\n throw new Error(`Path escapes architecture root: ${candidate}`);\n }\n return candidate;\n}\n\nfunction isNodeErrnoError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && \"code\" in err;\n}\n\nasync function loadJsonFile<T>(path: string): Promise<T> {\n const raw = await readFile(path, \"utf8\");\n return JSON.parse(raw) as T;\n}\n\nexport class FsArchitectureDataSource implements ArchitectureDataSource {\n constructor(private readonly root: string) {}\n\n async loadManifest(): Promise<ManifestFile> {\n const path = safeJoin(this.root, \"manifest.json\");\n return loadJsonFile<ManifestFile>(path);\n }\n\n async loadDiagram(slug: string): Promise<DiagramFile> {\n if (!SLUG_RE.test(slug)) throw new DiagramNotFoundError(slug);\n const path = safeJoin(this.root, \"diagrams\", `${slug}.json`);\n try {\n return await loadJsonFile<DiagramFile>(path);\n } catch (err) {\n if (isNodeErrnoError(err) && err.code === \"ENOENT\") {\n throw new DiagramNotFoundError(slug);\n }\n throw err;\n }\n }\n\n async loadDescription(nodeId: string): Promise<string> {\n if (!SLUG_RE.test(nodeId)) throw new DescriptionNotFoundError(nodeId);\n const path = safeJoin(this.root, \"descriptions\", `${nodeId}.md`);\n try {\n return await readFile(path, \"utf8\");\n } catch (err) {\n if (isNodeErrnoError(err) && err.code === \"ENOENT\") {\n throw new DescriptionNotFoundError(nodeId);\n }\n throw err;\n }\n }\n}\n\nexport class FsLayoutStore implements LayoutStore {\n constructor(private readonly tectureRoot: string) {}\n\n private path(slug: string): string {\n return safeJoin(this.tectureRoot, \"layouts\", `${slug}.json`);\n }\n\n async loadLayout(slug: string): Promise<DiagramLayoutFile> {\n if (!SLUG_RE.test(slug)) return emptyLayout(slug);\n const path = this.path(slug);\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch (err) {\n if (isNodeErrnoError(err) && err.code === \"ENOENT\") return emptyLayout(slug);\n console.warn(`[tecture] failed to read layout ${path}: ${String(err)}`);\n return emptyLayout(slug);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n console.warn(`[tecture] malformed layout JSON at ${path}: ${String(err)}`);\n return emptyLayout(slug);\n }\n\n if (!parsed || typeof parsed !== \"object\") return emptyLayout(slug);\n const p = parsed as Record<string, unknown>;\n const nodes: Record<string, NodeLayoutEntry> = {};\n if (p.nodes && typeof p.nodes === \"object\") {\n for (const [id, entry] of Object.entries(p.nodes as Record<string, unknown>)) {\n if (!SLUG_RE.test(id)) continue;\n if (!isValidLayoutEntry(entry)) continue;\n const out: NodeLayoutEntry = { x: entry.x, y: entry.y };\n if (isFiniteNumber(entry.width)) out.width = entry.width;\n if (isFiniteNumber(entry.height)) out.height = entry.height;\n nodes[id] = out;\n }\n }\n return {\n version: 1,\n diagramId: slug,\n updatedAt: typeof p.updatedAt === \"string\" ? p.updatedAt : \"\",\n nodes,\n };\n }\n\n async saveLayout(\n slug: string,\n update: ApiDiagramLayoutUpdate,\n ): Promise<DiagramLayoutFile> {\n const file = normalizeLayoutUpdate(slug, update);\n const path = this.path(slug);\n await mkdir(dirname(path), { recursive: true });\n const tmp = `${path}.tmp`;\n await writeFile(tmp, `${JSON.stringify(file, null, 2)}\\n`, \"utf8\");\n await rename(tmp, path);\n return file;\n }\n}\n"],"mappings":"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","names":["Router","Router"]}
1
+ {"version":3,"sources":["../src/server.ts","../src/routes/health.ts","../src/routes/architecture.ts","../../shared/src/validators.ts","../../shared/src/deepDive.ts","../src/source/fs.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport express, { type Express, type Request } from \"express\";\nimport { healthRouter } from \"./routes/health.js\";\nimport {\n architectureErrorHandler,\n createArchitectureRouter,\n type LayoutStoreResolver,\n type SourceResolver,\n} from \"./routes/architecture.js\";\nimport type {\n ArchitectureDataSource,\n LayoutStore,\n} from \"./source/types.js\";\nimport type { Reporter } from \"./telemetry.js\";\n\nexport interface CreateAppOptions {\n source: ArchitectureDataSource | SourceResolver;\n layoutStore?: LayoutStore | LayoutStoreResolver | null;\n /** Optional anonymous usage reporter (standalone viewer only). */\n report?: Reporter;\n}\n\nfunction toSourceResolver(\n value: ArchitectureDataSource | SourceResolver,\n): SourceResolver {\n if (typeof value === \"function\") return value as SourceResolver;\n return () => value;\n}\n\nfunction toLayoutStoreResolver(\n value: LayoutStore | LayoutStoreResolver | null | undefined,\n): LayoutStoreResolver | undefined {\n if (value == null) return undefined;\n if (typeof value === \"function\") return value as LayoutStoreResolver;\n return () => value;\n}\n\nexport function createApp(options: CreateAppOptions): Express {\n const app = express();\n\n app.use(express.json({ limit: \"256kb\" }));\n app.use(\"/api/health\", healthRouter);\n app.use(\n \"/api/architecture\",\n createArchitectureRouter({\n resolveSource: toSourceResolver(options.source),\n resolveLayoutStore: toLayoutStoreResolver(options.layoutStore),\n report: options.report,\n }),\n );\n app.use(\"/api/architecture\", architectureErrorHandler);\n\n const publicDir = fileURLToPath(new URL(\"./public\", import.meta.url));\n\n if (existsSync(publicDir)) {\n app.use(express.static(publicDir));\n app.get(\"*\", (req: Request, res, next) => {\n if (req.path.startsWith(\"/api/\")) return next();\n res.sendFile(fileURLToPath(new URL(\"./public/index.html\", import.meta.url)));\n });\n }\n\n return app;\n}\n","import { Router } from \"express\";\nimport type { ApiHealthResponse } from \"@tecture/shared\";\n\nexport const healthRouter: Router = Router();\n\nhealthRouter.get(\"/\", (_req, res) => {\n const body: ApiHealthResponse = {\n status: \"ok\",\n uptime: process.uptime(),\n timestamp: new Date().toISOString(),\n };\n res.json(body);\n});\n","import { Router, type Request, type Response, type NextFunction } from \"express\";\nimport type {\n ApiArchitectureError,\n ApiDiagram,\n ApiDiagramEdges,\n ApiDiagramLayout,\n ApiDiagramLayoutUpdate,\n ApiDiagramNodes,\n ApiNodeDetail,\n ManifestFile,\n} from \"@tecture/shared\";\nimport {\n type ArchitectureDataSource,\n DescriptionNotFoundError,\n DiagramNotFoundError,\n type LayoutStore,\n LayoutInvalidError,\n NodeNotFoundError,\n SLUG_RE,\n buildArchitectureSummary,\n emptyLayout,\n findNode,\n} from \"../source/types.js\";\nimport type { Reporter } from \"../telemetry.js\";\n\nexport type SourceResolver = (\n req: Request,\n) => ArchitectureDataSource | Promise<ArchitectureDataSource>;\n\nexport type LayoutStoreResolver = (\n req: Request,\n) => LayoutStore | null | Promise<LayoutStore | null>;\n\nexport interface ArchitectureRouterOptions {\n resolveSource: SourceResolver;\n resolveLayoutStore?: LayoutStoreResolver;\n /** Optional anonymous usage reporter (standalone viewer only). */\n report?: Reporter;\n}\n\nfunction send501(res: Response, body: ApiArchitectureError): void {\n res.status(501).json(body);\n}\n\nfunction send404(res: Response, body: ApiArchitectureError): void {\n res.status(404).json(body);\n}\n\nfunction send400(res: Response, body: ApiArchitectureError): void {\n res.status(400).json(body);\n}\n\nexport function createArchitectureRouter(\n opts: ArchitectureRouterOptions,\n): Router {\n const router = Router();\n const { resolveSource, resolveLayoutStore, report } = opts;\n\n router.get(\"/\", async (req, res, next) => {\n try {\n const source = await resolveSource(req);\n const summary = await buildArchitectureSummary(source);\n res.json(summary);\n } catch (err) {\n next(err);\n }\n });\n\n router.get(\"/manifest\", async (req, res, next) => {\n try {\n const source = await resolveSource(req);\n const manifest: ManifestFile = await source.loadManifest();\n res.json(manifest);\n } catch (err) {\n next(err);\n }\n });\n\n router.get(\"/diagrams\", async (req, res, next) => {\n try {\n const source = await resolveSource(req);\n const summary = await buildArchitectureSummary(source);\n res.json(summary.diagrams);\n } catch (err) {\n next(err);\n }\n });\n\n router.get(\"/diagrams/:diagramId\", async (req, res, next) => {\n const { diagramId } = req.params;\n if (!SLUG_RE.test(diagramId)) {\n return send404(res, { error: \"diagram_not_found\", slug: diagramId });\n }\n try {\n const source = await resolveSource(req);\n const diagram = await source.loadDiagram(diagramId);\n const body: ApiDiagram = {\n slug: diagramId,\n name: diagram.name,\n level: diagram.level,\n meta: diagram.meta,\n nodes: diagram.nodes,\n edges: diagram.edges ?? [],\n };\n res.json(body);\n // Anonymous usage signal: C4 level only, never the slug/name/content.\n report?.capture(\n \"diagram.viewed\",\n typeof diagram.level === \"number\" ? { level: diagram.level } : {},\n );\n } catch (err) {\n if (err instanceof DiagramNotFoundError) {\n return send404(res, { error: \"diagram_not_found\", slug: err.slug });\n }\n next(err);\n }\n });\n\n router.get(\"/diagrams/:diagramId/nodes\", async (req, res, next) => {\n const { diagramId } = req.params;\n if (!SLUG_RE.test(diagramId)) {\n return send404(res, { error: \"diagram_not_found\", slug: diagramId });\n }\n try {\n const source = await resolveSource(req);\n const diagram = await source.loadDiagram(diagramId);\n const body: ApiDiagramNodes = { diagramId, nodes: diagram.nodes };\n res.json(body);\n } catch (err) {\n if (err instanceof DiagramNotFoundError) {\n return send404(res, { error: \"diagram_not_found\", slug: err.slug });\n }\n next(err);\n }\n });\n\n router.get(\"/diagrams/:diagramId/edges\", async (req, res, next) => {\n const { diagramId } = req.params;\n if (!SLUG_RE.test(diagramId)) {\n return send404(res, { error: \"diagram_not_found\", slug: diagramId });\n }\n try {\n const source = await resolveSource(req);\n const diagram = await source.loadDiagram(diagramId);\n const body: ApiDiagramEdges = { diagramId, edges: diagram.edges ?? [] };\n res.json(body);\n } catch (err) {\n if (err instanceof DiagramNotFoundError) {\n return send404(res, { error: \"diagram_not_found\", slug: err.slug });\n }\n next(err);\n }\n });\n\n router.get(\"/diagrams/:diagramId/layout\", async (req, res, next) => {\n const { diagramId } = req.params;\n if (!SLUG_RE.test(diagramId)) {\n return send404(res, { error: \"diagram_not_found\", slug: diagramId });\n }\n try {\n const source = await resolveSource(req);\n await source.loadDiagram(diagramId);\n const store = resolveLayoutStore ? await resolveLayoutStore(req) : null;\n const layout: ApiDiagramLayout = store\n ? await store.loadLayout(diagramId)\n : emptyLayout(diagramId);\n res.json(layout);\n } catch (err) {\n if (err instanceof DiagramNotFoundError) {\n return send404(res, { error: \"diagram_not_found\", slug: err.slug });\n }\n next(err);\n }\n });\n\n router.put(\"/diagrams/:diagramId/layout\", async (req, res, next) => {\n const { diagramId } = req.params;\n if (!SLUG_RE.test(diagramId)) {\n return send404(res, { error: \"diagram_not_found\", slug: diagramId });\n }\n try {\n const source = await resolveSource(req);\n await source.loadDiagram(diagramId);\n const store = resolveLayoutStore ? await resolveLayoutStore(req) : null;\n if (!store) {\n return send501(res, {\n error: \"layout_not_supported\",\n message: \"Layout persistence is not configured for this data source\",\n });\n }\n const update = req.body as ApiDiagramLayoutUpdate;\n const saved = await store.saveLayout(diagramId, update);\n res.json(saved);\n } catch (err) {\n if (err instanceof DiagramNotFoundError) {\n return send404(res, { error: \"diagram_not_found\", slug: err.slug });\n }\n if (err instanceof LayoutInvalidError) {\n return send400(res, { error: \"layout_invalid\", message: err.message });\n }\n next(err);\n }\n });\n\n router.get(\"/nodes/:nodeId\", async (req, res, next) => {\n const { nodeId } = req.params;\n if (!SLUG_RE.test(nodeId)) {\n return send404(res, { error: \"node_not_found\", id: nodeId });\n }\n try {\n const source = await resolveSource(req);\n const { node, diagramId } = await findNode(source, nodeId);\n const description = await source.loadDescription(nodeId);\n const body: ApiNodeDetail = { ...node, diagramId, description };\n res.json(body);\n } catch (err) {\n if (err instanceof NodeNotFoundError) {\n return send404(res, { error: \"node_not_found\", id: err.id });\n }\n if (err instanceof DescriptionNotFoundError) {\n return send404(res, { error: \"description_not_found\", id: err.id });\n }\n next(err);\n }\n });\n\n router.get(\"/nodes/:nodeId/description\", async (req, res, next) => {\n const { nodeId } = req.params;\n if (!SLUG_RE.test(nodeId)) {\n return send404(res, { error: \"description_not_found\", id: nodeId });\n }\n try {\n const source = await resolveSource(req);\n await findNode(source, nodeId);\n const markdown = await source.loadDescription(nodeId);\n res.type(\"text/markdown; charset=utf-8\").send(markdown);\n } catch (err) {\n if (err instanceof NodeNotFoundError) {\n return send404(res, { error: \"node_not_found\", id: err.id });\n }\n if (err instanceof DescriptionNotFoundError) {\n return send404(res, { error: \"description_not_found\", id: err.id });\n }\n next(err);\n }\n });\n\n return router;\n}\n\nexport function architectureErrorHandler(\n err: unknown,\n _req: Request,\n res: Response,\n next: NextFunction,\n): void {\n if (res.headersSent) return next(err);\n const message = err instanceof Error ? err.message : String(err);\n const body: ApiArchitectureError = {\n error: \"architecture_unreadable\",\n message,\n };\n res.status(500).json(body);\n}\n","import type {\n ApiArchitectureSummary,\n ApiDiagramLayoutUpdate,\n ApiDiagramSummary,\n ArchitectureNode,\n DiagramFile,\n DiagramLayoutFile,\n ManifestFile,\n NodeLayoutEntry,\n SourceHost,\n} from \"./index\";\n\nexport const SLUG_RE = /^[a-z0-9]+(-[a-z0-9]+)*$/;\n\nexport class DiagramNotFoundError extends Error {\n constructor(public readonly slug: string) {\n super(`Diagram not found: ${slug}`);\n this.name = \"DiagramNotFoundError\";\n }\n}\n\nexport class NodeNotFoundError extends Error {\n constructor(public readonly id: string) {\n super(`Node not found: ${id}`);\n this.name = \"NodeNotFoundError\";\n }\n}\n\nexport class DescriptionNotFoundError extends Error {\n constructor(public readonly id: string) {\n super(`Description not found: ${id}`);\n this.name = \"DescriptionNotFoundError\";\n }\n}\n\nexport class LayoutInvalidError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LayoutInvalidError\";\n }\n}\n\nexport interface ArchitectureDataSource {\n loadManifest(): Promise<ManifestFile>;\n loadDiagram(slug: string): Promise<DiagramFile>;\n loadDescription(nodeId: string): Promise<string>;\n}\n\nexport interface LayoutStore {\n loadLayout(slug: string): Promise<DiagramLayoutFile>;\n saveLayout(\n slug: string,\n update: ApiDiagramLayoutUpdate,\n ): Promise<DiagramLayoutFile>;\n}\n\nexport function isFiniteNumber(v: unknown): v is number {\n return typeof v === \"number\" && Number.isFinite(v);\n}\n\nexport function isValidLayoutEntry(v: unknown): v is NodeLayoutEntry {\n if (!v || typeof v !== \"object\") return false;\n const e = v as Record<string, unknown>;\n if (!isFiniteNumber(e.x) || !isFiniteNumber(e.y)) return false;\n if (\"width\" in e && e.width !== undefined && !isFiniteNumber(e.width)) return false;\n if (\"height\" in e && e.height !== undefined && !isFiniteNumber(e.height)) return false;\n return true;\n}\n\nexport function emptyLayout(slug: string): DiagramLayoutFile {\n return { version: 1, diagramId: slug, updatedAt: \"\", nodes: {} };\n}\n\nexport function normalizeLayoutUpdate(\n slug: string,\n update: ApiDiagramLayoutUpdate,\n): DiagramLayoutFile {\n if (!SLUG_RE.test(slug)) {\n throw new LayoutInvalidError(`invalid diagram slug: ${slug}`);\n }\n if (\n !update ||\n typeof update !== \"object\" ||\n !update.nodes ||\n typeof update.nodes !== \"object\"\n ) {\n throw new LayoutInvalidError(\n \"body must be { nodes: Record<string, { x, y, width?, height? }> }\",\n );\n }\n const nodes: Record<string, NodeLayoutEntry> = {};\n for (const [id, entry] of Object.entries(update.nodes)) {\n if (!SLUG_RE.test(id)) {\n throw new LayoutInvalidError(`invalid node id: ${id}`);\n }\n if (!isValidLayoutEntry(entry)) {\n throw new LayoutInvalidError(`invalid layout entry for ${id}`);\n }\n const out: NodeLayoutEntry = { x: entry.x, y: entry.y };\n if (isFiniteNumber(entry.width)) out.width = entry.width;\n if (isFiniteNumber(entry.height)) out.height = entry.height;\n nodes[id] = out;\n }\n return {\n version: 1,\n diagramId: slug,\n updatedAt: new Date().toISOString(),\n nodes,\n };\n}\n\nexport async function buildArchitectureSummary(\n source: ArchitectureDataSource,\n): Promise<ApiArchitectureSummary> {\n const manifest = await source.loadManifest();\n const diagrams = await Promise.all(\n manifest.diagrams.map(async (slug): Promise<ApiDiagramSummary> => {\n const diagram = await source.loadDiagram(slug);\n return {\n slug,\n name: diagram.name,\n level: diagram.level,\n nodeCount: diagram.nodes?.length ?? 0,\n edgeCount: diagram.edges?.length ?? 0,\n };\n }),\n );\n return {\n name: manifest.name,\n description: manifest.description,\n source: manifest.source,\n sourceHost: manifest.sourceHost,\n topDiagram: manifest.topDiagram,\n diagrams,\n };\n}\n\nconst HOST_DOMAINS: Array<{ host: SourceHost; match: RegExp }> = [\n { host: \"github\", match: /(^|\\.)github\\.com$/i },\n { host: \"gitlab\", match: /(^|\\.)gitlab\\.com$/i },\n { host: \"bitbucket\", match: /(^|\\.)bitbucket\\.org$/i },\n];\n\nfunction inferSourceHost(source: string): SourceHost | undefined {\n // Extract the hostname without relying on the URL global (kept lib-agnostic for shared):\n // scheme://[userinfo@]host[:port]/...\n const hostname = /^[a-z][a-z0-9+.-]*:\\/\\/(?:[^@/]*@)?([^:/?#]+)/i.exec(source)?.[1];\n if (!hostname) return undefined;\n return HOST_DOMAINS.find(({ match }) => match.test(hostname))?.host;\n}\n\n/**\n * Build a web URL that views `path` (a repo-root-relative file or directory, trailing \"/\" = dir)\n * on the source repo host. `HEAD` resolves to the default branch so links stay current. Falls back\n * to the repo root when the host is unknown, and returns undefined when there is no source.\n */\nexport function buildSourceUrl(\n source: string | undefined,\n host: SourceHost | undefined,\n path: string,\n): string | undefined {\n if (!source) return undefined;\n const base = source.replace(/\\/+$/, \"\").replace(/\\.git$/i, \"\");\n const resolvedHost = host ?? inferSourceHost(base);\n const isDir = path.endsWith(\"/\");\n const encoded = path\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\")\n .split(\"/\")\n .map(encodeURIComponent)\n .join(\"/\");\n if (!encoded) return base;\n switch (resolvedHost) {\n case \"github\":\n return `${base}/${isDir ? \"tree\" : \"blob\"}/HEAD/${encoded}`;\n case \"gitlab\":\n return `${base}/-/${isDir ? \"tree\" : \"blob\"}/HEAD/${encoded}`;\n case \"bitbucket\":\n return `${base}/src/HEAD/${encoded}`;\n default:\n return base;\n }\n}\n\nexport async function findNode(\n source: ArchitectureDataSource,\n nodeId: string,\n): Promise<{ node: ArchitectureNode; diagramId: string }> {\n if (!SLUG_RE.test(nodeId)) throw new NodeNotFoundError(nodeId);\n const manifest = await source.loadManifest();\n for (const slug of manifest.diagrams) {\n let diagram: DiagramFile;\n try {\n diagram = await source.loadDiagram(slug);\n } catch (err) {\n if (err instanceof DiagramNotFoundError) continue;\n throw err;\n }\n const match = diagram.nodes?.find((n) => n.id === nodeId);\n if (match) return { node: match, diagramId: slug };\n }\n throw new NodeNotFoundError(nodeId);\n}\n","import type { ArchitectureNode, NodeMetaType } from \"./index\";\n\n/** Node types that map to first-party code worth a deep-dive. */\nconst CODE_NODE_TYPES: ReadonlySet<NodeMetaType> = new Set([\n \"service\",\n \"frontend\",\n \"gateway\",\n]);\n\n/**\n * Whether a node is worth deep-diving — i.e. first-party code the team owns.\n * True when the node carries a repo `path`, or its type is a code container\n * (service / frontend / gateway). People, external SaaS, and managed infra\n * (database / cache / queue / storage) have nothing in the repo to investigate.\n */\nexport function isDeepDivable(\n node: Pick<ArchitectureNode, \"path\" | \"meta\">,\n): boolean {\n if (node.path) return true;\n const type = node.meta?.type;\n return type !== undefined && CODE_NODE_TYPES.has(type);\n}\n\n/**\n * Build the prompt a user copies into a coding agent to enrich one component's\n * description. It invokes the skill's deep-dive via its slash command, keyed on\n * the node `id` (unambiguous) — it deliberately does not restate how to deep-dive,\n * since the architecture-docs skill already owns that (which files to read,\n * dependencies to trace, the target description file, prose-only, etc.).\n */\nexport function buildDeepDivePrompt(\n node: Pick<ArchitectureNode, \"id\">,\n): string {\n return `/architecture-docs deep-dive ${node.id}`;\n}\n","import { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport type {\n ApiDiagramLayoutUpdate,\n DiagramFile,\n DiagramLayoutFile,\n ManifestFile,\n NodeLayoutEntry,\n} from \"@tecture/shared\";\nimport {\n type ArchitectureDataSource,\n DescriptionNotFoundError,\n DiagramNotFoundError,\n type LayoutStore,\n SLUG_RE,\n emptyLayout,\n isFiniteNumber,\n isValidLayoutEntry,\n normalizeLayoutUpdate,\n} from \"./types.js\";\n\nexport function safeJoin(root: string, ...segments: string[]): string {\n const absRoot = resolve(root);\n const candidate = resolve(join(absRoot, ...segments));\n const guard = absRoot.endsWith(sep) ? absRoot : absRoot + sep;\n if (candidate !== absRoot && !candidate.startsWith(guard)) {\n throw new Error(`Path escapes architecture root: ${candidate}`);\n }\n return candidate;\n}\n\nfunction isNodeErrnoError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && \"code\" in err;\n}\n\nasync function loadJsonFile<T>(path: string): Promise<T> {\n const raw = await readFile(path, \"utf8\");\n return JSON.parse(raw) as T;\n}\n\nexport class FsArchitectureDataSource implements ArchitectureDataSource {\n constructor(private readonly root: string) {}\n\n async loadManifest(): Promise<ManifestFile> {\n const path = safeJoin(this.root, \"manifest.json\");\n return loadJsonFile<ManifestFile>(path);\n }\n\n async loadDiagram(slug: string): Promise<DiagramFile> {\n if (!SLUG_RE.test(slug)) throw new DiagramNotFoundError(slug);\n const path = safeJoin(this.root, \"diagrams\", `${slug}.json`);\n try {\n return await loadJsonFile<DiagramFile>(path);\n } catch (err) {\n if (isNodeErrnoError(err) && err.code === \"ENOENT\") {\n throw new DiagramNotFoundError(slug);\n }\n throw err;\n }\n }\n\n async loadDescription(nodeId: string): Promise<string> {\n if (!SLUG_RE.test(nodeId)) throw new DescriptionNotFoundError(nodeId);\n const path = safeJoin(this.root, \"descriptions\", `${nodeId}.md`);\n try {\n return await readFile(path, \"utf8\");\n } catch (err) {\n if (isNodeErrnoError(err) && err.code === \"ENOENT\") {\n throw new DescriptionNotFoundError(nodeId);\n }\n throw err;\n }\n }\n}\n\nexport class FsLayoutStore implements LayoutStore {\n constructor(private readonly tectureRoot: string) {}\n\n private path(slug: string): string {\n return safeJoin(this.tectureRoot, \"layouts\", `${slug}.json`);\n }\n\n async loadLayout(slug: string): Promise<DiagramLayoutFile> {\n if (!SLUG_RE.test(slug)) return emptyLayout(slug);\n const path = this.path(slug);\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch (err) {\n if (isNodeErrnoError(err) && err.code === \"ENOENT\") return emptyLayout(slug);\n console.warn(`[tecture] failed to read layout ${path}: ${String(err)}`);\n return emptyLayout(slug);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n console.warn(`[tecture] malformed layout JSON at ${path}: ${String(err)}`);\n return emptyLayout(slug);\n }\n\n if (!parsed || typeof parsed !== \"object\") return emptyLayout(slug);\n const p = parsed as Record<string, unknown>;\n const nodes: Record<string, NodeLayoutEntry> = {};\n if (p.nodes && typeof p.nodes === \"object\") {\n for (const [id, entry] of Object.entries(p.nodes as Record<string, unknown>)) {\n if (!SLUG_RE.test(id)) continue;\n if (!isValidLayoutEntry(entry)) continue;\n const out: NodeLayoutEntry = { x: entry.x, y: entry.y };\n if (isFiniteNumber(entry.width)) out.width = entry.width;\n if (isFiniteNumber(entry.height)) out.height = entry.height;\n nodes[id] = out;\n }\n }\n return {\n version: 1,\n diagramId: slug,\n updatedAt: typeof p.updatedAt === \"string\" ? p.updatedAt : \"\",\n nodes,\n };\n }\n\n async saveLayout(\n slug: string,\n update: ApiDiagramLayoutUpdate,\n ): Promise<DiagramLayoutFile> {\n const file = normalizeLayoutUpdate(slug, update);\n const path = this.path(slug);\n await mkdir(dirname(path), { recursive: true });\n const tmp = `${path}.tmp`;\n await writeFile(tmp, `${JSON.stringify(file, null, 2)}\\n`, \"utf8\");\n await rename(tmp, path);\n return file;\n }\n}\n"],"mappings":"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","names":["Router","Router"]}
@@ -1,2 +1,2 @@
1
- import{aR as L,bg as ln,aG as A,aP as v,aF as W,bh as gn,bi as dn,bj as hn,bk as z,bl as pn,bb as An,bm as m,aS as N,aX as U,a_ as T,bn as _n,aV as on,bo as wn,be as On,aH as V,bc as Pn,bp as I}from"./mermaid.core-sEG8CMeA.js";var vn="[object Symbol]";function x(n){return typeof n=="symbol"||L(n)&&ln(n)==vn}function yn(n,r){for(var e=-1,i=n==null?0:n.length,f=Array(i);++e<i;)f[e]=r(n[e],e,n);return f}var B=v?v.prototype:void 0,H=B?B.toString:void 0;function k(n){if(typeof n=="string")return n;if(A(n))return yn(n,k)+"";if(x(n))return H?H.call(n):"";var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function bn(){}function En(n,r){for(var e=-1,i=n==null?0:n.length;++e<i&&r(n[e],e,n)!==!1;);return n}function cn(n,r,e,i){for(var f=n.length,t=e+-1;++t<f;)if(r(n[t],t,n))return t;return-1}function Tn(n){return n!==n}function Rn(n,r,e){for(var i=e-1,f=n.length;++i<f;)if(n[i]===r)return i;return-1}function In(n,r,e){return r===r?Rn(n,r,e):cn(n,Tn,e)}function Sn(n,r){var e=n==null?0:n.length;return!!e&&In(n,r,0)>-1}function M(n){return W(n)?gn(n):dn(n)}var Ln=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,xn=/^\w*$/;function $(n,r){if(A(n))return!1;var e=typeof n;return e=="number"||e=="symbol"||e=="boolean"||n==null||x(n)?!0:xn.test(n)||!Ln.test(n)||r!=null&&n in Object(r)}var Mn=500;function $n(n){var r=hn(n,function(i){return e.size===Mn&&e.clear(),i}),e=r.cache;return r}var Cn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Fn=/\\(\\)?/g,Gn=$n(function(n){var r=[];return n.charCodeAt(0)===46&&r.push(""),n.replace(Cn,function(e,i,f,t){r.push(f?t.replace(Fn,"$1"):i||e)}),r});function Dn(n){return n==null?"":k(n)}function j(n,r){return A(n)?n:$(n,r)?[n]:Gn(Dn(n))}function R(n){if(typeof n=="string"||x(n))return n;var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function nn(n,r){r=j(r,n);for(var e=0,i=r.length;n!=null&&e<i;)n=n[R(r[e++])];return e&&e==i?n:void 0}function mn(n,r,e){var i=n==null?void 0:nn(n,r);return i===void 0?e:i}function rn(n,r){for(var e=-1,i=r.length,f=n.length;++e<i;)n[f+e]=r[e];return n}var K=v?v.isConcatSpreadable:void 0;function Nn(n){return A(n)||z(n)||!!(K&&n&&n[K])}function Kr(n,r,e,i,f){var t=-1,s=n.length;for(e||(e=Nn),f||(f=[]);++t<s;){var u=n[t];e(u)?rn(f,u):i||(f[f.length]=u)}return f}function Un(n,r,e,i){var f=-1,t=n==null?0:n.length;for(i&&t&&(e=n[++f]);++f<t;)e=r(e,n[f],f,n);return e}function en(n,r){for(var e=-1,i=n==null?0:n.length,f=0,t=[];++e<i;){var s=n[e];r(s,e,n)&&(t[f++]=s)}return t}function Bn(){return[]}var Hn=Object.prototype,Kn=Hn.propertyIsEnumerable,q=Object.getOwnPropertySymbols,qn=q?function(n){return n==null?[]:(n=Object(n),en(q(n),function(r){return Kn.call(n,r)}))}:Bn;function Zn(n,r,e){var i=r(n);return A(n)?i:rn(i,e(n))}function Z(n){return Zn(n,M,qn)}var Xn="__lodash_hash_undefined__";function Yn(n){return this.__data__.set(n,Xn),this}function Jn(n){return this.__data__.has(n)}function y(n){var r=-1,e=n==null?0:n.length;for(this.__data__=new pn;++r<e;)this.add(n[r])}y.prototype.add=y.prototype.push=Yn;y.prototype.has=Jn;function Qn(n,r){for(var e=-1,i=n==null?0:n.length;++e<i;)if(r(n[e],e,n))return!0;return!1}function tn(n,r){return n.has(r)}var Wn=1,zn=2;function fn(n,r,e,i,f,t){var s=e&Wn,u=n.length,a=r.length;if(u!=a&&!(s&&a>u))return!1;var h=t.get(n),g=t.get(r);if(h&&g)return h==r&&g==n;var l=-1,d=!0,o=e&zn?new y:void 0;for(t.set(n,r),t.set(r,n);++l<u;){var p=n[l],_=r[l];if(i)var w=s?i(_,p,l,r,n,t):i(p,_,l,n,r,t);if(w!==void 0){if(w)continue;d=!1;break}if(o){if(!Qn(r,function(O,P){if(!tn(o,P)&&(p===O||f(p,O,e,i,t)))return o.push(P)})){d=!1;break}}else if(!(p===_||f(p,_,e,i,t))){d=!1;break}}return t.delete(n),t.delete(r),d}function Vn(n){var r=-1,e=Array(n.size);return n.forEach(function(i,f){e[++r]=[f,i]}),e}function C(n){var r=-1,e=Array(n.size);return n.forEach(function(i){e[++r]=i}),e}var kn=1,jn=2,nr="[object Boolean]",rr="[object Date]",er="[object Error]",ir="[object Map]",tr="[object Number]",fr="[object RegExp]",sr="[object Set]",ur="[object String]",ar="[object Symbol]",lr="[object ArrayBuffer]",gr="[object DataView]",X=v?v.prototype:void 0,S=X?X.valueOf:void 0;function dr(n,r,e,i,f,t,s){switch(e){case gr:if(n.byteLength!=r.byteLength||n.byteOffset!=r.byteOffset)return!1;n=n.buffer,r=r.buffer;case lr:return!(n.byteLength!=r.byteLength||!t(new m(n),new m(r)));case nr:case rr:case tr:return An(+n,+r);case er:return n.name==r.name&&n.message==r.message;case fr:case ur:return n==r+"";case ir:var u=Vn;case sr:var a=i&kn;if(u||(u=C),n.size!=r.size&&!a)return!1;var h=s.get(n);if(h)return h==r;i|=jn,s.set(n,r);var g=fn(u(n),u(r),i,f,t,s);return s.delete(n),g;case ar:if(S)return S.call(n)==S.call(r)}return!1}var hr=1,pr=Object.prototype,Ar=pr.hasOwnProperty;function _r(n,r,e,i,f,t){var s=e&hr,u=Z(n),a=u.length,h=Z(r),g=h.length;if(a!=g&&!s)return!1;for(var l=a;l--;){var d=u[l];if(!(s?d in r:Ar.call(r,d)))return!1}var o=t.get(n),p=t.get(r);if(o&&p)return o==r&&p==n;var _=!0;t.set(n,r),t.set(r,n);for(var w=s;++l<a;){d=u[l];var O=n[d],P=r[d];if(i)var D=s?i(P,O,d,r,n,t):i(O,P,d,n,r,t);if(!(D===void 0?O===P||f(O,P,e,i,t):D)){_=!1;break}w||(w=d=="constructor")}if(_&&!w){var b=n.constructor,E=r.constructor;b!=E&&"constructor"in n&&"constructor"in r&&!(typeof b=="function"&&b instanceof b&&typeof E=="function"&&E instanceof E)&&(_=!1)}return t.delete(n),t.delete(r),_}var or=1,Y="[object Arguments]",J="[object Array]",c="[object Object]",wr=Object.prototype,Q=wr.hasOwnProperty;function Or(n,r,e,i,f,t){var s=A(n),u=A(r),a=s?J:N(n),h=u?J:N(r);a=a==Y?c:a,h=h==Y?c:h;var g=a==c,l=h==c,d=a==h;if(d&&U(n)){if(!U(r))return!1;s=!0,g=!1}if(d&&!g)return t||(t=new T),s||_n(n)?fn(n,r,e,i,f,t):dr(n,r,a,e,i,f,t);if(!(e&or)){var o=g&&Q.call(n,"__wrapped__"),p=l&&Q.call(r,"__wrapped__");if(o||p){var _=o?n.value():n,w=p?r.value():r;return t||(t=new T),f(_,w,e,i,t)}}return d?(t||(t=new T),_r(n,r,e,i,f,t)):!1}function F(n,r,e,i,f){return n===r?!0:n==null||r==null||!L(n)&&!L(r)?n!==n&&r!==r:Or(n,r,e,i,F,f)}var Pr=1,vr=2;function yr(n,r,e,i){var f=e.length,t=f;if(n==null)return!t;for(n=Object(n);f--;){var s=e[f];if(s[2]?s[1]!==n[s[0]]:!(s[0]in n))return!1}for(;++f<t;){s=e[f];var u=s[0],a=n[u],h=s[1];if(s[2]){if(a===void 0&&!(u in n))return!1}else{var g=new T,l;if(!(l===void 0?F(h,a,Pr|vr,i,g):l))return!1}}return!0}function sn(n){return n===n&&!on(n)}function br(n){for(var r=M(n),e=r.length;e--;){var i=r[e],f=n[i];r[e]=[i,f,sn(f)]}return r}function un(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function Er(n){var r=br(n);return r.length==1&&r[0][2]?un(r[0][0],r[0][1]):function(e){return e===n||yr(e,n,r)}}function cr(n,r){return n!=null&&r in Object(n)}function Tr(n,r,e){r=j(r,n);for(var i=-1,f=r.length,t=!1;++i<f;){var s=R(r[i]);if(!(t=n!=null&&e(n,s)))break;n=n[s]}return t||++i!=f?t:(f=n==null?0:n.length,!!f&&wn(f)&&On(s,f)&&(A(n)||z(n)))}function Rr(n,r){return n!=null&&Tr(n,r,cr)}var Ir=1,Sr=2;function Lr(n,r){return $(n)&&sn(r)?un(R(n),r):function(e){var i=mn(e,n);return i===void 0&&i===r?Rr(e,n):F(r,i,Ir|Sr)}}function xr(n){return function(r){return r==null?void 0:r[n]}}function Mr(n){return function(r){return nn(r,n)}}function $r(n){return $(n)?xr(R(n)):Mr(n)}function an(n){return typeof n=="function"?n:n==null?V:typeof n=="object"?A(n)?Lr(n[0],n[1]):Er(n):$r(n)}function Cr(n,r){return n&&Pn(n,r,M)}function Fr(n,r){return function(e,i){if(e==null)return e;if(!W(e))return n(e,i);for(var f=e.length,t=-1,s=Object(e);++t<f&&i(s[t],t,s)!==!1;);return e}}var G=Fr(Cr);function Gr(n){return typeof n=="function"?n:V}function qr(n,r){var e=A(n)?En:G;return e(n,Gr(r))}function Dr(n,r){var e=[];return G(n,function(i,f,t){r(i,f,t)&&e.push(i)}),e}function Zr(n,r){var e=A(n)?en:Dr;return e(n,an(r))}function mr(n,r,e,i,f){return f(n,function(t,s,u){e=i?(i=!1,t):r(e,t,s,u)}),e}function Xr(n,r,e){var i=A(n)?Un:mr,f=arguments.length<3;return i(n,an(r),e,f,G)}var Nr=1/0,Ur=I&&1/C(new I([,-0]))[1]==Nr?function(n){return new I(n)}:bn,Br=200;function Yr(n,r,e){var i=-1,f=Sn,t=n.length,s=!0,u=[],a=u;if(t>=Br){var h=r?null:Ur(n);if(h)return C(h);s=!1,f=tn,a=new y}else a=r?[]:u;n:for(;++i<t;){var g=n[i],l=r?r(g):g;if(g=g!==0?g:0,s&&l===l){for(var d=a.length;d--;)if(a[d]===l)continue n;r&&a.push(l),u.push(g)}else f(a,l,e)||(a!==u&&a.push(l),u.push(g))}return u}export{G as a,Kr as b,an as c,yn as d,rn as e,Zn as f,qn as g,En as h,x as i,Z as j,M as k,Yr as l,Zr as m,qr as n,cn as o,Gr as p,Cr as q,Xr as r,Bn as s,Tr as t,j as u,R as v,nn as w,Rr as x,Dn as y};
2
- //# sourceMappingURL=_baseUniq-Dhw8ANLN.js.map
1
+ import{aR as L,bg as ln,aG as A,aP as v,aF as W,bh as gn,bi as dn,bj as hn,bk as z,bl as pn,bb as An,bm as m,aS as N,aX as U,a_ as T,bn as _n,aV as on,bo as wn,be as On,aH as V,bc as Pn,bp as I}from"./mermaid.core-H7Dmb05b.js";var vn="[object Symbol]";function x(n){return typeof n=="symbol"||L(n)&&ln(n)==vn}function yn(n,r){for(var e=-1,i=n==null?0:n.length,f=Array(i);++e<i;)f[e]=r(n[e],e,n);return f}var B=v?v.prototype:void 0,H=B?B.toString:void 0;function k(n){if(typeof n=="string")return n;if(A(n))return yn(n,k)+"";if(x(n))return H?H.call(n):"";var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function bn(){}function En(n,r){for(var e=-1,i=n==null?0:n.length;++e<i&&r(n[e],e,n)!==!1;);return n}function cn(n,r,e,i){for(var f=n.length,t=e+-1;++t<f;)if(r(n[t],t,n))return t;return-1}function Tn(n){return n!==n}function Rn(n,r,e){for(var i=e-1,f=n.length;++i<f;)if(n[i]===r)return i;return-1}function In(n,r,e){return r===r?Rn(n,r,e):cn(n,Tn,e)}function Sn(n,r){var e=n==null?0:n.length;return!!e&&In(n,r,0)>-1}function M(n){return W(n)?gn(n):dn(n)}var Ln=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,xn=/^\w*$/;function $(n,r){if(A(n))return!1;var e=typeof n;return e=="number"||e=="symbol"||e=="boolean"||n==null||x(n)?!0:xn.test(n)||!Ln.test(n)||r!=null&&n in Object(r)}var Mn=500;function $n(n){var r=hn(n,function(i){return e.size===Mn&&e.clear(),i}),e=r.cache;return r}var Cn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Fn=/\\(\\)?/g,Gn=$n(function(n){var r=[];return n.charCodeAt(0)===46&&r.push(""),n.replace(Cn,function(e,i,f,t){r.push(f?t.replace(Fn,"$1"):i||e)}),r});function Dn(n){return n==null?"":k(n)}function j(n,r){return A(n)?n:$(n,r)?[n]:Gn(Dn(n))}function R(n){if(typeof n=="string"||x(n))return n;var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function nn(n,r){r=j(r,n);for(var e=0,i=r.length;n!=null&&e<i;)n=n[R(r[e++])];return e&&e==i?n:void 0}function mn(n,r,e){var i=n==null?void 0:nn(n,r);return i===void 0?e:i}function rn(n,r){for(var e=-1,i=r.length,f=n.length;++e<i;)n[f+e]=r[e];return n}var K=v?v.isConcatSpreadable:void 0;function Nn(n){return A(n)||z(n)||!!(K&&n&&n[K])}function Kr(n,r,e,i,f){var t=-1,s=n.length;for(e||(e=Nn),f||(f=[]);++t<s;){var u=n[t];e(u)?rn(f,u):i||(f[f.length]=u)}return f}function Un(n,r,e,i){var f=-1,t=n==null?0:n.length;for(i&&t&&(e=n[++f]);++f<t;)e=r(e,n[f],f,n);return e}function en(n,r){for(var e=-1,i=n==null?0:n.length,f=0,t=[];++e<i;){var s=n[e];r(s,e,n)&&(t[f++]=s)}return t}function Bn(){return[]}var Hn=Object.prototype,Kn=Hn.propertyIsEnumerable,q=Object.getOwnPropertySymbols,qn=q?function(n){return n==null?[]:(n=Object(n),en(q(n),function(r){return Kn.call(n,r)}))}:Bn;function Zn(n,r,e){var i=r(n);return A(n)?i:rn(i,e(n))}function Z(n){return Zn(n,M,qn)}var Xn="__lodash_hash_undefined__";function Yn(n){return this.__data__.set(n,Xn),this}function Jn(n){return this.__data__.has(n)}function y(n){var r=-1,e=n==null?0:n.length;for(this.__data__=new pn;++r<e;)this.add(n[r])}y.prototype.add=y.prototype.push=Yn;y.prototype.has=Jn;function Qn(n,r){for(var e=-1,i=n==null?0:n.length;++e<i;)if(r(n[e],e,n))return!0;return!1}function tn(n,r){return n.has(r)}var Wn=1,zn=2;function fn(n,r,e,i,f,t){var s=e&Wn,u=n.length,a=r.length;if(u!=a&&!(s&&a>u))return!1;var h=t.get(n),g=t.get(r);if(h&&g)return h==r&&g==n;var l=-1,d=!0,o=e&zn?new y:void 0;for(t.set(n,r),t.set(r,n);++l<u;){var p=n[l],_=r[l];if(i)var w=s?i(_,p,l,r,n,t):i(p,_,l,n,r,t);if(w!==void 0){if(w)continue;d=!1;break}if(o){if(!Qn(r,function(O,P){if(!tn(o,P)&&(p===O||f(p,O,e,i,t)))return o.push(P)})){d=!1;break}}else if(!(p===_||f(p,_,e,i,t))){d=!1;break}}return t.delete(n),t.delete(r),d}function Vn(n){var r=-1,e=Array(n.size);return n.forEach(function(i,f){e[++r]=[f,i]}),e}function C(n){var r=-1,e=Array(n.size);return n.forEach(function(i){e[++r]=i}),e}var kn=1,jn=2,nr="[object Boolean]",rr="[object Date]",er="[object Error]",ir="[object Map]",tr="[object Number]",fr="[object RegExp]",sr="[object Set]",ur="[object String]",ar="[object Symbol]",lr="[object ArrayBuffer]",gr="[object DataView]",X=v?v.prototype:void 0,S=X?X.valueOf:void 0;function dr(n,r,e,i,f,t,s){switch(e){case gr:if(n.byteLength!=r.byteLength||n.byteOffset!=r.byteOffset)return!1;n=n.buffer,r=r.buffer;case lr:return!(n.byteLength!=r.byteLength||!t(new m(n),new m(r)));case nr:case rr:case tr:return An(+n,+r);case er:return n.name==r.name&&n.message==r.message;case fr:case ur:return n==r+"";case ir:var u=Vn;case sr:var a=i&kn;if(u||(u=C),n.size!=r.size&&!a)return!1;var h=s.get(n);if(h)return h==r;i|=jn,s.set(n,r);var g=fn(u(n),u(r),i,f,t,s);return s.delete(n),g;case ar:if(S)return S.call(n)==S.call(r)}return!1}var hr=1,pr=Object.prototype,Ar=pr.hasOwnProperty;function _r(n,r,e,i,f,t){var s=e&hr,u=Z(n),a=u.length,h=Z(r),g=h.length;if(a!=g&&!s)return!1;for(var l=a;l--;){var d=u[l];if(!(s?d in r:Ar.call(r,d)))return!1}var o=t.get(n),p=t.get(r);if(o&&p)return o==r&&p==n;var _=!0;t.set(n,r),t.set(r,n);for(var w=s;++l<a;){d=u[l];var O=n[d],P=r[d];if(i)var D=s?i(P,O,d,r,n,t):i(O,P,d,n,r,t);if(!(D===void 0?O===P||f(O,P,e,i,t):D)){_=!1;break}w||(w=d=="constructor")}if(_&&!w){var b=n.constructor,E=r.constructor;b!=E&&"constructor"in n&&"constructor"in r&&!(typeof b=="function"&&b instanceof b&&typeof E=="function"&&E instanceof E)&&(_=!1)}return t.delete(n),t.delete(r),_}var or=1,Y="[object Arguments]",J="[object Array]",c="[object Object]",wr=Object.prototype,Q=wr.hasOwnProperty;function Or(n,r,e,i,f,t){var s=A(n),u=A(r),a=s?J:N(n),h=u?J:N(r);a=a==Y?c:a,h=h==Y?c:h;var g=a==c,l=h==c,d=a==h;if(d&&U(n)){if(!U(r))return!1;s=!0,g=!1}if(d&&!g)return t||(t=new T),s||_n(n)?fn(n,r,e,i,f,t):dr(n,r,a,e,i,f,t);if(!(e&or)){var o=g&&Q.call(n,"__wrapped__"),p=l&&Q.call(r,"__wrapped__");if(o||p){var _=o?n.value():n,w=p?r.value():r;return t||(t=new T),f(_,w,e,i,t)}}return d?(t||(t=new T),_r(n,r,e,i,f,t)):!1}function F(n,r,e,i,f){return n===r?!0:n==null||r==null||!L(n)&&!L(r)?n!==n&&r!==r:Or(n,r,e,i,F,f)}var Pr=1,vr=2;function yr(n,r,e,i){var f=e.length,t=f;if(n==null)return!t;for(n=Object(n);f--;){var s=e[f];if(s[2]?s[1]!==n[s[0]]:!(s[0]in n))return!1}for(;++f<t;){s=e[f];var u=s[0],a=n[u],h=s[1];if(s[2]){if(a===void 0&&!(u in n))return!1}else{var g=new T,l;if(!(l===void 0?F(h,a,Pr|vr,i,g):l))return!1}}return!0}function sn(n){return n===n&&!on(n)}function br(n){for(var r=M(n),e=r.length;e--;){var i=r[e],f=n[i];r[e]=[i,f,sn(f)]}return r}function un(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function Er(n){var r=br(n);return r.length==1&&r[0][2]?un(r[0][0],r[0][1]):function(e){return e===n||yr(e,n,r)}}function cr(n,r){return n!=null&&r in Object(n)}function Tr(n,r,e){r=j(r,n);for(var i=-1,f=r.length,t=!1;++i<f;){var s=R(r[i]);if(!(t=n!=null&&e(n,s)))break;n=n[s]}return t||++i!=f?t:(f=n==null?0:n.length,!!f&&wn(f)&&On(s,f)&&(A(n)||z(n)))}function Rr(n,r){return n!=null&&Tr(n,r,cr)}var Ir=1,Sr=2;function Lr(n,r){return $(n)&&sn(r)?un(R(n),r):function(e){var i=mn(e,n);return i===void 0&&i===r?Rr(e,n):F(r,i,Ir|Sr)}}function xr(n){return function(r){return r==null?void 0:r[n]}}function Mr(n){return function(r){return nn(r,n)}}function $r(n){return $(n)?xr(R(n)):Mr(n)}function an(n){return typeof n=="function"?n:n==null?V:typeof n=="object"?A(n)?Lr(n[0],n[1]):Er(n):$r(n)}function Cr(n,r){return n&&Pn(n,r,M)}function Fr(n,r){return function(e,i){if(e==null)return e;if(!W(e))return n(e,i);for(var f=e.length,t=-1,s=Object(e);++t<f&&i(s[t],t,s)!==!1;);return e}}var G=Fr(Cr);function Gr(n){return typeof n=="function"?n:V}function qr(n,r){var e=A(n)?En:G;return e(n,Gr(r))}function Dr(n,r){var e=[];return G(n,function(i,f,t){r(i,f,t)&&e.push(i)}),e}function Zr(n,r){var e=A(n)?en:Dr;return e(n,an(r))}function mr(n,r,e,i,f){return f(n,function(t,s,u){e=i?(i=!1,t):r(e,t,s,u)}),e}function Xr(n,r,e){var i=A(n)?Un:mr,f=arguments.length<3;return i(n,an(r),e,f,G)}var Nr=1/0,Ur=I&&1/C(new I([,-0]))[1]==Nr?function(n){return new I(n)}:bn,Br=200;function Yr(n,r,e){var i=-1,f=Sn,t=n.length,s=!0,u=[],a=u;if(t>=Br){var h=r?null:Ur(n);if(h)return C(h);s=!1,f=tn,a=new y}else a=r?[]:u;n:for(;++i<t;){var g=n[i],l=r?r(g):g;if(g=g!==0?g:0,s&&l===l){for(var d=a.length;d--;)if(a[d]===l)continue n;r&&a.push(l),u.push(g)}else f(a,l,e)||(a!==u&&a.push(l),u.push(g))}return u}export{G as a,Kr as b,an as c,yn as d,rn as e,Zn as f,qn as g,En as h,x as i,Z as j,M as k,Yr as l,Zr as m,qr as n,cn as o,Gr as p,Cr as q,Xr as r,Bn as s,Tr as t,j as u,R as v,nn as w,Rr as x,Dn as y};
2
+ //# sourceMappingURL=_baseUniq-CUITAAZ7.js.map