@rawsql-ts/ztd-cli 0.13.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 +178 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/commands/ddl.d.ts +7 -0
- package/dist/commands/ddl.js +118 -0
- package/dist/commands/ddl.js.map +1 -0
- package/dist/commands/diff.d.ts +10 -0
- package/dist/commands/diff.js +38 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/genConfigCommand.d.ts +2 -0
- package/dist/commands/genConfigCommand.js +36 -0
- package/dist/commands/genConfigCommand.js.map +1 -0
- package/dist/commands/genEntities.d.ts +6 -0
- package/dist/commands/genEntities.js +50 -0
- package/dist/commands/genEntities.js.map +1 -0
- package/dist/commands/init.d.ts +34 -0
- package/dist/commands/init.js +467 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/options.d.ts +9 -0
- package/dist/commands/options.js +48 -0
- package/dist/commands/options.js.map +1 -0
- package/dist/commands/pull.d.ts +10 -0
- package/dist/commands/pull.js +105 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/ztdConfig.d.ts +22 -0
- package/dist/commands/ztdConfig.js +190 -0
- package/dist/commands/ztdConfig.js.map +1 -0
- package/dist/commands/ztdConfigCommand.d.ts +5 -0
- package/dist/commands/ztdConfigCommand.js +146 -0
- package/dist/commands/ztdConfigCommand.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/agents.d.ts +1 -0
- package/dist/utils/agents.js +31 -0
- package/dist/utils/agents.js.map +1 -0
- package/dist/utils/collectSqlFiles.d.ts +9 -0
- package/dist/utils/collectSqlFiles.js +58 -0
- package/dist/utils/collectSqlFiles.js.map +1 -0
- package/dist/utils/connectionSummary.d.ts +3 -0
- package/dist/utils/connectionSummary.js +29 -0
- package/dist/utils/connectionSummary.js.map +1 -0
- package/dist/utils/dbConnection.d.ts +29 -0
- package/dist/utils/dbConnection.js +210 -0
- package/dist/utils/dbConnection.js.map +1 -0
- package/dist/utils/fs.d.ts +1 -0
- package/dist/utils/fs.js +12 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/normalizePulledSchema.d.ts +12 -0
- package/dist/utils/normalizePulledSchema.js +201 -0
- package/dist/utils/normalizePulledSchema.js.map +1 -0
- package/dist/utils/pgDump.d.ts +11 -0
- package/dist/utils/pgDump.js +55 -0
- package/dist/utils/pgDump.js.map +1 -0
- package/dist/utils/sqliteAffinity.d.ts +5 -0
- package/dist/utils/sqliteAffinity.js +39 -0
- package/dist/utils/sqliteAffinity.js.map +1 -0
- package/dist/utils/typeMapper.d.ts +4 -0
- package/dist/utils/typeMapper.js +76 -0
- package/dist/utils/typeMapper.js.map +1 -0
- package/dist/utils/ztdProjectConfig.d.ts +37 -0
- package/dist/utils/ztdProjectConfig.js +161 -0
- package/dist/utils/ztdProjectConfig.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runGenerateEntities = runGenerateEntities;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const collectSqlFiles_1 = require("../utils/collectSqlFiles");
|
|
10
|
+
const fs_1 = require("../utils/fs");
|
|
11
|
+
const typeMapper_1 = require("../utils/typeMapper");
|
|
12
|
+
const ztdConfig_1 = require("./ztdConfig");
|
|
13
|
+
function runGenerateEntities(options) {
|
|
14
|
+
const sources = (0, collectSqlFiles_1.collectSqlFiles)(options.directories, options.extensions);
|
|
15
|
+
if (sources.length === 0) {
|
|
16
|
+
throw new Error(`No SQL files were discovered under ${options.directories.join(', ')}`);
|
|
17
|
+
}
|
|
18
|
+
const tables = (0, ztdConfig_1.snapshotTableMetadata)(sources);
|
|
19
|
+
if (tables.length === 0) {
|
|
20
|
+
throw new Error('The provided DDL sources did not contain any CREATE TABLE statements.');
|
|
21
|
+
}
|
|
22
|
+
const output = renderEntitiesFile(tables);
|
|
23
|
+
(0, fs_1.ensureDirectory)(node_path_1.default.dirname(options.out));
|
|
24
|
+
(0, node_fs_1.writeFileSync)(options.out, output, 'utf8');
|
|
25
|
+
console.log(`Generated ${tables.length} schema helpers at ${options.out}`);
|
|
26
|
+
}
|
|
27
|
+
function renderEntitiesFile(tables) {
|
|
28
|
+
// The header reminds maintainers that this file is a secondary reference next to tests/generated/ztd-row-map.generated.ts.
|
|
29
|
+
const header = [
|
|
30
|
+
'// ENTITY HELPERS - AUTO GENERATED',
|
|
31
|
+
'// Complementary reference for tooling. TestRowMap in tests/generated/ztd-row-map.generated.ts remains authoritative.',
|
|
32
|
+
''
|
|
33
|
+
].join('\n');
|
|
34
|
+
// Emit an interface per table to keep column metadata available for optional helpers.
|
|
35
|
+
const definitions = tables
|
|
36
|
+
.map((table) => {
|
|
37
|
+
const entityName = table.testRowInterfaceName.replace(/TestRow$/, 'Entity');
|
|
38
|
+
const fields = table.columns
|
|
39
|
+
.map((column) => {
|
|
40
|
+
const baseType = (0, typeMapper_1.mapSqlTypeToTs)(column.typeName, `${table.name}.${column.name}`);
|
|
41
|
+
const tsType = column.isNullable ? `${baseType} | null` : baseType;
|
|
42
|
+
return ` ${column.name}: ${tsType};`;
|
|
43
|
+
})
|
|
44
|
+
.join('\n');
|
|
45
|
+
return `export interface ${entityName} {\n${fields}\n}`;
|
|
46
|
+
})
|
|
47
|
+
.join('\n\n');
|
|
48
|
+
return `${header}${definitions}\n`;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=genEntities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genEntities.js","sourceRoot":"","sources":["../../src/commands/genEntities.ts"],"names":[],"mappings":";;;;;AAaA,kDAeC;AA5BD,qCAAwC;AACxC,0DAA6B;AAC7B,8DAA2D;AAC3D,oCAA8C;AAC9C,oDAAqD;AACrD,2CAAwE;AAQxE,SAAgB,mBAAmB,CAAC,OAAgC;IAClE,MAAM,OAAO,GAAG,IAAA,iCAAe,EAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,iCAAqB,EAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAA,oBAAe,EAAC,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAA,uBAAa,EAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,sBAAsB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAuB;IACjD,2HAA2H;IAC3H,MAAM,MAAM,GAAG;QACb,oCAAoC;QACpC,uHAAuH;QACvH,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,sFAAsF;IACtF,MAAM,WAAW,GAAG,MAAM;SACvB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,UAAU,GAAG,KAAK,CAAC,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;aACzB,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACd,MAAM,QAAQ,GAAG,IAAA,2BAAc,EAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACjF,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;YACnE,OAAO,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,GAAG,CAAC;QACxC,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,oBAAoB,UAAU,OAAO,MAAM,KAAK,CAAC;IAC1D,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,OAAO,GAAG,MAAM,GAAG,WAAW,IAAI,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { type ZtdConfigGenerationOptions } from './ztdConfig';
|
|
3
|
+
import { type PullSchemaOptions } from './pull';
|
|
4
|
+
export interface Prompter {
|
|
5
|
+
selectChoice(question: string, choices: string[]): Promise<number>;
|
|
6
|
+
promptInput(question: string, example?: string): Promise<string>;
|
|
7
|
+
confirm(question: string): Promise<boolean>;
|
|
8
|
+
close(): void;
|
|
9
|
+
}
|
|
10
|
+
export declare function createConsolePrompter(): Prompter;
|
|
11
|
+
export interface FileSummary {
|
|
12
|
+
relativePath: string;
|
|
13
|
+
outcome: 'created' | 'overwritten' | 'unchanged';
|
|
14
|
+
}
|
|
15
|
+
export interface InitResult {
|
|
16
|
+
summary: string;
|
|
17
|
+
files: FileSummary[];
|
|
18
|
+
}
|
|
19
|
+
export interface ZtdConfigWriterDependencies {
|
|
20
|
+
ensureDirectory: (directory: string) => void;
|
|
21
|
+
writeFile: (filePath: string, contents: string) => void;
|
|
22
|
+
fileExists: (filePath: string) => boolean;
|
|
23
|
+
runPullSchema: (options: PullSchemaOptions) => Promise<void> | void;
|
|
24
|
+
runGenerateZtdConfig: (options: ZtdConfigGenerationOptions) => Promise<void> | void;
|
|
25
|
+
checkPgDump: () => boolean;
|
|
26
|
+
log: (message: string) => void;
|
|
27
|
+
copyAgentsTemplate: (rootDir: string) => string | null;
|
|
28
|
+
}
|
|
29
|
+
export interface InitCommandOptions {
|
|
30
|
+
rootDir?: string;
|
|
31
|
+
dependencies?: Partial<ZtdConfigWriterDependencies>;
|
|
32
|
+
}
|
|
33
|
+
export declare function runInitCommand(prompter: Prompter, options?: InitCommandOptions): Promise<InitResult>;
|
|
34
|
+
export declare function registerInitCommand(program: Command): void;
|
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createConsolePrompter = createConsolePrompter;
|
|
7
|
+
exports.runInitCommand = runInitCommand;
|
|
8
|
+
exports.registerInitCommand = registerInitCommand;
|
|
9
|
+
const node_child_process_1 = require("node:child_process");
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
12
|
+
const promises_1 = __importDefault(require("node:readline/promises"));
|
|
13
|
+
const fs_1 = require("../utils/fs");
|
|
14
|
+
const agents_1 = require("../utils/agents");
|
|
15
|
+
const ztdProjectConfig_1 = require("../utils/ztdProjectConfig");
|
|
16
|
+
const ztdConfig_1 = require("./ztdConfig");
|
|
17
|
+
const pull_1 = require("./pull");
|
|
18
|
+
const options_1 = require("./options");
|
|
19
|
+
function createConsolePrompter() {
|
|
20
|
+
const rl = promises_1.default.createInterface({
|
|
21
|
+
input: process.stdin,
|
|
22
|
+
output: process.stdout,
|
|
23
|
+
terminal: process.stdout.isTTY
|
|
24
|
+
});
|
|
25
|
+
async function requestLine(question) {
|
|
26
|
+
return (await rl.question(question)).trim();
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
async selectChoice(question, choices) {
|
|
30
|
+
while (true) {
|
|
31
|
+
console.log(question);
|
|
32
|
+
for (let i = 0; i < choices.length; i += 1) {
|
|
33
|
+
console.log(` ${i + 1}. ${choices[i]}`);
|
|
34
|
+
}
|
|
35
|
+
const answer = await requestLine('Select an option: ');
|
|
36
|
+
const selected = Number(answer);
|
|
37
|
+
if (Number.isFinite(selected) && selected >= 1 && selected <= choices.length) {
|
|
38
|
+
return selected - 1;
|
|
39
|
+
}
|
|
40
|
+
console.log('Please choose a valid option number.');
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
async promptInput(question, example) {
|
|
44
|
+
while (true) {
|
|
45
|
+
const answer = await requestLine(`${question}${example ? ` (${example})` : ''}: `);
|
|
46
|
+
if (answer.length > 0) {
|
|
47
|
+
return answer;
|
|
48
|
+
}
|
|
49
|
+
console.log('This value cannot be empty.');
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
async confirm(question) {
|
|
53
|
+
while (true) {
|
|
54
|
+
const answer = (await requestLine(`${question} (y/N): `)).toLowerCase();
|
|
55
|
+
if (answer === '') {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
if (answer === 'y' || answer === 'yes') {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
if (answer === 'n' || answer === 'no') {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
console.log('Please respond with y(es) or n(o).');
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
close() {
|
|
68
|
+
rl.close();
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const SAMPLE_SCHEMA = `CREATE TABLE public.example (
|
|
73
|
+
id serial PRIMARY KEY,
|
|
74
|
+
name text NOT NULL
|
|
75
|
+
);
|
|
76
|
+
`;
|
|
77
|
+
const README_TEMPLATE = 'README.md';
|
|
78
|
+
const TESTS_CONFIG_TEMPLATE = 'tests/generated/ztd-layout.generated.ts';
|
|
79
|
+
const TESTKIT_CLIENT_TEMPLATE = 'tests/support/testkit-client.ts';
|
|
80
|
+
const GLOBAL_SETUP_TEMPLATE = 'tests/support/global-setup.ts';
|
|
81
|
+
const VITEST_CONFIG_TEMPLATE = 'vitest.config.ts';
|
|
82
|
+
const NEXT_STEPS = [
|
|
83
|
+
' 1. Review the schema files under ztd/ddl/<schema>.sql',
|
|
84
|
+
' 2. Inspect tests/generated/ztd-layout.generated.ts for the SQL layout',
|
|
85
|
+
' 3. Run npx ztd ztd-config',
|
|
86
|
+
' 4. Run ZTD tests with pg-testkit'
|
|
87
|
+
];
|
|
88
|
+
const TEMPLATE_DIRECTORY = node_path_1.default.resolve(__dirname, '..', '..', 'templates');
|
|
89
|
+
const DEFAULT_DEPENDENCIES = {
|
|
90
|
+
ensureDirectory: fs_1.ensureDirectory,
|
|
91
|
+
writeFile: (filePath, contents) => (0, node_fs_1.writeFileSync)(filePath, contents, 'utf8'),
|
|
92
|
+
fileExists: (filePath) => (0, node_fs_1.existsSync)(filePath),
|
|
93
|
+
runPullSchema: pull_1.runPullSchema,
|
|
94
|
+
runGenerateZtdConfig: ztdConfig_1.runGenerateZtdConfig,
|
|
95
|
+
checkPgDump: () => {
|
|
96
|
+
var _a;
|
|
97
|
+
const executable = (_a = process.env.PG_DUMP_PATH) !== null && _a !== void 0 ? _a : 'pg_dump';
|
|
98
|
+
const result = (0, node_child_process_1.spawnSync)(executable, ['--version'], { stdio: 'ignore' });
|
|
99
|
+
return result.status === 0 && !result.error;
|
|
100
|
+
},
|
|
101
|
+
log: (message) => {
|
|
102
|
+
console.log(message);
|
|
103
|
+
},
|
|
104
|
+
copyAgentsTemplate: agents_1.copyAgentsTemplate
|
|
105
|
+
};
|
|
106
|
+
async function runInitCommand(prompter, options) {
|
|
107
|
+
var _a, _b;
|
|
108
|
+
const rootDir = (_a = options === null || options === void 0 ? void 0 : options.rootDir) !== null && _a !== void 0 ? _a : process.cwd();
|
|
109
|
+
const dependencies = {
|
|
110
|
+
...DEFAULT_DEPENDENCIES,
|
|
111
|
+
...((_b = options === null || options === void 0 ? void 0 : options.dependencies) !== null && _b !== void 0 ? _b : {})
|
|
112
|
+
};
|
|
113
|
+
const schemaFileName = `${ztdProjectConfig_1.DEFAULT_ZTD_CONFIG.ddl.defaultSchema}.sql`;
|
|
114
|
+
const absolutePaths = {
|
|
115
|
+
schema: node_path_1.default.join(rootDir, ztdProjectConfig_1.DEFAULT_ZTD_CONFIG.ddlDir, schemaFileName),
|
|
116
|
+
config: node_path_1.default.join(rootDir, 'ztd.config.json'),
|
|
117
|
+
ztdConfig: node_path_1.default.join(rootDir, ztdProjectConfig_1.DEFAULT_ZTD_CONFIG.testsDir, 'generated', 'ztd-row-map.generated.ts'),
|
|
118
|
+
testsConfig: node_path_1.default.join(rootDir, ztdProjectConfig_1.DEFAULT_ZTD_CONFIG.testsDir, 'generated', 'ztd-layout.generated.ts'),
|
|
119
|
+
readme: node_path_1.default.join(rootDir, 'README.md'),
|
|
120
|
+
testkitClient: node_path_1.default.join(rootDir, ztdProjectConfig_1.DEFAULT_ZTD_CONFIG.testsDir, 'support', 'testkit-client.ts'),
|
|
121
|
+
globalSetup: node_path_1.default.join(rootDir, ztdProjectConfig_1.DEFAULT_ZTD_CONFIG.testsDir, 'support', 'global-setup.ts'),
|
|
122
|
+
vitestConfig: node_path_1.default.join(rootDir, 'vitest.config.ts'),
|
|
123
|
+
ztdDocsAgent: node_path_1.default.join(rootDir, 'ztd', 'AGENTS.md'),
|
|
124
|
+
ztdDocsReadme: node_path_1.default.join(rootDir, 'ztd', 'README.md'),
|
|
125
|
+
agents: node_path_1.default.join(rootDir, 'AGENTS.md'),
|
|
126
|
+
gitignore: node_path_1.default.join(rootDir, '.gitignore'),
|
|
127
|
+
editorconfig: node_path_1.default.join(rootDir, '.editorconfig'),
|
|
128
|
+
prettierignore: node_path_1.default.join(rootDir, '.prettierignore'),
|
|
129
|
+
prettier: node_path_1.default.join(rootDir, '.prettierrc'),
|
|
130
|
+
package: node_path_1.default.join(rootDir, 'package.json')
|
|
131
|
+
};
|
|
132
|
+
const relativePath = (key) => node_path_1.default.relative(rootDir, absolutePaths[key]).replace(/\\/g, '/') || absolutePaths[key];
|
|
133
|
+
const summaries = {};
|
|
134
|
+
// Ask how the user prefers to populate the initial schema.
|
|
135
|
+
const workflow = await prompter.selectChoice('How do you want to start your database workflow?', ['Pull schema from Postgres (DDL-first)', 'Write DDL manually']);
|
|
136
|
+
if (workflow === 0) {
|
|
137
|
+
// Database-first path: pull the schema before writing any DDL files.
|
|
138
|
+
if (!dependencies.checkPgDump()) {
|
|
139
|
+
throw new Error('Unable to find pg_dump. Install Postgres or set PG_DUMP_PATH before running ztd init.');
|
|
140
|
+
}
|
|
141
|
+
const connectionString = await prompter.promptInput('Enter the Postgres connection string for your database', 'postgres://user:pass@host:5432/db');
|
|
142
|
+
const schemaSummary = await writeFileWithConsent(absolutePaths.schema, relativePath('schema'), dependencies, prompter, async () => {
|
|
143
|
+
dependencies.ensureDirectory(node_path_1.default.dirname(absolutePaths.schema));
|
|
144
|
+
await dependencies.runPullSchema({
|
|
145
|
+
url: connectionString,
|
|
146
|
+
out: node_path_1.default.dirname(absolutePaths.schema)
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
summaries.schema = schemaSummary;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// Manual path: seed the DDL directory with a starter schema so ztd-config can run.
|
|
153
|
+
const schemaSummary = await writeFileWithConsent(absolutePaths.schema, relativePath('schema'), dependencies, prompter, async () => {
|
|
154
|
+
dependencies.ensureDirectory(node_path_1.default.dirname(absolutePaths.schema));
|
|
155
|
+
dependencies.writeFile(absolutePaths.schema, SAMPLE_SCHEMA);
|
|
156
|
+
});
|
|
157
|
+
summaries.schema = schemaSummary;
|
|
158
|
+
}
|
|
159
|
+
// Seed the ztd.config.json defaults so downstream tooling knows where ddl/tests live.
|
|
160
|
+
const configSummary = await writeFileWithConsent(absolutePaths.config, relativePath('config'), dependencies, prompter, () => {
|
|
161
|
+
(0, ztdProjectConfig_1.writeZtdProjectConfig)(rootDir);
|
|
162
|
+
});
|
|
163
|
+
summaries.config = configSummary;
|
|
164
|
+
const projectConfig = (0, ztdProjectConfig_1.loadZtdProjectConfig)(rootDir);
|
|
165
|
+
const ztdConfigTarget = await confirmOverwriteIfExists(absolutePaths.ztdConfig, relativePath('ztdConfig'), dependencies, prompter);
|
|
166
|
+
if (ztdConfigTarget.write) {
|
|
167
|
+
// Regenerate tests/generated/ztd-row-map.generated.ts so TestRowMap reflects the DDL snapshot.
|
|
168
|
+
dependencies.ensureDirectory(node_path_1.default.dirname(absolutePaths.ztdConfig));
|
|
169
|
+
await dependencies.runGenerateZtdConfig({
|
|
170
|
+
directories: [node_path_1.default.resolve(node_path_1.default.dirname(absolutePaths.schema))],
|
|
171
|
+
extensions: options_1.DEFAULT_EXTENSIONS,
|
|
172
|
+
out: absolutePaths.ztdConfig,
|
|
173
|
+
defaultSchema: projectConfig.ddl.defaultSchema,
|
|
174
|
+
searchPath: projectConfig.ddl.searchPath
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
dependencies.log('Skipping ZTD config generation; existing tests/generated/ztd-row-map.generated.ts preserved.');
|
|
179
|
+
}
|
|
180
|
+
summaries.ztdConfig = {
|
|
181
|
+
relativePath: relativePath('ztdConfig'),
|
|
182
|
+
outcome: ztdConfigTarget.existed
|
|
183
|
+
? ztdConfigTarget.write
|
|
184
|
+
? 'overwritten'
|
|
185
|
+
: 'unchanged'
|
|
186
|
+
: 'created'
|
|
187
|
+
};
|
|
188
|
+
// Emit supporting documentation that describes the workflow for contributors.
|
|
189
|
+
const readmeSummary = await writeTemplateFile(rootDir, absolutePaths.readme, relativePath('readme'), README_TEMPLATE, dependencies, prompter, true);
|
|
190
|
+
if (readmeSummary) {
|
|
191
|
+
summaries.readme = readmeSummary;
|
|
192
|
+
}
|
|
193
|
+
const testkitSummary = await writeTemplateFile(rootDir, absolutePaths.testkitClient, relativePath('testkitClient'), TESTKIT_CLIENT_TEMPLATE, dependencies, prompter);
|
|
194
|
+
if (testkitSummary) {
|
|
195
|
+
summaries.testkitClient = testkitSummary;
|
|
196
|
+
}
|
|
197
|
+
const globalSetupSummary = await writeTemplateFile(rootDir, absolutePaths.globalSetup, relativePath('globalSetup'), GLOBAL_SETUP_TEMPLATE, dependencies, prompter);
|
|
198
|
+
if (globalSetupSummary) {
|
|
199
|
+
summaries.globalSetup = globalSetupSummary;
|
|
200
|
+
}
|
|
201
|
+
const vitestConfigSummary = await writeTemplateFile(rootDir, absolutePaths.vitestConfig, relativePath('vitestConfig'), VITEST_CONFIG_TEMPLATE, dependencies, prompter);
|
|
202
|
+
if (vitestConfigSummary) {
|
|
203
|
+
summaries.vitestConfig = vitestConfigSummary;
|
|
204
|
+
}
|
|
205
|
+
const testsConfigSummary = await writeTemplateFile(rootDir, absolutePaths.testsConfig, relativePath('testsConfig'), TESTS_CONFIG_TEMPLATE, dependencies, prompter);
|
|
206
|
+
if (testsConfigSummary) {
|
|
207
|
+
summaries.testsConfig = testsConfigSummary;
|
|
208
|
+
}
|
|
209
|
+
// Seed the shared guidance that lives inside the ztd/ directory so contributors see the new instructions.
|
|
210
|
+
const ztdDocsAgentSummary = await writeTemplateFile(rootDir, absolutePaths.ztdDocsAgent, relativePath('ztdDocsAgent'), 'ztd/AGENTS.md', dependencies, prompter);
|
|
211
|
+
if (ztdDocsAgentSummary) {
|
|
212
|
+
summaries.ztdDocsAgent = ztdDocsAgentSummary;
|
|
213
|
+
}
|
|
214
|
+
// Provide the companion README inside ztd/ so maintainers understand the schema, spec, and enum intentions.
|
|
215
|
+
const ztdDocsReadmeSummary = await writeTemplateFile(rootDir, absolutePaths.ztdDocsReadme, relativePath('ztdDocsReadme'), 'ztd/README.md', dependencies, prompter);
|
|
216
|
+
if (ztdDocsReadmeSummary) {
|
|
217
|
+
summaries.ztdDocsReadme = ztdDocsReadmeSummary;
|
|
218
|
+
}
|
|
219
|
+
const editorconfigSummary = copyTemplateFileIfMissing(rootDir, relativePath('editorconfig'), '.editorconfig', dependencies);
|
|
220
|
+
if (editorconfigSummary) {
|
|
221
|
+
summaries.editorconfig = editorconfigSummary;
|
|
222
|
+
}
|
|
223
|
+
const prettierSummary = copyTemplateFileIfMissing(rootDir, relativePath('prettier'), '.prettierrc', dependencies);
|
|
224
|
+
if (prettierSummary) {
|
|
225
|
+
summaries.prettier = prettierSummary;
|
|
226
|
+
}
|
|
227
|
+
const gitignoreSummary = copyTemplateFileIfMissing(rootDir, relativePath('gitignore'), '.gitignore', dependencies);
|
|
228
|
+
if (gitignoreSummary) {
|
|
229
|
+
summaries.gitignore = gitignoreSummary;
|
|
230
|
+
}
|
|
231
|
+
const prettierignoreSummary = copyTemplateFileIfMissing(rootDir, relativePath('prettierignore'), '.prettierignore', dependencies);
|
|
232
|
+
if (prettierignoreSummary) {
|
|
233
|
+
summaries.prettierignore = prettierignoreSummary;
|
|
234
|
+
}
|
|
235
|
+
const packageSummary = ensurePackageJsonFormatting(rootDir, relativePath('package'), dependencies);
|
|
236
|
+
if (packageSummary) {
|
|
237
|
+
summaries.package = packageSummary;
|
|
238
|
+
}
|
|
239
|
+
// Copy the AGENTS template so every project ships the same AI guardrails.
|
|
240
|
+
const agentsRelative = await ensureAgentsFile(rootDir, relativePath('agents'), dependencies);
|
|
241
|
+
if (agentsRelative) {
|
|
242
|
+
summaries.agents = agentsRelative;
|
|
243
|
+
}
|
|
244
|
+
const summaryLines = buildSummaryLines(summaries);
|
|
245
|
+
summaryLines.forEach(dependencies.log);
|
|
246
|
+
return {
|
|
247
|
+
summary: summaryLines.join('\n'),
|
|
248
|
+
files: Object.values(summaries)
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
async function ensureAgentsFile(rootDir, fallbackRelative, dependencies) {
|
|
252
|
+
const templateTarget = dependencies.copyAgentsTemplate(rootDir);
|
|
253
|
+
if (templateTarget) {
|
|
254
|
+
const relative = node_path_1.default.relative(rootDir, templateTarget).replace(/\\/g, '/');
|
|
255
|
+
return { relativePath: relative || fallbackRelative, outcome: 'created' };
|
|
256
|
+
}
|
|
257
|
+
const candidates = ['AGENTS.md', 'AGENTS_ztd.md'];
|
|
258
|
+
for (const candidate of candidates) {
|
|
259
|
+
const candidatePath = node_path_1.default.join(rootDir, candidate);
|
|
260
|
+
if (dependencies.fileExists(candidatePath)) {
|
|
261
|
+
return { relativePath: candidate, outcome: 'unchanged' };
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
function copyTemplateFileIfMissing(rootDir, relative, templateName, dependencies) {
|
|
267
|
+
const templatePath = node_path_1.default.join(TEMPLATE_DIRECTORY, templateName);
|
|
268
|
+
// Skip copying when the CLI package does not include the requested template.
|
|
269
|
+
if (!(0, node_fs_1.existsSync)(templatePath)) {
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
const targetPath = node_path_1.default.join(rootDir, relative);
|
|
273
|
+
// Avoid overwriting a file that the project already maintains.
|
|
274
|
+
if (dependencies.fileExists(targetPath)) {
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
dependencies.ensureDirectory(node_path_1.default.dirname(targetPath));
|
|
278
|
+
// Emit the template content so the generated project gets the same formatting defaults.
|
|
279
|
+
dependencies.writeFile(targetPath, (0, node_fs_1.readFileSync)(templatePath, 'utf8'));
|
|
280
|
+
return { relativePath: relative, outcome: 'created' };
|
|
281
|
+
}
|
|
282
|
+
function ensurePackageJsonFormatting(rootDir, relative, dependencies) {
|
|
283
|
+
var _a, _b;
|
|
284
|
+
const packagePath = node_path_1.default.join(rootDir, 'package.json');
|
|
285
|
+
// Skip wiring defaults when the project does not yet have a package manifest.
|
|
286
|
+
if (!dependencies.fileExists(packagePath)) {
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
const document = (0, node_fs_1.readFileSync)(packagePath, 'utf8');
|
|
290
|
+
const parsed = JSON.parse(document);
|
|
291
|
+
let changed = false;
|
|
292
|
+
const scripts = (_a = parsed.scripts) !== null && _a !== void 0 ? _a : {};
|
|
293
|
+
const requiredScripts = {
|
|
294
|
+
format: 'prettier . --write',
|
|
295
|
+
lint: 'eslint .',
|
|
296
|
+
'lint:fix': 'eslint . --fix'
|
|
297
|
+
};
|
|
298
|
+
// Ensure the canonical formatting and lint scripts exist without overwriting custom commands.
|
|
299
|
+
for (const [name, value] of Object.entries(requiredScripts)) {
|
|
300
|
+
if (name in scripts) {
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
scripts[name] = value;
|
|
304
|
+
changed = true;
|
|
305
|
+
}
|
|
306
|
+
if (changed) {
|
|
307
|
+
parsed.scripts = scripts;
|
|
308
|
+
}
|
|
309
|
+
// Provide lint-staged wiring for the formatting pipeline when no configuration is present.
|
|
310
|
+
if (!('lint-staged' in parsed)) {
|
|
311
|
+
parsed['lint-staged'] = {
|
|
312
|
+
'*.{ts,tsx,js,jsx,json,md,sql}': ['pnpm format']
|
|
313
|
+
};
|
|
314
|
+
changed = true;
|
|
315
|
+
}
|
|
316
|
+
// Wire simple-git-hooks only if the user has not already customized it.
|
|
317
|
+
if (!('simple-git-hooks' in parsed)) {
|
|
318
|
+
parsed['simple-git-hooks'] = {
|
|
319
|
+
'pre-commit': 'pnpm lint-staged'
|
|
320
|
+
};
|
|
321
|
+
changed = true;
|
|
322
|
+
}
|
|
323
|
+
const devDependencies = (_b = parsed.devDependencies) !== null && _b !== void 0 ? _b : {};
|
|
324
|
+
const formattingDeps = {
|
|
325
|
+
eslint: '^9.22.0',
|
|
326
|
+
'lint-staged': '^16.2.7',
|
|
327
|
+
'prettier': '^3.7.4',
|
|
328
|
+
'prettier-plugin-sql': '^0.19.2',
|
|
329
|
+
'simple-git-hooks': '^2.13.1'
|
|
330
|
+
};
|
|
331
|
+
// Add the formatting toolchain dependencies that back the scripts and hooks.
|
|
332
|
+
for (const [dep, version] of Object.entries(formattingDeps)) {
|
|
333
|
+
if (dep in devDependencies) {
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
devDependencies[dep] = version;
|
|
337
|
+
changed = true;
|
|
338
|
+
}
|
|
339
|
+
if (!changed) {
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
parsed.devDependencies = devDependencies;
|
|
343
|
+
dependencies.ensureDirectory(node_path_1.default.dirname(packagePath));
|
|
344
|
+
// Persist the updated manifest so the new scripts and tools are available immediately.
|
|
345
|
+
dependencies.writeFile(packagePath, `${JSON.stringify(parsed, null, 2)}\n`);
|
|
346
|
+
return { relativePath: relative, outcome: 'overwritten' };
|
|
347
|
+
}
|
|
348
|
+
async function writeFileWithConsent(absolutePath, relative, dependencies, prompter, writer) {
|
|
349
|
+
const { existed, write } = await confirmOverwriteIfExists(absolutePath, relative, dependencies, prompter);
|
|
350
|
+
if (!write) {
|
|
351
|
+
return { relativePath: relative, outcome: 'unchanged' };
|
|
352
|
+
}
|
|
353
|
+
await writer();
|
|
354
|
+
return { relativePath: relative, outcome: existed ? 'overwritten' : 'created' };
|
|
355
|
+
}
|
|
356
|
+
async function confirmOverwriteIfExists(absolutePath, relative, dependencies, prompter) {
|
|
357
|
+
const existed = dependencies.fileExists(absolutePath);
|
|
358
|
+
if (!existed) {
|
|
359
|
+
return { existed: false, write: true };
|
|
360
|
+
}
|
|
361
|
+
const overwrite = await prompter.confirm(`File ${relative} already exists. Overwrite?`);
|
|
362
|
+
if (!overwrite) {
|
|
363
|
+
return { existed: true, write: false };
|
|
364
|
+
}
|
|
365
|
+
return { existed: true, write: true };
|
|
366
|
+
}
|
|
367
|
+
async function writeDocFile(absolutePath, relative, contents, dependencies, prompter) {
|
|
368
|
+
const summary = await writeFileWithConsent(absolutePath, relative, dependencies, prompter, () => {
|
|
369
|
+
dependencies.ensureDirectory(node_path_1.default.dirname(absolutePath));
|
|
370
|
+
dependencies.writeFile(absolutePath, contents);
|
|
371
|
+
});
|
|
372
|
+
return summary;
|
|
373
|
+
}
|
|
374
|
+
async function writeTemplateFile(rootDir, absolutePath, relative, templateName, dependencies, prompter, allowFallback) {
|
|
375
|
+
const templateTarget = resolveTemplateTarget(rootDir, absolutePath, relative, dependencies, allowFallback);
|
|
376
|
+
if (!templateTarget) {
|
|
377
|
+
return null;
|
|
378
|
+
}
|
|
379
|
+
// Load shared documentation templates so every new project gets the same guidance.
|
|
380
|
+
const contents = loadTemplate(templateName);
|
|
381
|
+
return writeDocFile(templateTarget.absolutePath, templateTarget.relativePath, contents, dependencies, prompter);
|
|
382
|
+
}
|
|
383
|
+
function resolveTemplateTarget(rootDir, absolutePath, relative, dependencies, allowFallback) {
|
|
384
|
+
if (!dependencies.fileExists(absolutePath)) {
|
|
385
|
+
return { absolutePath, relativePath: relative };
|
|
386
|
+
}
|
|
387
|
+
if (!allowFallback || !isRootMarkdown(relative)) {
|
|
388
|
+
dependencies.log(`Skipping template ${relative} because the target file already exists.`);
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
391
|
+
// When the preferred destination already exists, try emitting a sibling with a "_ztd" suffix.
|
|
392
|
+
const parsed = node_path_1.default.parse(absolutePath);
|
|
393
|
+
const fallbackAbsolute = node_path_1.default.join(parsed.dir, `${parsed.name}_ztd${parsed.ext}`);
|
|
394
|
+
if (dependencies.fileExists(fallbackAbsolute)) {
|
|
395
|
+
const existingRelative = normalizeRelative(rootDir, fallbackAbsolute);
|
|
396
|
+
dependencies.log(`Skipping template ${relative} because both ${relative} and ${existingRelative} already exist.`);
|
|
397
|
+
return null;
|
|
398
|
+
}
|
|
399
|
+
const fallbackRelative = normalizeRelative(rootDir, fallbackAbsolute);
|
|
400
|
+
dependencies.log(`Existing ${relative} preserved; writing template as ${fallbackRelative}.`);
|
|
401
|
+
return { absolutePath: fallbackAbsolute, relativePath: fallbackRelative };
|
|
402
|
+
}
|
|
403
|
+
function normalizeRelative(rootDir, absolutePath) {
|
|
404
|
+
// Normalize the path relative to the project root so summaries use forward slashes.
|
|
405
|
+
const relative = node_path_1.default.relative(rootDir, absolutePath).replace(/\\/g, '/');
|
|
406
|
+
return relative || absolutePath;
|
|
407
|
+
}
|
|
408
|
+
function isRootMarkdown(relative) {
|
|
409
|
+
return relative.toLowerCase().endsWith('.md') && !relative.includes('/');
|
|
410
|
+
}
|
|
411
|
+
function loadTemplate(templateName) {
|
|
412
|
+
const templatePath = node_path_1.default.join(TEMPLATE_DIRECTORY, templateName);
|
|
413
|
+
// Fail fast if the template bundle was shipped without the requested file.
|
|
414
|
+
if (!(0, node_fs_1.existsSync)(templatePath)) {
|
|
415
|
+
throw new Error(`Missing template file: ${templateName}`);
|
|
416
|
+
}
|
|
417
|
+
return (0, node_fs_1.readFileSync)(templatePath, 'utf8');
|
|
418
|
+
}
|
|
419
|
+
function buildSummaryLines(summaries) {
|
|
420
|
+
const orderedKeys = [
|
|
421
|
+
'schema',
|
|
422
|
+
'config',
|
|
423
|
+
'testsConfig',
|
|
424
|
+
'ztdConfig',
|
|
425
|
+
'readme',
|
|
426
|
+
'testkitClient',
|
|
427
|
+
'globalSetup',
|
|
428
|
+
'vitestConfig',
|
|
429
|
+
'ztdDocsAgent',
|
|
430
|
+
'ztdDocsReadme',
|
|
431
|
+
'agents',
|
|
432
|
+
'gitignore',
|
|
433
|
+
'editorconfig',
|
|
434
|
+
'prettierignore',
|
|
435
|
+
'prettier',
|
|
436
|
+
'package'
|
|
437
|
+
];
|
|
438
|
+
const lines = ['ZTD project initialized.', '', 'Created:'];
|
|
439
|
+
for (const key of orderedKeys) {
|
|
440
|
+
const summary = summaries[key];
|
|
441
|
+
const note = (summary === null || summary === void 0 ? void 0 : summary.outcome) === 'created'
|
|
442
|
+
? ''
|
|
443
|
+
: (summary === null || summary === void 0 ? void 0 : summary.outcome) === 'overwritten'
|
|
444
|
+
? ' (overwritten existing file)'
|
|
445
|
+
: ' (existing file preserved)';
|
|
446
|
+
if (summary) {
|
|
447
|
+
lines.push(` - ${summary.relativePath}${note}`);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
lines.push('', 'Next steps:', ...NEXT_STEPS);
|
|
451
|
+
return lines;
|
|
452
|
+
}
|
|
453
|
+
function registerInitCommand(program) {
|
|
454
|
+
program
|
|
455
|
+
.command('init')
|
|
456
|
+
.description('Automate project setup for Zero Table Dependency workflows')
|
|
457
|
+
.action(async () => {
|
|
458
|
+
const prompter = createConsolePrompter();
|
|
459
|
+
try {
|
|
460
|
+
await runInitCommand(prompter);
|
|
461
|
+
}
|
|
462
|
+
finally {
|
|
463
|
+
prompter.close();
|
|
464
|
+
}
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;AAoBA,sDA0DC;AAmFD,wCAgRC;AAySD,kDAYC;AAruBD,2DAA+C;AAC/C,qCAAkE;AAClE,0DAA6B;AAC7B,sEAA8C;AAE9C,oCAA8C;AAC9C,4CAAqD;AACrD,gEAA4G;AAC5G,2CAAoF;AACpF,iCAA+D;AAC/D,uCAA+C;AAS/C,SAAgB,qBAAqB;IACnC,MAAM,EAAE,GAAG,kBAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK;KAC/B,CAAC,CAAC;IAEH,KAAK,UAAU,WAAW,CAAC,QAAgB;QACzC,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,OAAiB;YACpD,OAAO,IAAI,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3C,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,oBAAoB,CAAC,CAAC;gBACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;gBAChC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBAC7E,OAAO,QAAQ,GAAG,CAAC,CAAC;gBACtB,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,OAAgB;YAClD,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBACnF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,QAAgB;YAC5B,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,CAAC,MAAM,WAAW,CAAC,GAAG,QAAQ,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBACxE,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;oBAClB,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;oBACvC,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACtC,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,KAAK;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AA8CD,MAAM,aAAa,GAAG;;;;CAIrB,CAAC;AAEF,MAAM,eAAe,GAAG,WAAW,CAAC;AACpC,MAAM,qBAAqB,GAAG,yCAAyC,CAAC;AACxE,MAAM,uBAAuB,GAAG,iCAAiC,CAAC;AAClE,MAAM,qBAAqB,GAAG,+BAA+B,CAAC;AAC9D,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAElD,MAAM,UAAU,GAAG;IACjB,wDAAwD;IACxD,wEAAwE;IACxE,4BAA4B;IAC5B,mCAAmC;CACpC,CAAC;AACF,MAAM,kBAAkB,GAAG,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAE5E,MAAM,oBAAoB,GAAgC;IACxD,eAAe,EAAf,oBAAe;IACf,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAA,uBAAa,EAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;IAC5E,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAA,oBAAU,EAAC,QAAQ,CAAC;IAC9C,aAAa,EAAb,oBAAa;IACb,oBAAoB,EAApB,gCAAoB;IACpB,WAAW,EAAE,GAAG,EAAE;;QAChB,MAAM,UAAU,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,YAAY,mCAAI,SAAS,CAAC;QACzD,MAAM,MAAM,GAAG,IAAA,8BAAS,EAAC,UAAU,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC9C,CAAC;IACD,GAAG,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IACD,kBAAkB,EAAlB,2BAAkB;CACnB,CAAC;AAEK,KAAK,UAAU,cAAc,CAAC,QAAkB,EAAE,OAA4B;;IACnF,MAAM,OAAO,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,mCAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAClD,MAAM,YAAY,GAAgC;QAChD,GAAG,oBAAoB;QACvB,GAAG,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,mCAAI,EAAE,CAAC;KACjC,CAAC;IAEF,MAAM,cAAc,GAAG,GAAG,qCAAkB,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC;IAErE,MAAM,aAAa,GAA4B;QAC7C,MAAM,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qCAAkB,CAAC,MAAM,EAAE,cAAc,CAAC;QACrE,MAAM,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC;QAC7C,SAAS,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qCAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,0BAA0B,CAAC;QACnG,WAAW,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qCAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,yBAAyB,CAAC;QACpG,MAAM,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;QACvC,aAAa,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qCAAkB,CAAC,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC;QAC9F,WAAW,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qCAAkB,CAAC,QAAQ,EAAE,SAAS,EAAE,iBAAiB,CAAC;QAC1F,YAAY,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC;QACpD,YAAY,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC;QACpD,aAAa,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC;QACrD,MAAM,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;QACvC,SAAS,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;QAC3C,YAAY,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;QACjD,cAAc,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC;QACrD,QAAQ,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;QAC3C,OAAO,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;KAC5C,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,GAAY,EAAU,EAAE,CAC5C,mBAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;IAEvF,MAAM,SAAS,GAA0C,EAAE,CAAC;IAE5D,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,CAC1C,kDAAkD,EAClD,CAAC,uCAAuC,EAAE,oBAAoB,CAAC,CAChE,CAAC;IAEF,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,qEAAqE;QACrE,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;QAC3G,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,QAAQ,CAAC,WAAW,CACjD,wDAAwD,EACxD,mCAAmC,CACpC,CAAC;QAEF,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAC9C,aAAa,CAAC,MAAM,EACpB,YAAY,CAAC,QAAQ,CAAC,EACtB,YAAY,EACZ,QAAQ,EACR,KAAK,IAAI,EAAE;YACT,YAAY,CAAC,eAAe,CAAC,mBAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;YACjE,MAAM,YAAY,CAAC,aAAa,CAAC;gBAC/B,GAAG,EAAE,gBAAgB;gBACrB,GAAG,EAAE,mBAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;aACxC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QAEF,SAAS,CAAC,MAAM,GAAG,aAAa,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,mFAAmF;QACnF,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAC9C,aAAa,CAAC,MAAM,EACpB,YAAY,CAAC,QAAQ,CAAC,EACtB,YAAY,EACZ,QAAQ,EACR,KAAK,IAAI,EAAE;YACT,YAAY,CAAC,eAAe,CAAC,mBAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;YACjE,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAC9D,CAAC,CACF,CAAC;QAEF,SAAS,CAAC,MAAM,GAAG,aAAa,CAAC;IACnC,CAAC;IAED,sFAAsF;IACtF,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAC9C,aAAa,CAAC,MAAM,EACpB,YAAY,CAAC,QAAQ,CAAC,EACtB,YAAY,EACZ,QAAQ,EACR,GAAG,EAAE;QACH,IAAA,wCAAqB,EAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CACF,CAAC;IACF,SAAS,CAAC,MAAM,GAAG,aAAa,CAAC;IAEjC,MAAM,aAAa,GAAG,IAAA,uCAAoB,EAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,eAAe,GAAG,MAAM,wBAAwB,CACpD,aAAa,CAAC,SAAS,EACvB,YAAY,CAAC,WAAW,CAAC,EACzB,YAAY,EACZ,QAAQ,CACT,CAAC;IAEF,IAAI,eAAe,CAAC,KAAK,EAAE,CAAC;QAC1B,+FAA+F;QAC/F,YAAY,CAAC,eAAe,CAAC,mBAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;QACpE,MAAM,YAAY,CAAC,oBAAoB,CAAC;YACtC,WAAW,EAAE,CAAC,mBAAI,CAAC,OAAO,CAAC,mBAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/D,UAAU,EAAE,4BAAkB;YAC9B,GAAG,EAAE,aAAa,CAAC,SAAS;YAC5B,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,aAAa;YAC9C,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,UAAU;SACzC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,YAAY,CAAC,GAAG,CACd,8FAA8F,CAC/F,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,SAAS,GAAG;QACpB,YAAY,EAAE,YAAY,CAAC,WAAW,CAAC;QACvC,OAAO,EAAE,eAAe,CAAC,OAAO;YAC9B,CAAC,CAAC,eAAe,CAAC,KAAK;gBACrB,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,WAAW;YACf,CAAC,CAAC,SAAS;KACd,CAAC;IAEF,8EAA8E;IAC9E,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAC3C,OAAO,EACP,aAAa,CAAC,MAAM,EACpB,YAAY,CAAC,QAAQ,CAAC,EACtB,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,IAAI,CACL,CAAC;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,SAAS,CAAC,MAAM,GAAG,aAAa,CAAC;IACnC,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAC5C,OAAO,EACP,aAAa,CAAC,aAAa,EAC3B,YAAY,CAAC,eAAe,CAAC,EAC7B,uBAAuB,EACvB,YAAY,EACZ,QAAQ,CACT,CAAC;IACF,IAAI,cAAc,EAAE,CAAC;QACnB,SAAS,CAAC,aAAa,GAAG,cAAc,CAAC;IAC3C,CAAC;IAED,MAAM,kBAAkB,GAAG,MAAM,iBAAiB,CAChD,OAAO,EACP,aAAa,CAAC,WAAW,EACzB,YAAY,CAAC,aAAa,CAAC,EAC3B,qBAAqB,EACrB,YAAY,EACZ,QAAQ,CACT,CAAC;IACF,IAAI,kBAAkB,EAAE,CAAC;QACvB,SAAS,CAAC,WAAW,GAAG,kBAAkB,CAAC;IAC7C,CAAC;IAED,MAAM,mBAAmB,GAAG,MAAM,iBAAiB,CACjD,OAAO,EACP,aAAa,CAAC,YAAY,EAC1B,YAAY,CAAC,cAAc,CAAC,EAC5B,sBAAsB,EACtB,YAAY,EACZ,QAAQ,CACT,CAAC;IACF,IAAI,mBAAmB,EAAE,CAAC;QACxB,SAAS,CAAC,YAAY,GAAG,mBAAmB,CAAC;IAC/C,CAAC;IAED,MAAM,kBAAkB,GAAG,MAAM,iBAAiB,CAChD,OAAO,EACP,aAAa,CAAC,WAAW,EACzB,YAAY,CAAC,aAAa,CAAC,EAC3B,qBAAqB,EACrB,YAAY,EACZ,QAAQ,CACT,CAAC;IACF,IAAI,kBAAkB,EAAE,CAAC;QACvB,SAAS,CAAC,WAAW,GAAG,kBAAkB,CAAC;IAC7C,CAAC;IAED,0GAA0G;IAC1G,MAAM,mBAAmB,GAAG,MAAM,iBAAiB,CACjD,OAAO,EACP,aAAa,CAAC,YAAY,EAC1B,YAAY,CAAC,cAAc,CAAC,EAC5B,eAAe,EACf,YAAY,EACZ,QAAQ,CACT,CAAC;IACF,IAAI,mBAAmB,EAAE,CAAC;QACxB,SAAS,CAAC,YAAY,GAAG,mBAAmB,CAAC;IAC/C,CAAC;IAED,4GAA4G;IAC5G,MAAM,oBAAoB,GAAG,MAAM,iBAAiB,CAClD,OAAO,EACP,aAAa,CAAC,aAAa,EAC3B,YAAY,CAAC,eAAe,CAAC,EAC7B,eAAe,EACf,YAAY,EACZ,QAAQ,CACT,CAAC;IACF,IAAI,oBAAoB,EAAE,CAAC;QACzB,SAAS,CAAC,aAAa,GAAG,oBAAoB,CAAC;IACjD,CAAC;IAED,MAAM,mBAAmB,GAAG,yBAAyB,CACnD,OAAO,EACP,YAAY,CAAC,cAAc,CAAC,EAC5B,eAAe,EACf,YAAY,CACb,CAAC;IACF,IAAI,mBAAmB,EAAE,CAAC;QACxB,SAAS,CAAC,YAAY,GAAG,mBAAmB,CAAC;IAC/C,CAAC;IAED,MAAM,eAAe,GAAG,yBAAyB,CAC/C,OAAO,EACP,YAAY,CAAC,UAAU,CAAC,EACxB,aAAa,EACb,YAAY,CACb,CAAC;IACF,IAAI,eAAe,EAAE,CAAC;QACpB,SAAS,CAAC,QAAQ,GAAG,eAAe,CAAC;IACvC,CAAC;IAED,MAAM,gBAAgB,GAAG,yBAAyB,CAChD,OAAO,EACP,YAAY,CAAC,WAAW,CAAC,EACzB,YAAY,EACZ,YAAY,CACb,CAAC;IACF,IAAI,gBAAgB,EAAE,CAAC;QACrB,SAAS,CAAC,SAAS,GAAG,gBAAgB,CAAC;IACzC,CAAC;IAED,MAAM,qBAAqB,GAAG,yBAAyB,CACrD,OAAO,EACP,YAAY,CAAC,gBAAgB,CAAC,EAC9B,iBAAiB,EACjB,YAAY,CACb,CAAC;IACF,IAAI,qBAAqB,EAAE,CAAC;QAC1B,SAAS,CAAC,cAAc,GAAG,qBAAqB,CAAC;IACnD,CAAC;IAED,MAAM,cAAc,GAAG,2BAA2B,CAAC,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC;IACnG,IAAI,cAAc,EAAE,CAAC;QACnB,SAAS,CAAC,OAAO,GAAG,cAAc,CAAC;IACrC,CAAC;IAED,0EAA0E;IAC1E,MAAM,cAAc,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;IAC7F,IAAI,cAAc,EAAE,CAAC;QACnB,SAAS,CAAC,MAAM,GAAG,cAAc,CAAC;IACpC,CAAC;IAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,SAAyC,CAAC,CAAC;IAClF,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAEvC,OAAO;QACL,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAChC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAkB;KACjD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,OAAe,EACf,gBAAwB,EACxB,YAAyC;IAEzC,MAAM,cAAc,GAAG,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAChE,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,mBAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5E,OAAO,EAAE,YAAY,EAAE,QAAQ,IAAI,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAC5E,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAClD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,aAAa,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpD,IAAI,YAAY,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,yBAAyB,CAChC,OAAe,EACf,QAAgB,EAChB,YAAoB,EACpB,YAAyC;IAEzC,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IACjE,6EAA6E;IAC7E,IAAI,CAAC,IAAA,oBAAU,EAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAChD,+DAA+D;IAC/D,IAAI,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,CAAC,eAAe,CAAC,mBAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IACvD,wFAAwF;IACxF,YAAY,CAAC,SAAS,CAAC,UAAU,EAAE,IAAA,sBAAY,EAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IACvE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,2BAA2B,CAClC,OAAe,EACf,QAAgB,EAChB,YAAyC;;IAEzC,MAAM,WAAW,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACvD,8EAA8E;IAC9E,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,IAAA,sBAAY,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAA4B,CAAC;IAC/D,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,OAAO,GAAG,MAAC,MAAM,CAAC,OAA8C,mCAAI,EAAE,CAAC;IAC7E,MAAM,eAAe,GAA2B;QAC9C,MAAM,EAAE,oBAAoB;QAC5B,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,gBAAgB;KAC7B,CAAC;IAEF,8FAA8F;IAC9F,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5D,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;YACpB,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACtB,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,2FAA2F;IAC3F,IAAI,CAAC,CAAC,aAAa,IAAI,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,aAAa,CAAC,GAAG;YACtB,+BAA+B,EAAE,CAAC,aAAa,CAAC;SACjD,CAAC;QACF,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,wEAAwE;IACxE,IAAI,CAAC,CAAC,kBAAkB,IAAI,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,kBAAkB,CAAC,GAAG;YAC3B,YAAY,EAAE,kBAAkB;SACjC,CAAC;QACF,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,MAAM,eAAe,GAAG,MAAC,MAAM,CAAC,eAAsD,mCAAI,EAAE,CAAC;IAC7F,MAAM,cAAc,GAA2B;QAC7C,MAAM,EAAE,SAAS;QACjB,aAAa,EAAE,SAAS;QACxB,UAAU,EAAE,QAAQ;QACpB,qBAAqB,EAAE,SAAS;QAChC,kBAAkB,EAAE,SAAS;KAC9B,CAAC;IACF,6EAA6E;IAC7E,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5D,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;QAC/B,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,YAAY,CAAC,eAAe,CAAC,mBAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IACxD,uFAAuF;IACvF,YAAY,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5E,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,YAAoB,EACpB,QAAgB,EAChB,YAAyC,EACzC,QAAkB,EAClB,MAAkC;IAElC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,wBAAwB,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC1G,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAC1D,CAAC;IACD,MAAM,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAClF,CAAC;AAOD,KAAK,UAAU,wBAAwB,CACrC,YAAoB,EACpB,QAAgB,EAChB,YAAyC,EACzC,QAAkB;IAElB,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzC,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,QAAQ,6BAA6B,CAAC,CAAC;IACxF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACzC,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,YAAoB,EACpB,QAAgB,EAChB,QAAgB,EAChB,YAAyC,EACzC,QAAkB;IAElB,MAAM,OAAO,GAAG,MAAM,oBAAoB,CACxC,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,GAAG,EAAE;QACH,YAAY,CAAC,eAAe,CAAC,mBAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QACzD,YAAY,CAAC,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC,CACF,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,OAAe,EACf,YAAoB,EACpB,QAAgB,EAChB,YAAoB,EACpB,YAAyC,EACzC,QAAkB,EAClB,aAAuB;IAEvB,MAAM,cAAc,GAAG,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAC3G,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mFAAmF;IACnF,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC5C,OAAO,YAAY,CAAC,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AAClH,CAAC;AAOD,SAAS,qBAAqB,CAC5B,OAAe,EACf,YAAoB,EACpB,QAAgB,EAChB,YAAyC,EACzC,aAAuB;IAEvB,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,aAAa,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,YAAY,CAAC,GAAG,CAAC,qBAAqB,QAAQ,0CAA0C,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8FAA8F;IAC9F,MAAM,MAAM,GAAG,mBAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,gBAAgB,GAAG,mBAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAClF,IAAI,YAAY,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC9C,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACtE,YAAY,CAAC,GAAG,CACd,qBAAqB,QAAQ,iBAAiB,QAAQ,QAAQ,gBAAgB,iBAAiB,CAChG,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACtE,YAAY,CAAC,GAAG,CAAC,YAAY,QAAQ,mCAAmC,gBAAgB,GAAG,CAAC,CAAC;IAC7F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,YAAoB;IAC9D,oFAAoF;IACpF,MAAM,QAAQ,GAAG,mBAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1E,OAAO,QAAQ,IAAI,YAAY,CAAC;AAClC,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,YAAY,CAAC,YAAoB;IACxC,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IACjE,2EAA2E;IAC3E,IAAI,CAAC,IAAA,oBAAU,EAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,IAAA,sBAAY,EAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAuC;IAChE,MAAM,WAAW,GAAc;QAC7B,QAAQ;QACR,QAAQ;QACR,aAAa;QACb,WAAW;QACX,QAAQ;QACR,eAAe;QACf,aAAa;QACb,cAAc;QACd,cAAc;QACd,eAAe;QACf,QAAQ;QACR,WAAW;QACX,cAAc;QACd,gBAAgB;QAChB,UAAU;QACV,SAAS;KACV,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,0BAA0B,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;IAE3D,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,IAAI,GACR,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,MAAK,SAAS;YAC5B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,MAAK,aAAa;gBACpC,CAAC,CAAC,8BAA8B;gBAChC,CAAC,CAAC,4BAA4B,CAAC;QACnC,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,YAAY,GAAG,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;gBAAS,CAAC;YACT,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const DEFAULT_EXTENSIONS: string[];
|
|
2
|
+
export declare const DEFAULT_DDL_DIRECTORY = "ztd/ddl";
|
|
3
|
+
export declare const DEFAULT_TESTS_DIRECTORY = "tests";
|
|
4
|
+
export declare function collectDirectories(value: string, previous: string[]): string[];
|
|
5
|
+
export declare function collectValues(value: string, previous: string[]): string[];
|
|
6
|
+
export declare function normalizeDirectoryList(userDirectories: string[] | undefined, fallback: string): string[];
|
|
7
|
+
export declare function parseExtensions(value: string | string[]): string[];
|
|
8
|
+
export declare function resolveExtensions(input: string[] | undefined, fallback: string[]): string[];
|
|
9
|
+
export declare function parseCsvList(value: string): string[];
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_TESTS_DIRECTORY = exports.DEFAULT_DDL_DIRECTORY = exports.DEFAULT_EXTENSIONS = void 0;
|
|
4
|
+
exports.collectDirectories = collectDirectories;
|
|
5
|
+
exports.collectValues = collectValues;
|
|
6
|
+
exports.normalizeDirectoryList = normalizeDirectoryList;
|
|
7
|
+
exports.parseExtensions = parseExtensions;
|
|
8
|
+
exports.resolveExtensions = resolveExtensions;
|
|
9
|
+
exports.parseCsvList = parseCsvList;
|
|
10
|
+
exports.DEFAULT_EXTENSIONS = ['.sql'];
|
|
11
|
+
exports.DEFAULT_DDL_DIRECTORY = 'ztd/ddl';
|
|
12
|
+
exports.DEFAULT_TESTS_DIRECTORY = 'tests';
|
|
13
|
+
const EXTENSION_TOKEN_PATTERN = /^[A-Za-z0-9_]+$/;
|
|
14
|
+
function collectDirectories(value, previous) {
|
|
15
|
+
return [...previous, value];
|
|
16
|
+
}
|
|
17
|
+
function collectValues(value, previous) {
|
|
18
|
+
return [...previous, value];
|
|
19
|
+
}
|
|
20
|
+
function normalizeDirectoryList(userDirectories, fallback) {
|
|
21
|
+
const candidates = (userDirectories !== null && userDirectories !== void 0 ? userDirectories : []).map((entry) => entry.trim()).filter(Boolean);
|
|
22
|
+
// Fall back to the configured default directory when no explicit paths are provided.
|
|
23
|
+
const directories = candidates.length ? candidates : [fallback];
|
|
24
|
+
return Array.from(new Set(directories));
|
|
25
|
+
}
|
|
26
|
+
function parseExtensions(value) {
|
|
27
|
+
const rawEntries = Array.isArray(value) ? value : value.split(',');
|
|
28
|
+
// Clean and normalize each candidate before deduplicating to ensure stable output.
|
|
29
|
+
const cleanedTokens = rawEntries
|
|
30
|
+
.map((entry) => entry.trim())
|
|
31
|
+
.filter((entry) => entry.length > 0 && entry !== '.')
|
|
32
|
+
.map((entry) => (entry.startsWith('.') ? entry.slice(1) : entry))
|
|
33
|
+
.filter((token) => token.length > 0 && EXTENSION_TOKEN_PATTERN.test(token))
|
|
34
|
+
.map((token) => `.${token.toLowerCase()}`);
|
|
35
|
+
return Array.from(new Set(cleanedTokens)).sort();
|
|
36
|
+
}
|
|
37
|
+
function resolveExtensions(input, fallback) {
|
|
38
|
+
// Use user-specified extensions when present; otherwise rely on the default list.
|
|
39
|
+
const normalized = (input === null || input === void 0 ? void 0 : input.length) ? input : fallback;
|
|
40
|
+
return Array.from(new Set(normalized));
|
|
41
|
+
}
|
|
42
|
+
function parseCsvList(value) {
|
|
43
|
+
return value
|
|
44
|
+
.split(',')
|
|
45
|
+
.map((entry) => entry.trim())
|
|
46
|
+
.filter((entry) => entry.length > 0);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=options.js.map
|