supabee 0.2.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/LICENSE +21 -0
- package/README.md +239 -0
- package/dist/commands/data.d.ts +1 -0
- package/dist/commands/data.js +372 -0
- package/dist/commands/data.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +322 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/schema.d.ts +1 -0
- package/dist/commands/schema.js +301 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/command-contract.d.ts +28 -0
- package/dist/lib/command-contract.js +87 -0
- package/dist/lib/command-contract.js.map +1 -0
- package/dist/lib/command-mode.d.ts +7 -0
- package/dist/lib/command-mode.js +27 -0
- package/dist/lib/command-mode.js.map +1 -0
- package/dist/lib/config.d.ts +32 -0
- package/dist/lib/config.js +86 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +49 -0
- package/dist/lib/constants.js +22 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/output.d.ts +9 -0
- package/dist/lib/output.js +84 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/step-command.d.ts +27 -0
- package/dist/lib/step-command.js +52 -0
- package/dist/lib/step-command.js.map +1 -0
- package/dist/lib/ui.d.ts +13 -0
- package/dist/lib/ui.js +76 -0
- package/dist/lib/ui.js.map +1 -0
- package/package.json +53 -0
- package/supabase-splitter.config.example.json +29 -0
- package/supabee.config.example.json +29 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# Supabee
|
|
2
|
+
|
|
3
|
+
[](https://github.com/kaihochak/supabee/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/supabee)
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
|
|
7
|
+
Split large Supabase schema and data dump files into smaller, organized, version-control-friendly SQL files.
|
|
8
|
+
|
|
9
|
+
## Why?
|
|
10
|
+
|
|
11
|
+
When you run `supabase db dump`, you get a single monolithic SQL file that can be thousands of lines long. This makes it hard to:
|
|
12
|
+
|
|
13
|
+
- **Review changes** in pull requests (one giant diff vs. focused per-table diffs)
|
|
14
|
+
- **Navigate** your database structure (finding a specific table in 5000 lines vs. opening a file)
|
|
15
|
+
- **Seed selectively** (load only what you need instead of everything)
|
|
16
|
+
- **Resolve merge conflicts** (conflicts in small files vs. one massive file)
|
|
17
|
+
|
|
18
|
+
`supabee` takes those dump files and splits them into categorized, ordered files that reconstruct back to the original — verified by built-in validation.
|
|
19
|
+
|
|
20
|
+
## Prerequisites
|
|
21
|
+
|
|
22
|
+
- [Node.js](https://nodejs.org/) >= 18
|
|
23
|
+
- [Supabase CLI](https://supabase.com/docs/guides/cli/getting-started) installed and authenticated
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install --save-dev supabee
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Setup
|
|
32
|
+
|
|
33
|
+
### 1. Initialize config
|
|
34
|
+
|
|
35
|
+
Run `init` to generate `supabee.config.json` (if it doesn't exist) and update `supabase/config.toml` seed paths:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npx supabee init
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Review the generated `supabee.config.json` and adjust paths/limits for your project.
|
|
42
|
+
|
|
43
|
+
### 2. Link your Supabase project
|
|
44
|
+
|
|
45
|
+
If you haven't already, link your local repo to your Supabase project. This is required before you can dump schema or data:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
supabase link
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
You'll be prompted for your project ref and database password. See the [Supabase CLI docs](https://supabase.com/docs/reference/cli/supabase-link) for details.
|
|
52
|
+
|
|
53
|
+
### 3. Dump schema and data
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
supabase db dump > supabase/schemas/prod-schemas.sql
|
|
57
|
+
supabase db dump --data-only > supabase/seeds/prod-data.sql
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 4. Split, reconstruct, and validate
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
supabee schema
|
|
64
|
+
supabee data
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Each command runs the full chain: **split** → **reconstruct** → **validate**.
|
|
68
|
+
|
|
69
|
+
## Commands
|
|
70
|
+
|
|
71
|
+
### `init`
|
|
72
|
+
|
|
73
|
+
Creates `supabee.config.json` if missing, then updates `supabase/config.toml` `[db.seed].sql_paths` so Supabase knows where to find your split seed files.
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
supabee init
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### `schema`
|
|
80
|
+
|
|
81
|
+
Splits a schema dump into categorized folders:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
supabase/schemas/split/
|
|
85
|
+
├── 00_extensions/
|
|
86
|
+
├── 01_setup/
|
|
87
|
+
├── 02_types/
|
|
88
|
+
├── 03_functions/
|
|
89
|
+
├── 04_tables/
|
|
90
|
+
├── 05_views/
|
|
91
|
+
├── 06_constraints/
|
|
92
|
+
├── 07_indexes/
|
|
93
|
+
├── 08_foreign_keys/
|
|
94
|
+
├── 09_rls/
|
|
95
|
+
├── 10_permissions/
|
|
96
|
+
├── 11_ownership/
|
|
97
|
+
└── 12_others/
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# Full chain (split → reconstruct → validate)
|
|
102
|
+
supabee schema
|
|
103
|
+
|
|
104
|
+
# Individual steps
|
|
105
|
+
supabee schema split
|
|
106
|
+
supabee schema reconstruct
|
|
107
|
+
supabee schema validate
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### `data`
|
|
111
|
+
|
|
112
|
+
Splits a data dump into per-table files with configurable row/statement limits:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# Full chain (split → reconstruct → validate)
|
|
116
|
+
supabee data
|
|
117
|
+
|
|
118
|
+
# Individual steps
|
|
119
|
+
supabee data split
|
|
120
|
+
supabee data reconstruct
|
|
121
|
+
supabee data validate
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Overriding paths
|
|
125
|
+
|
|
126
|
+
All commands accept `--input` and `--output` flags:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
supabee schema split --input path/to/schema.sql --output path/to/split
|
|
130
|
+
supabee data split --input path/to/data.sql --output path/to/split --backup
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Use `--backup` to save the existing split directory before overwriting.
|
|
134
|
+
|
|
135
|
+
## Configuration
|
|
136
|
+
|
|
137
|
+
`supabee` reads `supabee.config.json` from your project root.
|
|
138
|
+
|
|
139
|
+
**Precedence:** CLI flags > config file > built-in defaults.
|
|
140
|
+
|
|
141
|
+
If the config file is missing, built-in defaults are used. Run `supabee init` to generate one.
|
|
142
|
+
|
|
143
|
+
Legacy support: `supabase-splitter.config.json` is still recognized, but `supabee.config.json` is preferred.
|
|
144
|
+
|
|
145
|
+
### Full config reference
|
|
146
|
+
|
|
147
|
+
```json
|
|
148
|
+
{
|
|
149
|
+
"schema": {
|
|
150
|
+
"input": "supabase/schemas/prod-schemas.sql",
|
|
151
|
+
"output": "supabase/schemas/split",
|
|
152
|
+
"reconstructed": "supabase/schemas/reconstructed-schemas.sql",
|
|
153
|
+
"keepFiles": []
|
|
154
|
+
},
|
|
155
|
+
"data": {
|
|
156
|
+
"input": "supabase/seeds/prod-data.sql",
|
|
157
|
+
"output": "supabase/seeds/split",
|
|
158
|
+
"reconstructed": "supabase/seeds/reconstructed-data.sql",
|
|
159
|
+
"maxLinesPerFile": 2000,
|
|
160
|
+
"maxStatementsPerFile": 20,
|
|
161
|
+
"maxRowsPerInsert": 200,
|
|
162
|
+
"tableRules": {},
|
|
163
|
+
"keepFiles": [],
|
|
164
|
+
"ignoreInReconstruct": []
|
|
165
|
+
},
|
|
166
|
+
"init": {
|
|
167
|
+
"seedSqlPaths": ["./seeds/split/*.sql"]
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
| Key | Description |
|
|
173
|
+
|-----|-------------|
|
|
174
|
+
| `schema.input` | Path to your schema dump file |
|
|
175
|
+
| `schema.output` | Directory for split schema files |
|
|
176
|
+
| `schema.reconstructed` | Path for the reconstructed schema (used in validation) |
|
|
177
|
+
| `schema.keepFiles` | Files in the split dir to preserve across re-splits (restored from backup) |
|
|
178
|
+
| `data.input` | Path to your data dump file |
|
|
179
|
+
| `data.output` | Directory for split data files |
|
|
180
|
+
| `data.reconstructed` | Path for the reconstructed data (used in validation) |
|
|
181
|
+
| `data.maxLinesPerFile` | Max lines per split file (default: 2000) |
|
|
182
|
+
| `data.maxStatementsPerFile` | Max INSERT statements per file (default: 20) |
|
|
183
|
+
| `data.maxRowsPerInsert` | Max rows per INSERT statement (default: 200) |
|
|
184
|
+
| `data.tableRules` | Per-table overrides (see below) |
|
|
185
|
+
| `data.keepFiles` | Files in the split dir to preserve across re-splits |
|
|
186
|
+
| `data.ignoreInReconstruct` | Files to skip during reconstruction |
|
|
187
|
+
| `init.seedSqlPaths` | Paths written to `supabase/config.toml` `[db.seed].sql_paths` |
|
|
188
|
+
|
|
189
|
+
### Table-specific rules
|
|
190
|
+
|
|
191
|
+
Override limits or skip specific tables:
|
|
192
|
+
|
|
193
|
+
```json
|
|
194
|
+
{
|
|
195
|
+
"data": {
|
|
196
|
+
"tableRules": {
|
|
197
|
+
"public.cities": {
|
|
198
|
+
"maxLinesPerFile": 800,
|
|
199
|
+
"maxStatementsPerFile": 8,
|
|
200
|
+
"maxRowsPerInsert": 80
|
|
201
|
+
},
|
|
202
|
+
"public.audit_logs": {
|
|
203
|
+
"skip": true
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Flags
|
|
211
|
+
|
|
212
|
+
Both `schema` and `data` support:
|
|
213
|
+
|
|
214
|
+
- `--input`: source SQL file
|
|
215
|
+
- `--output`: output path (split dir for `split`, reconstructed file for `reconstruct`/`validate`)
|
|
216
|
+
- `--backup`: backup dirty split directory before running split
|
|
217
|
+
|
|
218
|
+
For `validate`, you can pass reconstructed path either as `--output <path>` or as the second positional argument.
|
|
219
|
+
|
|
220
|
+
## Help
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
supabee --help
|
|
224
|
+
supabee init --help
|
|
225
|
+
supabee schema --help
|
|
226
|
+
supabee data --help
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Development
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
npm install
|
|
233
|
+
npm run typecheck
|
|
234
|
+
npm run build
|
|
235
|
+
npm run test
|
|
236
|
+
npm run pack:check
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
RC gate checklist: `docs/rc-checklist.md`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runDataCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { info, ok, error as errText } from '../lib/ui.js';
|
|
4
|
+
import { resolveCommandConfig } from '../lib/config.js';
|
|
5
|
+
import { prepareSplitOutputDir } from '../lib/output.js';
|
|
6
|
+
import { runStepCommand } from '../lib/step-command.js';
|
|
7
|
+
function countLines(str) {
|
|
8
|
+
return str.split('\n').length;
|
|
9
|
+
}
|
|
10
|
+
function countRowsInInsertStatement(statement) {
|
|
11
|
+
const lines = statement.split('\n');
|
|
12
|
+
let valuesStartIndex = -1;
|
|
13
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
14
|
+
if (lines[i].trim().toUpperCase().includes('VALUES')) {
|
|
15
|
+
valuesStartIndex = i;
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (valuesStartIndex === -1)
|
|
20
|
+
return 0;
|
|
21
|
+
const valueLines = lines.slice(valuesStartIndex + 1);
|
|
22
|
+
let rowCount = 0;
|
|
23
|
+
let parenCount = 0;
|
|
24
|
+
let inString = false;
|
|
25
|
+
let stringChar = '';
|
|
26
|
+
for (const line of valueLines) {
|
|
27
|
+
for (let i = 0; i < line.length; i += 1) {
|
|
28
|
+
const char = line[i];
|
|
29
|
+
const prevChar = i > 0 ? line[i - 1] : '';
|
|
30
|
+
if (!inString) {
|
|
31
|
+
if (char === "'" || char === '"') {
|
|
32
|
+
inString = true;
|
|
33
|
+
stringChar = char;
|
|
34
|
+
}
|
|
35
|
+
else if (char === '(') {
|
|
36
|
+
parenCount += 1;
|
|
37
|
+
}
|
|
38
|
+
else if (char === ')') {
|
|
39
|
+
parenCount -= 1;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (char === stringChar && prevChar !== '\\') {
|
|
43
|
+
inString = false;
|
|
44
|
+
stringChar = '';
|
|
45
|
+
}
|
|
46
|
+
if (!inString && parenCount === 0 && (char === ',' || char === ';'))
|
|
47
|
+
rowCount += 1;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return rowCount;
|
|
51
|
+
}
|
|
52
|
+
function breakDownInsertStatement(statement, tableName, maxRowsPerInsert) {
|
|
53
|
+
if (!Number.isFinite(maxRowsPerInsert) || maxRowsPerInsert <= 0)
|
|
54
|
+
return [statement];
|
|
55
|
+
const lines = statement.split('\n');
|
|
56
|
+
let valuesStartIndex = -1;
|
|
57
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
58
|
+
if (lines[i].trim().toUpperCase().includes('VALUES')) {
|
|
59
|
+
valuesStartIndex = i;
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (valuesStartIndex === -1)
|
|
64
|
+
return [statement];
|
|
65
|
+
const header = lines.slice(0, valuesStartIndex + 1).join('\n');
|
|
66
|
+
const valueLines = lines.slice(valuesStartIndex + 1);
|
|
67
|
+
const valueRows = [];
|
|
68
|
+
let currentRow = '';
|
|
69
|
+
let parenCount = 0;
|
|
70
|
+
let inString = false;
|
|
71
|
+
let stringChar = '';
|
|
72
|
+
for (const line of valueLines) {
|
|
73
|
+
for (let i = 0; i < line.length; i += 1) {
|
|
74
|
+
const char = line[i];
|
|
75
|
+
const prevChar = i > 0 ? line[i - 1] : '';
|
|
76
|
+
if (!inString) {
|
|
77
|
+
if (char === "'" || char === '"') {
|
|
78
|
+
inString = true;
|
|
79
|
+
stringChar = char;
|
|
80
|
+
}
|
|
81
|
+
else if (char === '(') {
|
|
82
|
+
parenCount += 1;
|
|
83
|
+
}
|
|
84
|
+
else if (char === ')') {
|
|
85
|
+
parenCount -= 1;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else if (char === stringChar && prevChar !== '\\') {
|
|
89
|
+
inString = false;
|
|
90
|
+
stringChar = '';
|
|
91
|
+
}
|
|
92
|
+
currentRow += char;
|
|
93
|
+
if (!inString && parenCount === 0 && (char === ',' || char === ';')) {
|
|
94
|
+
valueRows.push(currentRow.trim().slice(0, -1));
|
|
95
|
+
currentRow = '';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (currentRow.trim() && !currentRow.endsWith('\n'))
|
|
99
|
+
currentRow += '\n';
|
|
100
|
+
}
|
|
101
|
+
if (currentRow.trim())
|
|
102
|
+
valueRows.push(currentRow.trim());
|
|
103
|
+
if (valueRows.length <= maxRowsPerInsert)
|
|
104
|
+
return [statement];
|
|
105
|
+
const chunks = [];
|
|
106
|
+
for (let i = 0; i < valueRows.length; i += maxRowsPerInsert) {
|
|
107
|
+
const chunk = valueRows.slice(i, i + maxRowsPerInsert);
|
|
108
|
+
chunks.push(`${header}\n\t${chunk.join(',\n\t')};`);
|
|
109
|
+
}
|
|
110
|
+
console.log(info(`Broke down ${tableName} INSERT statement: ${valueRows.length} rows -> ${chunks.length} statements`));
|
|
111
|
+
return chunks;
|
|
112
|
+
}
|
|
113
|
+
function parseSeedContent(content) {
|
|
114
|
+
const lines = content.split('\n');
|
|
115
|
+
const tableContent = {};
|
|
116
|
+
let currentTable = null;
|
|
117
|
+
let currentStatement = [];
|
|
118
|
+
let inInsertStatement = false;
|
|
119
|
+
for (const line of lines) {
|
|
120
|
+
if (!inInsertStatement && (line.trim().startsWith('--') || line.trim() === ''))
|
|
121
|
+
continue;
|
|
122
|
+
const insertMatch = line.match(/^INSERT\s+INTO\s+(["`']?)([^."`'\s(]+)\1\.(["`']?)([^."`'\s(]+)\3/i);
|
|
123
|
+
if (insertMatch) {
|
|
124
|
+
if (inInsertStatement && currentTable && currentStatement.length > 0) {
|
|
125
|
+
if (!tableContent[currentTable])
|
|
126
|
+
tableContent[currentTable] = [];
|
|
127
|
+
tableContent[currentTable].push(currentStatement.join('\n'));
|
|
128
|
+
}
|
|
129
|
+
currentTable = `${insertMatch[2]}.${insertMatch[4]}`;
|
|
130
|
+
currentStatement = [line];
|
|
131
|
+
inInsertStatement = true;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (inInsertStatement) {
|
|
135
|
+
currentStatement.push(line);
|
|
136
|
+
if (line.trim().endsWith(';') && currentTable) {
|
|
137
|
+
if (!tableContent[currentTable])
|
|
138
|
+
tableContent[currentTable] = [];
|
|
139
|
+
tableContent[currentTable].push(currentStatement.join('\n'));
|
|
140
|
+
currentStatement = [];
|
|
141
|
+
inInsertStatement = false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (inInsertStatement && currentTable && currentStatement.length > 0) {
|
|
146
|
+
if (!tableContent[currentTable])
|
|
147
|
+
tableContent[currentTable] = [];
|
|
148
|
+
tableContent[currentTable].push(currentStatement.join('\n'));
|
|
149
|
+
}
|
|
150
|
+
const sequenceLines = lines.filter((line) => line.includes('SEQUENCE SET') || (line.trim().startsWith('SELECT') && line.includes('setval')));
|
|
151
|
+
return { tableContent, sequenceLines, lineCount: lines.length };
|
|
152
|
+
}
|
|
153
|
+
function asPositiveNumber(value, fallback) {
|
|
154
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback;
|
|
155
|
+
}
|
|
156
|
+
function getEffectiveTableLimits(table, config) {
|
|
157
|
+
const tableRule = config.tableRules?.[table];
|
|
158
|
+
if (!tableRule || typeof tableRule !== 'object')
|
|
159
|
+
return { ...config.limits, skip: false };
|
|
160
|
+
return {
|
|
161
|
+
maxLinesPerFile: asPositiveNumber(tableRule.maxLinesPerFile, config.limits.maxLinesPerFile),
|
|
162
|
+
maxStatementsPerFile: asPositiveNumber(tableRule.maxStatementsPerFile, config.limits.maxStatementsPerFile),
|
|
163
|
+
maxRowsPerInsert: asPositiveNumber(tableRule.maxRowsPerInsert, config.limits.maxRowsPerInsert),
|
|
164
|
+
skip: tableRule.skip === true,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function writeTableChunks(config, table, statements, counter) {
|
|
168
|
+
const tableLimits = getEffectiveTableLimits(table, config);
|
|
169
|
+
if (tableLimits.skip) {
|
|
170
|
+
console.log(info(`Skipping table by rule: ${table}`));
|
|
171
|
+
return counter;
|
|
172
|
+
}
|
|
173
|
+
const cleanTableName = table.replace(/\./g, '_');
|
|
174
|
+
let fileCounter = 0;
|
|
175
|
+
const processedStatements = [];
|
|
176
|
+
for (const statement of statements) {
|
|
177
|
+
const rowCount = countRowsInInsertStatement(statement);
|
|
178
|
+
if (rowCount > tableLimits.maxRowsPerInsert) {
|
|
179
|
+
processedStatements.push(...breakDownInsertStatement(statement, table, tableLimits.maxRowsPerInsert));
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
processedStatements.push(statement);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
statements = processedStatements;
|
|
186
|
+
const totalLines = statements.reduce((acc, stmt) => acc + countLines(stmt), 0);
|
|
187
|
+
const totalStatements = statements.length;
|
|
188
|
+
const needsSplitByLines = totalLines > tableLimits.maxLinesPerFile;
|
|
189
|
+
const needsSplitByStatements = totalStatements > tableLimits.maxStatementsPerFile;
|
|
190
|
+
const needsSplitting = needsSplitByLines || needsSplitByStatements;
|
|
191
|
+
if (!needsSplitting) {
|
|
192
|
+
const filename = `${String(counter).padStart(3, '0')}_${cleanTableName}.sql`;
|
|
193
|
+
fs.writeFileSync(path.join(config.outputDir, filename), statements.join('\n\n'));
|
|
194
|
+
console.log(info(`Created ${filename} with ${totalStatements} statements (${totalLines} lines)`));
|
|
195
|
+
return counter + 1;
|
|
196
|
+
}
|
|
197
|
+
let currentChunk = [];
|
|
198
|
+
let currentLines = 0;
|
|
199
|
+
let writtenFiles = 0;
|
|
200
|
+
for (const statement of statements) {
|
|
201
|
+
const statementLines = countLines(statement);
|
|
202
|
+
const wouldExceedLines = currentLines + statementLines > tableLimits.maxLinesPerFile;
|
|
203
|
+
const wouldExceedStatements = currentChunk.length >= tableLimits.maxStatementsPerFile;
|
|
204
|
+
if ((wouldExceedLines || wouldExceedStatements) && currentChunk.length > 0) {
|
|
205
|
+
const filename = `${String(counter).padStart(3, '0')}_${cleanTableName}_${String(fileCounter + 1).padStart(2, '0')}.sql`;
|
|
206
|
+
fs.writeFileSync(path.join(config.outputDir, filename), currentChunk.join('\n\n'));
|
|
207
|
+
console.log(info(`Created ${filename} with ${currentChunk.length} statements (${currentLines} lines)`));
|
|
208
|
+
currentChunk = [];
|
|
209
|
+
currentLines = 0;
|
|
210
|
+
fileCounter += 1;
|
|
211
|
+
writtenFiles += 1;
|
|
212
|
+
}
|
|
213
|
+
currentChunk.push(statement);
|
|
214
|
+
currentLines += statementLines;
|
|
215
|
+
}
|
|
216
|
+
if (currentChunk.length > 0) {
|
|
217
|
+
const filename = `${String(counter).padStart(3, '0')}_${cleanTableName}_${String(fileCounter + 1).padStart(2, '0')}.sql`;
|
|
218
|
+
fs.writeFileSync(path.join(config.outputDir, filename), currentChunk.join('\n\n'));
|
|
219
|
+
console.log(info(`Created ${filename} with ${currentChunk.length} statements (${currentLines} lines)`));
|
|
220
|
+
writtenFiles += 1;
|
|
221
|
+
}
|
|
222
|
+
console.log(info(`Table ${table} split into ${writtenFiles} files`));
|
|
223
|
+
return counter + 1;
|
|
224
|
+
}
|
|
225
|
+
function splitData(config) {
|
|
226
|
+
console.log(info(`Reading data file: ${config.inputFile}`));
|
|
227
|
+
const dataContent = fs.readFileSync(config.inputFile, 'utf8');
|
|
228
|
+
console.log(ok(`Loaded data file: ${(dataContent.length / 1024 / 1024).toFixed(2)}MB`));
|
|
229
|
+
fs.writeFileSync(path.join(config.outputDir, '001_setup.sql'), "-- Initial setup\nSET session_replication_role = 'replica';\n");
|
|
230
|
+
fs.writeFileSync(path.join(config.outputDir, '999_cleanup.sql'), '-- Cleanup\nRESET ALL;\n');
|
|
231
|
+
const parsed = parseSeedContent(dataContent);
|
|
232
|
+
console.log(info(`Processing ${parsed.lineCount} lines...`));
|
|
233
|
+
let counter = 2;
|
|
234
|
+
for (const [table, statements] of Object.entries(parsed.tableContent)) {
|
|
235
|
+
if (statements.length === 0)
|
|
236
|
+
continue;
|
|
237
|
+
counter = writeTableChunks(config, table, statements, counter);
|
|
238
|
+
}
|
|
239
|
+
if (parsed.sequenceLines.length > 0) {
|
|
240
|
+
const sequenceFile = `${String(counter).padStart(3, '0')}_sequences.sql`;
|
|
241
|
+
fs.writeFileSync(path.join(config.outputDir, sequenceFile), `-- Sequence values\n${parsed.sequenceLines.join('\n')}`);
|
|
242
|
+
console.log(info(`Created ${sequenceFile} with ${parsed.sequenceLines.length} sequence statements`));
|
|
243
|
+
}
|
|
244
|
+
const createdFiles = fs.readdirSync(config.outputDir).filter((file) => file.endsWith('.sql')).length;
|
|
245
|
+
console.log(ok(`Data split completed. ${createdFiles} files created in ${config.outputDir}.`));
|
|
246
|
+
}
|
|
247
|
+
function toRegexPattern(pattern) {
|
|
248
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*');
|
|
249
|
+
return new RegExp(`^${escaped}$`);
|
|
250
|
+
}
|
|
251
|
+
function shouldIgnoreFile(fileName, patterns) {
|
|
252
|
+
if (!patterns || patterns.length === 0)
|
|
253
|
+
return false;
|
|
254
|
+
return patterns.some((pattern) => {
|
|
255
|
+
if (pattern.includes('*'))
|
|
256
|
+
return toRegexPattern(pattern).test(fileName);
|
|
257
|
+
return pattern === fileName || pattern.endsWith(`/${fileName}`);
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
function reconstructData(config) {
|
|
261
|
+
const files = fs
|
|
262
|
+
.readdirSync(config.outputDir)
|
|
263
|
+
.filter((file) => file.endsWith('.sql'))
|
|
264
|
+
.filter((file) => !shouldIgnoreFile(file, config.ignoreInReconstruct))
|
|
265
|
+
.sort((a, b) => a.localeCompare(b));
|
|
266
|
+
const contents = files.map((file) => fs.readFileSync(path.join(config.outputDir, file), 'utf8').trimEnd());
|
|
267
|
+
const reconstructed = `${contents.join('\n\n')}\n`;
|
|
268
|
+
fs.writeFileSync(config.reconstructedFile, reconstructed, 'utf8');
|
|
269
|
+
console.log(ok(`Reconstructed data written to: ${config.reconstructedFile}`));
|
|
270
|
+
}
|
|
271
|
+
function getRowCountByTable(tableContent) {
|
|
272
|
+
const counts = {};
|
|
273
|
+
for (const [table, statements] of Object.entries(tableContent)) {
|
|
274
|
+
counts[table] = statements.reduce((acc, statement) => acc + countRowsInInsertStatement(statement), 0);
|
|
275
|
+
}
|
|
276
|
+
return counts;
|
|
277
|
+
}
|
|
278
|
+
function validateData(config) {
|
|
279
|
+
const originalContent = fs.readFileSync(config.inputFile, 'utf8');
|
|
280
|
+
const reconstructedContent = fs.readFileSync(config.reconstructedFile, 'utf8');
|
|
281
|
+
const originalParsed = parseSeedContent(originalContent);
|
|
282
|
+
const reconstructedParsed = parseSeedContent(reconstructedContent);
|
|
283
|
+
const originalRows = getRowCountByTable(originalParsed.tableContent);
|
|
284
|
+
const reconstructedRows = getRowCountByTable(reconstructedParsed.tableContent);
|
|
285
|
+
const originalTables = Object.keys(originalRows).sort();
|
|
286
|
+
const reconstructedTables = Object.keys(reconstructedRows).sort();
|
|
287
|
+
const missingTables = originalTables.filter((table) => !Object.hasOwn(reconstructedRows, table));
|
|
288
|
+
const extraTables = reconstructedTables.filter((table) => !Object.hasOwn(originalRows, table));
|
|
289
|
+
const mismatchedCounts = [];
|
|
290
|
+
for (const table of originalTables) {
|
|
291
|
+
if (!Object.hasOwn(reconstructedRows, table))
|
|
292
|
+
continue;
|
|
293
|
+
if (originalRows[table] !== reconstructedRows[table]) {
|
|
294
|
+
mismatchedCounts.push({ table, original: originalRows[table], reconstructed: reconstructedRows[table] });
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const originalSequenceCount = originalParsed.sequenceLines.length;
|
|
298
|
+
const reconstructedSequenceCount = reconstructedParsed.sequenceLines.length;
|
|
299
|
+
if (missingTables.length === 0 &&
|
|
300
|
+
extraTables.length === 0 &&
|
|
301
|
+
mismatchedCounts.length === 0 &&
|
|
302
|
+
originalSequenceCount === reconstructedSequenceCount) {
|
|
303
|
+
console.log(ok('Validation successful: row counts and sequence statements match.'));
|
|
304
|
+
console.log(info(`Tables: ${originalTables.length}`));
|
|
305
|
+
console.log(info(`Sequence statements: ${originalSequenceCount}`));
|
|
306
|
+
return true;
|
|
307
|
+
}
|
|
308
|
+
console.log(errText('Validation failed: reconstructed data does not match original source.'));
|
|
309
|
+
if (missingTables.length > 0)
|
|
310
|
+
console.log(info(`Missing tables: ${missingTables.join(', ')}`));
|
|
311
|
+
if (extraTables.length > 0)
|
|
312
|
+
console.log(info(`Unexpected tables: ${extraTables.join(', ')}`));
|
|
313
|
+
if (mismatchedCounts.length > 0) {
|
|
314
|
+
console.log(info(`Row count mismatches: ${mismatchedCounts.length}`));
|
|
315
|
+
mismatchedCounts.slice(0, 10).forEach((item) => {
|
|
316
|
+
console.log(info(` ${item.table}: original=${item.original}, reconstructed=${item.reconstructed}`));
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
if (originalSequenceCount !== reconstructedSequenceCount) {
|
|
320
|
+
console.log(info(`Sequence mismatch: original=${originalSequenceCount}, reconstructed=${reconstructedSequenceCount}`));
|
|
321
|
+
}
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
export async function runDataCommand(args) {
|
|
325
|
+
await runStepCommand(args, {
|
|
326
|
+
commandName: 'data',
|
|
327
|
+
commandDisplayName: 'Data',
|
|
328
|
+
detailNote: (step) => ({
|
|
329
|
+
split: ' Splitting data into files...',
|
|
330
|
+
reconstruct: ' Reconstructing data SQL from split files...',
|
|
331
|
+
validate: ' Validating reconstructed data against original...',
|
|
332
|
+
})[step],
|
|
333
|
+
buildDefaults: () => resolveCommandConfig('data', {}),
|
|
334
|
+
getDetailLines: (step, config) => {
|
|
335
|
+
if (step === 'split') {
|
|
336
|
+
return [
|
|
337
|
+
`input = ${config.inputFile}`,
|
|
338
|
+
`output = ${config.outputDir}`,
|
|
339
|
+
`maxLinesPerFile = ${config.limits.maxLinesPerFile}`,
|
|
340
|
+
`maxStatementsPerFile = ${config.limits.maxStatementsPerFile}`,
|
|
341
|
+
`maxRowsPerInsert = ${config.limits.maxRowsPerInsert}`,
|
|
342
|
+
`tableRules = ${Object.keys(config.tableRules || {}).length}`,
|
|
343
|
+
`keepFiles = ${config.keepFiles.length}`,
|
|
344
|
+
];
|
|
345
|
+
}
|
|
346
|
+
if (step === 'reconstruct') {
|
|
347
|
+
return [
|
|
348
|
+
`input = ${config.outputDir}`,
|
|
349
|
+
`reconstructed = ${config.reconstructedFile}`,
|
|
350
|
+
`ignoreInReconstruct = ${config.ignoreInReconstruct.length}`,
|
|
351
|
+
];
|
|
352
|
+
}
|
|
353
|
+
return [
|
|
354
|
+
`input = ${config.inputFile}`,
|
|
355
|
+
`reconstructed = ${config.reconstructedFile}`,
|
|
356
|
+
];
|
|
357
|
+
},
|
|
358
|
+
actions: {
|
|
359
|
+
split: async ({ config, options }) => {
|
|
360
|
+
await prepareSplitOutputDir(config.outputDir, options.backup, 'Data', { keepFiles: config.keepFiles });
|
|
361
|
+
splitData(config);
|
|
362
|
+
},
|
|
363
|
+
reconstruct: async ({ config }) => {
|
|
364
|
+
reconstructData(config);
|
|
365
|
+
},
|
|
366
|
+
validate: async ({ config }) => {
|
|
367
|
+
return validateData(config);
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
//# sourceMappingURL=data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/commands/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAmB,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAexD,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAChC,CAAC;AAED,SAAS,0BAA0B,CAAC,SAAiB;IACnD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,gBAAgB,GAAG,CAAC,CAAC,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,gBAAgB,GAAG,CAAC,CAAC;YACrB,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,gBAAgB,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAEtC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;IACrD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAE1C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACjC,QAAQ,GAAG,IAAI,CAAC;oBAChB,UAAU,GAAG,IAAI,CAAC;gBACpB,CAAC;qBAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACxB,UAAU,IAAI,CAAC,CAAC;gBAClB,CAAC;qBAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACxB,UAAU,IAAI,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,KAAK,UAAU,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACpD,QAAQ,GAAG,KAAK,CAAC;gBACjB,UAAU,GAAG,EAAE,CAAC;YAClB,CAAC;YAED,IAAI,CAAC,QAAQ,IAAI,UAAU,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC;gBAAE,QAAQ,IAAI,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,wBAAwB,CAAC,SAAiB,EAAE,SAAiB,EAAE,gBAAwB;IAC9F,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,IAAI,CAAC;QAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAEpF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,gBAAgB,GAAG,CAAC,CAAC,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,gBAAgB,GAAG,CAAC,CAAC;YACrB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,gBAAgB,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;IAErD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAE1C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACjC,QAAQ,GAAG,IAAI,CAAC;oBAChB,UAAU,GAAG,IAAI,CAAC;gBACpB,CAAC;qBAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACxB,UAAU,IAAI,CAAC,CAAC;gBAClB,CAAC;qBAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACxB,UAAU,IAAI,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,KAAK,UAAU,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACpD,QAAQ,GAAG,KAAK,CAAC;gBACjB,UAAU,GAAG,EAAE,CAAC;YAClB,CAAC;YAED,UAAU,IAAI,IAAI,CAAC;YACnB,IAAI,CAAC,QAAQ,IAAI,UAAU,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACpE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/C,UAAU,GAAG,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,UAAU,IAAI,IAAI,CAAC;IAC1E,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,EAAE;QAAE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IAEzD,IAAI,SAAS,CAAC,MAAM,IAAI,gBAAgB;QAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,SAAS,sBAAsB,SAAS,CAAC,MAAM,YAAY,MAAM,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC;IACvH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,YAAY,GAA6B,EAAE,CAAC;IAClD,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,gBAAgB,GAAa,EAAE,CAAC;IACpC,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;YAAE,SAAS;QAEzF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;QAErG,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,iBAAiB,IAAI,YAAY,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrE,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;oBAAE,YAAY,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;gBACjE,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/D,CAAC;YAED,YAAY,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,gBAAgB,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1B,iBAAiB,GAAG,IAAI,CAAC;YACzB,SAAS;QACX,CAAC;QAED,IAAI,iBAAiB,EAAE,CAAC;YACtB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,YAAY,EAAE,CAAC;gBAC9C,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;oBAAE,YAAY,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;gBACjE,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7D,gBAAgB,GAAG,EAAE,CAAC;gBACtB,iBAAiB,GAAG,KAAK,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,iBAAiB,IAAI,YAAY,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;YAAE,YAAY,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;QACjE,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAChC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CACzG,CAAC;IAEF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAE,QAAgB;IACxD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7F,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa,EAAE,MAAkB;IAChE,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAE1F,OAAO;QACL,eAAe,EAAE,gBAAgB,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;QAC3F,oBAAoB,EAAE,gBAAgB,CAAC,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC;QAC1G,gBAAgB,EAAE,gBAAgB,CAAC,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAC9F,IAAI,EAAE,SAAS,CAAC,IAAI,KAAK,IAAI;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAkB,EAAE,KAAa,EAAE,UAAoB,EAAE,OAAe;IAChG,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC3D,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjD,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,MAAM,mBAAmB,GAAa,EAAE,CAAC;IACzC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,QAAQ,GAAG,WAAW,CAAC,gBAAgB,EAAE,CAAC;YAC5C,mBAAmB,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACxG,CAAC;aAAM,CAAC;YACN,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,UAAU,GAAG,mBAAmB,CAAC;IACjC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC;IAE1C,MAAM,iBAAiB,GAAG,UAAU,GAAG,WAAW,CAAC,eAAe,CAAC;IACnE,MAAM,sBAAsB,GAAG,eAAe,GAAG,WAAW,CAAC,oBAAoB,CAAC;IAClF,MAAM,cAAc,GAAG,iBAAiB,IAAI,sBAAsB,CAAC;IAEnE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,cAAc,MAAM,CAAC;QAC7E,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,QAAQ,SAAS,eAAe,gBAAgB,UAAU,SAAS,CAAC,CAAC,CAAC;QAClG,OAAO,OAAO,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,gBAAgB,GAAG,YAAY,GAAG,cAAc,GAAG,WAAW,CAAC,eAAe,CAAC;QACrF,MAAM,qBAAqB,GAAG,YAAY,CAAC,MAAM,IAAI,WAAW,CAAC,oBAAoB,CAAC;QAEtF,IAAI,CAAC,gBAAgB,IAAI,qBAAqB,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3E,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,cAAc,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;YACzH,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACnF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,QAAQ,SAAS,YAAY,CAAC,MAAM,gBAAgB,YAAY,SAAS,CAAC,CAAC,CAAC;YACxG,YAAY,GAAG,EAAE,CAAC;YAClB,YAAY,GAAG,CAAC,CAAC;YACjB,WAAW,IAAI,CAAC,CAAC;YACjB,YAAY,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,YAAY,IAAI,cAAc,CAAC;IACjC,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,cAAc,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;QACzH,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,QAAQ,SAAS,YAAY,CAAC,MAAM,gBAAgB,YAAY,SAAS,CAAC,CAAC,CAAC;QACxG,YAAY,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,eAAe,YAAY,QAAQ,CAAC,CAAC,CAAC;IACrE,OAAO,OAAO,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,SAAS,CAAC,MAAkB;IACnC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,qBAAqB,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAExF,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,+DAA+D,CAAC,CAAC;IAChI,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,0BAA0B,CAAC,CAAC;IAE7F,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC;IAE7D,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QACtE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACtC,OAAO,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC;QACzE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,uBAAuB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,YAAY,SAAS,MAAM,CAAC,aAAa,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,YAAY,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,yBAAyB,YAAY,qBAAqB,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClF,OAAO,IAAI,MAAM,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,QAAkB;IAC5D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAC/B,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzE,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB;IACzC,MAAM,KAAK,GAAG,EAAE;SACb,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC;SAC7B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACvC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;SACrE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3G,MAAM,aAAa,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACnD,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,kCAAkC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,kBAAkB,CAAC,YAAsC;IAChE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,GAAG,0BAA0B,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,MAAkB;IACtC,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAClE,MAAM,oBAAoB,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAE/E,MAAM,cAAc,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IACzD,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,kBAAkB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IACrE,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAE/E,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC;IAElE,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC;IACjG,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;IAE/F,MAAM,gBAAgB,GAAsE,EAAE,CAAC;IAC/F,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC;YAAE,SAAS;QACvD,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAED,MAAM,qBAAqB,GAAG,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC;IAClE,MAAM,0BAA0B,GAAG,mBAAmB,CAAC,aAAa,CAAC,MAAM,CAAC;IAE5E,IACE,aAAa,CAAC,MAAM,KAAK,CAAC;QAC1B,WAAW,CAAC,MAAM,KAAK,CAAC;QACxB,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAC7B,qBAAqB,KAAK,0BAA0B,EACpD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,kEAAkE,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,qBAAqB,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,uEAAuE,CAAC,CAAC,CAAC;IAC9F,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/F,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9F,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtE,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,cAAc,IAAI,CAAC,QAAQ,mBAAmB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QACvG,CAAC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,qBAAqB,KAAK,0BAA0B,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,+BAA+B,qBAAqB,mBAAmB,0BAA0B,EAAE,CAAC,CAAC,CAAC;IACzH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,MAAM,cAAc,CAAC,IAAI,EAAE;QACzB,WAAW,EAAE,MAAM;QACnB,kBAAkB,EAAE,MAAM;QAC1B,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CACnB,CAAC;YACC,KAAK,EAAE,+BAA+B;YACtC,WAAW,EAAE,8CAA8C;YAC3D,QAAQ,EAAE,oDAAoD;SAC/D,CAAC,CAAC,IAAI,CAAC;QACV,aAAa,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC;QACrD,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAC/B,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrB,OAAO;oBACL,WAAW,MAAM,CAAC,SAAS,EAAE;oBAC7B,YAAY,MAAM,CAAC,SAAS,EAAE;oBAC9B,qBAAqB,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE;oBACpD,0BAA0B,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE;oBAC9D,sBAAsB,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;oBACtD,gBAAgB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;oBAC7D,eAAe,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;iBACzC,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC3B,OAAO;oBACL,WAAW,MAAM,CAAC,SAAS,EAAE;oBAC7B,mBAAmB,MAAM,CAAC,iBAAiB,EAAE;oBAC7C,yBAAyB,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE;iBAC7D,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,WAAW,MAAM,CAAC,SAAS,EAAE;gBAC7B,mBAAmB,MAAM,CAAC,iBAAiB,EAAE;aAC9C,CAAC;QACJ,CAAC;QACD,OAAO,EAAE;YACP,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;gBACnC,MAAM,qBAAqB,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBACvG,SAAS,CAAC,MAAM,CAAC,CAAC;YACpB,CAAC;YACD,WAAW,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;gBAChC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;YACD,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC7B,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;SACF;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runInitCommand(args: string[]): Promise<void>;
|