Skip to content

Commit 33cfeb2

Browse files
authored
Merge pull request #2100 from wellwelwel/procedure-ts
fix: create ProcedureCallPacket typings
2 parents 49620fc + 4dd11c8 commit 33cfeb2

File tree

12 files changed

+454
-25
lines changed

12 files changed

+454
-25
lines changed

.eslintrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
"rules": {
4747
"@typescript-eslint/no-empty-interface": "off",
4848
"@typescript-eslint/no-explicit-any": "off",
49+
"arrow-parens": "off",
4950
"no-restricted-syntax": [
5051
"error",
5152
{

test/tsc-build/helpers.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { mysql, mysqlp } from './index.js';
2+
3+
export const isResultSetHeader = (
4+
data: unknown
5+
): data is mysql.ResultSetHeader | mysqlp.ResultSetHeader => {
6+
if (!data || typeof data !== 'object') return false;
7+
8+
const keys = [
9+
'fieldCount',
10+
'affectedRows',
11+
'insertId',
12+
'info',
13+
'serverStatus',
14+
'warningStatus',
15+
];
16+
17+
return keys.every((key) => key in data);
18+
};
19+
20+
export const isOkPacket = (
21+
data: unknown
22+
): data is mysql.OkPacket | mysqlp.OkPacket => {
23+
if (!data || typeof data !== 'object') return false;
24+
25+
const keys = [
26+
'fieldCount',
27+
'affectedRows',
28+
'changedRows',
29+
'insertId',
30+
'serverStatus',
31+
'warningCount',
32+
'message',
33+
'procotol41',
34+
];
35+
36+
return keys.every((key) => key in data);
37+
};
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
import { mysql, mysqlp } from '../index.js';
2+
import { access } from '../mysql/baseConnection.js';
3+
import { isResultSetHeader } from '../helpers.js';
4+
5+
const dropProcedure = {
6+
select: 'DROP PROCEDURE IF EXISTS selectProcedure',
7+
update: 'DROP PROCEDURE IF EXISTS updateProcedure',
8+
};
9+
10+
const createProcedure = {
11+
select: `
12+
CREATE PROCEDURE selectProcedure()
13+
BEGIN
14+
SELECT 1 as id;
15+
END
16+
`,
17+
update: `
18+
CREATE PROCEDURE updateProcedure()
19+
BEGIN
20+
SET @a = 1;
21+
END
22+
`,
23+
};
24+
25+
const procedureCall = {
26+
select: 'CALL selectProcedure()',
27+
update: 'CALL updateProcedure()',
28+
};
29+
30+
// Callback
31+
(() => {
32+
interface User extends mysql.RowDataPacket {
33+
id: number;
34+
}
35+
36+
const conn = mysql.createConnection(access);
37+
const connAsRow = mysql.createConnection({ ...access, rowsAsArray: true });
38+
39+
// Checking `RowDataPacket[]` Procedure Calls
40+
conn.query(dropProcedure.select, () => {
41+
conn.query(createProcedure.select, () => {
42+
conn.query<mysql.ProcedureCallPacket<User[]>>(
43+
procedureCall.select,
44+
[],
45+
(_err, procedureResult) => {
46+
procedureResult.forEach((results) => {
47+
if (isResultSetHeader(results)) {
48+
console.log(results);
49+
50+
return;
51+
}
52+
53+
// Strict checking the `RowDataPacket[]`
54+
const user: User = results;
55+
const id: number = user.id;
56+
57+
console.log(id);
58+
});
59+
}
60+
);
61+
});
62+
});
63+
64+
// Checking `RowDataPacket[][]` Procedure Calls
65+
connAsRow.query(dropProcedure.select, () => {
66+
connAsRow.query(createProcedure.select, () => {
67+
connAsRow.query<mysql.ProcedureCallPacket<User[][]>>(
68+
procedureCall.select,
69+
[],
70+
(_err, procedureResult) => {
71+
procedureResult.forEach((results) => {
72+
if (isResultSetHeader(results)) {
73+
console.log(results);
74+
75+
return;
76+
}
77+
78+
// Strict checking the `RowDataPacket[][]`
79+
const users: User[] = results;
80+
81+
users.forEach((user) => {
82+
const id: number = user.id;
83+
84+
console.log(id);
85+
});
86+
});
87+
}
88+
);
89+
});
90+
});
91+
92+
// Checking `ResultSetHeader | OkPacket | OkPacket[]` Procedure Calls
93+
conn.query(dropProcedure.update, () => {
94+
conn.query(createProcedure.update, () => {
95+
conn.query<
96+
mysql.ProcedureCallPacket<
97+
mysql.ResultSetHeader | mysql.OkPacket | mysql.OkPacket[]
98+
>
99+
>(
100+
procedureCall.update,
101+
[],
102+
// Strict checking the `ResultSetHeader`
103+
(_err, procedureResult: mysql.ResultSetHeader) => {
104+
console.log(procedureResult);
105+
}
106+
);
107+
});
108+
});
109+
})();
110+
111+
// Promise
112+
(async () => {
113+
interface User extends mysqlp.RowDataPacket {
114+
id: number;
115+
}
116+
117+
const conn = await mysqlp.createConnection(access);
118+
const connAsRow = await mysqlp.createConnection({
119+
...access,
120+
rowsAsArray: true,
121+
});
122+
123+
// Checking `RowDataPacket[]` Procedure Calls
124+
{
125+
await conn.query(dropProcedure.select);
126+
await conn.query(createProcedure.select);
127+
128+
const [procedureResult] = await conn.query<
129+
mysqlp.ProcedureCallPacket<User[]>
130+
>(procedureCall.select, []);
131+
132+
procedureResult.forEach((results) => {
133+
if (isResultSetHeader(results)) {
134+
console.log(results);
135+
136+
return;
137+
}
138+
139+
// Strict checking the `RowDataPacket[]`
140+
const user: User = results;
141+
const id: number = user.id;
142+
143+
console.log(id);
144+
});
145+
}
146+
147+
// Checking `RowDataPacket[][]` Procedure Calls
148+
{
149+
await connAsRow.query(dropProcedure.select);
150+
await connAsRow.query(createProcedure.select);
151+
152+
const [procedureResult] = await connAsRow.query<
153+
mysqlp.ProcedureCallPacket<User[][]>
154+
>(procedureCall.select, []);
155+
156+
procedureResult.forEach((results) => {
157+
if (isResultSetHeader(results)) {
158+
console.log(results);
159+
160+
return;
161+
}
162+
163+
// Strict checking the `RowDataPacket[][]`
164+
const users: User[] = results;
165+
166+
users.forEach((user) => {
167+
const id: number = user.id;
168+
169+
console.log(id);
170+
});
171+
});
172+
}
173+
174+
// Checking `ResultSetHeader | OkPacket | OkPacket[]` Procedure Calls
175+
{
176+
await conn.query(dropProcedure.update);
177+
await conn.query(createProcedure.update);
178+
179+
const [procedureResult] = await conn.query<
180+
mysqlp.ProcedureCallPacket<
181+
mysqlp.ResultSetHeader | mysqlp.OkPacket | mysqlp.OkPacket[]
182+
>
183+
>(procedureCall.update, []);
184+
185+
// Strict checking the `ResultSetHeader`
186+
const resultSetHeader: mysqlp.ResultSetHeader = procedureResult;
187+
console.log(resultSetHeader);
188+
}
189+
})();

test/tsc-build/strict-checks/execute.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,48 @@ import { access, sql } from '../promise/baseConnection.js';
4949

5050
console.log(err, result, fields);
5151
});
52+
53+
conn.execute<mysql.ProcedureCallPacket>(sql, (_e, _r, _f) => {
54+
const err: mysql.QueryError | null = _e;
55+
const result: mysql.ProcedureCallPacket = _r;
56+
const fields: mysql.FieldPacket[] = _f;
57+
58+
console.log(err, result, fields);
59+
});
60+
61+
conn.execute<mysql.ProcedureCallPacket<mysql.RowDataPacket[]>>(
62+
sql,
63+
(_e, _r, _f) => {
64+
const err: mysql.QueryError | null = _e;
65+
const result: [...mysqlp.RowDataPacket[], mysql.ResultSetHeader] = _r;
66+
const fields: mysql.FieldPacket[] = _f;
67+
68+
console.log(err, result, fields);
69+
}
70+
);
71+
72+
conn.execute<mysql.ProcedureCallPacket<mysql.RowDataPacket[][]>>(
73+
sql,
74+
(_e, _r, _f) => {
75+
const err: mysql.QueryError | null = _e;
76+
const result: [...mysqlp.RowDataPacket[][], mysql.ResultSetHeader] = _r;
77+
const fields: mysql.FieldPacket[] = _f;
78+
79+
console.log(err, result, fields);
80+
}
81+
);
82+
83+
conn.execute<
84+
mysql.ProcedureCallPacket<
85+
mysql.OkPacket | mysql.OkPacket[] | mysql.ResultSetHeader
86+
>
87+
>(sql, (_e, _r, _f) => {
88+
const err: mysql.QueryError | null = _e;
89+
const result: mysql.ResultSetHeader = _r;
90+
const fields: mysql.FieldPacket[] = _f;
91+
92+
console.log(err, result, fields);
93+
});
5294
}
5395

5496
// Promise
@@ -89,4 +131,42 @@ import { access, sql } from '../promise/baseConnection.js';
89131

90132
console.log(result, fields);
91133
});
134+
135+
conn.execute<mysqlp.ProcedureCallPacket>(sql).then(([_r, _f]) => {
136+
const result: mysqlp.ProcedureCallPacket = _r;
137+
const fields: mysqlp.FieldPacket[] = _f;
138+
139+
console.log(result, fields);
140+
});
141+
142+
conn
143+
.execute<mysqlp.ProcedureCallPacket<mysqlp.RowDataPacket[]>>(sql)
144+
.then(([_r, _f]) => {
145+
const result: [...mysqlp.RowDataPacket[], mysql.ResultSetHeader] = _r;
146+
const fields: mysqlp.FieldPacket[] = _f;
147+
148+
console.log(result, fields);
149+
});
150+
151+
conn
152+
.execute<mysqlp.ProcedureCallPacket<mysqlp.RowDataPacket[][]>>(sql)
153+
.then(([_r, _f]) => {
154+
const result: [...mysqlp.RowDataPacket[][], mysql.ResultSetHeader] = _r;
155+
const fields: mysqlp.FieldPacket[] = _f;
156+
157+
console.log(result, fields);
158+
});
159+
160+
conn
161+
.execute<
162+
mysqlp.ProcedureCallPacket<
163+
mysqlp.OkPacket | mysqlp.OkPacket[] | mysqlp.ResultSetHeader
164+
>
165+
>(sql)
166+
.then(([_r, _f]) => {
167+
const result: mysqlp.ResultSetHeader = _r;
168+
const fields: mysqlp.FieldPacket[] = _f;
169+
170+
console.log(result, fields);
171+
});
92172
})();

0 commit comments

Comments
 (0)