@exanderal/stackcraft 0.8.3 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/create/scaffolders/orm.d.ts.map +1 -1
- package/dist/create/scaffolders/orm.js +15 -13
- package/dist/create/scaffolders/orm.js.map +1 -1
- package/dist/create/scaffolders/setup-linter.js +8 -2
- package/dist/create/scaffolders/setup-linter.js.map +1 -1
- package/package.json +1 -1
- package/templates/api-nestjs-graphql/src/modules/health/__tests__/health.controller.spec.ts +2 -2
- package/templates/api-nestjs-graphql/src/modules/health/__tests__/health.service.spec.ts +1 -1
- package/templates/api-nestjs-rest/src/modules/health/__tests__/health.controller.spec.ts +2 -2
- package/templates/api-nestjs-rest/src/modules/health/__tests__/health.service.spec.ts +1 -1
- package/templates/base/.github/workflows/quality.yml +5 -1
- package/templates/orm-kysely/src/common/repositories/entity.repository.ts +18 -14
- package/templates/orm-kysely/src/common/repositories/readonly-entity.repository.ts +13 -13
- package/templates/orm-kysely/tools/generators/module/files/__fileName__.repository.ts__tmpl__ +2 -3
- package/templates/web-vite/vite.config.ts +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orm.d.ts","sourceRoot":"","sources":["../../../src/create/scaffolders/orm.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAqDzD,wBAAsB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,iBAOlF;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,iBAoCxE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,iBAmE7E;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"orm.d.ts","sourceRoot":"","sources":["../../../src/create/scaffolders/orm.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAqDzD,wBAAsB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,iBAOlF;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,iBAoCxE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,iBAmE7E;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,iBAmH7E"}
|
|
@@ -74,7 +74,7 @@ export async function injectOrmDeps(appDir, config) {
|
|
|
74
74
|
}
|
|
75
75
|
else {
|
|
76
76
|
// kysely
|
|
77
|
-
pkg.dependencies['kysely'] = '^0.
|
|
77
|
+
pkg.dependencies['kysely'] = '^0.28.14';
|
|
78
78
|
pkg.devDependencies['tsx'] = '^4.0.0';
|
|
79
79
|
if (config.database === 'postgres') {
|
|
80
80
|
pkg.dependencies['pg'] = '^8.0.0';
|
|
@@ -162,20 +162,21 @@ export async function writeMigrateScript(appDir, config) {
|
|
|
162
162
|
let content;
|
|
163
163
|
if (config.database === 'postgres') {
|
|
164
164
|
content = `import 'dotenv/config';
|
|
165
|
-
import { Kysely, PostgresDialect, Migrator, FileMigrationProvider } from 'kysely';
|
|
166
|
-
import { Pool } from 'pg';
|
|
167
165
|
import { promises as fs } from 'node:fs';
|
|
168
|
-
import {
|
|
166
|
+
import { dirname, join } from 'node:path';
|
|
169
167
|
import { fileURLToPath } from 'node:url';
|
|
168
|
+
import { FileMigrationProvider, Kysely, Migrator, PostgresDialect } from 'kysely';
|
|
169
|
+
import { Pool } from 'pg';
|
|
170
170
|
|
|
171
171
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
172
172
|
|
|
173
173
|
async function migrate() {
|
|
174
|
+
// biome-ignore lint/suspicious/noExplicitAny: migration script uses dynamic DB types
|
|
174
175
|
const db = new Kysely<any>({
|
|
175
176
|
dialect: new PostgresDialect({
|
|
176
177
|
pool: new Pool({
|
|
177
178
|
host: process.env.DB_HOST,
|
|
178
|
-
port: parseInt(process.env.DB_PORT ?? '5432', 10),
|
|
179
|
+
port: Number.parseInt(process.env.DB_PORT ?? '5432', 10),
|
|
179
180
|
user: process.env.DB_USER,
|
|
180
181
|
password: process.env.DB_PASSWORD,
|
|
181
182
|
database: process.env.DB_NAME,
|
|
@@ -197,10 +198,10 @@ async function migrate() {
|
|
|
197
198
|
? await migrator.migrateDown()
|
|
198
199
|
: await migrator.migrateToLatest();
|
|
199
200
|
|
|
200
|
-
|
|
201
|
+
for (const it of results ?? []) {
|
|
201
202
|
if (it.status === 'Success') console.log(\`✓ \${it.migrationName}\`);
|
|
202
203
|
else if (it.status === 'Error') console.error(\`✗ \${it.migrationName}\`);
|
|
203
|
-
}
|
|
204
|
+
}
|
|
204
205
|
|
|
205
206
|
if (error) {
|
|
206
207
|
console.error('Migration failed:', error);
|
|
@@ -215,20 +216,21 @@ migrate();
|
|
|
215
216
|
}
|
|
216
217
|
else {
|
|
217
218
|
content = `import 'dotenv/config';
|
|
218
|
-
import { Kysely, MysqlDialect, Migrator, FileMigrationProvider } from 'kysely';
|
|
219
|
-
import { createPool } from 'mysql2/promise';
|
|
220
219
|
import { promises as fs } from 'node:fs';
|
|
221
|
-
import {
|
|
220
|
+
import { dirname, join } from 'node:path';
|
|
222
221
|
import { fileURLToPath } from 'node:url';
|
|
222
|
+
import { FileMigrationProvider, Kysely, Migrator, MysqlDialect } from 'kysely';
|
|
223
|
+
import { createPool } from 'mysql2/promise';
|
|
223
224
|
|
|
224
225
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
225
226
|
|
|
226
227
|
async function migrate() {
|
|
228
|
+
// biome-ignore lint/suspicious/noExplicitAny: migration script uses dynamic DB types
|
|
227
229
|
const db = new Kysely<any>({
|
|
228
230
|
dialect: new MysqlDialect({
|
|
229
231
|
pool: createPool({
|
|
230
232
|
host: process.env.DB_HOST,
|
|
231
|
-
port: parseInt(process.env.DB_PORT ?? '3306', 10),
|
|
233
|
+
port: Number.parseInt(process.env.DB_PORT ?? '3306', 10),
|
|
232
234
|
user: process.env.DB_USER,
|
|
233
235
|
password: process.env.DB_PASSWORD,
|
|
234
236
|
database: process.env.DB_NAME,
|
|
@@ -250,10 +252,10 @@ async function migrate() {
|
|
|
250
252
|
? await migrator.migrateDown()
|
|
251
253
|
: await migrator.migrateToLatest();
|
|
252
254
|
|
|
253
|
-
|
|
255
|
+
for (const it of results ?? []) {
|
|
254
256
|
if (it.status === 'Success') console.log(\`✓ \${it.migrationName}\`);
|
|
255
257
|
else if (it.status === 'Error') console.error(\`✗ \${it.migrationName}\`);
|
|
256
|
-
}
|
|
258
|
+
}
|
|
257
259
|
|
|
258
260
|
if (error) {
|
|
259
261
|
console.error('Migration failed:', error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orm.js","sourceRoot":"","sources":["../../../src/create/scaffolders/orm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBnC,CAAA;AAED,MAAM,8BAA8B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBtC,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,SAAiB,EAAE,OAAgB;IACjF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAA;IAC7D,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACtC,MAAM,OAAO,GAAG,OAAO,KAAK,gBAAgB;QAC1C,CAAC,CAAC,8BAA8B;QAChC,CAAC,CAAC,2BAA2B,CAAA;IAC/B,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,MAAqB;IACvE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IAExD,IAAI,MAAM,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,QAAQ,CAAA;QAC7C,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAA;QACxC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAA;QAErC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,oBAAoB,CAAA;QACnD,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,uBAAuB,CAAA;QACzD,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,2BAA2B,CAAA;QAC1D,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAA;QACzC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,eAAe,CAAA;QAC1C,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,iBAAiB,CAAA;QAE9C,GAAG,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAA;IACnD,CAAC;SAAM,CAAC;QACN,SAAS;QACT,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"orm.js","sourceRoot":"","sources":["../../../src/create/scaffolders/orm.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,13 +26,19 @@ async function writeBiomeConfig(config) {
|
|
|
26
26
|
const biome = {
|
|
27
27
|
$schema: 'https://biomejs.dev/schemas/1.9.0/schema.json',
|
|
28
28
|
vcs: { enabled: true, clientKind: 'git', useIgnoreFile: true },
|
|
29
|
-
files: { ignoreUnknown: false },
|
|
29
|
+
files: { ignoreUnknown: false, ignore: ['package.json'] },
|
|
30
30
|
formatter: { enabled: true, indentStyle: 'space', indentWidth: 2 },
|
|
31
|
-
linter: { enabled: true, rules: { recommended: true } },
|
|
31
|
+
linter: { enabled: true, rules: { recommended: true, style: { useImportType: 'off' } } },
|
|
32
32
|
javascript: {
|
|
33
33
|
formatter: { quoteStyle: 'single', trailingCommas: 'all', semicolons: 'always' },
|
|
34
34
|
},
|
|
35
35
|
organizeImports: { enabled: true },
|
|
36
|
+
overrides: [
|
|
37
|
+
{
|
|
38
|
+
include: ['tsconfig*.json'],
|
|
39
|
+
json: { parser: { allowComments: true, allowTrailingCommas: true } },
|
|
40
|
+
},
|
|
41
|
+
],
|
|
36
42
|
};
|
|
37
43
|
await writeFile(join(config.targetDir, 'biome.json'), JSON.stringify(biome, null, 2) + '\n', 'utf-8');
|
|
38
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-linter.js","sourceRoot":"","sources":["../../../src/create/scaffolders/setup-linter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAqB;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;QAAE,OAAM;IAErC,MAAM,cAAc,CAAC,MAAM,CAAC,CAAA;IAC5B,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC9B,MAAM,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,YAAY,EAAE,uBAAuB,CAAC,CAAA;IAE5F,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAA;IACpF,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,EAAE,uBAAuB,CAAC,CAAA;IAChF,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,qBAAqB,CAAC,CAAA;IACjE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAqB;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IACxD,GAAG,CAAC,eAAe,CAAC,gBAAgB,CAAC,GAAG,QAAQ,CAAA;IAChD,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA;AACxE,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAAqB;IACnD,MAAM,KAAK,GAAG;QACZ,OAAO,EAAE,+CAA+C;QACxD,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE;QAC9D,KAAK,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"setup-linter.js","sourceRoot":"","sources":["../../../src/create/scaffolders/setup-linter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Test, TestingModule } from '@nestjs/testing';
|
|
2
|
-
import { HealthController } from '
|
|
3
|
-
import { HealthService } from '
|
|
2
|
+
import { HealthController } from '../health.controller';
|
|
3
|
+
import { HealthService } from '../health.service';
|
|
4
4
|
|
|
5
5
|
describe('HealthController', () => {
|
|
6
6
|
let controller: HealthController;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Test, TestingModule } from '@nestjs/testing';
|
|
2
|
-
import { HealthController } from '
|
|
3
|
-
import { HealthService } from '
|
|
2
|
+
import { HealthController } from '../health.controller';
|
|
3
|
+
import { HealthService } from '../health.service';
|
|
4
4
|
|
|
5
5
|
describe('HealthController', () => {
|
|
6
6
|
let controller: HealthController;
|
|
@@ -5,6 +5,10 @@ on:
|
|
|
5
5
|
push:
|
|
6
6
|
branches: [main, master]
|
|
7
7
|
|
|
8
|
+
permissions:
|
|
9
|
+
actions: read
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
8
12
|
concurrency:
|
|
9
13
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
10
14
|
cancel-in-progress: true
|
|
@@ -69,7 +73,7 @@ jobs:
|
|
|
69
73
|
node-version: 22
|
|
70
74
|
cache: pnpm
|
|
71
75
|
- run: pnpm install --frozen-lockfile
|
|
72
|
-
- run: pnpm audit --audit-level=high
|
|
76
|
+
- run: pnpm audit --audit-level=high --prod
|
|
73
77
|
|
|
74
78
|
build:
|
|
75
79
|
name: Build
|
|
@@ -1,33 +1,37 @@
|
|
|
1
|
+
import type { Insertable, Selectable } from 'kysely';
|
|
2
|
+
import type { Database } from '../../database/database.types';
|
|
1
3
|
import { ReadonlyEntityRepository } from './readonly-entity.repository';
|
|
2
4
|
|
|
3
5
|
export abstract class EntityRepository<
|
|
4
|
-
|
|
6
|
+
TableName extends keyof Database & string,
|
|
7
|
+
TEntity = Selectable<Database[TableName]>,
|
|
5
8
|
TFilters extends Record<string, unknown> = Record<string, never>,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
async create(data: TInsert): Promise<TEntity> {
|
|
9
|
+
> extends ReadonlyEntityRepository<TableName, TEntity, TFilters> {
|
|
10
|
+
async create(data: Insertable<Database[TableName]>): Promise<TEntity> {
|
|
9
11
|
const row = await this.db
|
|
10
|
-
.insertInto(this.table
|
|
11
|
-
.values(data
|
|
12
|
+
.insertInto(this.table)
|
|
13
|
+
.values(data)
|
|
12
14
|
.returningAll()
|
|
13
15
|
.executeTakeFirstOrThrow();
|
|
14
|
-
return
|
|
16
|
+
return row as TEntity;
|
|
15
17
|
}
|
|
16
18
|
|
|
17
|
-
async update(id: string | number, data: Partial<
|
|
19
|
+
async update(id: string | number, data: Partial<Insertable<Database[TableName]>>): Promise<TEntity> {
|
|
18
20
|
const row = await this.db
|
|
19
|
-
.updateTable(this.table
|
|
20
|
-
.set(data
|
|
21
|
-
|
|
21
|
+
.updateTable(this.table)
|
|
22
|
+
.set(data)
|
|
23
|
+
// biome-ignore lint/suspicious/noExplicitAny: column 'id' cannot be inferred from a generic TableName without schema knowledge
|
|
24
|
+
.where('id' as any, '=', id)
|
|
22
25
|
.returningAll()
|
|
23
26
|
.executeTakeFirstOrThrow();
|
|
24
|
-
return
|
|
27
|
+
return row as TEntity;
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
async remove(id: string | number): Promise<void> {
|
|
28
31
|
await this.db
|
|
29
|
-
.deleteFrom(this.table
|
|
30
|
-
|
|
32
|
+
.deleteFrom(this.table)
|
|
33
|
+
// biome-ignore lint/suspicious/noExplicitAny: column 'id' cannot be inferred from a generic TableName without schema knowledge
|
|
34
|
+
.where('id' as any, '=', id)
|
|
31
35
|
.execute();
|
|
32
36
|
}
|
|
33
37
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Kysely } from 'kysely';
|
|
1
|
+
import type { Kysely, Selectable } from 'kysely';
|
|
2
2
|
import type { Database } from '../../database/database.types';
|
|
3
3
|
|
|
4
4
|
export function where(column: string) {
|
|
@@ -6,41 +6,41 @@ export function where(column: string) {
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export abstract class ReadonlyEntityRepository<
|
|
9
|
-
|
|
9
|
+
TableName extends keyof Database & string,
|
|
10
|
+
TEntity = Selectable<Database[TableName]>,
|
|
10
11
|
TFilters extends Record<string, unknown> = Record<string, never>,
|
|
11
12
|
> {
|
|
12
13
|
constructor(protected readonly db: Kysely<Database>) {}
|
|
13
14
|
|
|
14
|
-
protected abstract table:
|
|
15
|
+
protected abstract table: TableName;
|
|
15
16
|
|
|
16
|
-
protected filters: Partial<
|
|
17
|
-
Record<keyof TFilters, (qb: any, value: any) => any>
|
|
18
|
-
> = {};
|
|
17
|
+
protected filters: Partial<Record<keyof TFilters, (qb: any, value: unknown) => any>> = {};
|
|
19
18
|
|
|
20
19
|
protected queryable() {
|
|
21
|
-
return this.db.selectFrom(this.table
|
|
20
|
+
return this.db.selectFrom(this.table);
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
async findAll(filters?: Partial<TFilters>): Promise<TEntity[]> {
|
|
25
24
|
let q = this.queryable();
|
|
26
25
|
if (filters) {
|
|
27
26
|
for (const [key, value] of Object.entries(filters)) {
|
|
28
|
-
const fn =
|
|
27
|
+
const fn = this.filters[key as keyof TFilters];
|
|
29
28
|
if (value !== undefined && fn) q = fn(q, value);
|
|
30
29
|
}
|
|
31
30
|
}
|
|
32
|
-
return (await q.selectAll().execute())
|
|
31
|
+
return (await q.selectAll().execute()) as TEntity[];
|
|
33
32
|
}
|
|
34
33
|
|
|
35
34
|
async findById(id: string | number): Promise<TEntity | null> {
|
|
36
35
|
const row = await this.queryable()
|
|
37
36
|
.selectAll()
|
|
38
|
-
|
|
37
|
+
// biome-ignore lint/suspicious/noExplicitAny: column 'id' cannot be inferred from a generic TableName without schema knowledge
|
|
38
|
+
.where('id' as any, '=', id)
|
|
39
39
|
.executeTakeFirst();
|
|
40
|
-
return row ?
|
|
40
|
+
return row ? (row as TEntity) : null;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
protected mapFromDB(row:
|
|
44
|
-
return row;
|
|
43
|
+
protected mapFromDB(row: Selectable<Database[TableName]>): TEntity {
|
|
44
|
+
return row as TEntity;
|
|
45
45
|
}
|
|
46
46
|
}
|
package/templates/orm-kysely/tools/generators/module/files/__fileName__.repository.ts__tmpl__
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { Injectable } from '@nestjs/common';
|
|
2
2
|
import { EntityRepository } from '../../common/repositories/entity.repository';
|
|
3
3
|
import { KyselyService } from '../../modules/database/kysely.service';
|
|
4
|
-
import type { <%= className %> } from './<%= fileName %>.model';
|
|
5
4
|
|
|
6
5
|
// Add properties to enable filtering, e.g.:
|
|
7
6
|
// export type <%= className %>Filters = { id?: string }
|
|
8
7
|
export type <%= className %>Filters = Record<string, never>
|
|
9
8
|
|
|
10
9
|
@Injectable()
|
|
11
|
-
export class <%= className %>Repository extends EntityRepository
|
|
12
|
-
protected table = '<%= fileName %>s';
|
|
10
|
+
export class <%= className %>Repository extends EntityRepository<'<%= fileName %>s', <%= className %>Filters> {
|
|
11
|
+
protected table = '<%= fileName %>s' as const;
|
|
13
12
|
|
|
14
13
|
constructor(kyselyService: KyselyService) {
|
|
15
14
|
super(kyselyService.db);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import tailwindcss from '@tailwindcss/vite'
|
|
2
|
-
import react from '@vitejs/plugin-react'
|
|
3
|
-
import { defineConfig } from 'vite'
|
|
1
|
+
import tailwindcss from '@tailwindcss/vite';
|
|
2
|
+
import react from '@vitejs/plugin-react';
|
|
3
|
+
import { defineConfig } from 'vite';
|
|
4
4
|
|
|
5
5
|
export default defineConfig({
|
|
6
6
|
plugins: [react(), tailwindcss()],
|
|
7
|
-
})
|
|
7
|
+
});
|