• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

rogerpadilla / nukak / #520

29 Dec 2025 12:41PM UTC coverage: 86.536% (-10.7%) from 97.192%
#520

push

web-flow
Merge pull request #70 from rogerpadilla/feat/migrations-issue-38

feat: add support for database migrations

669 of 915 branches covered (73.11%)

Branch coverage included in aggregate %.

135 of 276 new or added lines in 9 files covered. (48.91%)

56 existing lines in 6 files now uncovered.

2294 of 2509 relevant lines covered (91.43%)

146.06 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

82.05
/packages/sqlite/src/sqliteDialect.ts
1
import { AbstractSqlDialect } from 'nukak/dialect';
4✔
2
import { getMeta } from 'nukak/entity';
4✔
3
import type {
4
  FieldKey,
5
  QueryComparisonOptions,
6
  QueryConflictPaths,
7
  QueryContext,
8
  QueryTextSearchOptions,
9
  QueryWhereFieldOperatorMap,
10
  QueryWhereMap,
11
  Type,
12
} from 'nukak/type';
13
import sqlstring from 'sqlstring-sqlite';
4✔
14

15
export class SqliteDialect extends AbstractSqlDialect {
4✔
16
  constructor() {
17
    super('`', 'BEGIN TRANSACTION');
4✔
18
  }
19

20
  override addValue(values: unknown[], value: unknown): string {
21
    if (value instanceof Date) {
869✔
22
      value = value.getTime();
2✔
23
    } else if (typeof value === 'boolean') {
867!
UNCOV
24
      value = value ? 1 : 0;
×
25
    }
26
    return super.addValue(values, value);
869✔
27
  }
28

29
  override compare<E, K extends keyof QueryWhereMap<E>>(
30
    ctx: QueryContext,
31
    entity: Type<E>,
32
    key: K,
33
    val: QueryWhereMap<E>[K],
34
    opts?: QueryComparisonOptions,
35
  ): void {
36
    if (key === '$text') {
465✔
37
      const meta = getMeta(entity);
2✔
38
      const search = val as QueryTextSearchOptions<E>;
2✔
39
      const fields = search.$fields.map((field) => this.escapeId(meta.fields[field]?.name ?? field));
3!
40
      ctx.append(`${this.escapeId(meta.name)} MATCH {${fields.join(' ')}} : `);
2✔
41
      ctx.addValue(search.$value);
2✔
42
      return;
2✔
43
    }
44
    super.compare(ctx, entity, key, val, opts);
463✔
45
  }
46

47
  override compareFieldOperator<E, K extends keyof QueryWhereFieldOperatorMap<E>>(
48
    ctx: QueryContext,
49
    entity: Type<E>,
50
    key: FieldKey<E>,
51
    op: K,
52
    val: QueryWhereFieldOperatorMap<E>[K],
53
    opts: QueryComparisonOptions = {},
×
54
  ): void {
55
    super.compareFieldOperator(ctx, entity, key, op, val, opts);
443✔
56
  }
57

58
  override upsert<E>(ctx: QueryContext, entity: Type<E>, conflictPaths: QueryConflictPaths<E>, payload: E): void {
59
    const meta = getMeta(entity);
6✔
60
    const update = this.getUpsertUpdateAssignments(ctx, meta, conflictPaths, payload, (name) => `EXCLUDED.${name}`);
10✔
61
    const keysStr = this.getUpsertConflictPathsStr(meta, conflictPaths);
6✔
62
    const onConflict = update ? `DO UPDATE SET ${update}` : 'DO NOTHING';
6✔
63
    this.insert(ctx, entity, payload);
6✔
64
    ctx.append(` ON CONFLICT (${keysStr}) ${onConflict}`);
6✔
65
  }
66

67
  override escape(value: unknown): string {
UNCOV
68
    return sqlstring.escape(value);
×
69
  }
70
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc