@shivaedev/effect-test-sql 0.8.1 → 0.8.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.8.2 - 2026-10-19
4
+
5
+ ### Changed
6
+
7
+ - Release with updated workspace dependencies.
8
+
3
9
  ## 0.8.1 - 2026-10-19
4
10
 
5
11
  ### Changed
@@ -1 +1 @@
1
- {"version":3,"file":"assertModelColumns.d.ts","sourceRoot":"","sources":["../../src/server/assertModelColumns.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,MAAM,EAAU,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;;;;AAE5D,qBAAa,mBAAoB,SAAQ,yBAAwC;IAChF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;CAAG;AAEL,eAAO,MAAM,kBAAkB,GAA2D,MAAM,SAAS,KAAK,CAAC,GAAG,wEAG9F,MAAM,mGAqCxB,CAAC"}
1
+ {"version":3,"file":"assertModelColumns.d.ts","sourceRoot":"","sources":["../../src/server/assertModelColumns.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,MAAM,EAAU,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;;;;AAE5D,qBAAa,mBAAoB,SAAQ,yBAAwC;IAChF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;CAAG;AAEL,eAAO,MAAM,kBAAkB,GAA2D,MAAM,SAAS,KAAK,CAAC,GAAG,wEAG9F,MAAM,mGAKxB,CAAC"}
@@ -1,43 +1,11 @@
1
1
  import * as PgClient from "@effect/sql-pg/PgClient";
2
2
  import { Data, Effect, Option } from "effect";
3
+ import { modelColumnProblems } from "#internal/modelColumnProblems.ts";
3
4
  export class ModelColumnMismatch extends Data.TaggedError("ModelColumnMismatch") {
4
5
  }
5
6
  export const assertModelColumns = Effect.fn("PostgresTest.assertModelColumns")(function* (columns, model, types) {
6
7
  const client = yield* Effect.serviceOption(PgClient.PgClient);
7
- const config = Option.getOrUndefined(client)?.config;
8
- const queryFields = new Map(Object.keys(model.fields).map((name) => [config?.transformQueryNames?.(name) ?? name, name]));
9
- function fieldName(name) {
10
- return queryFields.get(name) ?? config?.transformResultNames?.(name) ?? name;
11
- }
12
- const expectedTypes = types;
13
- function columnKey(name) {
14
- return config?.transformQueryNames === undefined ? fieldName(name) : name;
15
- }
16
- const actual = new Map(columns.map(({ name, type }) => [columnKey(name), type]));
17
- const problems = [];
18
- for (const name of Object.keys(model.fields)) {
19
- const type = actual.get(config?.transformQueryNames?.(name) ?? name);
20
- if (type === undefined) {
21
- problems.push(`Missing column: ${name}`);
22
- }
23
- else if (type !== expectedTypes[name]) {
24
- problems.push(`Wrong type for ${name}: expected ${expectedTypes[name]}, received ${type}`);
25
- }
26
- if (!Object.hasOwn(expectedTypes, name)) {
27
- problems.push(`Missing expected PostgreSQL type: ${name}`);
28
- }
29
- }
30
- for (const column of columns) {
31
- const name = fieldName(column.name);
32
- if (!queryFields.has(columnKey(column.name))) {
33
- problems.push(`Extra column: ${name}`);
34
- }
35
- }
36
- for (const name of Object.keys(expectedTypes)) {
37
- if (!Object.hasOwn(model.fields, name)) {
38
- problems.push(`Extra expected PostgreSQL type: ${name}`);
39
- }
40
- }
8
+ const problems = modelColumnProblems(columns, model.fields, types, Option.getOrUndefined(client)?.config);
41
9
  return yield* problems.length === 0 ? Effect.void : Effect.fail(new ModelColumnMismatch({ problems }));
42
10
  });
43
11
  //# sourceMappingURL=assertModelColumns.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"assertModelColumns.js","sourceRoot":"","sources":["../../src/server/assertModelColumns.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assertModelColumns.js","sourceRoot":"","sources":["../../src/server/assertModelColumns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAGvE,MAAM,OAAO,mBAAoB,SAAQ,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAE7E;CAAG;AAEL,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,iCAAiC,CAAC,CAAC,QAAQ,CAAC,EACvF,OAAkC,EAClC,KAAa,EACb,KAAuE;IAEvE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1G,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;AACxG,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { PostgresColumn } from "#migrationUpgrade.ts";
2
+ interface NameTransforms {
3
+ readonly transformQueryNames?: ((name: string) => string) | undefined;
4
+ readonly transformResultNames?: ((name: string) => string) | undefined;
5
+ }
6
+ export declare function modelColumnProblems(columns: readonly PostgresColumn[], fields: object, expectedTypes: Readonly<Record<string, string>>, transforms: NameTransforms | undefined): readonly string[];
7
+ export {};
8
+ //# sourceMappingURL=modelColumnProblems.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelColumnProblems.d.ts","sourceRoot":"","sources":["../../../src/server/internal/modelColumnProblems.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,UAAU,cAAc;IACvB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IACtE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;CACvE;AAED,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC/C,UAAU,EAAE,cAAc,GAAG,SAAS,GACpC,SAAS,MAAM,EAAE,CAgCnB"}
@@ -0,0 +1,35 @@
1
+ export function modelColumnProblems(columns, fields, expectedTypes, transforms) {
2
+ const queryFields = new Map(Object.keys(fields).map((name) => [transforms?.transformQueryNames?.(name) ?? name, name]));
3
+ function fieldName(name) {
4
+ return queryFields.get(name) ?? transforms?.transformResultNames?.(name) ?? name;
5
+ }
6
+ function columnKey(name) {
7
+ return transforms?.transformQueryNames === undefined ? fieldName(name) : name;
8
+ }
9
+ const actual = new Map(columns.map(({ name, type }) => [columnKey(name), type]));
10
+ const problems = [];
11
+ for (const name of Object.keys(fields)) {
12
+ const type = actual.get(transforms?.transformQueryNames?.(name) ?? name);
13
+ if (type === undefined) {
14
+ problems.push(`Missing column: ${name}`);
15
+ }
16
+ else if (type !== expectedTypes[name]) {
17
+ problems.push(`Wrong type for ${name}: expected ${expectedTypes[name]}, received ${type}`);
18
+ }
19
+ if (!Object.hasOwn(expectedTypes, name)) {
20
+ problems.push(`Missing expected PostgreSQL type: ${name}`);
21
+ }
22
+ }
23
+ for (const column of columns) {
24
+ if (!queryFields.has(columnKey(column.name))) {
25
+ problems.push(`Extra column: ${fieldName(column.name)}`);
26
+ }
27
+ }
28
+ for (const name of Object.keys(expectedTypes)) {
29
+ if (!Object.hasOwn(fields, name)) {
30
+ problems.push(`Extra expected PostgreSQL type: ${name}`);
31
+ }
32
+ }
33
+ return problems;
34
+ }
35
+ //# sourceMappingURL=modelColumnProblems.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelColumnProblems.js","sourceRoot":"","sources":["../../../src/server/internal/modelColumnProblems.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,mBAAmB,CAClC,OAAkC,EAClC,MAAc,EACd,aAA+C,EAC/C,UAAsC;IAEtC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,mBAAmB,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACxH,SAAS,SAAS,CAAC,IAAY;QAC9B,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,EAAE,oBAAoB,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAClF,CAAC;IACD,SAAS,SAAS,CAAC,IAAY;QAC9B,OAAO,UAAU,EAAE,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,mBAAmB,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QACzE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,IAAI,KAAK,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,IAAI,cAAc,aAAa,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,qCAAqC,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;IACF,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC9C,QAAQ,CAAC,IAAI,CAAC,iBAAiB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;IACF,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;IACF,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shivaedev/effect-test-sql",
3
- "version": "0.8.1",
3
+ "version": "0.8.2",
4
4
  "description": "PostgreSQL rollback and real-commit test isolation for Effect",
5
5
  "homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/effect-test-sql#readme",
6
6
  "bugs": {
@@ -41,7 +41,7 @@
41
41
  "README.md"
42
42
  ],
43
43
  "dependencies": {
44
- "@shivaedev/effect-sql": "0.12.0"
44
+ "@shivaedev/effect-sql": "0.13.0"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@effect/sql-pg": "4.0.4",
@@ -1,6 +1,7 @@
1
1
  import * as PgClient from "@effect/sql-pg/PgClient";
2
2
  import { Data, Effect, Option } from "effect";
3
3
  import type { Model } from "effect/schema";
4
+ import { modelColumnProblems } from "#internal/modelColumnProblems.ts";
4
5
  import type { PostgresColumn } from "./migrationUpgrade.ts";
5
6
 
6
7
  export class ModelColumnMismatch extends Data.TaggedError("ModelColumnMismatch")<{
@@ -13,38 +14,6 @@ export const assertModelColumns = Effect.fn("PostgresTest.assertModelColumns")(f
13
14
  types: { readonly [TField in keyof NoInfer<TModel>["fields"]]: string },
14
15
  ) {
15
16
  const client = yield* Effect.serviceOption(PgClient.PgClient);
16
- const config = Option.getOrUndefined(client)?.config;
17
- const queryFields = new Map(Object.keys(model.fields).map((name) => [config?.transformQueryNames?.(name) ?? name, name]));
18
- function fieldName(name: string) {
19
- return queryFields.get(name) ?? config?.transformResultNames?.(name) ?? name;
20
- }
21
- const expectedTypes: Readonly<Record<string, string>> = types;
22
- function columnKey(name: string) {
23
- return config?.transformQueryNames === undefined ? fieldName(name) : name;
24
- }
25
- const actual = new Map(columns.map(({ name, type }) => [columnKey(name), type]));
26
- const problems: string[] = [];
27
- for (const name of Object.keys(model.fields)) {
28
- const type = actual.get(config?.transformQueryNames?.(name) ?? name);
29
- if (type === undefined) {
30
- problems.push(`Missing column: ${name}`);
31
- } else if (type !== expectedTypes[name]) {
32
- problems.push(`Wrong type for ${name}: expected ${expectedTypes[name]}, received ${type}`);
33
- }
34
- if (!Object.hasOwn(expectedTypes, name)) {
35
- problems.push(`Missing expected PostgreSQL type: ${name}`);
36
- }
37
- }
38
- for (const column of columns) {
39
- const name = fieldName(column.name);
40
- if (!queryFields.has(columnKey(column.name))) {
41
- problems.push(`Extra column: ${name}`);
42
- }
43
- }
44
- for (const name of Object.keys(expectedTypes)) {
45
- if (!Object.hasOwn(model.fields, name)) {
46
- problems.push(`Extra expected PostgreSQL type: ${name}`);
47
- }
48
- }
17
+ const problems = modelColumnProblems(columns, model.fields, types, Option.getOrUndefined(client)?.config);
49
18
  return yield* problems.length === 0 ? Effect.void : Effect.fail(new ModelColumnMismatch({ problems }));
50
19
  });
@@ -0,0 +1,45 @@
1
+ import type { PostgresColumn } from "#migrationUpgrade.ts";
2
+
3
+ interface NameTransforms {
4
+ readonly transformQueryNames?: ((name: string) => string) | undefined;
5
+ readonly transformResultNames?: ((name: string) => string) | undefined;
6
+ }
7
+
8
+ export function modelColumnProblems(
9
+ columns: readonly PostgresColumn[],
10
+ fields: object,
11
+ expectedTypes: Readonly<Record<string, string>>,
12
+ transforms: NameTransforms | undefined,
13
+ ): readonly string[] {
14
+ const queryFields = new Map(Object.keys(fields).map((name) => [transforms?.transformQueryNames?.(name) ?? name, name]));
15
+ function fieldName(name: string) {
16
+ return queryFields.get(name) ?? transforms?.transformResultNames?.(name) ?? name;
17
+ }
18
+ function columnKey(name: string) {
19
+ return transforms?.transformQueryNames === undefined ? fieldName(name) : name;
20
+ }
21
+ const actual = new Map(columns.map(({ name, type }) => [columnKey(name), type]));
22
+ const problems: string[] = [];
23
+ for (const name of Object.keys(fields)) {
24
+ const type = actual.get(transforms?.transformQueryNames?.(name) ?? name);
25
+ if (type === undefined) {
26
+ problems.push(`Missing column: ${name}`);
27
+ } else if (type !== expectedTypes[name]) {
28
+ problems.push(`Wrong type for ${name}: expected ${expectedTypes[name]}, received ${type}`);
29
+ }
30
+ if (!Object.hasOwn(expectedTypes, name)) {
31
+ problems.push(`Missing expected PostgreSQL type: ${name}`);
32
+ }
33
+ }
34
+ for (const column of columns) {
35
+ if (!queryFields.has(columnKey(column.name))) {
36
+ problems.push(`Extra column: ${fieldName(column.name)}`);
37
+ }
38
+ }
39
+ for (const name of Object.keys(expectedTypes)) {
40
+ if (!Object.hasOwn(fields, name)) {
41
+ problems.push(`Extra expected PostgreSQL type: ${name}`);
42
+ }
43
+ }
44
+ return problems;
45
+ }