@dbmason/mysql 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # @dbmason/mysql
2
+
3
+ MySQL Dialect for Dbmason.
4
+
5
+ Provides the introspector, analyzer, and emitter logic specifically for MySQL databases.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @dbmason/mysql
11
+ ```
@@ -0,0 +1,157 @@
1
+ import { AnalyzedTableNode } from '@dbmason/core';
2
+ import { ColumnHandle } from '@dbmason/core';
3
+ import { ColumnNode } from '@dbmason/core';
4
+ import { ColumnReference } from '@dbmason/core';
5
+ import { ConstraintNode } from '@dbmason/core';
6
+ import { DbmasonContext } from '@dbmason/core';
7
+ import { DbmasonDialect } from '@dbmason/core';
8
+ import { DbmasonDriver } from '@dbmason/core';
9
+ import { DbmasonIntrospector } from '@dbmason/core';
10
+ import { DbmasonScope } from '@dbmason/core';
11
+ import { DbOperation } from '@dbmason/core';
12
+ import { ExecutionPlan } from '@dbmason/core';
13
+ import { IndexNode } from '@dbmason/core';
14
+ import { ReferentialAction } from '@dbmason/core';
15
+ import { RoleReference } from '@dbmason/core';
16
+ import { Snapshot } from '@dbmason/core';
17
+ import { TableHandle } from '@dbmason/core';
18
+ import { TableNode } from '@dbmason/core';
19
+ import { TableReference } from '@dbmason/core';
20
+
21
+ export declare const bigint: () => MysqlColumnBuilder;
22
+
23
+ export declare const boolean: () => MysqlColumnBuilder;
24
+
25
+ export declare const btree: (...columns: ColumnReference[]) => IndexNode;
26
+
27
+ export declare const char: (length?: number) => MysqlColumnBuilder;
28
+
29
+ export declare const date: () => MysqlColumnBuilder;
30
+
31
+ export declare const datetime: () => MysqlColumnBuilder;
32
+
33
+ export { DbmasonContext }
34
+
35
+ export { DbOperation }
36
+
37
+ export declare function defineEvent(scope: DbmasonContext | DbmasonScope, name: string, schedule: string, body: string): void;
38
+
39
+ export declare function defineFunction(scope: DbmasonContext | DbmasonScope, name: string, args: Record<string, string>, returns: string, body: string): void;
40
+
41
+ export declare function defineProcedure(scope: DbmasonContext | DbmasonScope, name: string, args: Record<string, string>, body: string): void;
42
+
43
+ export declare function defineTable<C extends Record<string, MysqlColumnBuilder | string | ColumnNode>>(scope: DbmasonContext | DbmasonScope, name: string, input: MysqlTableInput<C>): TableHandle & {
44
+ [K in keyof C]: ColumnHandle;
45
+ };
46
+
47
+ export declare function defineTrigger(scope: DbmasonContext | DbmasonScope, name: string, input: {
48
+ event: 'INSERT' | 'UPDATE' | 'DELETE';
49
+ timing: 'BEFORE' | 'AFTER';
50
+ table: string;
51
+ body: string;
52
+ }): void;
53
+
54
+ export declare function defineView(scope: DbmasonContext | DbmasonScope, name: string, query: string): void;
55
+
56
+ export declare const fulltext: (...columns: ColumnReference[]) => IndexNode;
57
+
58
+ export declare const hash: (...columns: ColumnReference[]) => IndexNode;
59
+
60
+ /**
61
+ * MySQL Index Helpers
62
+ */
63
+ export declare type IndexMethod = 'btree' | 'hash' | 'fulltext' | 'spatial';
64
+
65
+ /**
66
+ * MySQL Column Factories
67
+ */
68
+ export declare const int: () => MysqlColumnBuilder;
69
+
70
+ export declare const integer: () => MysqlColumnBuilder;
71
+
72
+ export declare const json: () => MysqlColumnBuilder;
73
+
74
+ export declare const mediumint: () => MysqlColumnBuilder;
75
+
76
+ export declare class MysqlColumnBuilder {
77
+ private readonly node;
78
+ constructor(node: MysqlColumnNode);
79
+ primaryKey(): MysqlColumnBuilder;
80
+ notNull(): MysqlColumnBuilder;
81
+ unique(): MysqlColumnBuilder;
82
+ default(expr: string): MysqlColumnBuilder;
83
+ autoIncrement(): MysqlColumnBuilder;
84
+ unsigned(): MysqlColumnBuilder;
85
+ onUpdateCurrentTimestamp(): MysqlColumnBuilder;
86
+ charset(charset: string): MysqlColumnBuilder;
87
+ collate(collate: string): MysqlColumnBuilder;
88
+ check(expression: string): MysqlColumnBuilder;
89
+ references(handle: ColumnReference, options?: {
90
+ onDelete?: ReferentialAction;
91
+ onUpdate?: ReferentialAction;
92
+ }): MysqlColumnBuilder;
93
+ references(table: string, column: string, options?: {
94
+ onDelete?: ReferentialAction;
95
+ onUpdate?: ReferentialAction;
96
+ }): MysqlColumnBuilder;
97
+ build(): MysqlColumnNode;
98
+ }
99
+
100
+ export declare interface MysqlColumnNode extends ColumnNode {
101
+ length?: number;
102
+ autoIncrement?: boolean;
103
+ unsigned?: boolean;
104
+ onUpdate?: string;
105
+ charset?: string;
106
+ collate?: string;
107
+ }
108
+
109
+ export declare class MysqlDialect implements DbmasonDialect {
110
+ readonly name = "mysql";
111
+ private ctx?;
112
+ introspector: MysqlIntrospector;
113
+ constructor();
114
+ setContext(ctx: DbmasonContext): void;
115
+ analyzeTable(table: TableNode): AnalyzedTableNode;
116
+ emit(plan: ExecutionPlan): string;
117
+ getDriver(connectionString: string): DbmasonDriver;
118
+ }
119
+
120
+ declare class MysqlIntrospector implements DbmasonIntrospector {
121
+ introspect(connectionString: string): Promise<Snapshot>;
122
+ }
123
+
124
+ export declare interface MysqlTableInput<C = Record<string, unknown>> {
125
+ columns: C;
126
+ constraints?: ConstraintNode[];
127
+ indexes?: IndexNode[];
128
+ education?: string;
129
+ options?: {
130
+ engine?: 'InnoDB' | 'MyISAM' | 'Memory' | 'CSV' | 'Archive';
131
+ charset?: string;
132
+ collate?: string;
133
+ comment?: string;
134
+ };
135
+ }
136
+
137
+ export { RoleReference }
138
+
139
+ export declare const smallint: () => MysqlColumnBuilder;
140
+
141
+ export declare const spatial: (...columns: ColumnReference[]) => IndexNode;
142
+
143
+ export { TableReference }
144
+
145
+ export declare const text: () => MysqlColumnBuilder;
146
+
147
+ export declare const time: () => MysqlColumnBuilder;
148
+
149
+ export declare const timestamp: () => MysqlColumnBuilder;
150
+
151
+ export declare const tinyint: () => MysqlColumnBuilder;
152
+
153
+ export declare const varchar: (length?: number) => MysqlColumnBuilder;
154
+
155
+ export declare const year: () => MysqlColumnBuilder;
156
+
157
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,109 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _=require("mysql2/promise"),u=require("@dbmason/core");class I{constructor(e){this.connection=null,this.pool=_.createPool(e)}async connect(){this.connection=await this.pool.getConnection()}async close(){this.connection&&(this.connection.release(),this.connection=null),await this.pool.end()}async query(e,n){if(!this.connection)throw new Error("Driver not connected");const[t]=await this.connection.query(e,n);return t}async beginTransaction(){if(!this.connection)throw new Error("Driver not connected");await this.connection.beginTransaction()}async commitTransaction(){if(!this.connection)throw new Error("Driver not connected");await this.connection.commit()}async rollbackTransaction(){if(!this.connection)throw new Error("Driver not connected");await this.connection.rollback()}}class C{static emit(e){let n=e.type.toUpperCase();n==="BOOLEAN"&&(n="TINYINT(1)"),n==="VARCHAR"&&e.length&&(n=`VARCHAR(${e.length})`),n==="CHAR"&&e.length&&(n=`CHAR(${e.length})`),n==="UUID"&&(n="CHAR(36)");let t=`\`${e.name}\` ${n}`;return e.unsigned&&(t+=" UNSIGNED"),e.notNull&&(t+=" NOT NULL"),e.default!==void 0&&(t+=` DEFAULT ${e.default}`),e.autoIncrement&&(t+=" AUTO_INCREMENT"),t}}class M{static emit(e,n,t){switch(e){case"create":return this.emitCreate(n);case"alter":return this.emitAlter(n,t);case"drop":return`DROP TABLE IF EXISTS \`${n.name}\`;`;default:return""}}static emitCreate(e){let t=[...Object.values(e.columns).map(a=>C.emit(a))];const E=Object.values(e.columns).filter(a=>a.primaryKey).map(a=>`\`${a.name}\``);E.length>0&&t.push(`PRIMARY KEY (${E.join(", ")})`);for(const a of Object.values(e.columns)){const T=a;if(T.references){const m=T.references.table,d=T.references.column;let R=`CONSTRAINT \`fk_${e.name}_${a.name}\` FOREIGN KEY (\`${a.name}\`) REFERENCES \`${m}\`(\`${d}\`)`;T.references.onDelete&&(R+=` ON DELETE ${T.references.onDelete}`),T.references.onUpdate&&(R+=` ON UPDATE ${T.references.onUpdate}`),t.push(R)}}for(const a of e.indexes){let T="";a.method==="fulltext"?T="FULLTEXT ":a.method==="spatial"?T="SPATIAL ":a.unique&&(T="UNIQUE "),t.push(`${T}KEY \`${a.name}\` (${a.columns.map(m=>`\`${m}\``).join(", ")})`)}for(const a of e.constraints)a.type==="check"&&t.push(`CONSTRAINT \`${a.name}\` CHECK (${a.definition})`);const o=e.options,s=(o==null?void 0:o.engine)||"InnoDB",r=(o==null?void 0:o.charset)||"utf8mb4",N=o!=null&&o.collate?` COLLATE=${o.collate}`:"",A=o!=null&&o.comment?` COMMENT='${o.comment}'`:"";return`CREATE TABLE \`${e.name}\` (
2
+ ${t.join(`,
3
+ `)}
4
+ ) ENGINE=${s} DEFAULT CHARSET=${r}${N}${A};`}static emitAlter(e,n){const t=[],E=n==null?void 0:n.old;for(const[o,s]of Object.entries(e.columns))E.columns[o]||t.push(`ADD COLUMN ${C.emit(s)}`);return t.length===0?"":`ALTER TABLE \`${e.name}\`
5
+ ${t.join(`,
6
+ `)};`}}class O{static emit(e){return`CREATE OR REPLACE VIEW \`${e.name}\` AS ${e.query};
7
+ `}}class L{static emit(e){const n=Object.entries(e.args).map(([t,E])=>`${t} ${E}`).join(", ");return`DELIMITER //
8
+ CREATE PROCEDURE \`${e.name}\`(${n})
9
+ BEGIN
10
+ ${e.body}
11
+ END //
12
+ DELIMITER ;
13
+ `}}class h{static emit(e){const n=Object.entries(e.args).map(([t,E])=>`${t} ${E}`).join(", ");return`DELIMITER //
14
+ CREATE FUNCTION \`${e.name}\`(${n}) RETURNS ${e.returns}
15
+ BEGIN
16
+ ${e.body}
17
+ END //
18
+ DELIMITER ;
19
+ `}}class S{static emit(e){const n=e.events.join(" OR ");return`DELIMITER //
20
+ CREATE TRIGGER \`${e.name}\` ${e.when} ${n} ON \`${e.table}\`
21
+ FOR EACH ROW
22
+ BEGIN
23
+ ${e.body}
24
+ END //
25
+ DELIMITER ;
26
+ `}}class p{static emit(e){return`CREATE EVENT \`${e.name}\`
27
+ ON SCHEDULE ${e.schedule}
28
+ DO
29
+ ${e.command};
30
+ `}}class w{static emit(e){let n=`-- Generated by @dbmason/mysql
31
+
32
+ `;for(const t of e)switch(t.node.kind){case"Table":n+=M.emit(t.action,t.node,t.diff)+`
33
+
34
+ `;break;case"View":n+=O.emit(t.node)+`
35
+
36
+ `;break;case"Procedure":n+=L.emit(t.node)+`
37
+
38
+ `;break;case"Function":n+=h.emit(t.node)+`
39
+
40
+ `;break;case"Trigger":n+=S.emit(t.node)+`
41
+
42
+ `;break;case"Cron":n+=p.emit(t.node)+`
43
+
44
+ `;break;default:console.warn(`Unsupported node kind for MySQL: ${t.node.kind}`)}return n}}class D{static async introspect(e){const n={},E=(await e.query("SELECT DATABASE() as db"))[0].db,o=await e.query(`
45
+ SELECT TABLE_NAME
46
+ FROM information_schema.TABLES
47
+ WHERE TABLE_SCHEMA = '${E}'
48
+ AND TABLE_TYPE = 'BASE TABLE'
49
+ `);for(const s of o){const r=s.TABLE_NAME,N=await this.introspectColumns(e,E,r),A=await this.introspectIndexes(e,E,r),a=await this.introspectConstraints(e,E,r);n[r]={kind:"Table",name:r,module:"global",columns:N,indexes:A,constraints:a,policies:[],triggers:[]}}return n}static async introspectColumns(e,n,t){const E=await e.query(`
50
+ SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, EXTRA, COLUMN_TYPE
51
+ FROM information_schema.COLUMNS
52
+ WHERE TABLE_SCHEMA = '${n}' AND TABLE_NAME = '${t}'
53
+ ORDER BY ORDINAL_POSITION
54
+ `),o={};for(const r of E)o[r.COLUMN_NAME]={kind:"Column",name:r.COLUMN_NAME,type:r.DATA_TYPE.toUpperCase(),notNull:r.IS_NULLABLE==="NO",default:r.COLUMN_DEFAULT||void 0,primaryKey:r.COLUMN_KEY==="PRI",options:r.EXTRA.includes("auto_increment")?{identity:!0}:void 0};const s=await e.query(`
55
+ SELECT COLUMN_NAME
56
+ FROM information_schema.KEY_COLUMN_USAGE
57
+ WHERE CONSTRAINT_NAME = 'PRIMARY'
58
+ AND TABLE_SCHEMA = '${n}' AND TABLE_NAME = '${t}'
59
+ `);for(const r of s)o[r.COLUMN_NAME]&&(o[r.COLUMN_NAME].primaryKey=!0);return o}static async introspectIndexes(e,n,t){const E=await e.query(`
60
+ SELECT INDEX_NAME, COLUMN_NAME, NON_UNIQUE
61
+ FROM information_schema.STATISTICS
62
+ WHERE TABLE_SCHEMA = '${n}' AND TABLE_NAME = '${t}'
63
+ ORDER BY INDEX_NAME, SEQ_IN_INDEX
64
+ `),o=new Map;for(const s of E)s.INDEX_NAME!=="PRIMARY"&&(o.has(s.INDEX_NAME)||o.set(s.INDEX_NAME,{kind:"Index",name:s.INDEX_NAME,table:t,columns:[],unique:s.NON_UNIQUE===0}),o.get(s.INDEX_NAME).columns.push(s.COLUMN_NAME));return Array.from(o.values())}static async introspectConstraints(e,n,t){const E=[],o=await e.query(`
65
+ SELECT
66
+ CONSTRAINT_NAME,
67
+ COLUMN_NAME,
68
+ REFERENCED_TABLE_NAME,
69
+ REFERENCED_COLUMN_NAME
70
+ FROM information_schema.KEY_COLUMN_USAGE
71
+ WHERE TABLE_SCHEMA = '${n}' AND TABLE_NAME = '${t}'
72
+ AND REFERENCED_TABLE_NAME IS NOT NULL
73
+ `);for(const N of o){const A=`FOREIGN KEY (\`${N.COLUMN_NAME}\`) REFERENCES \`${N.REFERENCED_TABLE_NAME}\`(\`${N.REFERENCED_COLUMN_NAME}\`)`;E.push({kind:"Constraint",type:"foreign_key",definition:A,name:N.CONSTRAINT_NAME,table:t})}try{const N=await e.query(`
74
+ SELECT CONSTRAINT_NAME, CHECK_CLAUSE
75
+ FROM information_schema.CHECK_CONSTRAINTS
76
+ WHERE CONSTRAINT_SCHEMA = '${n}'
77
+ -- Note: CHECK_CONSTRAINTS doesn't always have TABLE_NAME directly in all versions,
78
+ -- sometimes joined with TABLE_CONSTRAINTS
79
+ `),A=await e.query(`
80
+ SELECT tc.CONSTRAINT_NAME, cc.CHECK_CLAUSE
81
+ FROM information_schema.TABLE_CONSTRAINTS tc
82
+ JOIN information_schema.CHECK_CONSTRAINTS cc ON tc.CONSTRAINT_NAME = cc.CONSTRAINT_NAME
83
+ WHERE tc.TABLE_SCHEMA = '${n}' AND tc.TABLE_NAME = '${t}'
84
+ AND tc.CONSTRAINT_TYPE = 'CHECK'
85
+ `);for(const a of A)E.push({kind:"Constraint",type:"check",name:a.CONSTRAINT_NAME,table:t,definition:`CHECK (${a.CHECK_CLAUSE})`})}catch{}const s=await e.query(`
86
+ SELECT tc.CONSTRAINT_NAME, kcu.COLUMN_NAME
87
+ FROM information_schema.TABLE_CONSTRAINTS tc
88
+ JOIN information_schema.KEY_COLUMN_USAGE kcu ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
89
+ WHERE tc.TABLE_SCHEMA = '${n}' AND tc.TABLE_NAME = '${t}'
90
+ AND tc.CONSTRAINT_TYPE = 'UNIQUE'
91
+ `),r=new Map;for(const N of s)r.has(N.CONSTRAINT_NAME)||r.set(N.CONSTRAINT_NAME,[]),r.get(N.CONSTRAINT_NAME).push(N.COLUMN_NAME);for(const[N,A]of r)E.push({kind:"Constraint",type:"unique",name:N,table:t,definition:`UNIQUE (${A.map(a=>`\`${a}\``).join(", ")})`});return E}}class y{static async introspect(e){const n={},E=(await e.query("SELECT DATABASE() as db"))[0].db,o=await e.query(`
92
+ SELECT TABLE_NAME, VIEW_DEFINITION
93
+ FROM information_schema.VIEWS
94
+ WHERE TABLE_SCHEMA = '${E}'
95
+ `);for(const s of o)n[s.TABLE_NAME]={kind:"View",name:s.TABLE_NAME,query:s.VIEW_DEFINITION};return{views:n,materializedViews:{}}}}class U{static async introspect(e){const n={},t={},o=(await e.query("SELECT DATABASE() as db"))[0].db,s=await e.query(`
96
+ SELECT ROUTINE_NAME, ROUTINE_TYPE, DTD_IDENTIFIER, ROUTINE_DEFINITION, EXTERNAL_LANGUAGE
97
+ FROM information_schema.ROUTINES
98
+ WHERE ROUTINE_SCHEMA = '${o}'
99
+ `);for(const r of s){const N=r.ROUTINE_NAME,A=r.ROUTINE_TYPE,a=await e.query(`
100
+ SELECT PARAMETER_NAME, DATA_TYPE, PARAMETER_MODE
101
+ FROM information_schema.PARAMETERS
102
+ WHERE SPECIFIC_SCHEMA = '${o}' AND ROUTINE_NAME = '${N}'
103
+ ORDER BY ORDINAL_POSITION
104
+ `),T={};for(const m of a)m.PARAMETER_NAME&&(T[m.PARAMETER_NAME]=m.DATA_TYPE);A==="FUNCTION"?n[N]={kind:"Function",name:N,args:T,returns:r.DTD_IDENTIFIER,language:r.EXTERNAL_LANGUAGE||"SQL",body:r.ROUTINE_DEFINITION}:t[N]={kind:"Procedure",name:N,args:T,returns:"void",language:r.EXTERNAL_LANGUAGE||"SQL",body:r.ROUTINE_DEFINITION}}return{functions:n,procedures:t}}}class b{static async introspect(e){const n={},E=(await e.query("SELECT DATABASE() as db"))[0].db,o=await e.query(`
105
+ SELECT TRIGGER_NAME, EVENT_OBJECT_TABLE, ACTION_TIMING, EVENT_MANIPULATION, ACTION_STATEMENT
106
+ FROM information_schema.TRIGGERS
107
+ WHERE TRIGGER_SCHEMA = '${E}'
108
+ `);for(const s of o)n[s.TRIGGER_NAME]={kind:"Trigger",name:s.TRIGGER_NAME,table:s.EVENT_OBJECT_TABLE,events:[s.EVENT_MANIPULATION.toLowerCase()],functionName:"inline",when:s.ACTION_TIMING.toLowerCase(),forEach:"ROW",body:s.ACTION_STATEMENT};return n}}class ${async introspect(e){const n=new I(e);await n.connect();try{const t=await D.introspect(n),{views:E,materializedViews:o}=await y.introspect(n),{functions:s,procedures:r}=await U.introspect(n),N=await b.introspect(n);return{tables:t,procedures:r,functions:s,views:E,materializedViews:o,types:{},crons:{},extensions:{},roles:{},grants:{},policies:{},triggers:N,hashes:{}}}finally{await n.close()}}}class g{constructor(){this.name="mysql",this.introspector=new $}setContext(e){this.ctx=e}analyzeTable(e){return{...e,indexes:e.indexes,dependencies:[],rls:{enabled:!1,policies:[]}}}emit(e){return w.emit(e)}getDriver(e){return new I(e)}}function l(i){return i.map(e=>u.resolveColumn(e).column)}const k=(...i)=>({kind:"Index",name:"",table:"",columns:l(i),method:"btree"}),B=(...i)=>({kind:"Index",name:"",table:"",columns:l(i),method:"hash"}),F=(...i)=>({kind:"Index",name:"",table:"",columns:l(i),method:"fulltext"}),H=(...i)=>({kind:"Index",name:"",table:"",columns:l(i),method:"spatial"});class c{constructor(e){this.node=e}primaryKey(){return new c({...this.node,primaryKey:!0,notNull:!0})}notNull(){return new c({...this.node,notNull:!0})}unique(){return new c({...this.node,unique:!0})}default(e){return new c({...this.node,default:e})}autoIncrement(){return new c({...this.node,autoIncrement:!0})}unsigned(){return new c({...this.node,unsigned:!0})}onUpdateCurrentTimestamp(){return new c({...this.node,onUpdate:"CURRENT_TIMESTAMP"})}charset(e){return new c({...this.node,charset:e})}collate(e){return new c({...this.node,collate:e})}check(e){return new c({...this.node,check:e})}references(e,n,t){let E,o,s;return typeof e!="string"?(E=e.tableName,o=e.columnName,s=n):(E=e,o=n,s=t),new c({...this.node,references:{module:e.moduleName,table:E,column:o,onDelete:s==null?void 0:s.onDelete,onUpdate:s==null?void 0:s.onUpdate}})}build(){return this.node}}const f=()=>new c({kind:"Column",name:"",type:"INT"}),P=f,G=()=>new c({kind:"Column",name:"",type:"TINYINT"}),q=()=>new c({kind:"Column",name:"",type:"SMALLINT"}),Y=()=>new c({kind:"Column",name:"",type:"MEDIUMINT"}),x=()=>new c({kind:"Column",name:"",type:"BIGINT"}),j=(i=255)=>new c({kind:"Column",name:"",type:"VARCHAR",length:i}),K=()=>new c({kind:"Column",name:"",type:"TEXT"}),V=(i=1)=>new c({kind:"Column",name:"",type:"CHAR",length:i}),v=()=>new c({kind:"Column",name:"",type:"DATE"}),W=()=>new c({kind:"Column",name:"",type:"DATETIME"}),X=()=>new c({kind:"Column",name:"",type:"TIMESTAMP"}),Q=()=>new c({kind:"Column",name:"",type:"TIME"}),J=()=>new c({kind:"Column",name:"",type:"YEAR"}),z=()=>new c({kind:"Column",name:"",type:"BOOLEAN"}),Z=()=>new c({kind:"Column",name:"",type:"JSON"});function ee(i,e,n){return u.internalDefineTable(i,e,n,t=>{const E={};for(const[o,s]of Object.entries(t))if(s instanceof c){const r=s.build();r.name=o,E[o]=r}else typeof s=="string"?E[o]={kind:"Column",name:o,type:s}:E[o]={...s,name:o};return E})}function ne(i,e,n){u.internalDefineView(i,e,n)}function te(i,e,n,t){u.internalDefineProcedure(i,e,{args:n,body:t,language:"SQL"})}function oe(i,e,n,t,E){u.internalDefineFunction(i,e,{args:n,returns:t,body:E,language:"SQL"})}function se(i,e,n){u.internalDefineTrigger(i,n.table,e,{when:n.timing,events:[n.event],body:n.body,forEach:"ROW"})}function ie(i,e,n,t){u.internalDefineCron(i,e,n,t)}Object.defineProperty(exports,"DbOperation",{enumerable:!0,get:()=>u.DbOperation});Object.defineProperty(exports,"DbmasonContext",{enumerable:!0,get:()=>u.DbmasonContext});Object.defineProperty(exports,"RoleReference",{enumerable:!0,get:()=>u.RoleReference});Object.defineProperty(exports,"TableReference",{enumerable:!0,get:()=>u.TableReference});exports.MysqlColumnBuilder=c;exports.MysqlDialect=g;exports.bigint=x;exports.boolean=z;exports.btree=k;exports.char=V;exports.date=v;exports.datetime=W;exports.defineEvent=ie;exports.defineFunction=oe;exports.defineProcedure=te;exports.defineTable=ee;exports.defineTrigger=se;exports.defineView=ne;exports.fulltext=F;exports.hash=B;exports.int=f;exports.integer=P;exports.json=Z;exports.mediumint=Y;exports.smallint=q;exports.spatial=H;exports.text=K;exports.time=Q;exports.timestamp=X;exports.tinyint=G;exports.varchar=j;exports.year=J;
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/MysqlDriver.ts","../src/emitters/Column.emitter.ts","../src/emitters/Table.emitter.ts","../src/emitters/View.emitter.ts","../src/emitters/Procedure.emitter.ts","../src/emitters/Function.emitter.ts","../src/emitters/Trigger.emitter.ts","../src/emitters/Event.emitter.ts","../src/MysqlEmitter.ts","../src/introspectors/Table.introspector.ts","../src/introspectors/View.introspector.ts","../src/introspectors/Routine.introspector.ts","../src/introspectors/Trigger.introspector.ts","../src/MysqlIntrospector.ts","../src/MysqlDialect.ts","../src/definitions/Table.ts","../src/definitions/View.ts","../src/definitions/Procedure.ts","../src/definitions/Function.ts","../src/definitions/Trigger.ts","../src/definitions/Event.ts"],"sourcesContent":["import { createPool, Pool, PoolConnection } from 'mysql2/promise';\nimport { DbmasonDriver } from '@dbmason/core';\n\nexport class MysqlDriver implements DbmasonDriver {\n private pool: Pool;\n private connection: PoolConnection | null = null;\n\n constructor(connectionString: string) {\n this.pool = createPool(connectionString);\n }\n\n async connect(): Promise<void> {\n this.connection = await this.pool.getConnection();\n }\n\n async close(): Promise<void> {\n if (this.connection) {\n this.connection.release();\n this.connection = null;\n }\n await this.pool.end();\n }\n\n async query(sql: string, params?: any[]): Promise<unknown> {\n if (!this.connection) throw new Error('Driver not connected');\n const [rows] = await this.connection.query(sql, params);\n return rows;\n }\n\n async beginTransaction(): Promise<void> {\n if (!this.connection) throw new Error('Driver not connected');\n await this.connection.beginTransaction();\n }\n\n async commitTransaction(): Promise<void> {\n if (!this.connection) throw new Error('Driver not connected');\n await this.connection.commit();\n }\n\n async rollbackTransaction(): Promise<void> {\n if (!this.connection) throw new Error('Driver not connected');\n await this.connection.rollback();\n }\n}\n","import { MysqlColumnNode } from '../definitions/Table';\n\nexport class ColumnEmitter {\n static emit(col: MysqlColumnNode): string {\n let type = col.type.toUpperCase();\n \n if (type === 'BOOLEAN') type = 'TINYINT(1)';\n if (type === 'VARCHAR' && col.length) type = `VARCHAR(${col.length})`;\n if (type === 'CHAR' && col.length) type = `CHAR(${col.length})`;\n if (type === 'UUID') type = 'CHAR(36)';\n\n let def = `\\`${col.name}\\` ${type}`;\n\n if (col.unsigned) def += ' UNSIGNED';\n\n if (col.notNull) {\n def += ' NOT NULL';\n }\n\n if (col.default !== undefined) {\n def += ` DEFAULT ${col.default}`;\n }\n\n if (col.autoIncrement) {\n def += ' AUTO_INCREMENT';\n }\n\n return def;\n }\n}\n","import { AnalyzedTableNode, TableNode } from '@dbmason/core';\nimport { ColumnEmitter } from './Column.emitter';\nimport { MysqlColumnNode, MysqlTableInput } from '../definitions/Table';\n\nexport class TableEmitter {\n static emit(action: string, node: AnalyzedTableNode, diff?: unknown): string {\n switch (action) {\n case 'create':\n return this.emitCreate(node);\n case 'alter':\n return this.emitAlter(node, diff);\n case 'drop':\n return `DROP TABLE IF EXISTS \\`${node.name}\\`;`;\n default:\n return '';\n }\n }\n\n static emitCreate(node: AnalyzedTableNode): string {\n const columns = Object.values(node.columns).map(col => ColumnEmitter.emit(col as MysqlColumnNode));\n \n let definitions = [...columns];\n\n // Primary Key Constraint\n const pkCols = Object.values(node.columns).filter(c => c.primaryKey).map(c => `\\`${c.name}\\``);\n if (pkCols.length > 0) {\n definitions.push(`PRIMARY KEY (${pkCols.join(', ')})`);\n }\n\n // Foreign Keys\n for (const col of Object.values(node.columns)) {\n const mCol = col as MysqlColumnNode;\n if (mCol.references) {\n const refTable = mCol.references.table;\n const refCol = mCol.references.column;\n let fk = `CONSTRAINT \\`fk_${node.name}_${col.name}\\` FOREIGN KEY (\\`${col.name}\\`) REFERENCES \\`${refTable}\\`(\\`${refCol}\\`)`;\n if (mCol.references.onDelete) fk += ` ON DELETE ${mCol.references.onDelete}`;\n if (mCol.references.onUpdate) fk += ` ON UPDATE ${mCol.references.onUpdate}`;\n definitions.push(fk);\n }\n }\n\n // Indexes\n for (const idx of node.indexes) {\n let type = '';\n if (idx.method === 'fulltext') type = 'FULLTEXT ';\n else if (idx.method === 'spatial') type = 'SPATIAL ';\n else if (idx.unique) type = 'UNIQUE ';\n \n definitions.push(`${type}KEY \\`${idx.name}\\` (${idx.columns.map(c => `\\`${c}\\``).join(', ')})`);\n }\n\n // Constraints (CHECK)\n for (const constraint of node.constraints) {\n if (constraint.type === 'check') {\n definitions.push(`CONSTRAINT \\`${constraint.name}\\` CHECK (${constraint.definition})`);\n }\n }\n\n const options = (node as any).options as MysqlTableInput['options'];\n const engine = options?.engine || 'InnoDB';\n const charset = options?.charset || 'utf8mb4';\n const collate = options?.collate ? ` COLLATE=${options.collate}` : '';\n const comment = options?.comment ? ` COMMENT='${options.comment}'` : '';\n\n return `CREATE TABLE \\`${node.name}\\` (\\n ${definitions.join(',\\n ')}\\n) ENGINE=${engine} DEFAULT CHARSET=${charset}${collate}${comment};`;\n }\n\n static emitAlter(node: AnalyzedTableNode, diff?: unknown): string {\n const statements: string[] = [];\n const oldNode = (diff as any)?.old as TableNode;\n\n // 1. Add/Modify/Drop Columns\n for (const [name, col] of Object.entries(node.columns)) {\n if (!oldNode.columns[name]) {\n statements.push(`ADD COLUMN ${ColumnEmitter.emit(col as MysqlColumnNode)}`);\n } else {\n // Check for modifications (simplified)\n // In a real implementation we would compare properties\n // statements.push(`MODIFY COLUMN ${ColumnEmitter.emit(col as MysqlColumnNode)}`);\n }\n }\n\n if (statements.length === 0) return '';\n return `ALTER TABLE \\`${node.name}\\`\\n ${statements.join(',\\n ')};`;\n }\n}\n","import { ViewNode } from '@dbmason/core';\n\nexport class ViewEmitter {\n static emit(node: ViewNode): string {\n return `CREATE OR REPLACE VIEW \\`${node.name}\\` AS ${node.query};\\n`;\n }\n}\n","import { ProcedureNode } from '@dbmason/core';\n\nexport class ProcedureEmitter {\n static emit(node: ProcedureNode): string {\n const args = Object.entries(node.args).map(([name, type]) => `${name} ${type}`).join(', ');\n return `DELIMITER //\\nCREATE PROCEDURE \\`${node.name}\\`(${args})\\nBEGIN\\n${node.body}\\nEND //\\nDELIMITER ;\\n`;\n }\n}\n","import { FunctionNode } from '@dbmason/core';\n\nexport class FunctionEmitter {\n static emit(node: FunctionNode): string {\n const args = Object.entries(node.args).map(([name, type]) => `${name} ${type}`).join(', ');\n return `DELIMITER //\\nCREATE FUNCTION \\`${node.name}\\`(${args}) RETURNS ${node.returns}\\nBEGIN\\n${node.body}\\nEND //\\nDELIMITER ;\\n`;\n }\n}\n","import { TriggerNode } from '@dbmason/core';\n\nexport class TriggerEmitter {\n static emit(node: TriggerNode): string {\n const events = node.events.join(' OR ');\n return `DELIMITER //\\nCREATE TRIGGER \\`${node.name}\\` ${node.when} ${events} ON \\`${node.table}\\`\\nFOR EACH ROW\\nBEGIN\\n${node.body}\\nEND //\\nDELIMITER ;\\n`;\n }\n}\n","import { CronNode } from '@dbmason/core';\n\nexport class EventEmitter {\n static emit(node: CronNode): string {\n // Map Cron schedule to MySQL Event Schedule\n // This is a naive mapping. A robust one would parse the schedule string.\n // For now assume user provides MySQL compatible schedule e.g. \"EVERY 1 DAY\"\n return `CREATE EVENT \\`${node.name}\\`\\nON SCHEDULE ${node.schedule}\\nDO\\n${node.command};\\n`;\n }\n}\n","import { ExecutionPlan, AnalyzedTableNode, ViewNode, ProcedureNode, FunctionNode, TriggerNode, CronNode } from '@dbmason/core';\nimport { TableEmitter } from './emitters/Table.emitter';\nimport { ViewEmitter } from './emitters/View.emitter';\nimport { ProcedureEmitter } from './emitters/Procedure.emitter';\nimport { FunctionEmitter } from './emitters/Function.emitter';\nimport { TriggerEmitter } from './emitters/Trigger.emitter';\nimport { EventEmitter } from './emitters/Event.emitter';\n\nexport class MysqlEmitter {\n static emit(plan: ExecutionPlan): string {\n let sql = '-- Generated by @dbmason/mysql\\n\\n';\n\n for (const step of plan) {\n switch (step.node.kind) {\n case 'Table':\n sql += TableEmitter.emit(step.action, step.node as unknown as AnalyzedTableNode, step.diff) + '\\n\\n';\n break;\n case 'View':\n sql += ViewEmitter.emit(step.node as unknown as ViewNode) + '\\n\\n';\n break;\n case 'Procedure':\n sql += ProcedureEmitter.emit(step.node as unknown as ProcedureNode) + '\\n\\n';\n break;\n case 'Function':\n sql += FunctionEmitter.emit(step.node as unknown as FunctionNode) + '\\n\\n';\n break;\n case 'Trigger':\n sql += TriggerEmitter.emit(step.node as unknown as TriggerNode) + '\\n\\n';\n break;\n case 'Cron':\n sql += EventEmitter.emit(step.node as unknown as CronNode) + '\\n\\n';\n break;\n default:\n console.warn(`Unsupported node kind for MySQL: ${step.node.kind}`);\n }\n }\n\n return sql;\n }\n}\n","import { TableNode, ColumnNode, IndexNode, ConstraintNode } from '@dbmason/core';\nimport { MysqlDriver } from '../MysqlDriver';\n\nexport class TableIntrospector {\n static async introspect(driver: MysqlDriver): Promise<Record<string, TableNode>> {\n const tableNodes: Record<string, TableNode> = {};\n\n // Get current database name\n const dbResult = await driver.query('SELECT DATABASE() as db') as any[];\n const schema = dbResult[0].db;\n\n // 1. Fetch Tables\n const tablesResult = await driver.query(`\n SELECT TABLE_NAME \n FROM information_schema.TABLES \n WHERE TABLE_SCHEMA = '${schema}' \n AND TABLE_TYPE = 'BASE TABLE'\n `) as any[];\n\n for (const row of tablesResult) {\n const tableName = row.TABLE_NAME;\n const columns = await this.introspectColumns(driver, schema, tableName);\n const indexes = await this.introspectIndexes(driver, schema, tableName);\n const constraints = await this.introspectConstraints(driver, schema, tableName);\n\n tableNodes[tableName] = {\n kind: 'Table',\n name: tableName,\n module: 'global', // MySQL database maps to global scope in Dbmason usually\n columns,\n indexes,\n constraints,\n policies: [],\n triggers: []\n };\n }\n\n return tableNodes;\n }\n\n private static async introspectColumns(driver: MysqlDriver, schema: string, table: string): Promise<Record<string, ColumnNode>> {\n const columnsResult = await driver.query(`\n SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, EXTRA, COLUMN_TYPE\n FROM information_schema.COLUMNS \n WHERE TABLE_SCHEMA = '${schema}' AND TABLE_NAME = '${table}'\n ORDER BY ORDINAL_POSITION\n `) as any[];\n\n const columns: Record<string, ColumnNode> = {};\n for (const row of columnsResult) {\n columns[row.COLUMN_NAME] = {\n kind: 'Column',\n name: row.COLUMN_NAME,\n type: row.DATA_TYPE.toUpperCase(),\n notNull: row.IS_NULLABLE === 'NO',\n default: row.COLUMN_DEFAULT || undefined,\n primaryKey: row.COLUMN_KEY === 'PRI', // Actually PRI comes from a different column sometimes, better check EXTRA or use another query\n options: row.EXTRA.includes('auto_increment') ? { identity: true } : undefined\n };\n }\n\n // Refine PKs\n const pksResult = await driver.query(`\n SELECT COLUMN_NAME\n FROM information_schema.KEY_COLUMN_USAGE\n WHERE CONSTRAINT_NAME = 'PRIMARY'\n AND TABLE_SCHEMA = '${schema}' AND TABLE_NAME = '${table}'\n `) as any[];\n \n for (const row of pksResult) {\n if (columns[row.COLUMN_NAME]) {\n columns[row.COLUMN_NAME].primaryKey = true;\n }\n }\n\n return columns;\n }\n\n private static async introspectIndexes(driver: MysqlDriver, schema: string, table: string): Promise<IndexNode[]> {\n const result = await driver.query(`\n SELECT INDEX_NAME, COLUMN_NAME, NON_UNIQUE\n FROM information_schema.STATISTICS\n WHERE TABLE_SCHEMA = '${schema}' AND TABLE_NAME = '${table}'\n ORDER BY INDEX_NAME, SEQ_IN_INDEX\n `) as any[];\n\n const indexMap = new Map<string, IndexNode>();\n for (const row of result) {\n if (row.INDEX_NAME === 'PRIMARY') continue; // Skip primary key as an index\n\n if (!indexMap.has(row.INDEX_NAME)) {\n indexMap.set(row.INDEX_NAME, {\n kind: 'Index',\n name: row.INDEX_NAME,\n table,\n columns: [],\n unique: row.NON_UNIQUE === 0\n });\n }\n indexMap.get(row.INDEX_NAME)!.columns.push(row.COLUMN_NAME);\n }\n\n return Array.from(indexMap.values());\n }\n\n private static async introspectConstraints(driver: MysqlDriver, schema: string, table: string): Promise<ConstraintNode[]> {\n const constraints: ConstraintNode[] = [];\n\n // 1. Foreign Keys\n const fkResult = await driver.query(`\n SELECT\n CONSTRAINT_NAME,\n COLUMN_NAME,\n REFERENCED_TABLE_NAME,\n REFERENCED_COLUMN_NAME\n FROM information_schema.KEY_COLUMN_USAGE\n WHERE TABLE_SCHEMA = '${schema}' AND TABLE_NAME = '${table}'\n AND REFERENCED_TABLE_NAME IS NOT NULL\n `) as any[];\n\n for (const row of fkResult) {\n const definition = `FOREIGN KEY (\\`${row.COLUMN_NAME}\\`) REFERENCES \\`${row.REFERENCED_TABLE_NAME}\\`(\\`${row.REFERENCED_COLUMN_NAME}\\`)`;\n\n constraints.push({\n kind: 'Constraint',\n type: 'foreign_key',\n definition,\n name: row.CONSTRAINT_NAME,\n table\n });\n }\n\n // 2. Check Constraints (MySQL 8.0.16+)\n try {\n const checkResult = await driver.query(`\n SELECT CONSTRAINT_NAME, CHECK_CLAUSE\n FROM information_schema.CHECK_CONSTRAINTS\n WHERE CONSTRAINT_SCHEMA = '${schema}'\n -- Note: CHECK_CONSTRAINTS doesn't always have TABLE_NAME directly in all versions, \n -- sometimes joined with TABLE_CONSTRAINTS\n `) as any[];\n \n // For now, if it fails or returns too many, we might need a more complex query joining TABLE_CONSTRAINTS\n // But let's try a simple approach first. \n // Better: join with TABLE_CONSTRAINTS to filter by table.\n const refinedCheckResult = await driver.query(`\n SELECT tc.CONSTRAINT_NAME, cc.CHECK_CLAUSE\n FROM information_schema.TABLE_CONSTRAINTS tc\n JOIN information_schema.CHECK_CONSTRAINTS cc ON tc.CONSTRAINT_NAME = cc.CONSTRAINT_NAME\n WHERE tc.TABLE_SCHEMA = '${schema}' AND tc.TABLE_NAME = '${table}'\n AND tc.CONSTRAINT_TYPE = 'CHECK'\n `) as any[];\n\n for (const row of refinedCheckResult) {\n constraints.push({\n kind: 'Constraint',\n type: 'check',\n name: row.CONSTRAINT_NAME,\n table,\n definition: `CHECK (${row.CHECK_CLAUSE})`\n });\n }\n } catch (e) {\n // Silently skip if CHECK_CONSTRAINTS is not supported (old MySQL)\n }\n\n // 3. Unique Constraints\n const uniqueResult = await driver.query(`\n SELECT tc.CONSTRAINT_NAME, kcu.COLUMN_NAME\n FROM information_schema.TABLE_CONSTRAINTS tc\n JOIN information_schema.KEY_COLUMN_USAGE kcu ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME\n WHERE tc.TABLE_SCHEMA = '${schema}' AND tc.TABLE_NAME = '${table}'\n AND tc.CONSTRAINT_TYPE = 'UNIQUE'\n `) as any[];\n\n const uniqueMap = new Map<string, string[]>();\n for (const row of uniqueResult) {\n if (!uniqueMap.has(row.CONSTRAINT_NAME)) uniqueMap.set(row.CONSTRAINT_NAME, []);\n uniqueMap.get(row.CONSTRAINT_NAME)!.push(row.COLUMN_NAME);\n }\n\n for (const [name, columns] of uniqueMap) {\n constraints.push({\n kind: 'Constraint',\n type: 'unique',\n name,\n table,\n definition: `UNIQUE (${columns.map(c => `\\`${c}\\``).join(', ')})`\n });\n }\n\n return constraints;\n }\n}\n","import { ViewNode } from '@dbmason/core';\nimport { MysqlDriver } from '../MysqlDriver';\n\nexport class ViewIntrospector {\n static async introspect(driver: MysqlDriver): Promise<{ views: Record<string, ViewNode>; materializedViews: Record<string, ViewNode> }> {\n const views: Record<string, ViewNode> = {};\n\n const dbResult = await driver.query('SELECT DATABASE() as db') as any[];\n const schema = dbResult[0].db;\n\n const result = await driver.query(`\n SELECT TABLE_NAME, VIEW_DEFINITION\n FROM information_schema.VIEWS\n WHERE TABLE_SCHEMA = '${schema}'\n `) as any[];\n\n for (const row of result) {\n views[row.TABLE_NAME] = {\n kind: 'View',\n name: row.TABLE_NAME,\n query: row.VIEW_DEFINITION\n };\n }\n\n return { views, materializedViews: {} };\n }\n}\n","import { FunctionNode, ProcedureNode } from '@dbmason/core';\nimport { MysqlDriver } from '../MysqlDriver';\n\nexport class RoutineIntrospector {\n static async introspect(driver: MysqlDriver): Promise<{ functions: Record<string, FunctionNode>; procedures: Record<string, ProcedureNode> }> {\n const functions: Record<string, FunctionNode> = {};\n const procedures: Record<string, ProcedureNode> = {};\n\n const dbResult = await driver.query('SELECT DATABASE() as db') as any[];\n const schema = dbResult[0].db;\n\n const routines = await driver.query(`\n SELECT ROUTINE_NAME, ROUTINE_TYPE, DTD_IDENTIFIER, ROUTINE_DEFINITION, EXTERNAL_LANGUAGE\n FROM information_schema.ROUTINES\n WHERE ROUTINE_SCHEMA = '${schema}'\n `) as any[];\n\n for (const routine of routines) {\n const name = routine.ROUTINE_NAME;\n const type = routine.ROUTINE_TYPE; // 'FUNCTION' or 'PROCEDURE'\n \n // Fetch parameters\n const paramsResult = await driver.query(`\n SELECT PARAMETER_NAME, DATA_TYPE, PARAMETER_MODE\n FROM information_schema.PARAMETERS\n WHERE SPECIFIC_SCHEMA = '${schema}' AND ROUTINE_NAME = '${name}'\n ORDER BY ORDINAL_POSITION\n `) as any[];\n\n const args: Record<string, any> = {};\n for (const p of paramsResult) {\n if (p.PARAMETER_NAME) {\n args[p.PARAMETER_NAME] = p.DATA_TYPE;\n }\n }\n\n if (type === 'FUNCTION') {\n functions[name] = {\n kind: 'Function',\n name,\n args,\n returns: routine.DTD_IDENTIFIER,\n language: routine.EXTERNAL_LANGUAGE || 'SQL',\n body: routine.ROUTINE_DEFINITION\n };\n } else {\n procedures[name] = {\n kind: 'Procedure',\n name,\n args,\n returns: 'void',\n language: routine.EXTERNAL_LANGUAGE || 'SQL',\n body: routine.ROUTINE_DEFINITION\n };\n }\n }\n\n return { functions, procedures };\n }\n}\n","import { TriggerNode } from '@dbmason/core';\nimport { MysqlDriver } from '../MysqlDriver';\n\nexport class TriggerIntrospector {\n static async introspect(driver: MysqlDriver): Promise<Record<string, TriggerNode>> {\n const triggers: Record<string, TriggerNode> = {};\n\n const dbResult = await driver.query('SELECT DATABASE() as db') as any[];\n const schema = dbResult[0].db;\n\n const result = await driver.query(`\n SELECT TRIGGER_NAME, EVENT_OBJECT_TABLE, ACTION_TIMING, EVENT_MANIPULATION, ACTION_STATEMENT\n FROM information_schema.TRIGGERS\n WHERE TRIGGER_SCHEMA = '${schema}'\n `) as any[];\n\n for (const row of result) {\n triggers[row.TRIGGER_NAME] = {\n kind: 'Trigger',\n name: row.TRIGGER_NAME,\n table: row.EVENT_OBJECT_TABLE,\n events: [row.EVENT_MANIPULATION.toLowerCase() as any],\n functionName: 'inline', // MySQL triggers are inline SQL\n when: row.ACTION_TIMING.toLowerCase() as any,\n forEach: 'ROW', // MySQL triggers are always FOR EACH ROW\n body: row.ACTION_STATEMENT\n };\n }\n\n return triggers;\n }\n}\n","import { DbmasonIntrospector, Snapshot } from '@dbmason/core';\nimport { MysqlDriver } from './MysqlDriver';\nimport { TableIntrospector } from './introspectors/Table.introspector';\nimport { ViewIntrospector } from './introspectors/View.introspector';\nimport { RoutineIntrospector } from './introspectors/Routine.introspector';\nimport { TriggerIntrospector } from './introspectors/Trigger.introspector';\n\nexport class MysqlIntrospector implements DbmasonIntrospector {\n async introspect(connectionString: string): Promise<Snapshot> {\n const driver = new MysqlDriver(connectionString);\n await driver.connect();\n\n try {\n const tables = await TableIntrospector.introspect(driver);\n const { views, materializedViews } = await ViewIntrospector.introspect(driver);\n const { functions, procedures } = await RoutineIntrospector.introspect(driver);\n const triggers = await TriggerIntrospector.introspect(driver);\n \n return {\n tables,\n procedures,\n functions,\n views,\n materializedViews,\n types: {}, // MySQL ENUMs are column-level\n crons: {},\n extensions: {},\n roles: {},\n grants: {},\n policies: {},\n triggers,\n hashes: {}\n };\n } finally {\n await driver.close();\n }\n }\n}\n","import { \n DbmasonDialect, \n DbmasonDriver,\n TableNode, \n AnalyzedTableNode, \n ExecutionPlan,\n DbmasonContext\n} from '@dbmason/core';\nimport { MysqlDriver } from './MysqlDriver';\nimport { MysqlEmitter } from './MysqlEmitter';\nimport { MysqlIntrospector } from './MysqlIntrospector';\n\nexport class MysqlDialect implements DbmasonDialect {\n readonly name = 'mysql';\n\n private ctx?: DbmasonContext;\n introspector = new MysqlIntrospector();\n\n constructor() {}\n\n setContext(ctx: DbmasonContext) {\n this.ctx = ctx;\n }\n\n analyzeTable(table: TableNode): AnalyzedTableNode {\n return {\n ...table,\n indexes: table.indexes,\n dependencies: [],\n rls: { enabled: false, policies: [] }\n };\n }\n\n emit(plan: ExecutionPlan): string {\n return MysqlEmitter.emit(plan);\n }\n\n getDriver(connectionString: string): DbmasonDriver {\n return new MysqlDriver(connectionString);\n }\n}\n","import { DbmasonContext, DbmasonScope } from '@dbmason/core';\nimport { internalDefineTable, ColumnNode, TableHandle, ColumnHandle, IndexNode, ConstraintNode, ColumnReference, resolveColumn, resolveTable, ReferentialAction } from '@dbmason/core';\n\n/**\n * MySQL Index Helpers\n */\nexport type IndexMethod = 'btree' | 'hash' | 'fulltext' | 'spatial';\n\nfunction resolveColumns(refs: ColumnReference[]): string[] {\n return refs.map(ref => resolveColumn(ref).column);\n}\n\nexport const btree = (...columns: ColumnReference[]): IndexNode => ({\n kind: 'Index', name: '', table: '', columns: resolveColumns(columns), method: 'btree'\n});\nexport const hash = (...columns: ColumnReference[]): IndexNode => ({\n kind: 'Index', name: '', table: '', columns: resolveColumns(columns), method: 'hash'\n});\nexport const fulltext = (...columns: ColumnReference[]): IndexNode => ({\n kind: 'Index', name: '', table: '', columns: resolveColumns(columns), method: 'fulltext'\n});\nexport const spatial = (...columns: ColumnReference[]): IndexNode => ({\n kind: 'Index', name: '', table: '', columns: resolveColumns(columns), method: 'spatial'\n});\n\nexport interface MysqlColumnNode extends ColumnNode {\n length?: number;\n autoIncrement?: boolean;\n unsigned?: boolean;\n onUpdate?: string;\n charset?: string;\n collate?: string;\n}\n\nexport class MysqlColumnBuilder {\n constructor(private readonly node: MysqlColumnNode) {}\n\n primaryKey() {\n return new MysqlColumnBuilder({ ...this.node, primaryKey: true, notNull: true });\n }\n\n notNull() {\n return new MysqlColumnBuilder({ ...this.node, notNull: true });\n }\n\n unique() {\n return new MysqlColumnBuilder({ ...this.node, unique: true });\n }\n\n default(expr: string) {\n return new MysqlColumnBuilder({ ...this.node, default: expr });\n }\n\n autoIncrement() {\n return new MysqlColumnBuilder({ ...this.node, autoIncrement: true });\n }\n\n unsigned() {\n return new MysqlColumnBuilder({ ...this.node, unsigned: true });\n }\n\n onUpdateCurrentTimestamp() {\n return new MysqlColumnBuilder({ ...this.node, onUpdate: 'CURRENT_TIMESTAMP' });\n }\n\n charset(charset: string) {\n return new MysqlColumnBuilder({ ...this.node, charset });\n }\n\n collate(collate: string) {\n return new MysqlColumnBuilder({ ...this.node, collate });\n }\n\n check(expression: string) {\n return new MysqlColumnBuilder({ ...this.node, check: expression });\n }\n\n references(handle: ColumnReference, options?: { onDelete?: ReferentialAction, onUpdate?: ReferentialAction }): MysqlColumnBuilder;\n references(table: string, column: string, options?: { onDelete?: ReferentialAction, onUpdate?: ReferentialAction }): MysqlColumnBuilder;\n references(tableOrCol: ColumnReference | string, columnOrOptions?: string | { onDelete?: ReferentialAction, onUpdate?: ReferentialAction }, maybeOptions?: { onDelete?: ReferentialAction, onUpdate?: ReferentialAction }) {\n let tableName: string;\n let columnName: string;\n let options: { onDelete?: ReferentialAction, onUpdate?: ReferentialAction } | undefined;\n\n if (typeof tableOrCol !== 'string') {\n tableName = tableOrCol.tableName;\n columnName = tableOrCol.columnName;\n options = columnOrOptions as any;\n } else {\n tableName = tableOrCol;\n columnName = columnOrOptions as string;\n options = maybeOptions;\n }\n\n return new MysqlColumnBuilder({ \n ...this.node, \n references: {\n module: (tableOrCol as any).moduleName,\n table: tableName,\n column: columnName,\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate\n } \n });\n }\n\n build(): MysqlColumnNode {\n return this.node;\n }\n}\n\n/**\n * MySQL Column Factories\n */\nexport const int = () => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'INT' });\nexport const integer = int;\nexport const tinyint = () => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'TINYINT' });\nexport const smallint = () => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'SMALLINT' });\nexport const mediumint = () => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'MEDIUMINT' });\nexport const bigint = () => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'BIGINT' });\n\nexport const varchar = (length: number = 255) => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'VARCHAR', length });\nexport const text = () => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'TEXT' });\nexport const char = (length: number = 1) => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'CHAR', length });\n\nexport const date = () => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'DATE' });\nexport const datetime = () => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'DATETIME' });\nexport const timestamp = () => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'TIMESTAMP' });\nexport const time = () => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'TIME' });\nexport const year = () => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'YEAR' });\n\nexport const boolean = () => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'BOOLEAN' });\nexport const json = () => new MysqlColumnBuilder({ kind: 'Column', name: '', type: 'JSON' });\n\nexport interface MysqlTableInput<C = Record<string, unknown>> {\n columns: C;\n constraints?: ConstraintNode[];\n indexes?: IndexNode[];\n education?: string; // Just to avoid typescript complaining about empty interface if needed\n options?: {\n engine?: 'InnoDB' | 'MyISAM' | 'Memory' | 'CSV' | 'Archive';\n charset?: string;\n collate?: string;\n comment?: string;\n };\n}\n\nexport function defineTable<C extends Record<string, MysqlColumnBuilder | string | ColumnNode>>(\n scope: DbmasonContext | DbmasonScope,\n name: string,\n input: MysqlTableInput<C>\n): TableHandle & { [K in keyof C]: ColumnHandle } {\n return internalDefineTable(scope, name, input, (cols: C) => {\n const processed: Record<string, MysqlColumnNode> = {};\n for (const [colName, colDef] of Object.entries(cols)) {\n if (colDef instanceof MysqlColumnBuilder) {\n const node = colDef.build();\n node.name = colName;\n processed[colName] = node;\n } else if (typeof colDef === 'string') {\n processed[colName] = { kind: 'Column', name: colName, type: colDef };\n } else {\n processed[colName] = { ...colDef as ColumnNode, name: colName };\n }\n }\n return processed;\n }) as TableHandle & { [K in keyof C]: ColumnHandle };\n}\n","import { DbmasonContext, DbmasonScope, internalDefineView } from '@dbmason/core';\n\nexport function defineView(\n scope: DbmasonContext | DbmasonScope,\n name: string,\n query: string\n): void {\n // Signature: internalDefineView(scope, name, query)\n internalDefineView(scope, name, query);\n}\n","import { DbmasonContext, DbmasonScope, internalDefineProcedure } from '@dbmason/core';\n\nexport function defineProcedure(\n scope: DbmasonContext | DbmasonScope,\n name: string,\n args: Record<string, string>,\n body: string\n): void {\n // internalDefineProcedure returns void\n internalDefineProcedure(scope, name, { args, body, language: 'SQL' });\n}\n","import { DbmasonContext, DbmasonScope, internalDefineFunction } from '@dbmason/core';\n\nexport function defineFunction(\n scope: DbmasonContext | DbmasonScope,\n name: string,\n args: Record<string, string>,\n returns: string,\n body: string\n): void {\n // internalDefineFunction returns void\n internalDefineFunction(scope, name, { args, returns, body, language: 'SQL' });\n}\n","import { DbmasonContext, DbmasonScope, internalDefineTrigger } from '@dbmason/core';\n\nexport function defineTrigger(\n scope: DbmasonContext | DbmasonScope,\n name: string,\n input: {\n event: 'INSERT' | 'UPDATE' | 'DELETE',\n timing: 'BEFORE' | 'AFTER',\n table: string,\n body: string\n }\n): void {\n // Internal signature: internalDefineTrigger(scope, tableName, name, input)\n // Input expects: { when, events: string[], body, ... }\n \n internalDefineTrigger(scope, input.table, name, {\n when: input.timing,\n events: [input.event],\n body: input.body,\n forEach: 'ROW'\n });\n}\n","import { DbmasonContext, DbmasonScope, internalDefineCron } from '@dbmason/core';\n\nexport function defineEvent(\n scope: DbmasonContext | DbmasonScope,\n name: string,\n schedule: string,\n body: string\n): void {\n // Map MySQL Event to Core Cron node\n // Signature: internalDefineCron(scope, name, schedule, command)\n internalDefineCron(scope, name, schedule, body);\n}\n"],"names":["MysqlDriver","connectionString","createPool","sql","params","rows","ColumnEmitter","col","type","def","TableEmitter","action","node","diff","definitions","pkCols","c","mCol","refTable","refCol","fk","idx","constraint","options","engine","charset","collate","comment","statements","oldNode","name","ViewEmitter","ProcedureEmitter","args","FunctionEmitter","TriggerEmitter","events","EventEmitter","MysqlEmitter","plan","step","TableIntrospector","driver","tableNodes","schema","tablesResult","row","tableName","columns","indexes","constraints","table","columnsResult","pksResult","result","indexMap","fkResult","definition","checkResult","refinedCheckResult","uniqueResult","uniqueMap","ViewIntrospector","views","RoutineIntrospector","functions","procedures","routines","routine","paramsResult","p","TriggerIntrospector","triggers","MysqlIntrospector","tables","materializedViews","MysqlDialect","ctx","resolveColumns","refs","ref","resolveColumn","btree","hash","fulltext","spatial","MysqlColumnBuilder","expr","expression","tableOrCol","columnOrOptions","maybeOptions","columnName","int","integer","tinyint","smallint","mediumint","bigint","varchar","length","text","char","date","datetime","timestamp","time","year","boolean","json","defineTable","scope","input","internalDefineTable","cols","processed","colName","colDef","defineView","query","internalDefineView","defineProcedure","body","internalDefineProcedure","defineFunction","returns","internalDefineFunction","defineTrigger","internalDefineTrigger","defineEvent","schedule","internalDefineCron"],"mappings":"6IAGO,MAAMA,CAAqC,CAI9C,YAAYC,EAA0B,CAFtC,KAAQ,WAAoC,KAGxC,KAAK,KAAOC,EAAAA,WAAWD,CAAgB,CAC3C,CAEA,MAAM,SAAyB,CAC3B,KAAK,WAAa,MAAM,KAAK,KAAK,cAAA,CACtC,CAEA,MAAM,OAAuB,CACrB,KAAK,aACL,KAAK,WAAW,QAAA,EAChB,KAAK,WAAa,MAEtB,MAAM,KAAK,KAAK,IAAA,CACpB,CAEA,MAAM,MAAME,EAAaC,EAAkC,CACvD,GAAI,CAAC,KAAK,WAAY,MAAM,IAAI,MAAM,sBAAsB,EAC5D,KAAM,CAACC,CAAI,EAAI,MAAM,KAAK,WAAW,MAAMF,EAAKC,CAAM,EACtD,OAAOC,CACX,CAEA,MAAM,kBAAkC,CACpC,GAAI,CAAC,KAAK,WAAY,MAAM,IAAI,MAAM,sBAAsB,EAC5D,MAAM,KAAK,WAAW,iBAAA,CAC1B,CAEA,MAAM,mBAAmC,CACrC,GAAI,CAAC,KAAK,WAAY,MAAM,IAAI,MAAM,sBAAsB,EAC5D,MAAM,KAAK,WAAW,OAAA,CAC1B,CAEA,MAAM,qBAAqC,CACvC,GAAI,CAAC,KAAK,WAAY,MAAM,IAAI,MAAM,sBAAsB,EAC5D,MAAM,KAAK,WAAW,SAAA,CAC1B,CACJ,CCzCO,MAAMC,CAAc,CACvB,OAAO,KAAKC,EAA8B,CACtC,IAAIC,EAAOD,EAAI,KAAK,YAAA,EAEhBC,IAAS,YAAWA,EAAO,cAC3BA,IAAS,WAAaD,EAAI,SAAQC,EAAO,WAAWD,EAAI,MAAM,KAC9DC,IAAS,QAAUD,EAAI,SAAQC,EAAO,QAAQD,EAAI,MAAM,KACxDC,IAAS,SAAQA,EAAO,YAE5B,IAAIC,EAAM,KAAKF,EAAI,IAAI,MAAMC,CAAI,GAEjC,OAAID,EAAI,WAAUE,GAAO,aAErBF,EAAI,UACHE,GAAO,aAGRF,EAAI,UAAY,SACfE,GAAO,YAAYF,EAAI,OAAO,IAG/BA,EAAI,gBACJE,GAAO,mBAGJA,CACX,CACJ,CCzBO,MAAMC,CAAa,CACtB,OAAO,KAAKC,EAAgBC,EAAyBC,EAAwB,CACzE,OAAQF,EAAA,CACJ,IAAK,SACD,OAAO,KAAK,WAAWC,CAAI,EAC/B,IAAK,QACD,OAAO,KAAK,UAAUA,EAAMC,CAAI,EACpC,IAAK,OACD,MAAO,0BAA0BD,EAAK,IAAI,MAC9C,QACI,MAAO,EAAA,CAEnB,CAEA,OAAO,WAAWA,EAAiC,CAG/C,IAAIE,EAAc,CAAC,GAFH,OAAO,OAAOF,EAAK,OAAO,EAAE,IAAIL,GAAOD,EAAc,KAAKC,CAAsB,CAAC,CAEpE,EAG7B,MAAMQ,EAAS,OAAO,OAAOH,EAAK,OAAO,EAAE,OAAOI,GAAKA,EAAE,UAAU,EAAE,IAAIA,GAAK,KAAKA,EAAE,IAAI,IAAI,EACzFD,EAAO,OAAS,GAChBD,EAAY,KAAK,gBAAgBC,EAAO,KAAK,IAAI,CAAC,GAAG,EAIzD,UAAWR,KAAO,OAAO,OAAOK,EAAK,OAAO,EAAG,CAC3C,MAAMK,EAAOV,EACb,GAAIU,EAAK,WAAY,CAChB,MAAMC,EAAWD,EAAK,WAAW,MAC3BE,EAASF,EAAK,WAAW,OAC/B,IAAIG,EAAK,mBAAmBR,EAAK,IAAI,IAAIL,EAAI,IAAI,qBAAqBA,EAAI,IAAI,oBAAoBW,CAAQ,QAAQC,CAAM,MACpHF,EAAK,WAAW,cAAgB,cAAcA,EAAK,WAAW,QAAQ,IACtEA,EAAK,WAAW,cAAgB,cAAcA,EAAK,WAAW,QAAQ,IAC1EH,EAAY,KAAKM,CAAE,CACxB,CACJ,CAGA,UAAWC,KAAOT,EAAK,QAAS,CAC5B,IAAIJ,EAAO,GACPa,EAAI,SAAW,WAAYb,EAAO,YAC7Ba,EAAI,SAAW,UAAWb,EAAO,WACjCa,EAAI,SAAQb,EAAO,WAE5BM,EAAY,KAAK,GAAGN,CAAI,SAASa,EAAI,IAAI,OAAOA,EAAI,QAAQ,IAAIL,GAAK,KAAKA,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,GAAG,CAClG,CAGA,UAAWM,KAAcV,EAAK,YACtBU,EAAW,OAAS,SACnBR,EAAY,KAAK,gBAAgBQ,EAAW,IAAI,aAAaA,EAAW,UAAU,GAAG,EAI9F,MAAMC,EAAWX,EAAa,QACxBY,GAASD,GAAA,YAAAA,EAAS,SAAU,SAC5BE,GAAUF,GAAA,YAAAA,EAAS,UAAW,UAC9BG,EAAUH,GAAA,MAAAA,EAAS,QAAU,YAAYA,EAAQ,OAAO,GAAK,GAC7DI,EAAUJ,GAAA,MAAAA,EAAS,QAAU,aAAaA,EAAQ,OAAO,IAAM,GAErE,MAAO,kBAAkBX,EAAK,IAAI;AAAA,IAAWE,EAAY,KAAK;AAAA,GAAO,CAAC;AAAA,WAAcU,CAAM,oBAAoBC,CAAO,GAAGC,CAAO,GAAGC,CAAO,GAC7I,CAEA,OAAO,UAAUf,EAAyBC,EAAwB,CAC9D,MAAMe,EAAuB,CAAA,EACvBC,EAAWhB,GAAA,YAAAA,EAAc,IAG/B,SAAW,CAACiB,EAAMvB,CAAG,IAAK,OAAO,QAAQK,EAAK,OAAO,EAC5CiB,EAAQ,QAAQC,CAAI,GACrBF,EAAW,KAAK,cAActB,EAAc,KAAKC,CAAsB,CAAC,EAAE,EAQlF,OAAIqB,EAAW,SAAW,EAAU,GAC7B,iBAAiBhB,EAAK,IAAI;AAAA,IAASgB,EAAW,KAAK;AAAA,GAAO,CAAC,GACtE,CACJ,CCpFO,MAAMG,CAAY,CACrB,OAAO,KAAKnB,EAAwB,CAChC,MAAO,4BAA4BA,EAAK,IAAI,SAASA,EAAK,KAAK;AAAA,CACnE,CACJ,CCJO,MAAMoB,CAAiB,CAC1B,OAAO,KAAKpB,EAA6B,CACrC,MAAMqB,EAAO,OAAO,QAAQrB,EAAK,IAAI,EAAE,IAAI,CAAC,CAACkB,EAAMtB,CAAI,IAAM,GAAGsB,CAAI,IAAItB,CAAI,EAAE,EAAE,KAAK,IAAI,EACzF,MAAO;AAAA,qBAAoCI,EAAK,IAAI,MAAMqB,CAAI;AAAA;AAAA,EAAarB,EAAK,IAAI;AAAA;AAAA;AAAA,CACxF,CACJ,CCLO,MAAMsB,CAAgB,CACzB,OAAO,KAAKtB,EAA4B,CACpC,MAAMqB,EAAO,OAAO,QAAQrB,EAAK,IAAI,EAAE,IAAI,CAAC,CAACkB,EAAMtB,CAAI,IAAM,GAAGsB,CAAI,IAAItB,CAAI,EAAE,EAAE,KAAK,IAAI,EACzF,MAAO;AAAA,oBAAmCI,EAAK,IAAI,MAAMqB,CAAI,aAAarB,EAAK,OAAO;AAAA;AAAA,EAAYA,EAAK,IAAI;AAAA;AAAA;AAAA,CAC/G,CACJ,CCLO,MAAMuB,CAAe,CACxB,OAAO,KAAKvB,EAA2B,CACnC,MAAMwB,EAASxB,EAAK,OAAO,KAAK,MAAM,EACtC,MAAO;AAAA,mBAAkCA,EAAK,IAAI,MAAMA,EAAK,IAAI,IAAIwB,CAAM,SAASxB,EAAK,KAAK;AAAA;AAAA;AAAA,EAA4BA,EAAK,IAAI;AAAA;AAAA;AAAA,CACvI,CACJ,CCLO,MAAMyB,CAAa,CACtB,OAAO,KAAKzB,EAAwB,CAIhC,MAAO,kBAAkBA,EAAK,IAAI;AAAA,cAAmBA,EAAK,QAAQ;AAAA;AAAA,EAASA,EAAK,OAAO;AAAA,CAC3F,CACJ,CCDO,MAAM0B,CAAa,CACtB,OAAO,KAAKC,EAA6B,CACrC,IAAIpC,EAAM;AAAA;AAAA,EAEV,UAAWqC,KAAQD,EACf,OAAQC,EAAK,KAAK,KAAA,CACd,IAAK,QACDrC,GAAOO,EAAa,KAAK8B,EAAK,OAAQA,EAAK,KAAsCA,EAAK,IAAI,EAAI;AAAA;AAAA,EAC9F,MACJ,IAAK,OACDrC,GAAO4B,EAAY,KAAKS,EAAK,IAA2B,EAAI;AAAA;AAAA,EAC5D,MACJ,IAAK,YACDrC,GAAO6B,EAAiB,KAAKQ,EAAK,IAAgC,EAAI;AAAA;AAAA,EACtE,MACJ,IAAK,WACDrC,GAAO+B,EAAgB,KAAKM,EAAK,IAA+B,EAAI;AAAA;AAAA,EACpE,MACJ,IAAK,UACDrC,GAAOgC,EAAe,KAAKK,EAAK,IAA8B,EAAI;AAAA;AAAA,EAClE,MACJ,IAAK,OACDrC,GAAOkC,EAAa,KAAKG,EAAK,IAA2B,EAAI;AAAA;AAAA,EAC7D,MACJ,QACI,QAAQ,KAAK,oCAAoCA,EAAK,KAAK,IAAI,EAAE,CAAA,CAI7E,OAAOrC,CACX,CACJ,CCpCO,MAAMsC,CAAkB,CAC3B,aAAa,WAAWC,EAAyD,CAC7E,MAAMC,EAAwC,CAAA,EAIxCC,GADW,MAAMF,EAAO,MAAM,yBAAyB,GACrC,CAAC,EAAE,GAGrBG,EAAe,MAAMH,EAAO,MAAM;AAAA;AAAA;AAAA,oCAGZE,CAAM;AAAA;AAAA,SAEjC,EAED,UAAWE,KAAOD,EAAc,CAC5B,MAAME,EAAYD,EAAI,WAChBE,EAAU,MAAM,KAAK,kBAAkBN,EAAQE,EAAQG,CAAS,EAChEE,EAAU,MAAM,KAAK,kBAAkBP,EAAQE,EAAQG,CAAS,EAChEG,EAAc,MAAM,KAAK,sBAAsBR,EAAQE,EAAQG,CAAS,EAE9EJ,EAAWI,CAAS,EAAI,CACpB,KAAM,QACN,KAAMA,EACN,OAAQ,SACR,QAAAC,EACA,QAAAC,EACA,YAAAC,EACA,SAAU,CAAA,EACV,SAAU,CAAA,CAAC,CAEnB,CAEA,OAAOP,CACX,CAEA,aAAqB,kBAAkBD,EAAqBE,EAAgBO,EAAoD,CAC5H,MAAMC,EAAgB,MAAMV,EAAO,MAAM;AAAA;AAAA;AAAA,oCAGbE,CAAM,uBAAuBO,CAAK;AAAA;AAAA,SAE7D,EAEKH,EAAsC,CAAA,EAC5C,UAAWF,KAAOM,EACdJ,EAAQF,EAAI,WAAW,EAAI,CACvB,KAAM,SACN,KAAMA,EAAI,YACV,KAAMA,EAAI,UAAU,YAAA,EACpB,QAASA,EAAI,cAAgB,KAC7B,QAASA,EAAI,gBAAkB,OAC/B,WAAYA,EAAI,aAAe,MAC/B,QAASA,EAAI,MAAM,SAAS,gBAAgB,EAAI,CAAE,SAAU,IAAS,MAAA,EAK7E,MAAMO,EAAY,MAAMX,EAAO,MAAM;AAAA;AAAA;AAAA;AAAA,kCAIXE,CAAM,uBAAuBO,CAAK;AAAA,SAC3D,EAED,UAAWL,KAAOO,EACVL,EAAQF,EAAI,WAAW,IACvBE,EAAQF,EAAI,WAAW,EAAE,WAAa,IAI9C,OAAOE,CACX,CAEA,aAAqB,kBAAkBN,EAAqBE,EAAgBO,EAAqC,CAC7G,MAAMG,EAAS,MAAMZ,EAAO,MAAM;AAAA;AAAA;AAAA,oCAGNE,CAAM,uBAAuBO,CAAK;AAAA;AAAA,SAE7D,EAEKI,MAAe,IACrB,UAAWT,KAAOQ,EACVR,EAAI,aAAe,YAElBS,EAAS,IAAIT,EAAI,UAAU,GAC5BS,EAAS,IAAIT,EAAI,WAAY,CACzB,KAAM,QACN,KAAMA,EAAI,WACV,MAAAK,EACA,QAAS,CAAA,EACT,OAAQL,EAAI,aAAe,CAAA,CAC9B,EAELS,EAAS,IAAIT,EAAI,UAAU,EAAG,QAAQ,KAAKA,EAAI,WAAW,GAG9D,OAAO,MAAM,KAAKS,EAAS,OAAA,CAAQ,CACvC,CAEA,aAAqB,sBAAsBb,EAAqBE,EAAgBO,EAA0C,CACtH,MAAMD,EAAgC,CAAA,EAGhCM,EAAW,MAAMd,EAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAORE,CAAM,uBAAuBO,CAAK;AAAA;AAAA,SAE7D,EAED,UAAWL,KAAOU,EAAU,CACxB,MAAMC,EAAa,kBAAkBX,EAAI,WAAW,oBAAoBA,EAAI,qBAAqB,QAAQA,EAAI,sBAAsB,MAEnII,EAAY,KAAK,CACb,KAAM,aACN,KAAM,cACN,WAAAO,EACA,KAAMX,EAAI,gBACV,MAAAK,CAAA,CACH,CACL,CAGA,GAAI,CACA,MAAMO,EAAc,MAAMhB,EAAO,MAAM;AAAA;AAAA;AAAA,6CAGNE,CAAM;AAAA;AAAA;AAAA,aAGtC,EAKKe,EAAqB,MAAMjB,EAAO,MAAM;AAAA;AAAA;AAAA;AAAA,2CAIfE,CAAM,0BAA0BO,CAAK;AAAA;AAAA,aAEnE,EAED,UAAWL,KAAOa,EACdT,EAAY,KAAK,CACb,KAAM,aACN,KAAM,QACN,KAAMJ,EAAI,gBACV,MAAAK,EACA,WAAY,UAAUL,EAAI,YAAY,GAAA,CACzC,CAET,MAAY,CAEZ,CAGA,MAAMc,EAAe,MAAMlB,EAAO,MAAM;AAAA;AAAA;AAAA;AAAA,uCAITE,CAAM,0BAA0BO,CAAK;AAAA;AAAA,SAEnE,EAEKU,MAAgB,IACtB,UAAWf,KAAOc,EACTC,EAAU,IAAIf,EAAI,eAAe,GAAGe,EAAU,IAAIf,EAAI,gBAAiB,EAAE,EAC9Ee,EAAU,IAAIf,EAAI,eAAe,EAAG,KAAKA,EAAI,WAAW,EAG5D,SAAW,CAAChB,EAAMkB,CAAO,IAAKa,EAC1BX,EAAY,KAAK,CACb,KAAM,aACN,KAAM,SACN,KAAApB,EACA,MAAAqB,EACA,WAAY,WAAWH,EAAQ,IAAIhC,GAAK,KAAKA,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,GAAA,CACjE,EAGL,OAAOkC,CACX,CACJ,CC9LO,MAAMY,CAAiB,CAC1B,aAAa,WAAWpB,EAAgH,CACpI,MAAMqB,EAAkC,CAAA,EAGlCnB,GADW,MAAMF,EAAO,MAAM,yBAAyB,GACrC,CAAC,EAAE,GAErBY,EAAS,MAAMZ,EAAO,MAAM;AAAA;AAAA;AAAA,oCAGNE,CAAM;AAAA,SACjC,EAED,UAAWE,KAAOQ,EACdS,EAAMjB,EAAI,UAAU,EAAI,CACpB,KAAM,OACN,KAAMA,EAAI,WACV,MAAOA,EAAI,eAAA,EAInB,MAAO,CAAE,MAAAiB,EAAO,kBAAmB,EAAC,CACxC,CACJ,CCvBO,MAAMC,CAAoB,CAC7B,aAAa,WAAWtB,EAAsH,CAC1I,MAAMuB,EAA0C,CAAA,EAC1CC,EAA4C,CAAA,EAG5CtB,GADW,MAAMF,EAAO,MAAM,yBAAyB,GACrC,CAAC,EAAE,GAErByB,EAAW,MAAMzB,EAAO,MAAM;AAAA;AAAA;AAAA,sCAGNE,CAAM;AAAA,SACnC,EAED,UAAWwB,KAAWD,EAAU,CAC5B,MAAMrC,EAAOsC,EAAQ,aACf5D,EAAO4D,EAAQ,aAGfC,EAAe,MAAM3B,EAAO,MAAM;AAAA;AAAA;AAAA,2CAGTE,CAAM,yBAAyBd,CAAI;AAAA;AAAA,aAEjE,EAEKG,EAA4B,CAAA,EAClC,UAAWqC,KAAKD,EACRC,EAAE,iBACFrC,EAAKqC,EAAE,cAAc,EAAIA,EAAE,WAI/B9D,IAAS,WACTyD,EAAUnC,CAAI,EAAI,CACd,KAAM,WACN,KAAAA,EACA,KAAAG,EACA,QAASmC,EAAQ,eACjB,SAAUA,EAAQ,mBAAqB,MACvC,KAAMA,EAAQ,kBAAA,EAGlBF,EAAWpC,CAAI,EAAI,CACf,KAAM,YACN,KAAAA,EACA,KAAAG,EACA,QAAS,OACT,SAAUmC,EAAQ,mBAAqB,MACvC,KAAMA,EAAQ,kBAAA,CAG1B,CAEA,MAAO,CAAE,UAAAH,EAAW,WAAAC,CAAA,CACxB,CACJ,CCxDO,MAAMK,CAAoB,CAC7B,aAAa,WAAW7B,EAA2D,CAC/E,MAAM8B,EAAwC,CAAA,EAGxC5B,GADW,MAAMF,EAAO,MAAM,yBAAyB,GACrC,CAAC,EAAE,GAErBY,EAAS,MAAMZ,EAAO,MAAM;AAAA;AAAA;AAAA,sCAGJE,CAAM;AAAA,SACnC,EAED,UAAWE,KAAOQ,EACdkB,EAAS1B,EAAI,YAAY,EAAI,CACzB,KAAM,UACN,KAAMA,EAAI,aACV,MAAOA,EAAI,mBACX,OAAQ,CAACA,EAAI,mBAAmB,aAAoB,EACpD,aAAc,SACd,KAAMA,EAAI,cAAc,YAAA,EACxB,QAAS,MACT,KAAMA,EAAI,gBAAA,EAIlB,OAAO0B,CACX,CACJ,CCxBO,MAAMC,CAAiD,CAC1D,MAAM,WAAWxE,EAA6C,CAC1D,MAAMyC,EAAS,IAAI1C,EAAYC,CAAgB,EAC/C,MAAMyC,EAAO,QAAA,EAEb,GAAI,CACA,MAAMgC,EAAS,MAAMjC,EAAkB,WAAWC,CAAM,EAClD,CAAE,MAAAqB,EAAO,kBAAAY,CAAA,EAAsB,MAAMb,EAAiB,WAAWpB,CAAM,EACvE,CAAE,UAAAuB,EAAW,WAAAC,CAAA,EAAe,MAAMF,EAAoB,WAAWtB,CAAM,EACvE8B,EAAW,MAAMD,EAAoB,WAAW7B,CAAM,EAE5D,MAAO,CACH,OAAAgC,EACA,WAAAR,EACA,UAAAD,EACA,MAAAF,EACA,kBAAAY,EACA,MAAO,CAAA,EACP,MAAO,CAAA,EACP,WAAY,CAAA,EACZ,MAAO,CAAA,EACP,OAAQ,CAAA,EACR,SAAU,CAAA,EACV,SAAAH,EACA,OAAQ,CAAA,CAAC,CAEjB,QAAA,CACI,MAAM9B,EAAO,MAAA,CACjB,CACJ,CACJ,CCzBO,MAAMkC,CAAuC,CAMhD,aAAc,CALd,KAAS,KAAO,QAGhB,KAAA,aAAe,IAAIH,CAEJ,CAEf,WAAWI,EAAqB,CAC5B,KAAK,IAAMA,CACf,CAEA,aAAa1B,EAAqC,CAC9C,MAAO,CACH,GAAGA,EACH,QAASA,EAAM,QACf,aAAc,CAAA,EACd,IAAK,CAAE,QAAS,GAAO,SAAU,CAAA,CAAC,CAAE,CAE5C,CAEA,KAAKZ,EAA6B,CAC9B,OAAOD,EAAa,KAAKC,CAAI,CACjC,CAEA,UAAUtC,EAAyC,CAC/C,OAAO,IAAID,EAAYC,CAAgB,CAC3C,CACJ,CChCA,SAAS6E,EAAeC,EAAmC,CACvD,OAAOA,EAAK,IAAIC,GAAOC,EAAAA,cAAcD,CAAG,EAAE,MAAM,CACpD,CAEO,MAAME,EAAQ,IAAIlC,KAA2C,CAChE,KAAM,QAAS,KAAM,GAAI,MAAO,GAAI,QAAS8B,EAAe9B,CAAO,EAAG,OAAQ,OAClF,GACamC,EAAO,IAAInC,KAA2C,CAC/D,KAAM,QAAS,KAAM,GAAI,MAAO,GAAI,QAAS8B,EAAe9B,CAAO,EAAG,OAAQ,MAClF,GACaoC,EAAW,IAAIpC,KAA2C,CACnE,KAAM,QAAS,KAAM,GAAI,MAAO,GAAI,QAAS8B,EAAe9B,CAAO,EAAG,OAAQ,UAClF,GACaqC,EAAU,IAAIrC,KAA2C,CAClE,KAAM,QAAS,KAAM,GAAI,MAAO,GAAI,QAAS8B,EAAe9B,CAAO,EAAG,OAAQ,SAClF,GAWO,MAAMsC,CAAmB,CAC5B,YAA6B1E,EAAuB,CAAvB,KAAA,KAAAA,CAAwB,CAErD,YAAa,CACT,OAAO,IAAI0E,EAAmB,CAAE,GAAG,KAAK,KAAM,WAAY,GAAM,QAAS,GAAM,CACnF,CAEA,SAAU,CACN,OAAO,IAAIA,EAAmB,CAAE,GAAG,KAAK,KAAM,QAAS,GAAM,CACjE,CAEA,QAAS,CACL,OAAO,IAAIA,EAAmB,CAAE,GAAG,KAAK,KAAM,OAAQ,GAAM,CAChE,CAEA,QAAQC,EAAc,CAClB,OAAO,IAAID,EAAmB,CAAE,GAAG,KAAK,KAAM,QAASC,EAAM,CACjE,CAEA,eAAgB,CACZ,OAAO,IAAID,EAAmB,CAAE,GAAG,KAAK,KAAM,cAAe,GAAM,CACvE,CAEA,UAAW,CACP,OAAO,IAAIA,EAAmB,CAAE,GAAG,KAAK,KAAM,SAAU,GAAM,CAClE,CAEA,0BAA2B,CACvB,OAAO,IAAIA,EAAmB,CAAE,GAAG,KAAK,KAAM,SAAU,oBAAqB,CACjF,CAEA,QAAQ7D,EAAiB,CACrB,OAAO,IAAI6D,EAAmB,CAAE,GAAG,KAAK,KAAM,QAAA7D,EAAS,CAC3D,CAEA,QAAQC,EAAiB,CACrB,OAAO,IAAI4D,EAAmB,CAAE,GAAG,KAAK,KAAM,QAAA5D,EAAS,CAC3D,CAEA,MAAM8D,EAAoB,CACtB,OAAO,IAAIF,EAAmB,CAAE,GAAG,KAAK,KAAM,MAAOE,EAAY,CACrE,CAIA,WAAWC,EAAsCC,EAA2FC,EAA+E,CACvN,IAAI5C,EACA6C,EACArE,EAEJ,OAAI,OAAOkE,GAAe,UACtB1C,EAAY0C,EAAW,UACvBG,EAAaH,EAAW,WACxBlE,EAAUmE,IAEV3C,EAAY0C,EACZG,EAAaF,EACbnE,EAAUoE,GAGP,IAAIL,EAAmB,CAC1B,GAAG,KAAK,KACR,WAAY,CACR,OAASG,EAAmB,WAC5B,MAAO1C,EACP,OAAQ6C,EACR,SAAUrE,GAAA,YAAAA,EAAS,SACnB,SAAUA,GAAA,YAAAA,EAAS,QAAA,CACvB,CACH,CACL,CAEA,OAAyB,CACrB,OAAO,KAAK,IAChB,CACJ,CAKO,MAAMsE,EAAM,IAAM,IAAIP,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,KAAA,CAAO,EAC5EQ,EAAUD,EACVE,EAAU,IAAM,IAAIT,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,SAAA,CAAW,EACpFU,EAAW,IAAM,IAAIV,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,UAAA,CAAY,EACtFW,EAAY,IAAM,IAAIX,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,WAAA,CAAa,EACxFY,EAAS,IAAM,IAAIZ,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,QAAA,CAAU,EAElFa,EAAU,CAACC,EAAiB,MAAQ,IAAId,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,UAAW,OAAAc,EAAQ,EAChHC,EAAO,IAAM,IAAIf,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,MAAA,CAAQ,EAC9EgB,EAAO,CAACF,EAAiB,IAAM,IAAId,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,OAAQ,OAAAc,EAAQ,EAExGG,EAAO,IAAM,IAAIjB,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,MAAA,CAAQ,EAC9EkB,EAAW,IAAM,IAAIlB,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,UAAA,CAAY,EACtFmB,EAAY,IAAM,IAAInB,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,WAAA,CAAa,EACxFoB,EAAO,IAAM,IAAIpB,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,MAAA,CAAQ,EAC9EqB,EAAO,IAAM,IAAIrB,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,MAAA,CAAQ,EAE9EsB,EAAU,IAAM,IAAItB,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,SAAA,CAAW,EACpFuB,EAAO,IAAM,IAAIvB,EAAmB,CAAE,KAAM,SAAU,KAAM,GAAI,KAAM,MAAA,CAAQ,EAepF,SAASwB,GACZC,EACAjF,EACAkF,EAC8C,CAC9C,OAAOC,EAAAA,oBAAoBF,EAAOjF,EAAMkF,EAAQE,GAAY,CACxD,MAAMC,EAA6C,CAAA,EACnD,SAAW,CAACC,EAASC,CAAM,IAAK,OAAO,QAAQH,CAAI,EAC/C,GAAIG,aAAkB/B,EAAoB,CACtC,MAAM1E,EAAOyG,EAAO,MAAA,EACpBzG,EAAK,KAAOwG,EACZD,EAAUC,CAAO,EAAIxG,CACzB,MAAW,OAAOyG,GAAW,SACzBF,EAAUC,CAAO,EAAI,CAAE,KAAM,SAAU,KAAMA,EAAS,KAAMC,CAAA,EAE5DF,EAAUC,CAAO,EAAI,CAAE,GAAGC,EAAsB,KAAMD,CAAA,EAG9D,OAAOD,CACX,CAAC,CACL,CCrKO,SAASG,GACZP,EACAjF,EACAyF,EACI,CAEJC,qBAAmBT,EAAOjF,EAAMyF,CAAK,CACzC,CCPO,SAASE,GACZV,EACAjF,EACAG,EACAyF,EACI,CAEJC,EAAAA,wBAAwBZ,EAAOjF,EAAM,CAAE,KAAAG,EAAM,KAAAyF,EAAM,SAAU,MAAO,CACxE,CCRO,SAASE,GACZb,EACAjF,EACAG,EACA4F,EACAH,EACI,CAEJI,yBAAuBf,EAAOjF,EAAM,CAAE,KAAAG,EAAM,QAAA4F,EAAS,KAAAH,EAAM,SAAU,MAAO,CAChF,CCTO,SAASK,GACZhB,EACAjF,EACAkF,EAMI,CAIJgB,EAAAA,sBAAsBjB,EAAOC,EAAM,MAAOlF,EAAM,CAC5C,KAAMkF,EAAM,OACZ,OAAQ,CAACA,EAAM,KAAK,EACpB,KAAMA,EAAM,KACZ,QAAS,KAAA,CACZ,CACL,CCnBO,SAASiB,GACZlB,EACAjF,EACAoG,EACAR,EACI,CAGJS,EAAAA,mBAAmBpB,EAAOjF,EAAMoG,EAAUR,CAAI,CAClD"}