@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 +11 -0
- package/dist/index.d.ts +157 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +583 -0
- package/dist/index.mjs.map +1 -0
- package/dist/index.umd.js +109 -0
- package/dist/index.umd.js.map +1 -0
- package/package.json +30 -0
package/README.md
ADDED
package/dist/index.d.ts
ADDED
|
@@ -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":"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"}
|