cl-orm 0.1.0 → 0.1.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/lib/drivers/_utils.d.ts +4 -0
- package/lib/drivers/_utils.js +23 -0
- package/lib/drivers/d1.d.ts +2 -0
- package/lib/drivers/d1.js +48 -0
- package/lib/drivers/do.d.ts +2 -0
- package/lib/drivers/do.js +45 -0
- package/{src/index.ts → lib/index.d.ts} +1 -10
- package/lib/index.js +9 -0
- package/lib/queries/_utils.d.ts +1 -0
- package/lib/queries/_utils.js +13 -0
- package/lib/queries/delete.d.ts +5 -0
- package/lib/queries/delete.js +22 -0
- package/lib/queries/insert.d.ts +5 -0
- package/lib/queries/insert.js +19 -0
- package/lib/queries/select.d.ts +5 -0
- package/lib/queries/select.js +55 -0
- package/lib/queries/update.d.ts +5 -0
- package/lib/queries/update.js +25 -0
- package/lib/queries/where/operators.d.ts +23 -0
- package/lib/queries/where/operators.js +60 -0
- package/lib/queries/where/where.d.ts +5 -0
- package/lib/queries/where/where.js +34 -0
- package/lib/types.d.ts +64 -0
- package/lib/types.js +2 -0
- package/package.json +27 -2
- package/.editorconfig +0 -12
- package/.gitattributes +0 -1
- package/.prettierignore +0 -3
- package/.prettierrc +0 -34
- package/.vscode/settings.json +0 -14
- package/mcr.config.ts +0 -12
- package/src/drivers/_utils.ts +0 -31
- package/src/drivers/d1.ts +0 -70
- package/src/drivers/do.ts +0 -81
- package/src/queries/_utils.ts +0 -10
- package/src/queries/delete.ts +0 -26
- package/src/queries/insert.ts +0 -22
- package/src/queries/select.ts +0 -64
- package/src/queries/update.ts +0 -28
- package/src/queries/where/operators.ts +0 -96
- package/src/queries/where/where.ts +0 -50
- package/src/types.ts +0 -76
- package/test/__fixtures__/d1/worker.ts +0 -70
- package/test/__fixtures__/d1/wrangler.jsonc +0 -13
- package/test/__fixtures__/do/worker.ts +0 -106
- package/test/__fixtures__/do/wrangler.jsonc +0 -20
- package/test/e2e/d1.test.ts +0 -113
- package/test/e2e/do.test.ts +0 -116
- package/test/unit/buildDelete.test.ts +0 -36
- package/test/unit/buildInsert.test.ts +0 -36
- package/test/unit/buildSelect.test.ts +0 -137
- package/test/unit/buildUpdate.test.ts +0 -34
- package/test/unit/buildWhere.test.ts +0 -249
- package/test/unit/operators.test.ts +0 -98
- package/test/unit/prepare.test.ts +0 -22
- package/test/unit/quoteIdentifier.test.ts +0 -12
- package/test/unit/returnsRows.test.ts +0 -41
- package/test/unit/setMeta.test.ts +0 -31
- package/tsconfig.build.json +0 -4
- package/tsconfig.json +0 -34
- package/website/.prettierignore +0 -4
- package/website/.prettierrc +0 -34
- package/website/README.md +0 -3
- package/website/docs/documentation/connection.mdx +0 -123
- package/website/docs/documentation/queries/_category_.json +0 -7
- package/website/docs/documentation/queries/delete.mdx +0 -51
- package/website/docs/documentation/queries/insert.mdx +0 -63
- package/website/docs/documentation/queries/operators/_category_.json +0 -7
- package/website/docs/documentation/queries/operators/between.mdx +0 -17
- package/website/docs/documentation/queries/operators/eq.mdx +0 -22
- package/website/docs/documentation/queries/operators/gt.mdx +0 -22
- package/website/docs/documentation/queries/operators/gte.mdx +0 -22
- package/website/docs/documentation/queries/operators/in.mdx +0 -28
- package/website/docs/documentation/queries/operators/is-not-null.mdx +0 -22
- package/website/docs/documentation/queries/operators/is-null.mdx +0 -22
- package/website/docs/documentation/queries/operators/like.mdx +0 -27
- package/website/docs/documentation/queries/operators/lt.mdx +0 -22
- package/website/docs/documentation/queries/operators/lte.mdx +0 -22
- package/website/docs/documentation/queries/operators/ne.mdx +0 -22
- package/website/docs/documentation/queries/operators/not-between.mdx +0 -17
- package/website/docs/documentation/queries/operators/not-like.mdx +0 -27
- package/website/docs/documentation/queries/operators/notIn.mdx +0 -28
- package/website/docs/documentation/queries/select.mdx +0 -294
- package/website/docs/documentation/queries/update.mdx +0 -61
- package/website/docs/documentation/queries/where.mdx +0 -176
- package/website/docs/index.mdx +0 -228
- package/website/docusaurus.config.ts +0 -82
- package/website/package-lock.json +0 -21348
- package/website/package.json +0 -59
- package/website/plugins/locale.ts +0 -16
- package/website/sidebars.ts +0 -18
- package/website/src/components/FAQ.tsx +0 -35
- package/website/src/components/Loading.tsx +0 -4
- package/website/src/components/PageTitle.tsx +0 -29
- package/website/src/css/_faq.scss +0 -39
- package/website/src/css/_loading.scss +0 -43
- package/website/src/css/_mixins.scss +0 -19
- package/website/src/css/custom.scss +0 -149
- package/website/src/pages/index.tsx +0 -17
- package/website/static/.nojekyll +0 -0
- package/website/static/img/favicon.svg +0 -1
- package/website/test/unit/check-extensions.test.ts +0 -48
- package/website/tsconfig.json +0 -14
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import type { Connection } from '../../../src/types.js';
|
|
2
|
-
import { DurableObject } from 'cloudflare:workers';
|
|
3
|
-
import { OP, useDO } from '../../../src/index.js';
|
|
4
|
-
|
|
5
|
-
interface Env {
|
|
6
|
-
MY_DO: DurableObjectNamespace<MyDurableObject>;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export class MyDurableObject extends DurableObject<Env> {
|
|
10
|
-
private db: Connection;
|
|
11
|
-
|
|
12
|
-
constructor(ctx: DurableObjectState, env: Env) {
|
|
13
|
-
super(ctx, env);
|
|
14
|
-
this.db = useDO(ctx.storage.sql);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
async setup() {
|
|
18
|
-
await this.db.query('DROP TABLE IF EXISTS users');
|
|
19
|
-
await this.db.query(
|
|
20
|
-
'CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT NOT NULL)'
|
|
21
|
-
);
|
|
22
|
-
return { ok: true };
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async queryRaw(sql: string) {
|
|
26
|
-
return this.db.query(sql);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async insertUser(name: string, email: string) {
|
|
30
|
-
return this.db.insert({
|
|
31
|
-
table: 'users',
|
|
32
|
-
values: { name, email },
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async selectUsers(limit?: number) {
|
|
37
|
-
return this.db.select({
|
|
38
|
-
table: 'users',
|
|
39
|
-
...(limit ? { limit: limit as 1 } : {}),
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
async updateUser(oldName: string, newName: string) {
|
|
44
|
-
return this.db.update({
|
|
45
|
-
table: 'users',
|
|
46
|
-
set: { name: newName },
|
|
47
|
-
where: OP.eq('name', oldName),
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async deleteUser(name: string) {
|
|
52
|
-
return this.db.delete({
|
|
53
|
-
table: 'users',
|
|
54
|
-
where: OP.eq('name', name),
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export default {
|
|
60
|
-
async fetch(request: Request, env: Env): Promise<Response> {
|
|
61
|
-
const url = new URL(request.url);
|
|
62
|
-
const DO = env.MY_DO.get(env.MY_DO.idFromName('default'));
|
|
63
|
-
|
|
64
|
-
switch (url.pathname) {
|
|
65
|
-
case '/setup': {
|
|
66
|
-
const result = await DO.setup();
|
|
67
|
-
return Response.json(result);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
case '/query': {
|
|
71
|
-
const sql = url.searchParams.get('sql')!;
|
|
72
|
-
const result = await DO.queryRaw(sql);
|
|
73
|
-
return Response.json(result);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
case '/insert': {
|
|
77
|
-
const name = url.searchParams.get('name')!;
|
|
78
|
-
const email = url.searchParams.get('email')!;
|
|
79
|
-
const meta = await DO.insertUser(name, email);
|
|
80
|
-
return Response.json(meta);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
case '/select': {
|
|
84
|
-
const limit = url.searchParams.get('limit');
|
|
85
|
-
const rows = await DO.selectUsers(limit ? Number(limit) : undefined);
|
|
86
|
-
return Response.json({ rows });
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
case '/update': {
|
|
90
|
-
const oldName = url.searchParams.get('oldName')!;
|
|
91
|
-
const newName = url.searchParams.get('newName')!;
|
|
92
|
-
const meta = await DO.updateUser(oldName, newName);
|
|
93
|
-
return Response.json(meta);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
case '/delete': {
|
|
97
|
-
const name = url.searchParams.get('name')!;
|
|
98
|
-
const meta = await DO.deleteUser(name);
|
|
99
|
-
return Response.json(meta);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
default:
|
|
103
|
-
return new Response('Not found', { status: 404 });
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../../node_modules/wrangler/config-schema.json",
|
|
3
|
-
"name": "do-test",
|
|
4
|
-
"main": "worker.ts",
|
|
5
|
-
"compatibility_date": "2026-01-28",
|
|
6
|
-
"durable_objects": {
|
|
7
|
-
"bindings": [
|
|
8
|
-
{
|
|
9
|
-
"name": "MY_DO",
|
|
10
|
-
"class_name": "MyDurableObject"
|
|
11
|
-
}
|
|
12
|
-
]
|
|
13
|
-
},
|
|
14
|
-
"migrations": [
|
|
15
|
-
{
|
|
16
|
-
"tag": "v1",
|
|
17
|
-
"new_sqlite_classes": ["MyDurableObject"]
|
|
18
|
-
}
|
|
19
|
-
]
|
|
20
|
-
}
|
package/test/e2e/d1.test.ts
DELETED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { assert, beforeEach, describe, it, kill, startScript } from 'poku';
|
|
2
|
-
|
|
3
|
-
const PORT = 8787;
|
|
4
|
-
const BASE_URL = `http://localhost:${PORT}`;
|
|
5
|
-
|
|
6
|
-
describe(async () => {
|
|
7
|
-
await kill.port(PORT);
|
|
8
|
-
|
|
9
|
-
const server = await startScript('dev:d1', {
|
|
10
|
-
startAfter: 'Ready on',
|
|
11
|
-
timeout: 5000,
|
|
12
|
-
verbose: true,
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
try {
|
|
16
|
-
await describe('useD1', async () => {
|
|
17
|
-
beforeEach(async () => {
|
|
18
|
-
const res = await fetch(`${BASE_URL}/setup`);
|
|
19
|
-
assert.strictEqual(res.status, 200);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
await it('should insert a row', async () => {
|
|
23
|
-
const res = await fetch(
|
|
24
|
-
`${BASE_URL}/insert?name=Alice&email=alice@example.com`
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
assert.strictEqual(res.status, 200);
|
|
28
|
-
|
|
29
|
-
const meta = await res.json();
|
|
30
|
-
|
|
31
|
-
assert.ok(meta);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
await it('should select multiple rows', async () => {
|
|
35
|
-
await fetch(`${BASE_URL}/insert?name=Alice&email=alice@example.com`);
|
|
36
|
-
|
|
37
|
-
const res = await fetch(`${BASE_URL}/select`);
|
|
38
|
-
|
|
39
|
-
assert.strictEqual(res.status, 200);
|
|
40
|
-
|
|
41
|
-
const data = (await res.json()) as {
|
|
42
|
-
rows: Array<{ id: number; name: string; email: string }>;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
assert.ok(Array.isArray(data.rows));
|
|
46
|
-
assert.ok(data.rows.length > 0);
|
|
47
|
-
assert.strictEqual(data.rows[0].name, 'Alice');
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
await it('should select a single row with limit 1', async () => {
|
|
51
|
-
await fetch(`${BASE_URL}/insert?name=Alice&email=alice@example.com`);
|
|
52
|
-
|
|
53
|
-
const res = await fetch(`${BASE_URL}/select?limit=1`);
|
|
54
|
-
|
|
55
|
-
assert.strictEqual(res.status, 200);
|
|
56
|
-
|
|
57
|
-
const data = (await res.json()) as {
|
|
58
|
-
rows: { id: number; name: string; email: string };
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
assert.ok(data.rows !== null);
|
|
62
|
-
assert.strictEqual(data.rows.name, 'Alice');
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
await it('should run a raw query', async () => {
|
|
66
|
-
await fetch(`${BASE_URL}/insert?name=Alice&email=alice@example.com`);
|
|
67
|
-
|
|
68
|
-
const res = await fetch(
|
|
69
|
-
`${BASE_URL}/query?sql=${encodeURIComponent('SELECT * FROM users')}`
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
assert.strictEqual(res.status, 200);
|
|
73
|
-
|
|
74
|
-
const data = (await res.json()) as {
|
|
75
|
-
rows: Array<{ id: number; name: string; email: string }>;
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
assert.ok(data.rows.length > 0);
|
|
79
|
-
assert.strictEqual(data.rows[0].name, 'Alice');
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
await it('should update a row', async () => {
|
|
83
|
-
await fetch(`${BASE_URL}/insert?name=Alice&email=alice@example.com`);
|
|
84
|
-
const res = await fetch(`${BASE_URL}/update?name=Bob&where=Alice`);
|
|
85
|
-
|
|
86
|
-
assert.strictEqual(res.status, 200);
|
|
87
|
-
|
|
88
|
-
const selectRes = await fetch(`${BASE_URL}/select`);
|
|
89
|
-
const data = (await selectRes.json()) as {
|
|
90
|
-
rows: Array<{ id: number; name: string; email: string }>;
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
assert.strictEqual(data.rows[0].name, 'Bob');
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
await it('should delete a row', async () => {
|
|
97
|
-
await fetch(`${BASE_URL}/insert?name=Bob&email=bob@example.com`);
|
|
98
|
-
const res = await fetch(`${BASE_URL}/delete?name=Bob`);
|
|
99
|
-
|
|
100
|
-
assert.strictEqual(res.status, 200);
|
|
101
|
-
|
|
102
|
-
const selectRes = await fetch(`${BASE_URL}/select`);
|
|
103
|
-
const data = (await selectRes.json()) as {
|
|
104
|
-
rows: Array<{ id: number; name: string; email: string }>;
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
assert.strictEqual(data.rows.length, 0);
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
} finally {
|
|
111
|
-
await server.end(PORT);
|
|
112
|
-
}
|
|
113
|
-
});
|
package/test/e2e/do.test.ts
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { assert, beforeEach, describe, it, kill, startScript } from 'poku';
|
|
2
|
-
|
|
3
|
-
const PORT = 8788;
|
|
4
|
-
const BASE_URL = `http://localhost:${PORT}`;
|
|
5
|
-
|
|
6
|
-
describe(async () => {
|
|
7
|
-
await kill.port(PORT);
|
|
8
|
-
|
|
9
|
-
const server = await startScript('dev:do', {
|
|
10
|
-
startAfter: 'Ready on',
|
|
11
|
-
timeout: 5000,
|
|
12
|
-
verbose: true,
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
try {
|
|
16
|
-
await describe('useDO', async () => {
|
|
17
|
-
beforeEach(async () => {
|
|
18
|
-
const res = await fetch(`${BASE_URL}/setup`);
|
|
19
|
-
|
|
20
|
-
assert.strictEqual(res.status, 200);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
await it('should insert a row', async () => {
|
|
24
|
-
const res = await fetch(
|
|
25
|
-
`${BASE_URL}/insert?name=Alice&email=alice@example.com`
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
assert.strictEqual(res.status, 200);
|
|
29
|
-
|
|
30
|
-
const meta = await res.json();
|
|
31
|
-
|
|
32
|
-
assert.ok(meta);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
await it('should select multiple rows', async () => {
|
|
36
|
-
await fetch(`${BASE_URL}/insert?name=Alice&email=alice@example.com`);
|
|
37
|
-
|
|
38
|
-
const res = await fetch(`${BASE_URL}/select`);
|
|
39
|
-
|
|
40
|
-
assert.strictEqual(res.status, 200);
|
|
41
|
-
|
|
42
|
-
const data = (await res.json()) as {
|
|
43
|
-
rows: Array<{ id: number; name: string; email: string }>;
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
assert.ok(Array.isArray(data.rows));
|
|
47
|
-
assert.ok(data.rows.length > 0);
|
|
48
|
-
assert.strictEqual(data.rows[0].name, 'Alice');
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
await it('should select a single row with limit 1', async () => {
|
|
52
|
-
await fetch(`${BASE_URL}/insert?name=Alice&email=alice@example.com`);
|
|
53
|
-
|
|
54
|
-
const res = await fetch(`${BASE_URL}/select?limit=1`);
|
|
55
|
-
|
|
56
|
-
assert.strictEqual(res.status, 200);
|
|
57
|
-
|
|
58
|
-
const data = (await res.json()) as {
|
|
59
|
-
rows: { id: number; name: string; email: string };
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
assert.ok(data.rows !== null);
|
|
63
|
-
assert.strictEqual(data.rows.name, 'Alice');
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
await it('should run a raw query', async () => {
|
|
67
|
-
await fetch(`${BASE_URL}/insert?name=Alice&email=alice@example.com`);
|
|
68
|
-
|
|
69
|
-
const res = await fetch(
|
|
70
|
-
`${BASE_URL}/query?sql=${encodeURIComponent('SELECT * FROM users')}`
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
assert.strictEqual(res.status, 200);
|
|
74
|
-
|
|
75
|
-
const data = (await res.json()) as {
|
|
76
|
-
rows: Array<{ id: number; name: string; email: string }>;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
assert.ok(data.rows.length > 0);
|
|
80
|
-
assert.strictEqual(data.rows[0].name, 'Alice');
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
await it('should update a user', async () => {
|
|
84
|
-
await fetch(`${BASE_URL}/insert?name=Alice&email=alice@example.com`);
|
|
85
|
-
|
|
86
|
-
const res = await fetch(`${BASE_URL}/update?oldName=Alice&newName=Bob`);
|
|
87
|
-
|
|
88
|
-
assert.strictEqual(res.status, 200);
|
|
89
|
-
|
|
90
|
-
const selectRes = await fetch(`${BASE_URL}/select`);
|
|
91
|
-
const data = (await selectRes.json()) as {
|
|
92
|
-
rows: Array<{ id: number; name: string; email: string }>;
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
assert.strictEqual(data.rows[0].name, 'Bob');
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
await it('should delete a user', async () => {
|
|
99
|
-
await fetch(`${BASE_URL}/insert?name=Bob&email=bob@example.com`);
|
|
100
|
-
|
|
101
|
-
const res = await fetch(`${BASE_URL}/delete?name=Bob`);
|
|
102
|
-
|
|
103
|
-
assert.strictEqual(res.status, 200);
|
|
104
|
-
|
|
105
|
-
const selectRes = await fetch(`${BASE_URL}/select`);
|
|
106
|
-
const data = (await selectRes.json()) as {
|
|
107
|
-
rows: Array<{ id: number; name: string; email: string }>;
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
assert.strictEqual(data.rows.length, 0);
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
} finally {
|
|
114
|
-
await server.end(PORT);
|
|
115
|
-
}
|
|
116
|
-
});
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { assert, describe, it } from 'poku';
|
|
2
|
-
import { buildDelete } from '../../src/queries/delete.js';
|
|
3
|
-
import { OP } from '../../src/queries/where/operators.js';
|
|
4
|
-
|
|
5
|
-
describe('buildDelete', () => {
|
|
6
|
-
it('should build a basic delete', () => {
|
|
7
|
-
const result = buildDelete({ table: 'users' });
|
|
8
|
-
assert.strictEqual(result.sql, 'DELETE FROM `users`');
|
|
9
|
-
assert.deepStrictEqual(result.params, []);
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it('should build delete with where clause', () => {
|
|
13
|
-
const result = buildDelete({
|
|
14
|
-
table: 'users',
|
|
15
|
-
where: OP.eq('name', 'Alice'),
|
|
16
|
-
});
|
|
17
|
-
assert.strictEqual(result.sql, 'DELETE FROM `users` WHERE `name` = ?');
|
|
18
|
-
assert.deepStrictEqual(result.params, ['Alice']);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('should build delete with limit', () => {
|
|
22
|
-
const result = buildDelete({ table: 'users', limit: 1 });
|
|
23
|
-
assert.strictEqual(result.sql, 'DELETE FROM `users` LIMIT ?');
|
|
24
|
-
assert.deepStrictEqual(result.params, [1]);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should build delete with extra params', () => {
|
|
28
|
-
const result = buildDelete({
|
|
29
|
-
table: 'users',
|
|
30
|
-
where: OP.eq('id', 1),
|
|
31
|
-
params: ['extra'],
|
|
32
|
-
});
|
|
33
|
-
assert.strictEqual(result.sql, 'DELETE FROM `users` WHERE `id` = ?');
|
|
34
|
-
assert.deepStrictEqual(result.params, ['extra', 1]);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { assert, describe, it } from 'poku';
|
|
2
|
-
import { buildInsert } from '../../src/queries/insert.js';
|
|
3
|
-
|
|
4
|
-
describe('buildInsert', () => {
|
|
5
|
-
it('should build a single row insert', () => {
|
|
6
|
-
const result = buildInsert({
|
|
7
|
-
table: 'users',
|
|
8
|
-
values: { name: 'Alice', email: 'a@b.com' },
|
|
9
|
-
});
|
|
10
|
-
assert.strictEqual(
|
|
11
|
-
result.sql,
|
|
12
|
-
'INSERT INTO `users` (`name`, `email`) VALUES (?, ?)'
|
|
13
|
-
);
|
|
14
|
-
assert.deepStrictEqual(result.params, ['Alice', 'a@b.com']);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('should build a multi-row insert', () => {
|
|
18
|
-
const result = buildInsert({
|
|
19
|
-
table: 'users',
|
|
20
|
-
values: [
|
|
21
|
-
{ name: 'Alice', email: 'a@b.com' },
|
|
22
|
-
{ name: 'Bob', email: 'b@b.com' },
|
|
23
|
-
],
|
|
24
|
-
});
|
|
25
|
-
assert.strictEqual(
|
|
26
|
-
result.sql,
|
|
27
|
-
'INSERT INTO `users` (`name`, `email`) VALUES (?, ?), (?, ?)'
|
|
28
|
-
);
|
|
29
|
-
assert.deepStrictEqual(result.params, [
|
|
30
|
-
'Alice',
|
|
31
|
-
'a@b.com',
|
|
32
|
-
'Bob',
|
|
33
|
-
'b@b.com',
|
|
34
|
-
]);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { assert, describe, it } from 'poku';
|
|
2
|
-
import { buildSelect } from '../../src/queries/select.js';
|
|
3
|
-
import { OP } from '../../src/queries/where/operators.js';
|
|
4
|
-
|
|
5
|
-
describe('buildSelect', () => {
|
|
6
|
-
it('should build a basic select', () => {
|
|
7
|
-
const result = buildSelect({ table: 'users' });
|
|
8
|
-
assert.strictEqual(result.sql, 'SELECT * FROM `users`');
|
|
9
|
-
assert.deepStrictEqual(result.params, []);
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it('should build select with specific columns', () => {
|
|
13
|
-
const result = buildSelect({ table: 'users', columns: ['name', 'email'] });
|
|
14
|
-
assert.strictEqual(result.sql, 'SELECT `name`, `email` FROM `users`');
|
|
15
|
-
assert.deepStrictEqual(result.params, []);
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
it('should build select with string column', () => {
|
|
19
|
-
const result = buildSelect({ table: 'users', columns: 'COUNT(*)' });
|
|
20
|
-
assert.strictEqual(result.sql, 'SELECT COUNT(*) FROM `users`');
|
|
21
|
-
assert.deepStrictEqual(result.params, []);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it('should build select with distinct', () => {
|
|
25
|
-
const result = buildSelect({ table: 'users', distinct: true });
|
|
26
|
-
assert.strictEqual(result.sql, 'SELECT DISTINCT * FROM `users`');
|
|
27
|
-
assert.deepStrictEqual(result.params, []);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('should build select with where clause', () => {
|
|
31
|
-
const result = buildSelect({
|
|
32
|
-
table: 'users',
|
|
33
|
-
where: OP.eq('name', 'Alice'),
|
|
34
|
-
});
|
|
35
|
-
assert.strictEqual(result.sql, 'SELECT * FROM `users` WHERE `name` = ?');
|
|
36
|
-
assert.deepStrictEqual(result.params, ['Alice']);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('should build select with limit', () => {
|
|
40
|
-
const result = buildSelect({ table: 'users', limit: 10 });
|
|
41
|
-
assert.strictEqual(result.sql, 'SELECT * FROM `users` LIMIT ?');
|
|
42
|
-
assert.deepStrictEqual(result.params, [10]);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('should build select with offset', () => {
|
|
46
|
-
const result = buildSelect({ table: 'users', limit: 10, offset: 5 });
|
|
47
|
-
assert.strictEqual(result.sql, 'SELECT * FROM `users` LIMIT ? OFFSET ?');
|
|
48
|
-
assert.deepStrictEqual(result.params, [10, 5]);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('should build select with orderBy', () => {
|
|
52
|
-
const result = buildSelect({ table: 'users', orderBy: ['name', 'DESC'] });
|
|
53
|
-
assert.strictEqual(
|
|
54
|
-
result.sql,
|
|
55
|
-
'SELECT * FROM `users` ORDER BY `name` DESC'
|
|
56
|
-
);
|
|
57
|
-
assert.deepStrictEqual(result.params, []);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it('should build select with orderBy default ASC', () => {
|
|
61
|
-
const result = buildSelect({ table: 'users', orderBy: ['name'] });
|
|
62
|
-
assert.strictEqual(result.sql, 'SELECT * FROM `users` ORDER BY `name` ASC');
|
|
63
|
-
assert.deepStrictEqual(result.params, []);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('should build select with groupBy', () => {
|
|
67
|
-
const result = buildSelect({ table: 'users', groupBy: 'name' });
|
|
68
|
-
assert.strictEqual(result.sql, 'SELECT * FROM `users` GROUP BY `name`');
|
|
69
|
-
assert.deepStrictEqual(result.params, []);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('should build select with join', () => {
|
|
73
|
-
const result = buildSelect({
|
|
74
|
-
table: 'users',
|
|
75
|
-
join: {
|
|
76
|
-
type: 'inner',
|
|
77
|
-
table: 'orders',
|
|
78
|
-
on: { a: 'users.id', b: 'orders.user_id' },
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
assert.strictEqual(
|
|
82
|
-
result.sql,
|
|
83
|
-
'SELECT * FROM `users` INNER JOIN `orders` ON `users`.`id` = `orders`.`user_id`'
|
|
84
|
-
);
|
|
85
|
-
assert.deepStrictEqual(result.params, []);
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
it('should build select with outer join', () => {
|
|
89
|
-
const result = buildSelect({
|
|
90
|
-
table: 'users',
|
|
91
|
-
join: {
|
|
92
|
-
type: 'left',
|
|
93
|
-
table: 'orders',
|
|
94
|
-
on: { a: 'users.id', b: 'orders.user_id' },
|
|
95
|
-
outer: true,
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
assert.strictEqual(
|
|
99
|
-
result.sql,
|
|
100
|
-
'SELECT * FROM `users` LEFT OUTER JOIN `orders` ON `users`.`id` = `orders`.`user_id`'
|
|
101
|
-
);
|
|
102
|
-
assert.deepStrictEqual(result.params, []);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it('should build select with multiple joins', () => {
|
|
106
|
-
const result = buildSelect({
|
|
107
|
-
table: 'users',
|
|
108
|
-
join: [
|
|
109
|
-
{
|
|
110
|
-
type: 'inner',
|
|
111
|
-
table: 'orders',
|
|
112
|
-
on: { a: 'users.id', b: 'orders.user_id' },
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
type: 'left',
|
|
116
|
-
table: 'items',
|
|
117
|
-
on: { a: 'orders.id', b: 'items.order_id' },
|
|
118
|
-
},
|
|
119
|
-
],
|
|
120
|
-
});
|
|
121
|
-
assert.strictEqual(
|
|
122
|
-
result.sql,
|
|
123
|
-
'SELECT * FROM `users` INNER JOIN `orders` ON `users`.`id` = `orders`.`user_id` LEFT JOIN `items` ON `orders`.`id` = `items`.`order_id`'
|
|
124
|
-
);
|
|
125
|
-
assert.deepStrictEqual(result.params, []);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it('should build select with params', () => {
|
|
129
|
-
const result = buildSelect({
|
|
130
|
-
table: 'users',
|
|
131
|
-
where: 'name = ?',
|
|
132
|
-
params: ['Alice'],
|
|
133
|
-
});
|
|
134
|
-
assert.strictEqual(result.sql, 'SELECT * FROM `users` WHERE name = ?');
|
|
135
|
-
assert.deepStrictEqual(result.params, ['Alice']);
|
|
136
|
-
});
|
|
137
|
-
});
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { assert, describe, it } from 'poku';
|
|
2
|
-
import { buildUpdate } from '../../src/queries/update.js';
|
|
3
|
-
import { OP } from '../../src/queries/where/operators.js';
|
|
4
|
-
|
|
5
|
-
describe('buildUpdate', () => {
|
|
6
|
-
it('should build a basic update', () => {
|
|
7
|
-
const result = buildUpdate({ table: 'users', set: { name: 'Bob' } });
|
|
8
|
-
assert.strictEqual(result.sql, 'UPDATE `users` SET `name` = ?');
|
|
9
|
-
assert.deepStrictEqual(result.params, ['Bob']);
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it('should build update with where clause', () => {
|
|
13
|
-
const result = buildUpdate({
|
|
14
|
-
table: 'users',
|
|
15
|
-
set: { name: 'Bob' },
|
|
16
|
-
where: OP.eq('name', 'Alice'),
|
|
17
|
-
});
|
|
18
|
-
assert.strictEqual(
|
|
19
|
-
result.sql,
|
|
20
|
-
'UPDATE `users` SET `name` = ? WHERE `name` = ?'
|
|
21
|
-
);
|
|
22
|
-
assert.deepStrictEqual(result.params, ['Bob', 'Alice']);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('should build update with extra params', () => {
|
|
26
|
-
const result = buildUpdate({
|
|
27
|
-
table: 'users',
|
|
28
|
-
set: { name: 'Bob' },
|
|
29
|
-
params: ['extra'],
|
|
30
|
-
});
|
|
31
|
-
assert.strictEqual(result.sql, 'UPDATE `users` SET `name` = ?');
|
|
32
|
-
assert.deepStrictEqual(result.params, ['Bob', 'extra']);
|
|
33
|
-
});
|
|
34
|
-
});
|