@danielfgray/pg-sourcerer 0.1.9 → 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/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/plugins/kysely-queries.d.ts +54 -2
- package/dist/plugins/kysely-queries.d.ts.map +1 -1
- package/dist/plugins/kysely-queries.js +541 -62
- package/dist/plugins/kysely-queries.js.map +1 -1
- package/dist/plugins/kysely-types.d.ts +35 -0
- package/dist/plugins/kysely-types.d.ts.map +1 -0
- package/dist/plugins/kysely-types.js +601 -0
- package/dist/plugins/kysely-types.js.map +1 -0
- package/dist/plugins/sql-queries.d.ts +0 -2
- package/dist/plugins/sql-queries.d.ts.map +1 -1
- package/dist/plugins/sql-queries.js +1 -4
- package/dist/plugins/sql-queries.js.map +1 -1
- package/dist/services/emissions.d.ts.map +1 -1
- package/dist/services/emissions.js +31 -23
- package/dist/services/emissions.js.map +1 -1
- package/dist/services/file-writer.d.ts +0 -4
- package/dist/services/file-writer.d.ts.map +1 -1
- package/dist/services/file-writer.js +3 -12
- package/dist/services/file-writer.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kysely Types Plugin - Generate Kysely-compatible type definitions
|
|
3
|
+
*
|
|
4
|
+
* Generates table interfaces with Generated<T>, ColumnType<S, I, U>, and DB interface.
|
|
5
|
+
* Uses RLS permissions to determine Generated<T> wrapping.
|
|
6
|
+
*
|
|
7
|
+
* Output structure:
|
|
8
|
+
* - Helper type definitions (Generated, ArrayType, ColumnType imports)
|
|
9
|
+
* - Enum type aliases
|
|
10
|
+
* - Table interfaces with column types
|
|
11
|
+
* - DB interface mapping table names to interfaces
|
|
12
|
+
*/
|
|
13
|
+
import { Option, pipe, Schema as S } from "effect";
|
|
14
|
+
import { definePlugin } from "../services/plugin.js";
|
|
15
|
+
import { findEnumByPgName, PgTypeOid } from "../services/pg-types.js";
|
|
16
|
+
import { getEnumEntities, getTableEntities } from "../ir/semantic-ir.js";
|
|
17
|
+
import { conjure } from "../lib/conjure.js";
|
|
18
|
+
import { isEnumType, getPgTypeName, } from "../lib/field-utils.js";
|
|
19
|
+
import { getExtensionTypeMapping } from "../services/pg-types.js";
|
|
20
|
+
const { ts, exp } = conjure;
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// Configuration
|
|
23
|
+
// ============================================================================
|
|
24
|
+
const KyselyTypesPluginConfig = S.Struct({
|
|
25
|
+
/** Output file path */
|
|
26
|
+
outputFile: S.optionalWith(S.String, { default: () => "db.ts" }),
|
|
27
|
+
/** Use runtime enums instead of string literal unions */
|
|
28
|
+
runtimeEnums: S.optionalWith(S.Boolean, { default: () => false }),
|
|
29
|
+
/** Use type-only imports (recommended) */
|
|
30
|
+
typeOnlyImports: S.optionalWith(S.Boolean, { default: () => true }),
|
|
31
|
+
});
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Helper Type Definitions (ported from kysely-codegen)
|
|
34
|
+
// ============================================================================
|
|
35
|
+
/**
|
|
36
|
+
* Build Generated<T> type alias as raw TypeScript string.
|
|
37
|
+
*
|
|
38
|
+
* Generated marks columns that have defaults and don't need to be provided on insert.
|
|
39
|
+
*
|
|
40
|
+
* type Generated<T> = T extends ColumnType<infer S, infer I, infer U>
|
|
41
|
+
* ? ColumnType<S, I | undefined, U>
|
|
42
|
+
* : ColumnType<T, T | undefined, T>;
|
|
43
|
+
*/
|
|
44
|
+
const GENERATED_TYPE_DEF = `T extends ColumnType<infer S, infer I, infer U>
|
|
45
|
+
? ColumnType<S, I | undefined, U>
|
|
46
|
+
: ColumnType<T, T | undefined, T>`;
|
|
47
|
+
/**
|
|
48
|
+
* Build ArrayType<T> helper for complex array types.
|
|
49
|
+
*
|
|
50
|
+
* type ArrayType<T> = ArrayTypeImpl<T> extends (infer U)[]
|
|
51
|
+
* ? U[]
|
|
52
|
+
* : ArrayTypeImpl<T>;
|
|
53
|
+
*/
|
|
54
|
+
const ARRAY_TYPE_DEF = `ArrayTypeImpl<T> extends (infer U)[]
|
|
55
|
+
? U[]
|
|
56
|
+
: ArrayTypeImpl<T>`;
|
|
57
|
+
/**
|
|
58
|
+
* Build ArrayTypeImpl<T> helper.
|
|
59
|
+
*
|
|
60
|
+
* type ArrayTypeImpl<T> = T extends ColumnType<infer S, infer I, infer U>
|
|
61
|
+
* ? ColumnType<S[], I[], U[]>
|
|
62
|
+
* : T[];
|
|
63
|
+
*/
|
|
64
|
+
const ARRAY_TYPE_IMPL_DEF = `T extends ColumnType<infer S, infer I, infer U>
|
|
65
|
+
? ColumnType<S[], I[], U[]>
|
|
66
|
+
: T[]`;
|
|
67
|
+
// ============================================================================
|
|
68
|
+
// PostgreSQL Type Mappings (ported from kysely-codegen postgres-adapter)
|
|
69
|
+
// ============================================================================
|
|
70
|
+
/**
|
|
71
|
+
* Simple scalar mappings: PG type name → TS type
|
|
72
|
+
* These don't need ColumnType wrapper.
|
|
73
|
+
*/
|
|
74
|
+
const SCALAR_TYPES = {
|
|
75
|
+
// Boolean
|
|
76
|
+
bool: ts.boolean,
|
|
77
|
+
// Integers → number
|
|
78
|
+
int2: ts.number,
|
|
79
|
+
int4: ts.number,
|
|
80
|
+
float4: ts.number,
|
|
81
|
+
float8: ts.number,
|
|
82
|
+
oid: ts.number,
|
|
83
|
+
// Text types → string
|
|
84
|
+
text: ts.string,
|
|
85
|
+
varchar: ts.string,
|
|
86
|
+
bpchar: ts.string, // blank-padded char
|
|
87
|
+
char: ts.string,
|
|
88
|
+
name: ts.string,
|
|
89
|
+
bit: ts.string,
|
|
90
|
+
varbit: ts.string,
|
|
91
|
+
xml: ts.string,
|
|
92
|
+
// UUID → string
|
|
93
|
+
uuid: ts.string,
|
|
94
|
+
// Network types → string
|
|
95
|
+
inet: ts.string,
|
|
96
|
+
cidr: ts.string,
|
|
97
|
+
macaddr: ts.string,
|
|
98
|
+
macaddr8: ts.string,
|
|
99
|
+
// Geometric types → string (typically serialized)
|
|
100
|
+
line: ts.string,
|
|
101
|
+
lseg: ts.string,
|
|
102
|
+
box: ts.string,
|
|
103
|
+
path: ts.string,
|
|
104
|
+
polygon: ts.string,
|
|
105
|
+
// Time without date → string
|
|
106
|
+
time: ts.string,
|
|
107
|
+
timetz: ts.string,
|
|
108
|
+
// Full-text search → string
|
|
109
|
+
tsvector: ts.string,
|
|
110
|
+
tsquery: ts.string,
|
|
111
|
+
txid_snapshot: ts.string,
|
|
112
|
+
// Money → string
|
|
113
|
+
money: ts.string,
|
|
114
|
+
// Binary → Buffer
|
|
115
|
+
bytea: () => ts.ref("Buffer"),
|
|
116
|
+
};
|
|
117
|
+
const COMPLEX_TYPES = {
|
|
118
|
+
// int8/bigint: returns string (to avoid precision loss), accepts string|number|bigint
|
|
119
|
+
int8: {
|
|
120
|
+
select: ts.string,
|
|
121
|
+
insert: () => ts.union(ts.string(), ts.number(), ts.bigint()),
|
|
122
|
+
update: () => ts.union(ts.string(), ts.number(), ts.bigint()),
|
|
123
|
+
},
|
|
124
|
+
// numeric/decimal: returns string, accepts number|string
|
|
125
|
+
numeric: {
|
|
126
|
+
select: ts.string,
|
|
127
|
+
insert: () => ts.union(ts.number(), ts.string()),
|
|
128
|
+
update: () => ts.union(ts.number(), ts.string()),
|
|
129
|
+
},
|
|
130
|
+
// Timestamps: returns Date, accepts Date|string
|
|
131
|
+
date: {
|
|
132
|
+
select: () => ts.ref("Date"),
|
|
133
|
+
insert: () => ts.union(ts.ref("Date"), ts.string()),
|
|
134
|
+
update: () => ts.union(ts.ref("Date"), ts.string()),
|
|
135
|
+
},
|
|
136
|
+
timestamp: {
|
|
137
|
+
select: () => ts.ref("Date"),
|
|
138
|
+
insert: () => ts.union(ts.ref("Date"), ts.string()),
|
|
139
|
+
update: () => ts.union(ts.ref("Date"), ts.string()),
|
|
140
|
+
},
|
|
141
|
+
timestamptz: {
|
|
142
|
+
select: () => ts.ref("Date"),
|
|
143
|
+
insert: () => ts.union(ts.ref("Date"), ts.string()),
|
|
144
|
+
update: () => ts.union(ts.ref("Date"), ts.string()),
|
|
145
|
+
},
|
|
146
|
+
// Interval: For now, defer to string until we decide on postgres-interval
|
|
147
|
+
interval: {
|
|
148
|
+
select: ts.string,
|
|
149
|
+
insert: () => ts.union(ts.string(), ts.number()),
|
|
150
|
+
update: () => ts.union(ts.string(), ts.number()),
|
|
151
|
+
},
|
|
152
|
+
// JSON: returns JsonValue, accepts JsonValue
|
|
153
|
+
json: {
|
|
154
|
+
select: () => ts.ref("JsonValue"),
|
|
155
|
+
insert: () => ts.ref("JsonValue"),
|
|
156
|
+
update: () => ts.ref("JsonValue"),
|
|
157
|
+
},
|
|
158
|
+
jsonb: {
|
|
159
|
+
select: () => ts.ref("JsonValue"),
|
|
160
|
+
insert: () => ts.ref("JsonValue"),
|
|
161
|
+
update: () => ts.ref("JsonValue"),
|
|
162
|
+
},
|
|
163
|
+
// Geometric: Point and Circle have object representations
|
|
164
|
+
point: {
|
|
165
|
+
select: () => ts.objectType([
|
|
166
|
+
{ name: "x", type: ts.number() },
|
|
167
|
+
{ name: "y", type: ts.number() },
|
|
168
|
+
]),
|
|
169
|
+
insert: () => ts.objectType([
|
|
170
|
+
{ name: "x", type: ts.number() },
|
|
171
|
+
{ name: "y", type: ts.number() },
|
|
172
|
+
]),
|
|
173
|
+
update: () => ts.objectType([
|
|
174
|
+
{ name: "x", type: ts.number() },
|
|
175
|
+
{ name: "y", type: ts.number() },
|
|
176
|
+
]),
|
|
177
|
+
},
|
|
178
|
+
circle: {
|
|
179
|
+
select: () => ts.objectType([
|
|
180
|
+
{ name: "x", type: ts.number() },
|
|
181
|
+
{ name: "y", type: ts.number() },
|
|
182
|
+
{ name: "radius", type: ts.number() },
|
|
183
|
+
]),
|
|
184
|
+
insert: () => ts.objectType([
|
|
185
|
+
{ name: "x", type: ts.number() },
|
|
186
|
+
{ name: "y", type: ts.number() },
|
|
187
|
+
{ name: "radius", type: ts.number() },
|
|
188
|
+
]),
|
|
189
|
+
update: () => ts.objectType([
|
|
190
|
+
{ name: "x", type: ts.number() },
|
|
191
|
+
{ name: "y", type: ts.number() },
|
|
192
|
+
{ name: "radius", type: ts.number() },
|
|
193
|
+
]),
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
// ============================================================================
|
|
197
|
+
// Type Resolution
|
|
198
|
+
// ============================================================================
|
|
199
|
+
/** Build TypeHintFieldMatch from field and context */
|
|
200
|
+
const buildFieldMatch = (field, ctx) => ({
|
|
201
|
+
schema: ctx.schemaName,
|
|
202
|
+
table: ctx.tableName,
|
|
203
|
+
column: field.columnName,
|
|
204
|
+
pgType: field.isArray && field.elementTypeName
|
|
205
|
+
? field.elementTypeName
|
|
206
|
+
: field.pgAttribute.getType()?.typname ?? "",
|
|
207
|
+
});
|
|
208
|
+
/**
|
|
209
|
+
* Resolve a field to its Kysely type.
|
|
210
|
+
* Handles: TypeHints, enums, complex types, scalar types, extensions.
|
|
211
|
+
*/
|
|
212
|
+
function resolveFieldType(field, ctx) {
|
|
213
|
+
const pgType = field.pgAttribute.getType();
|
|
214
|
+
const typeName = pgType?.typname ?? "";
|
|
215
|
+
// 1. Check TypeHints first (highest priority)
|
|
216
|
+
const fieldMatch = buildFieldMatch(field, ctx);
|
|
217
|
+
const tsTypeHint = ctx.typeHints.getHint(fieldMatch, "tsType");
|
|
218
|
+
if (Option.isSome(tsTypeHint)) {
|
|
219
|
+
const typeName = tsTypeHint.value;
|
|
220
|
+
const importPath = ctx.typeHints.getHint(fieldMatch, "import");
|
|
221
|
+
return {
|
|
222
|
+
selectType: ts.ref(typeName),
|
|
223
|
+
needsColumnType: false,
|
|
224
|
+
externalImport: pipe(importPath, Option.map(path => ({ name: typeName, from: path })), Option.getOrUndefined),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
// 2. Check if it's an enum
|
|
228
|
+
if (isEnumType(field)) {
|
|
229
|
+
const enumName = getPgTypeName(field);
|
|
230
|
+
if (enumName) {
|
|
231
|
+
const enumDef = findEnumByPgName(ctx.enums, enumName);
|
|
232
|
+
if (Option.isSome(enumDef)) {
|
|
233
|
+
return {
|
|
234
|
+
selectType: ts.ref(enumDef.value.name),
|
|
235
|
+
needsColumnType: false,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// 3. Check complex types (need ColumnType wrapper)
|
|
241
|
+
const complexType = COMPLEX_TYPES[typeName];
|
|
242
|
+
if (complexType) {
|
|
243
|
+
return {
|
|
244
|
+
selectType: complexType.select(),
|
|
245
|
+
insertType: complexType.insert(),
|
|
246
|
+
updateType: complexType.update(),
|
|
247
|
+
needsColumnType: true,
|
|
248
|
+
externalImport: complexType.import,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
// 4. Check simple scalar types
|
|
252
|
+
const scalarBuilder = SCALAR_TYPES[typeName];
|
|
253
|
+
if (scalarBuilder) {
|
|
254
|
+
return {
|
|
255
|
+
selectType: scalarBuilder(),
|
|
256
|
+
needsColumnType: false,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
// 5. Check extension types (citext, etc.)
|
|
260
|
+
if (pgType) {
|
|
261
|
+
const extType = getExtensionTypeMapping(typeName, String(pgType.typnamespace), ctx.extensions);
|
|
262
|
+
if (Option.isSome(extType)) {
|
|
263
|
+
return {
|
|
264
|
+
selectType: tsTypeToAst(extType.value),
|
|
265
|
+
needsColumnType: false,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// 6. Default to string (PostgreSQL sends unknown types as strings)
|
|
270
|
+
return {
|
|
271
|
+
selectType: ts.string(),
|
|
272
|
+
needsColumnType: false,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/** Convert a simple TS type string to AST */
|
|
276
|
+
function tsTypeToAst(typeName) {
|
|
277
|
+
switch (typeName) {
|
|
278
|
+
case "string": return ts.string();
|
|
279
|
+
case "number": return ts.number();
|
|
280
|
+
case "boolean": return ts.boolean();
|
|
281
|
+
case "bigint": return ts.bigint();
|
|
282
|
+
case "unknown": return ts.unknown();
|
|
283
|
+
case "null": return ts.null();
|
|
284
|
+
case "Date": return ts.ref("Date");
|
|
285
|
+
case "Buffer": return ts.ref("Buffer");
|
|
286
|
+
default: return ts.ref(typeName);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Build the final field type with array/nullable/Generated wrappers.
|
|
291
|
+
*/
|
|
292
|
+
function buildFieldType(field, kyselyType, needsGenerated) {
|
|
293
|
+
let baseType;
|
|
294
|
+
// If complex type, wrap in ColumnType<S, I, U>
|
|
295
|
+
if (kyselyType.needsColumnType && kyselyType.insertType && kyselyType.updateType) {
|
|
296
|
+
baseType = ts.ref("ColumnType", [
|
|
297
|
+
kyselyType.selectType,
|
|
298
|
+
kyselyType.insertType,
|
|
299
|
+
kyselyType.updateType,
|
|
300
|
+
]);
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
baseType = kyselyType.selectType;
|
|
304
|
+
}
|
|
305
|
+
// Wrap in array if needed
|
|
306
|
+
if (field.isArray) {
|
|
307
|
+
// For simple types, use T[]
|
|
308
|
+
// For complex types, use ArrayType<T>
|
|
309
|
+
if (kyselyType.needsColumnType) {
|
|
310
|
+
baseType = ts.ref("ArrayType", [baseType]);
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
baseType = ts.array(baseType);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Wrap in nullable if needed
|
|
317
|
+
if (field.nullable) {
|
|
318
|
+
baseType = ts.union(baseType, ts.null());
|
|
319
|
+
}
|
|
320
|
+
// Wrap in Generated<T> if field has default and is not insertable
|
|
321
|
+
if (needsGenerated) {
|
|
322
|
+
baseType = ts.ref("Generated", [baseType]);
|
|
323
|
+
}
|
|
324
|
+
return baseType;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Determine if a field should be wrapped in Generated<T>.
|
|
328
|
+
*
|
|
329
|
+
* A field is Generated when:
|
|
330
|
+
* - It has a default value, AND
|
|
331
|
+
* - It's not required on insert (either auto-increment or RLS blocks insert)
|
|
332
|
+
*/
|
|
333
|
+
function isGeneratedField(field) {
|
|
334
|
+
if (!field.hasDefault)
|
|
335
|
+
return false;
|
|
336
|
+
// If field can't be inserted via RLS, it's generated
|
|
337
|
+
if (!field.permissions.canInsert)
|
|
338
|
+
return true;
|
|
339
|
+
// Check for serial/identity columns (auto-incrementing)
|
|
340
|
+
const pgType = field.pgAttribute.getType();
|
|
341
|
+
if (!pgType)
|
|
342
|
+
return false;
|
|
343
|
+
// Check for identity columns (GENERATED ALWAYS AS IDENTITY)
|
|
344
|
+
if (field.isIdentity)
|
|
345
|
+
return true;
|
|
346
|
+
// Check for generated columns (GENERATED ALWAYS AS ...)
|
|
347
|
+
if (field.isGenerated)
|
|
348
|
+
return true;
|
|
349
|
+
// serial types have specific OIDs that resolve to int4/int8
|
|
350
|
+
// but the attribute itself may have attidentity or atthasdef
|
|
351
|
+
// For now, use a heuristic: if it's an integer with a default, likely generated
|
|
352
|
+
const typeOid = Number(pgType._id);
|
|
353
|
+
const isIntegerType = typeOid === PgTypeOid.Int2
|
|
354
|
+
|| typeOid === PgTypeOid.Int4
|
|
355
|
+
|| typeOid === PgTypeOid.Int8;
|
|
356
|
+
// If it's an integer primary key with a default, it's likely auto-increment
|
|
357
|
+
// This is a simplification - proper detection would check sequences
|
|
358
|
+
if (isIntegerType && field.hasDefault) {
|
|
359
|
+
// Check if it's a primary key (best effort)
|
|
360
|
+
const constraints = field.pgAttribute.getClass()?.getConstraints() ?? [];
|
|
361
|
+
const isPrimaryKey = constraints.some(c => c.contype === "p" && c.conkey?.includes(field.pgAttribute.attnum));
|
|
362
|
+
if (isPrimaryKey)
|
|
363
|
+
return true;
|
|
364
|
+
}
|
|
365
|
+
return false;
|
|
366
|
+
}
|
|
367
|
+
// ============================================================================
|
|
368
|
+
// Statement Generators
|
|
369
|
+
// ============================================================================
|
|
370
|
+
/**
|
|
371
|
+
* Generate the helper type definitions (Generated, ArrayType, etc.)
|
|
372
|
+
*/
|
|
373
|
+
function generateHelperTypes() {
|
|
374
|
+
const b = conjure;
|
|
375
|
+
// We'll emit these as raw type alias strings since they use complex conditionals
|
|
376
|
+
// that are easier to express as strings than AST
|
|
377
|
+
return []; // These will be added via file.header() or raw content
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Generate enum type alias: `export type Status = "active" | "inactive"`
|
|
381
|
+
*/
|
|
382
|
+
function generateEnumStatement(enumEntity) {
|
|
383
|
+
return exp.typeAlias(enumEntity.name, { capability: "types:kysely", entity: enumEntity.name }, ts.union(...enumEntity.values.map(v => ts.literal(v))));
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Generate table interface with all column types.
|
|
387
|
+
*/
|
|
388
|
+
function generateTableInterface(entity, ctx) {
|
|
389
|
+
const properties = [];
|
|
390
|
+
// Use the row shape for column definitions
|
|
391
|
+
for (const field of entity.shapes.row.fields) {
|
|
392
|
+
// Skip fields that aren't selectable via RLS
|
|
393
|
+
if (!field.permissions.canSelect)
|
|
394
|
+
continue;
|
|
395
|
+
const kyselyType = resolveFieldType(field, ctx);
|
|
396
|
+
const needsGenerated = isGeneratedField(field);
|
|
397
|
+
const fieldType = buildFieldType(field, kyselyType, needsGenerated);
|
|
398
|
+
properties.push({
|
|
399
|
+
name: field.name,
|
|
400
|
+
type: fieldType,
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
return exp.interface(entity.name, { capability: "types:kysely", entity: entity.name }, properties);
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Generate DB interface: `export interface DB { 'schema.table': Table }`
|
|
407
|
+
*/
|
|
408
|
+
function generateDBInterface(entities, defaultSchemas) {
|
|
409
|
+
const properties = [];
|
|
410
|
+
for (const entity of entities) {
|
|
411
|
+
// Skip entities that aren't selectable
|
|
412
|
+
if (!entity.permissions.canSelect)
|
|
413
|
+
continue;
|
|
414
|
+
// Use schema-qualified key if not in default schema
|
|
415
|
+
const key = defaultSchemas.includes(entity.schemaName)
|
|
416
|
+
? entity.pgName
|
|
417
|
+
: `${entity.schemaName}.${entity.pgName}`;
|
|
418
|
+
properties.push({
|
|
419
|
+
name: key,
|
|
420
|
+
type: ts.ref(entity.name),
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
// Sort by key for stable output
|
|
424
|
+
properties.sort((a, b) => a.name.localeCompare(b.name));
|
|
425
|
+
return exp.interface("DB", { capability: "types:kysely", entity: "DB" }, properties);
|
|
426
|
+
}
|
|
427
|
+
function collectImports(entities, ctx) {
|
|
428
|
+
const kyselyImports = new Set();
|
|
429
|
+
const externalImports = new Map();
|
|
430
|
+
const usedEnums = new Set();
|
|
431
|
+
let needsJsonTypes = false;
|
|
432
|
+
let needsArrayType = false;
|
|
433
|
+
let needsGenerated = false;
|
|
434
|
+
for (const entity of entities) {
|
|
435
|
+
if (!entity.permissions.canSelect)
|
|
436
|
+
continue;
|
|
437
|
+
for (const field of entity.shapes.row.fields) {
|
|
438
|
+
if (!field.permissions.canSelect)
|
|
439
|
+
continue;
|
|
440
|
+
const kyselyType = resolveFieldType(field, {
|
|
441
|
+
...ctx,
|
|
442
|
+
schemaName: entity.schemaName,
|
|
443
|
+
tableName: entity.pgName,
|
|
444
|
+
});
|
|
445
|
+
// Check for ColumnType usage
|
|
446
|
+
if (kyselyType.needsColumnType) {
|
|
447
|
+
kyselyImports.add("ColumnType");
|
|
448
|
+
}
|
|
449
|
+
// Check for external imports
|
|
450
|
+
if (kyselyType.externalImport) {
|
|
451
|
+
const { name, from } = kyselyType.externalImport;
|
|
452
|
+
if (!externalImports.has(from)) {
|
|
453
|
+
externalImports.set(from, new Set());
|
|
454
|
+
}
|
|
455
|
+
externalImports.get(from).add(name);
|
|
456
|
+
}
|
|
457
|
+
// Check for enum usage
|
|
458
|
+
if (isEnumType(field)) {
|
|
459
|
+
const enumName = getPgTypeName(field);
|
|
460
|
+
if (enumName) {
|
|
461
|
+
const enumDef = findEnumByPgName(ctx.enums, enumName);
|
|
462
|
+
if (Option.isSome(enumDef)) {
|
|
463
|
+
usedEnums.add(enumDef.value.name);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
// Check for JSON types
|
|
468
|
+
const pgType = field.pgAttribute.getType();
|
|
469
|
+
if (pgType?.typname === "json" || pgType?.typname === "jsonb") {
|
|
470
|
+
needsJsonTypes = true;
|
|
471
|
+
}
|
|
472
|
+
// Check for complex array types
|
|
473
|
+
if (field.isArray && kyselyType.needsColumnType) {
|
|
474
|
+
needsArrayType = true;
|
|
475
|
+
}
|
|
476
|
+
// Check for Generated
|
|
477
|
+
if (isGeneratedField(field)) {
|
|
478
|
+
needsGenerated = true;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
return {
|
|
483
|
+
kyselyImports,
|
|
484
|
+
externalImports,
|
|
485
|
+
usedEnums,
|
|
486
|
+
needsJsonTypes,
|
|
487
|
+
needsArrayType,
|
|
488
|
+
needsGenerated,
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
// ============================================================================
|
|
492
|
+
// Plugin Definition
|
|
493
|
+
// ============================================================================
|
|
494
|
+
/**
|
|
495
|
+
* Kysely Types Plugin
|
|
496
|
+
*
|
|
497
|
+
* Generates Kysely-compatible type definitions from SemanticIR.
|
|
498
|
+
* Uses RLS permissions to determine Generated<T> wrapping.
|
|
499
|
+
*
|
|
500
|
+
* @example Generated output:
|
|
501
|
+
* ```typescript
|
|
502
|
+
* import type { ColumnType } from 'kysely';
|
|
503
|
+
*
|
|
504
|
+
* export type Generated<T> = ...
|
|
505
|
+
*
|
|
506
|
+
* export type Status = 'active' | 'inactive';
|
|
507
|
+
*
|
|
508
|
+
* export interface Users {
|
|
509
|
+
* id: Generated<string>;
|
|
510
|
+
* name: string;
|
|
511
|
+
* email: string | null;
|
|
512
|
+
* }
|
|
513
|
+
*
|
|
514
|
+
* export interface DB {
|
|
515
|
+
* users: Users;
|
|
516
|
+
* }
|
|
517
|
+
* ```
|
|
518
|
+
*/
|
|
519
|
+
export const kyselyTypesPlugin = definePlugin({
|
|
520
|
+
name: "kysely-types",
|
|
521
|
+
provides: ["types:kysely"],
|
|
522
|
+
configSchema: KyselyTypesPluginConfig,
|
|
523
|
+
inflection: {
|
|
524
|
+
outputFile: () => "db.ts",
|
|
525
|
+
symbolName: (entityName) => entityName,
|
|
526
|
+
},
|
|
527
|
+
run: (ctx, config) => {
|
|
528
|
+
const { ir, typeHints } = ctx;
|
|
529
|
+
const enumEntities = getEnumEntities(ir);
|
|
530
|
+
const tableEntities = getTableEntities(ir).filter(e => e.tags.omit !== true);
|
|
531
|
+
const defaultSchemas = ir.schemas;
|
|
532
|
+
// Build field context
|
|
533
|
+
const fieldCtx = {
|
|
534
|
+
schemaName: "", // Will be set per-entity
|
|
535
|
+
tableName: "",
|
|
536
|
+
enums: enumEntities,
|
|
537
|
+
extensions: ir.extensions,
|
|
538
|
+
typeHints,
|
|
539
|
+
defaultSchemas,
|
|
540
|
+
};
|
|
541
|
+
// Collect what imports we need
|
|
542
|
+
const imports = collectImports(tableEntities, fieldCtx);
|
|
543
|
+
// Build statements
|
|
544
|
+
const statements = [];
|
|
545
|
+
// Generate enum types
|
|
546
|
+
for (const enumEntity of enumEntities) {
|
|
547
|
+
if (enumEntity.tags.omit === true)
|
|
548
|
+
continue;
|
|
549
|
+
statements.push(generateEnumStatement(enumEntity));
|
|
550
|
+
}
|
|
551
|
+
// Generate table interfaces
|
|
552
|
+
for (const entity of tableEntities) {
|
|
553
|
+
statements.push(generateTableInterface(entity, {
|
|
554
|
+
...fieldCtx,
|
|
555
|
+
schemaName: entity.schemaName,
|
|
556
|
+
tableName: entity.pgName,
|
|
557
|
+
}));
|
|
558
|
+
}
|
|
559
|
+
// Generate DB interface
|
|
560
|
+
statements.push(generateDBInterface(tableEntities, defaultSchemas));
|
|
561
|
+
// Build the file
|
|
562
|
+
const file = ctx.file(config.outputFile);
|
|
563
|
+
// Add Kysely imports
|
|
564
|
+
if (imports.kyselyImports.size > 0) {
|
|
565
|
+
file.import({
|
|
566
|
+
kind: "package",
|
|
567
|
+
types: [...imports.kyselyImports],
|
|
568
|
+
from: "kysely",
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
// Add external imports
|
|
572
|
+
for (const [from, names] of imports.externalImports) {
|
|
573
|
+
file.import({
|
|
574
|
+
kind: "relative",
|
|
575
|
+
types: [...names],
|
|
576
|
+
from,
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
// Build header with helper types
|
|
580
|
+
const helperTypes = [];
|
|
581
|
+
if (imports.needsGenerated) {
|
|
582
|
+
helperTypes.push(`export type Generated<T> = ${GENERATED_TYPE_DEF};`);
|
|
583
|
+
}
|
|
584
|
+
if (imports.needsArrayType) {
|
|
585
|
+
helperTypes.push(`export type ArrayType<T> = ${ARRAY_TYPE_DEF};`);
|
|
586
|
+
helperTypes.push(`export type ArrayTypeImpl<T> = ${ARRAY_TYPE_IMPL_DEF};`);
|
|
587
|
+
}
|
|
588
|
+
if (imports.needsJsonTypes) {
|
|
589
|
+
helperTypes.push(`export type JsonPrimitive = boolean | number | string | null;`);
|
|
590
|
+
helperTypes.push(`export type JsonObject = { [x: string]: JsonValue | undefined };`);
|
|
591
|
+
helperTypes.push(`export type JsonArray = JsonValue[];`);
|
|
592
|
+
helperTypes.push(`export type JsonValue = JsonArray | JsonObject | JsonPrimitive;`);
|
|
593
|
+
}
|
|
594
|
+
if (helperTypes.length > 0) {
|
|
595
|
+
file.header(helperTypes.join("\n\n"));
|
|
596
|
+
}
|
|
597
|
+
// Add the main content
|
|
598
|
+
file.ast(conjure.symbolProgram(...statements)).emit();
|
|
599
|
+
},
|
|
600
|
+
});
|
|
601
|
+
//# sourceMappingURL=kysely-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kysely-types.js","sourceRoot":"","sources":["../../src/plugins/kysely-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAgB,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAOrE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAI3C,OAAO,EACL,UAAU,EACV,aAAa,GACd,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAEjE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;AAE3B,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,uBAAuB;IACvB,UAAU,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAChE,yDAAyD;IACzD,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACjE,0CAA0C;IAC1C,eAAe,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;CACpE,CAAC,CAAA;AA8BF,+EAA+E;AAC/E,uDAAuD;AACvD,+EAA+E;AAE/E;;;;;;;;GAQG;AACH,MAAM,kBAAkB,GAAG;;oCAES,CAAA;AAEpC;;;;;;GAMG;AACH,MAAM,cAAc,GAAG;;qBAEF,CAAA;AAErB;;;;;;GAMG;AACH,MAAM,mBAAmB,GAAG;;QAEpB,CAAA;AAER,+EAA+E;AAC/E,yEAAyE;AACzE,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,YAAY,GAAmC;IACnD,UAAU;IACV,IAAI,EAAE,EAAE,CAAC,OAAO;IAEhB,oBAAoB;IACpB,IAAI,EAAE,EAAE,CAAC,MAAM;IACf,IAAI,EAAE,EAAE,CAAC,MAAM;IACf,MAAM,EAAE,EAAE,CAAC,MAAM;IACjB,MAAM,EAAE,EAAE,CAAC,MAAM;IACjB,GAAG,EAAE,EAAE,CAAC,MAAM;IAEd,sBAAsB;IACtB,IAAI,EAAE,EAAE,CAAC,MAAM;IACf,OAAO,EAAE,EAAE,CAAC,MAAM;IAClB,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,oBAAoB;IACvC,IAAI,EAAE,EAAE,CAAC,MAAM;IACf,IAAI,EAAE,EAAE,CAAC,MAAM;IACf,GAAG,EAAE,EAAE,CAAC,MAAM;IACd,MAAM,EAAE,EAAE,CAAC,MAAM;IACjB,GAAG,EAAE,EAAE,CAAC,MAAM;IAEd,gBAAgB;IAChB,IAAI,EAAE,EAAE,CAAC,MAAM;IAEf,yBAAyB;IACzB,IAAI,EAAE,EAAE,CAAC,MAAM;IACf,IAAI,EAAE,EAAE,CAAC,MAAM;IACf,OAAO,EAAE,EAAE,CAAC,MAAM;IAClB,QAAQ,EAAE,EAAE,CAAC,MAAM;IAEnB,kDAAkD;IAClD,IAAI,EAAE,EAAE,CAAC,MAAM;IACf,IAAI,EAAE,EAAE,CAAC,MAAM;IACf,GAAG,EAAE,EAAE,CAAC,MAAM;IACd,IAAI,EAAE,EAAE,CAAC,MAAM;IACf,OAAO,EAAE,EAAE,CAAC,MAAM;IAElB,6BAA6B;IAC7B,IAAI,EAAE,EAAE,CAAC,MAAM;IACf,MAAM,EAAE,EAAE,CAAC,MAAM;IAEjB,4BAA4B;IAC5B,QAAQ,EAAE,EAAE,CAAC,MAAM;IACnB,OAAO,EAAE,EAAE,CAAC,MAAM;IAClB,aAAa,EAAE,EAAE,CAAC,MAAM;IAExB,iBAAiB;IACjB,KAAK,EAAE,EAAE,CAAC,MAAM;IAEhB,kBAAkB;IAClB,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;CAC9B,CAAA;AAiBD,MAAM,aAAa,GAAuC;IACxD,sFAAsF;IACtF,IAAI,EAAE;QACJ,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;QAC7D,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;KAC9D;IAED,yDAAyD;IACzD,OAAO,EAAE;QACP,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;QAChD,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;KACjD;IAED,gDAAgD;IAChD,IAAI,EAAE;QACJ,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;QAC5B,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;QACnD,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;KACpD;IACD,SAAS,EAAE;QACT,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;QAC5B,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;QACnD,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;KACpD;IACD,WAAW,EAAE;QACX,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;QAC5B,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;QACnD,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;KACpD;IAED,0EAA0E;IAC1E,QAAQ,EAAE;QACR,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;QAChD,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;KACjD;IAED,6CAA6C;IAC7C,IAAI,EAAE;QACJ,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC;QACjC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC;QACjC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC;KAClC;IACD,KAAK,EAAE;QACL,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC;QACjC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC;QACjC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC;KAClC;IAED,0DAA0D;IAC1D,KAAK,EAAE;QACL,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC;YAC1B,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;YAChC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;SACjC,CAAC;QACF,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC;YAC1B,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;YAChC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;SACjC,CAAC;QACF,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC;YAC1B,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;YAChC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;SACjC,CAAC;KACH;IACD,MAAM,EAAE;QACN,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC;YAC1B,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;YAChC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;YAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;SACtC,CAAC;QACF,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC;YAC1B,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;YAChC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;YAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;SACtC,CAAC;QACF,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC;YAC1B,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;YAChC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;YAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;SACtC,CAAC;KACH;CACF,CAAA;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E,sDAAsD;AACtD,MAAM,eAAe,GAAG,CAAC,KAAY,EAAE,GAAiB,EAAsB,EAAE,CAAC,CAAC;IAChF,MAAM,EAAE,GAAG,CAAC,UAAU;IACtB,KAAK,EAAE,GAAG,CAAC,SAAS;IACpB,MAAM,EAAE,KAAK,CAAC,UAAU;IACxB,MAAM,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,eAAe;QAC5C,CAAC,CAAC,KAAK,CAAC,eAAe;QACvB,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,OAAO,IAAI,EAAE;CAC/C,CAAC,CAAA;AAEF;;;GAGG;AACH,SAAS,gBAAgB,CAAC,KAAY,EAAE,GAAiB;IACvD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,CAAA;IAC1C,MAAM,QAAQ,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAA;IAEtC,8CAA8C;IAC9C,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC9C,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAS,UAAU,EAAE,QAAQ,CAAC,CAAA;IAEtE,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAA;QACjC,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAS,UAAU,EAAE,QAAQ,CAAC,CAAA;QACtE,OAAO;YACL,UAAU,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC5B,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI,CAClB,UAAU,EACV,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EACpD,MAAM,CAAC,cAAc,CACtB;SACF,CAAA;IACH,CAAC;IAED,2BAA2B;IAC3B,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;QACrC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YACrD,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,OAAO;oBACL,UAAU,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;oBACtC,eAAe,EAAE,KAAK;iBACvB,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC3C,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE;YAChC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE;YAChC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE;YAChC,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,WAAW,CAAC,MAAM;SACnC,CAAA;IACH,CAAC;IAED,+BAA+B;IAC/B,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IAC5C,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO;YACL,UAAU,EAAE,aAAa,EAAE;YAC3B,eAAe,EAAE,KAAK;SACvB,CAAA;IACH,CAAC;IAED,0CAA0C;IAC1C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,uBAAuB,CACrC,QAAQ,EACR,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAC3B,GAAG,CAAC,UAAU,CACf,CAAA;QACD,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;gBACtC,eAAe,EAAE,KAAK;aACvB,CAAA;QACH,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,OAAO;QACL,UAAU,EAAE,EAAE,CAAC,MAAM,EAAE;QACvB,eAAe,EAAE,KAAK;KACvB,CAAA;AACH,CAAC;AAED,6CAA6C;AAC7C,SAAS,WAAW,CAAC,QAAgB;IACnC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAA;QACjC,KAAK,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAA;QACjC,KAAK,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAA;QACnC,KAAK,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAA;QACjC,KAAK,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAA;QACnC,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAA;QAC7B,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAClC,KAAK,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACtC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,KAAY,EACZ,UAAsB,EACtB,cAAuB;IAEvB,IAAI,QAAkB,CAAA;IAEtB,+CAA+C;IAC/C,IAAI,UAAU,CAAC,eAAe,IAAI,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QACjF,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,EAAE;YAC9B,UAAU,CAAC,UAAU;YACrB,UAAU,CAAC,UAAU;YACrB,UAAU,CAAC,UAAU;SACtB,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAA;IAClC,CAAC;IAED,0BAA0B;IAC1B,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,4BAA4B;QAC5B,sCAAsC;QACtC,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;YAC/B,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;IAC1C,CAAC;IAED,kEAAkE;IAClE,IAAI,cAAc,EAAE,CAAC;QACnB,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,KAAY;IACpC,IAAI,CAAC,KAAK,CAAC,UAAU;QAAE,OAAO,KAAK,CAAA;IAEnC,qDAAqD;IACrD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAE7C,wDAAwD;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,CAAA;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAEzB,4DAA4D;IAC5D,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,IAAI,CAAA;IAEjC,wDAAwD;IACxD,IAAI,KAAK,CAAC,WAAW;QAAE,OAAO,IAAI,CAAA;IAElC,4DAA4D;IAC5D,6DAA6D;IAC7D,gFAAgF;IAChF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAClC,MAAM,aAAa,GAAG,OAAO,KAAK,SAAS,CAAC,IAAI;WAC3C,OAAO,KAAK,SAAS,CAAC,IAAI;WAC1B,OAAO,KAAK,SAAS,CAAC,IAAI,CAAA;IAE/B,4EAA4E;IAC5E,oEAAoE;IACpE,IAAI,aAAa,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACtC,4CAA4C;QAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAA;QACxE,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CACvE,CAAA;QACD,IAAI,YAAY;YAAE,OAAO,IAAI,CAAA;IAC/B,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,mBAAmB;IAC1B,MAAM,CAAC,GAAG,OAAO,CAAA;IAEjB,iFAAiF;IACjF,iDAAiD;IACjD,OAAO,EAAE,CAAA,CAAE,uDAAuD;AACpE,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,UAAsB;IACnD,OAAO,GAAG,CAAC,SAAS,CAClB,UAAU,CAAC,IAAI,EACf,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,EACvD,EAAE,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CACvD,CAAA;AACH,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAC7B,MAAmB,EACnB,GAAiB;IAEjB,MAAM,UAAU,GAAgE,EAAE,CAAA;IAElF,2CAA2C;IAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAC7C,6CAA6C;QAC7C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS;YAAE,SAAQ;QAE1C,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAC/C,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAC9C,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,CAAC,CAAA;QAEnE,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,SAAS;SAChB,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,GAAG,CAAC,SAAS,CAClB,MAAM,CAAC,IAAI,EACX,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EACnD,UAAU,CACX,CAAA;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,QAAgC,EAChC,cAAiC;IAEjC,MAAM,UAAU,GAA4C,EAAE,CAAA;IAE9D,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,uCAAuC;QACvC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS;YAAE,SAAQ;QAE3C,oDAAoD;QACpD,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC;YACpD,CAAC,CAAC,MAAM,CAAC,MAAM;YACf,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,CAAA;QAE3C,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;SAC1B,CAAC,CAAA;IACJ,CAAC;IAED,gCAAgC;IAChC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAEvD,OAAO,GAAG,CAAC,SAAS,CAClB,IAAI,EACJ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,EAC5C,UAAU,CACX,CAAA;AACH,CAAC;AAeD,SAAS,cAAc,CACrB,QAAgC,EAChC,GAAiB;IAEjB,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAA;IACvC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAuB,CAAA;IACtD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;IACnC,IAAI,cAAc,GAAG,KAAK,CAAA;IAC1B,IAAI,cAAc,GAAG,KAAK,CAAA;IAC1B,IAAI,cAAc,GAAG,KAAK,CAAA;IAE1B,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS;YAAE,SAAQ;QAE3C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS;gBAAE,SAAQ;YAE1C,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,EAAE;gBACzC,GAAG,GAAG;gBACN,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,MAAM;aACzB,CAAC,CAAA;YAEF,6BAA6B;YAC7B,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;gBAC/B,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;YACjC,CAAC;YAED,6BAA6B;YAC7B,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;gBAC9B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,cAAc,CAAA;gBAChD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC/B,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;gBACtC,CAAC;gBACD,eAAe,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACtC,CAAC;YAED,uBAAuB;YACvB,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;gBACrC,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;oBACrD,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC3B,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;oBACnC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,CAAA;YAC1C,IAAI,MAAM,EAAE,OAAO,KAAK,MAAM,IAAI,MAAM,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC9D,cAAc,GAAG,IAAI,CAAA;YACvB,CAAC;YAED,gCAAgC;YAChC,IAAI,KAAK,CAAC,OAAO,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;gBAChD,cAAc,GAAG,IAAI,CAAA;YACvB,CAAC;YAED,sBAAsB;YACtB,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,cAAc,GAAG,IAAI,CAAA;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,aAAa;QACb,eAAe;QACf,SAAS;QACT,cAAc;QACd,cAAc;QACd,cAAc;KACf,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;IAC5C,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,CAAC,cAAc,CAAC;IAC1B,YAAY,EAAE,uBAAuB;IACrC,UAAU,EAAE;QACV,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO;QACzB,UAAU,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU;KACvC;IAED,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;QACnB,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,GAAG,CAAA;QAC7B,MAAM,YAAY,GAAG,eAAe,CAAC,EAAE,CAAC,CAAA;QACxC,MAAM,aAAa,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;QAC5E,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAAA;QAEjC,sBAAsB;QACtB,MAAM,QAAQ,GAAiB;YAC7B,UAAU,EAAE,EAAE,EAAG,yBAAyB;YAC1C,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,YAAY;YACnB,UAAU,EAAE,EAAE,CAAC,UAAU;YACzB,SAAS;YACT,cAAc;SACf,CAAA;QAED,+BAA+B;QAC/B,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;QAEvD,mBAAmB;QACnB,MAAM,UAAU,GAAsB,EAAE,CAAA;QAExC,sBAAsB;QACtB,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;YACtC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI;gBAAE,SAAQ;YAC3C,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAA;QACpD,CAAC;QAED,4BAA4B;QAC5B,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE;gBAC7C,GAAG,QAAQ;gBACX,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,MAAM;aACzB,CAAC,CAAC,CAAA;QACL,CAAC;QAED,wBAAwB;QACxB,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAA;QAEnE,iBAAiB;QACjB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAExC,qBAAqB;QACrB,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC;gBACV,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;gBACjC,IAAI,EAAE,QAAQ;aACf,CAAC,CAAA;QACJ,CAAC;QAED,uBAAuB;QACvB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC;gBACV,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;gBACjB,IAAI;aACL,CAAC,CAAA;QACJ,CAAC;QAED,iCAAiC;QACjC,MAAM,WAAW,GAAa,EAAE,CAAA;QAEhC,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC,8BAA8B,kBAAkB,GAAG,CAAC,CAAA;QACvE,CAAC;QAED,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC,8BAA8B,cAAc,GAAG,CAAC,CAAA;YACjE,WAAW,CAAC,IAAI,CAAC,kCAAkC,mBAAmB,GAAG,CAAC,CAAA;QAC5E,CAAC;QAED,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAA;YACjF,WAAW,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAA;YACpF,WAAW,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;YACxD,WAAW,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAA;QACrF,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QACvC,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACvD,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
export declare const sqlQueriesPlugin: import("../index.js").PluginFactory<{
|
|
2
2
|
readonly outputDir: string;
|
|
3
|
-
readonly header?: string | undefined;
|
|
4
3
|
readonly sqlStyle: "string" | "tag";
|
|
5
4
|
}, {
|
|
6
5
|
readonly outputDir?: string | undefined;
|
|
7
|
-
readonly header?: string | undefined;
|
|
8
6
|
readonly sqlStyle?: "string" | "tag" | undefined;
|
|
9
7
|
}>;
|
|
10
8
|
//# sourceMappingURL=sql-queries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-queries.d.ts","sourceRoot":"","sources":["../../src/plugins/sql-queries.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sql-queries.d.ts","sourceRoot":"","sources":["../../src/plugins/sql-queries.ts"],"names":[],"mappings":"AA0VA,eAAO,MAAM,gBAAgB;;;;;;EA6D3B,CAAC"}
|
|
@@ -14,7 +14,6 @@ const { ts, b, param } = conjure;
|
|
|
14
14
|
// ============================================================================
|
|
15
15
|
const SqlQueriesPluginConfig = S.Struct({
|
|
16
16
|
outputDir: S.optionalWith(S.String, { default: () => "sql-queries" }),
|
|
17
|
-
header: S.optional(S.String),
|
|
18
17
|
/** SQL query style. Defaults to "tag" (tagged template literals) */
|
|
19
18
|
sqlStyle: S.optionalWith(S.Union(S.Literal("tag"), S.Literal("string")), { default: () => "tag" }),
|
|
20
19
|
});
|
|
@@ -282,9 +281,7 @@ export const sqlQueriesPlugin = definePlugin({
|
|
|
282
281
|
entity,
|
|
283
282
|
};
|
|
284
283
|
const filePath = `${config.outputDir}/${ctx.pluginInflection.outputFile(fileNameCtx)}`;
|
|
285
|
-
const file = ctx
|
|
286
|
-
.file(filePath)
|
|
287
|
-
.header(config.header ? `${config.header}\n` : "// This file is auto-generated. Do not edit.\n");
|
|
284
|
+
const file = ctx.file(filePath);
|
|
288
285
|
// Import the appropriate SQL client based on style
|
|
289
286
|
if (sqlStyle === "tag") {
|
|
290
287
|
file.import({ kind: "relative", names: ["sql"], from: "../db" });
|