@lyku/lockstep-pg 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -86,65 +86,7 @@ const sql = generateSeedSql({ tables });
86
86
 
87
87
  <!-- Generated from libs/lockstep-core/diagrams/pipeline.mmd — do not edit manually -->
88
88
 
89
- ```mermaid
90
- graph TD
91
- input-tables["Table Schemas<br/><small>PostgresRecordModel</small>"]
92
- input-api["API Definitions<br/><small>TsonHandlerModel</small>"]
93
-
94
- core-jsonmodels["generateJsonModels"]
95
- core-dbtypes["generateDbTypes"]
96
- core-apitypes["generateApiTypes"]
97
- core-validators["buildValidator"]
98
-
99
- handles-gen["generateHandles"]
100
-
101
- client-gen["generateTsClient"]
102
-
103
- pg-drift["detectDrift"]
104
- pg-migrate["generateMigration"]
105
-
106
- output-jsonschemas["JSON Schemas +<br/>TypeScript Types"]
107
- output-kysely["Kysely Database<br/>Interface"]
108
- output-reqres["Request / Response<br/>TypeScript Types"]
109
- output-handlers["Handler Factories<br/>+ Validators"]
110
- output-client["Type-safe<br/>HTTP Client"]
111
- output-sql["SQL Migrations"]
112
-
113
- input-tables --> core-jsonmodels
114
- core-jsonmodels --> output-jsonschemas
115
- output-jsonschemas --> core-dbtypes
116
- core-dbtypes --> output-kysely
117
-
118
- input-api --> core-apitypes
119
- core-apitypes --> output-reqres
120
- input-api --> core-validators
121
-
122
- output-reqres --> handles-gen
123
- input-api --> handles-gen
124
- core-validators -.-> handles-gen
125
- handles-gen --> output-handlers
126
-
127
- output-reqres --> client-gen
128
- input-api --> client-gen
129
- client-gen --> output-client
130
-
131
- input-tables --> pg-drift
132
- pg-drift --> pg-migrate
133
- pg-migrate --> output-sql
134
-
135
- classDef highlight fill:#4f46e5,stroke:#3730a3,color:#fff,stroke-width:2px
136
- classDef dimmed fill:#f1f5f9,stroke:#cbd5e1,color:#94a3b8,stroke-width:1px
137
- classDef inputNode fill:#fef3c7,stroke:#f59e0b,color:#92400e,stroke-width:1px
138
- classDef outputNode fill:#d1fae5,stroke:#10b981,color:#065f46,stroke-width:1px
139
- classDef ownedOutput fill:#a5b4fc,stroke:#4f46e5,color:#1e1b4b,stroke-width:2px
140
- classDef ownedInput fill:#fde68a,stroke:#4f46e5,color:#1e1b4b,stroke-width:2px
141
- class pg-drift,pg-migrate highlight
142
- class core-jsonmodels,core-dbtypes,core-apitypes,core-validators,handles-gen,client-gen dimmed
143
- class input-api inputNode
144
- class output-jsonschemas,output-kysely,output-reqres,output-handlers,output-client outputNode
145
- class input-tables ownedInput
146
- class output-sql ownedOutput
147
- ```
89
+ <p align="center"><img src="./pipeline.svg" alt="lockstep-pg pipeline diagram" /></p>
148
90
 
149
91
  ## Drift types
150
92
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lyku/lockstep-pg",
3
- "version": "1.3.1",
3
+ "version": "1.4.0",
4
4
  "description": "Schema-driven PostgreSQL migration toolkit: drift detection, introspection, and SQL generation for @lyku/lockstep-core models",
5
5
  "main": "./src/index.js",
6
6
  "types": "./src/index.d.ts",
package/pipeline.svg ADDED
@@ -0,0 +1 @@
1
+ <svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 1035.32px; background-color: transparent;" viewBox="0 0 1035.3203125 558" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-thickness-normal{stroke-width:1px;}#my-svg .edge-thickness-thick{stroke-width:3.5px;}#my-svg .edge-pattern-solid{stroke-dasharray:0;}#my-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#my-svg .edge-pattern-dashed{stroke-dasharray:3;}#my-svg .edge-pattern-dotted{stroke-dasharray:2;}#my-svg .marker{fill:#333333;stroke:#333333;}#my-svg .marker.cross{stroke:#333333;}#my-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#my-svg p{margin:0;}#my-svg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#my-svg .cluster-label text{fill:#333;}#my-svg .cluster-label span{color:#333;}#my-svg .cluster-label span p{background-color:transparent;}#my-svg .label text,#my-svg span{fill:#333;color:#333;}#my-svg .node rect,#my-svg .node circle,#my-svg .node ellipse,#my-svg .node polygon,#my-svg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#my-svg .rough-node .label text,#my-svg .node .label text,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-anchor:middle;}#my-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#my-svg .rough-node .label,#my-svg .node .label,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-align:center;}#my-svg .node.clickable{cursor:pointer;}#my-svg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#my-svg .arrowheadPath{fill:#333333;}#my-svg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#my-svg .flowchart-link{stroke:#333333;fill:none;}#my-svg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#my-svg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#my-svg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#my-svg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#my-svg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#my-svg .cluster text{fill:#333;}#my-svg .cluster span{color:#333;}#my-svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#my-svg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#my-svg rect.text{fill:none;stroke-width:0;}#my-svg .icon-shape,#my-svg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#my-svg .icon-shape p,#my-svg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#my-svg .icon-shape .label rect,#my-svg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#my-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#my-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#my-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#my-svg .highlight&gt;*{fill:#4f46e5!important;stroke:#3730a3!important;color:#fff!important;stroke-width:2px!important;}#my-svg .highlight span{fill:#4f46e5!important;stroke:#3730a3!important;color:#fff!important;stroke-width:2px!important;}#my-svg .highlight tspan{fill:#fff!important;}#my-svg .dimmed&gt;*{fill:#f1f5f9!important;stroke:#cbd5e1!important;color:#94a3b8!important;stroke-width:1px!important;}#my-svg .dimmed span{fill:#f1f5f9!important;stroke:#cbd5e1!important;color:#94a3b8!important;stroke-width:1px!important;}#my-svg .dimmed tspan{fill:#94a3b8!important;}#my-svg .inputNode&gt;*{fill:#fef3c7!important;stroke:#f59e0b!important;color:#92400e!important;stroke-width:1px!important;}#my-svg .inputNode span{fill:#fef3c7!important;stroke:#f59e0b!important;color:#92400e!important;stroke-width:1px!important;}#my-svg .inputNode tspan{fill:#92400e!important;}#my-svg .outputNode&gt;*{fill:#d1fae5!important;stroke:#10b981!important;color:#065f46!important;stroke-width:1px!important;}#my-svg .outputNode span{fill:#d1fae5!important;stroke:#10b981!important;color:#065f46!important;stroke-width:1px!important;}#my-svg .outputNode tspan{fill:#065f46!important;}#my-svg .ownedOutput&gt;*{fill:#a5b4fc!important;stroke:#4f46e5!important;color:#1e1b4b!important;stroke-width:2px!important;}#my-svg .ownedOutput span{fill:#a5b4fc!important;stroke:#4f46e5!important;color:#1e1b4b!important;stroke-width:2px!important;}#my-svg .ownedOutput tspan{fill:#1e1b4b!important;}#my-svg .ownedInput&gt;*{fill:#fde68a!important;stroke:#4f46e5!important;color:#1e1b4b!important;stroke-width:2px!important;}#my-svg .ownedInput span{fill:#fde68a!important;stroke:#4f46e5!important;color:#1e1b4b!important;stroke-width:2px!important;}#my-svg .ownedInput tspan{fill:#1e1b4b!important;}</style><g><marker id="my-svg_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="4.5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 5 L 10 10 L 10 0 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="11" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-1" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossEnd" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="12" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossStart" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="-1" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><g class="root"><g class="clusters"/><g class="edgePaths"><path d="M744.994,86L736.586,90.167C728.178,94.333,711.363,102.667,702.955,110.333C694.547,118,694.547,125,694.547,128.5L694.547,132" id="L_input-tables_core-jsonmodels_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_input-tables_core-jsonmodels_0" data-points="W3sieCI6NzQ0Ljk5Mzk1NzUxOTUzMTIsInkiOjg2fSx7IngiOjY5NC41NDY4NzUsInkiOjExMX0seyJ4Ijo2OTQuNTQ2ODc1LCJ5IjoxMzZ9XQ==" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M694.547,190L694.547,194.167C694.547,198.333,694.547,206.667,694.547,214.333C694.547,222,694.547,229,694.547,232.5L694.547,236" id="L_core-jsonmodels_output-jsonschemas_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_core-jsonmodels_output-jsonschemas_0" data-points="W3sieCI6Njk0LjU0Njg3NSwieSI6MTkwfSx7IngiOjY5NC41NDY4NzUsInkiOjIxNX0seyJ4Ijo2OTQuNTQ2ODc1LCJ5IjoyNDB9XQ==" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M694.547,318L694.547,322.167C694.547,326.333,694.547,334.667,694.547,342.333C694.547,350,694.547,357,694.547,360.5L694.547,364" id="L_output-jsonschemas_core-dbtypes_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_output-jsonschemas_core-dbtypes_0" data-points="W3sieCI6Njk0LjU0Njg3NSwieSI6MzE4fSx7IngiOjY5NC41NDY4NzUsInkiOjM0M30seyJ4Ijo2OTQuNTQ2ODc1LCJ5IjozNjh9XQ==" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M694.547,422L694.547,426.167C694.547,430.333,694.547,438.667,694.547,446.333C694.547,454,694.547,461,694.547,464.5L694.547,468" id="L_core-dbtypes_output-kysely_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_core-dbtypes_output-kysely_0" data-points="W3sieCI6Njk0LjU0Njg3NSwieSI6NDIyfSx7IngiOjY5NC41NDY4NzUsInkiOjQ0N30seyJ4Ijo2OTQuNTQ2ODc1LCJ5Ijo0NzJ9XQ==" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M219.156,75.195L201.046,81.163C182.935,87.13,146.714,99.065,128.603,108.533C110.492,118,110.492,125,110.492,128.5L110.492,132" id="L_input-api_core-apitypes_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_input-api_core-apitypes_0" data-points="W3sieCI6MjE5LjE1NjI1LCJ5Ijo3NS4xOTUzMTgxNTYyMjIzNH0seyJ4IjoxMTAuNDkyMTg3NSwieSI6MTExfSx7IngiOjExMC40OTIxODc1LCJ5IjoxMzZ9XQ==" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M110.492,190L110.492,194.167C110.492,198.333,110.492,206.667,110.492,214.333C110.492,222,110.492,229,110.492,232.5L110.492,236" id="L_core-apitypes_output-reqres_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_core-apitypes_output-reqres_0" data-points="W3sieCI6MTEwLjQ5MjE4NzUsInkiOjE5MH0seyJ4IjoxMTAuNDkyMTg3NSwieSI6MjE1fSx7IngiOjExMC40OTIxODc1LCJ5IjoyNDB9XQ==" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M390.297,79.572L404.057,84.81C417.818,90.048,445.339,100.524,459.099,114.429C472.859,128.333,472.859,145.667,472.859,163C472.859,180.333,472.859,197.667,472.859,211.833C472.859,226,472.859,237,472.859,242.5L472.859,248" id="L_input-api_core-validators_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_input-api_core-validators_0" data-points="W3sieCI6MzkwLjI5Njg3NSwieSI6NzkuNTcyNDY0MTA0ODI3ODR9LHsieCI6NDcyLjg1OTM3NSwieSI6MTExfSx7IngiOjQ3Mi44NTkzNzUsInkiOjE2M30seyJ4Ijo0NzIuODU5Mzc1LCJ5IjoyMTV9LHsieCI6NDcyLjg1OTM3NSwieSI6MjUyfV0=" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M212.984,314.604L226.608,319.337C240.232,324.069,267.479,333.535,285.81,342.019C304.141,350.502,313.555,358.005,318.262,361.756L322.969,365.507" id="L_output-reqres_handles-gen_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_output-reqres_handles-gen_0" data-points="W3sieCI6MjEyLjk4NDM3NSwieSI6MzE0LjYwNDEwNDgyNTcxNDU2fSx7IngiOjI5NC43MjY1NjI1LCJ5IjozNDN9LHsieCI6MzI2LjA5Njc1NDgwNzY5MjMsInkiOjM2OH1d" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M338.395,86L341.992,90.167C345.589,94.333,352.783,102.667,356.38,115.5C359.977,128.333,359.977,145.667,359.977,163C359.977,180.333,359.977,197.667,359.977,217C359.977,236.333,359.977,257.667,359.977,279C359.977,300.333,359.977,321.667,359.977,335.833C359.977,350,359.977,357,359.977,360.5L359.977,364" id="L_input-api_handles-gen_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_input-api_handles-gen_0" data-points="W3sieCI6MzM4LjM5NDUzMTI1LCJ5Ijo4Nn0seyJ4IjozNTkuOTc2NTYyNSwieSI6MTExfSx7IngiOjM1OS45NzY1NjI1LCJ5IjoxNjN9LHsieCI6MzU5Ljk3NjU2MjUsInkiOjIxNX0seyJ4IjozNTkuOTc2NTYyNSwieSI6Mjc5fSx7IngiOjM1OS45NzY1NjI1LCJ5IjozNDN9LHsieCI6MzU5Ljk3NjU2MjUsInkiOjM2OH1d" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M472.859,306L472.859,312.167C472.859,318.333,472.859,330.667,464.42,340.721C455.98,350.775,439.101,358.551,430.661,362.439L422.222,366.326" id="L_core-validators_handles-gen_0" class="edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_core-validators_handles-gen_0" data-points="W3sieCI6NDcyLjg1OTM3NSwieSI6MzA2fSx7IngiOjQ3Mi44NTkzNzUsInkiOjM0M30seyJ4Ijo0MTguNTg4NzkyMDY3MzA3NywieSI6MzY4fV0=" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M359.977,422L359.977,426.167C359.977,430.333,359.977,438.667,359.977,446.333C359.977,454,359.977,461,359.977,464.5L359.977,468" id="L_handles-gen_output-handlers_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_handles-gen_output-handlers_0" data-points="W3sieCI6MzU5Ljk3NjU2MjUsInkiOjQyMn0seyJ4IjozNTkuOTc2NTYyNSwieSI6NDQ3fSx7IngiOjM1OS45NzY1NjI1LCJ5Ijo0NzJ9XQ==" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M110.492,318L110.492,322.167C110.492,326.333,110.492,334.667,111.752,342.372C113.011,350.077,115.53,357.154,116.789,360.693L118.049,364.232" id="L_output-reqres_client-gen_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_output-reqres_client-gen_0" data-points="W3sieCI6MTEwLjQ5MjE4NzUsInkiOjMxOH0seyJ4IjoxMTAuNDkyMTg3NSwieSI6MzQzfSx7IngiOjExOS4zOTAxNzQyNzg4NDYxNiwieSI6MzY4fV0=" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M286.445,86L284.492,90.167C282.539,94.333,278.633,102.667,276.68,115.5C274.727,128.333,274.727,145.667,274.727,163C274.727,180.333,274.727,197.667,274.727,217C274.727,236.333,274.727,257.667,274.727,279C274.727,300.333,274.727,321.667,263.678,336.276C252.629,350.885,230.531,358.77,219.482,362.713L208.433,366.656" id="L_input-api_client-gen_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_input-api_client-gen_0" data-points="W3sieCI6Mjg2LjQ0NTMxMjUsInkiOjg2fSx7IngiOjI3NC43MjY1NjI1LCJ5IjoxMTF9LHsieCI6Mjc0LjcyNjU2MjUsInkiOjE2M30seyJ4IjoyNzQuNzI2NTYyNSwieSI6MjE1fSx7IngiOjI3NC43MjY1NjI1LCJ5IjoyNzl9LHsieCI6Mjc0LjcyNjU2MjUsInkiOjM0M30seyJ4IjoyMDQuNjY1NzE1MTQ0MjMwNzcsInkiOjM2OH1d" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M129,422L129,426.167C129,430.333,129,438.667,129,446.333C129,454,129,461,129,464.5L129,468" id="L_client-gen_output-client_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_client-gen_output-client_0" data-points="W3sieCI6MTI5LCJ5Ijo0MjJ9LHsieCI6MTI5LCJ5Ijo0NDd9LHsieCI6MTI5LCJ5Ijo0NzJ9XQ==" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M890.201,86L897.307,90.167C904.413,94.333,918.624,102.667,925.73,110.333C932.836,118,932.836,125,932.836,128.5L932.836,132" id="L_input-tables_pg-drift_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_input-tables_pg-drift_0" data-points="W3sieCI6ODkwLjIwMTM1NDk4MDQ2ODgsInkiOjg2fSx7IngiOjkzMi44MzU5Mzc1LCJ5IjoxMTF9LHsieCI6OTMyLjgzNTkzNzUsInkiOjEzNn1d" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M932.836,190L932.836,194.167C932.836,198.333,932.836,206.667,932.836,216.333C932.836,226,932.836,237,932.836,242.5L932.836,248" id="L_pg-drift_pg-migrate_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_pg-drift_pg-migrate_0" data-points="W3sieCI6OTMyLjgzNTkzNzUsInkiOjE5MH0seyJ4Ijo5MzIuODM1OTM3NSwieSI6MjE1fSx7IngiOjkzMi44MzU5Mzc1LCJ5IjoyNTJ9XQ==" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M932.836,306L932.836,312.167C932.836,318.333,932.836,330.667,932.836,340.333C932.836,350,932.836,357,932.836,360.5L932.836,364" id="L_pg-migrate_output-sql_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_pg-migrate_output-sql_0" data-points="W3sieCI6OTMyLjgzNTkzNzUsInkiOjMwNn0seyJ4Ijo5MzIuODM1OTM3NSwieSI6MzQzfSx7IngiOjkzMi44MzU5Mzc1LCJ5IjozNjh9XQ==" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/></g><g class="edgeLabels"><g class="edgeLabel"><g class="label" data-id="L_input-tables_core-jsonmodels_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_core-jsonmodels_output-jsonschemas_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_output-jsonschemas_core-dbtypes_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_core-dbtypes_output-kysely_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_input-api_core-apitypes_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_core-apitypes_output-reqres_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_input-api_core-validators_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_output-reqres_handles-gen_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_input-api_handles-gen_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_core-validators_handles-gen_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_handles-gen_output-handlers_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_output-reqres_client-gen_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_input-api_client-gen_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_client-gen_output-client_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_input-tables_pg-drift_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_pg-drift_pg-migrate_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_pg-migrate_output-sql_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g></g><g class="nodes"><g class="node default ownedInput" id="flowchart-input-tables-0" transform="translate(823.69140625, 47)"><rect class="basic label-container" style="fill:#fde68a !important;stroke:#4f46e5 !important;stroke-width:2px !important" x="-95.9375" y="-39" width="191.875" height="78"/><g class="label" style="color:#1e1b4b !important" transform="translate(-65.9375, -24)"><rect/><foreignObject width="131.875" height="48"><div style="color: rgb(30, 27, 75) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#1e1b4b !important" class="nodeLabel"><p>Table Schemas<br /><small>PostgresRecordModel</small></p></span></div></foreignObject></g></g><g class="node default inputNode" id="flowchart-input-api-1" transform="translate(304.7265625, 47)"><rect class="basic label-container" style="fill:#fef3c7 !important;stroke:#f59e0b !important;stroke-width:1px !important" x="-85.5703125" y="-39" width="171.140625" height="78"/><g class="label" style="color:#92400e !important" transform="translate(-55.5703125, -24)"><rect/><foreignObject width="111.140625" height="48"><div style="color: rgb(146, 64, 14) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#92400e !important" class="nodeLabel"><p>API Definitions<br /><small>TsonHandlerModel</small></p></span></div></foreignObject></g></g><g class="node default dimmed" id="flowchart-core-jsonmodels-2" transform="translate(694.546875, 163)"><rect class="basic label-container" style="fill:#f1f5f9 !important;stroke:#cbd5e1 !important;stroke-width:1px !important" x="-104.2734375" y="-27" width="208.546875" height="54"/><g class="label" style="color:#94a3b8 !important" transform="translate(-74.2734375, -12)"><rect/><foreignObject width="148.546875" height="24"><div style="color: rgb(148, 163, 184) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#94a3b8 !important" class="nodeLabel"><p>generateJsonModels</p></span></div></foreignObject></g></g><g class="node default dimmed" id="flowchart-core-dbtypes-3" transform="translate(694.546875, 395)"><rect class="basic label-container" style="fill:#f1f5f9 !important;stroke:#cbd5e1 !important;stroke-width:1px !important" x="-93.15625" y="-27" width="186.3125" height="54"/><g class="label" style="color:#94a3b8 !important" transform="translate(-63.15625, -12)"><rect/><foreignObject width="126.3125" height="24"><div style="color: rgb(148, 163, 184) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#94a3b8 !important" class="nodeLabel"><p>generateDbTypes</p></span></div></foreignObject></g></g><g class="node default dimmed" id="flowchart-core-apitypes-4" transform="translate(110.4921875, 163)"><rect class="basic label-container" style="fill:#f1f5f9 !important;stroke:#cbd5e1 !important;stroke-width:1px !important" x="-94.4921875" y="-27" width="188.984375" height="54"/><g class="label" style="color:#94a3b8 !important" transform="translate(-64.4921875, -12)"><rect/><foreignObject width="128.984375" height="24"><div style="color: rgb(148, 163, 184) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#94a3b8 !important" class="nodeLabel"><p>generateApiTypes</p></span></div></foreignObject></g></g><g class="node default dimmed" id="flowchart-core-validators-5" transform="translate(472.859375, 279)"><rect class="basic label-container" style="fill:#f1f5f9 !important;stroke:#cbd5e1 !important;stroke-width:1px !important" x="-77.8828125" y="-27" width="155.765625" height="54"/><g class="label" style="color:#94a3b8 !important" transform="translate(-47.8828125, -12)"><rect/><foreignObject width="95.765625" height="24"><div style="color: rgb(148, 163, 184) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#94a3b8 !important" class="nodeLabel"><p>buildValidator</p></span></div></foreignObject></g></g><g class="node default dimmed" id="flowchart-handles-gen-6" transform="translate(359.9765625, 395)"><rect class="basic label-container" style="fill:#f1f5f9 !important;stroke:#cbd5e1 !important;stroke-width:1px !important" x="-90.9375" y="-27" width="181.875" height="54"/><g class="label" style="color:#94a3b8 !important" transform="translate(-60.9375, -12)"><rect/><foreignObject width="121.875" height="24"><div style="color: rgb(148, 163, 184) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#94a3b8 !important" class="nodeLabel"><p>generateHandles</p></span></div></foreignObject></g></g><g class="node default dimmed" id="flowchart-client-gen-7" transform="translate(129, 395)"><rect class="basic label-container" style="fill:#f1f5f9 !important;stroke:#cbd5e1 !important;stroke-width:1px !important" x="-90.0390625" y="-27" width="180.078125" height="54"/><g class="label" style="color:#94a3b8 !important" transform="translate(-60.0390625, -12)"><rect/><foreignObject width="120.078125" height="24"><div style="color: rgb(148, 163, 184) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#94a3b8 !important" class="nodeLabel"><p>generateTsClient</p></span></div></foreignObject></g></g><g class="node default highlight" id="flowchart-pg-drift-8" transform="translate(932.8359375, 163)"><rect class="basic label-container" style="fill:#4f46e5 !important;stroke:#3730a3 !important;stroke-width:2px !important" x="-66.4609375" y="-27" width="132.921875" height="54"/><g class="label" style="color:#fff !important" transform="translate(-36.4609375, -12)"><rect/><foreignObject width="72.921875" height="24"><div style="color: rgb(255, 255, 255) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#fff !important" class="nodeLabel"><p>detectDrift</p></span></div></foreignObject></g></g><g class="node default highlight" id="flowchart-pg-migrate-9" transform="translate(932.8359375, 279)"><rect class="basic label-container" style="fill:#4f46e5 !important;stroke:#3730a3 !important;stroke-width:2px !important" x="-94.484375" y="-27" width="188.96875" height="54"/><g class="label" style="color:#fff !important" transform="translate(-64.484375, -12)"><rect/><foreignObject width="128.96875" height="24"><div style="color: rgb(255, 255, 255) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#fff !important" class="nodeLabel"><p>generateMigration</p></span></div></foreignObject></g></g><g class="node default outputNode" id="flowchart-output-jsonschemas-10" transform="translate(694.546875, 279)"><rect class="basic label-container" style="fill:#d1fae5 !important;stroke:#10b981 !important;stroke-width:1px !important" x="-93.8046875" y="-39" width="187.609375" height="78"/><g class="label" style="color:#065f46 !important" transform="translate(-63.8046875, -24)"><rect/><foreignObject width="127.609375" height="48"><div style="color: rgb(6, 95, 70) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#065f46 !important" class="nodeLabel"><p>JSON Schemas +<br />TypeScript Types</p></span></div></foreignObject></g></g><g class="node default outputNode" id="flowchart-output-kysely-11" transform="translate(694.546875, 511)"><rect class="basic label-container" style="fill:#d1fae5 !important;stroke:#10b981 !important;stroke-width:1px !important" x="-90.03125" y="-39" width="180.0625" height="78"/><g class="label" style="color:#065f46 !important" transform="translate(-60.03125, -24)"><rect/><foreignObject width="120.0625" height="48"><div style="color: rgb(6, 95, 70) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#065f46 !important" class="nodeLabel"><p>Kysely Database<br />Interface</p></span></div></foreignObject></g></g><g class="node default outputNode" id="flowchart-output-reqres-12" transform="translate(110.4921875, 279)"><rect class="basic label-container" style="fill:#d1fae5 !important;stroke:#10b981 !important;stroke-width:1px !important" x="-102.4921875" y="-39" width="204.984375" height="78"/><g class="label" style="color:#065f46 !important" transform="translate(-72.4921875, -24)"><rect/><foreignObject width="144.984375" height="48"><div style="color: rgb(6, 95, 70) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#065f46 !important" class="nodeLabel"><p>Request / Response<br />TypeScript Types</p></span></div></foreignObject></g></g><g class="node default outputNode" id="flowchart-output-handlers-13" transform="translate(359.9765625, 511)"><rect class="basic label-container" style="fill:#d1fae5 !important;stroke:#10b981 !important;stroke-width:1px !important" x="-93.140625" y="-39" width="186.28125" height="78"/><g class="label" style="color:#065f46 !important" transform="translate(-63.140625, -24)"><rect/><foreignObject width="126.28125" height="48"><div style="color: rgb(6, 95, 70) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#065f46 !important" class="nodeLabel"><p>Handler Factories<br />+ Validators</p></span></div></foreignObject></g></g><g class="node default outputNode" id="flowchart-output-client-14" transform="translate(129, 511)"><rect class="basic label-container" style="fill:#d1fae5 !important;stroke:#10b981 !important;stroke-width:1px !important" x="-73.421875" y="-39" width="146.84375" height="78"/><g class="label" style="color:#065f46 !important" transform="translate(-43.421875, -24)"><rect/><foreignObject width="86.84375" height="48"><div style="color: rgb(6, 95, 70) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#065f46 !important" class="nodeLabel"><p>Type-safe<br />HTTP Client</p></span></div></foreignObject></g></g><g class="node default ownedOutput" id="flowchart-output-sql-15" transform="translate(932.8359375, 395)"><rect class="basic label-container" style="fill:#a5b4fc !important;stroke:#4f46e5 !important;stroke-width:2px !important" x="-84.8359375" y="-27" width="169.671875" height="54"/><g class="label" style="color:#1e1b4b !important" transform="translate(-54.8359375, -12)"><rect/><foreignObject width="109.671875" height="24"><div style="color: rgb(30, 27, 75) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#1e1b4b !important" class="nodeLabel"><p>SQL Migrations</p></span></div></foreignObject></g></g></g></g></g></svg>