prostgles-types 4.0.311 → 4.0.313
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/JSONBSchemaValidation/getJSONBSchemaTSTypes.d.ts.map +1 -1
- package/dist/JSONBSchemaValidation/getJSONBSchemaTSTypes.js +2 -1
- package/dist/JSONBSchemaValidation/getJSONBSchemaTSTypes.js.map +1 -1
- package/dist/auditTable.d.ts +32 -0
- package/dist/auditTable.d.ts.map +1 -0
- package/dist/auditTable.js +33 -0
- package/dist/auditTable.js.map +1 -0
- package/dist/fileTable.d.ts +53 -0
- package/dist/fileTable.d.ts.map +1 -0
- package/dist/fileTable.js +39 -0
- package/dist/fileTable.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/index_umd.js +1 -1
- package/dist/jobControl.d.ts +2 -1
- package/dist/jobControl.d.ts.map +1 -1
- package/dist/jobTable.d.ts +149 -0
- package/dist/jobTable.d.ts.map +1 -0
- package/dist/jobTable.js +70 -0
- package/dist/jobTable.js.map +1 -0
- package/dist/selectFunctions.d.ts +2 -2
- package/dist/selectFunctions.d.ts.map +1 -1
- package/dist/tableRowFromColumnDefinitions.d.ts +79 -0
- package/dist/tableRowFromColumnDefinitions.d.ts.map +1 -0
- package/dist/tableRowFromColumnDefinitions.js +3 -0
- package/dist/tableRowFromColumnDefinitions.js.map +1 -0
- package/lib/JSONBSchemaValidation/getJSONBSchemaTSTypes.ts +2 -1
- package/lib/auditTable.ts +38 -0
- package/lib/fileTable.ts +62 -0
- package/lib/index.ts +4 -0
- package/lib/jobControl.ts +3 -2
- package/lib/jobTable.ts +95 -0
- package/lib/selectFunctions.ts +2 -0
- package/lib/tableRowFromColumnDefinitions.ts +220 -0
- package/package.json +1 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { JSONB } from "./JSONBSchemaValidation/JSONBSchema";
|
|
2
|
+
export type TableCheckValue = string | number | boolean | null;
|
|
3
|
+
export type TableCheckBranch = Record<string, TableCheckValue | {
|
|
4
|
+
enum: readonly TableCheckValue[];
|
|
5
|
+
} | {
|
|
6
|
+
$ne: null;
|
|
7
|
+
} | Record<string, never>>;
|
|
8
|
+
export type TableCheck = {
|
|
9
|
+
$or: readonly TableCheckBranch[];
|
|
10
|
+
};
|
|
11
|
+
export type ManagedTableColumnDefinition = string | {
|
|
12
|
+
enum: readonly (string | number)[];
|
|
13
|
+
nullable?: boolean;
|
|
14
|
+
} | {
|
|
15
|
+
jsonbSchema: JSONB.JSONBSchema;
|
|
16
|
+
nullable?: boolean;
|
|
17
|
+
};
|
|
18
|
+
export type ManagedTableSchema = {
|
|
19
|
+
columns: Record<string, ManagedTableColumnDefinition>;
|
|
20
|
+
check?: TableCheck;
|
|
21
|
+
};
|
|
22
|
+
/** Row types for the column definitions used by managed tables. */
|
|
23
|
+
export type TableRowFromColumnDefinitions<T extends Record<string, ManagedTableColumnDefinition>, Binary = ArrayBuffer | Uint8Array> = InsertRow<{
|
|
24
|
+
[K in keyof T]: T[K] extends string ? NormalizeSQL<Uppercase<T[K]>> : T[K];
|
|
25
|
+
}, Binary>;
|
|
26
|
+
/** Selected managed rows, narrowed by the same CHECK branches as the generated schema. */
|
|
27
|
+
export type TableRowFromTableConfig<T extends ManagedTableSchema, ValueTypes extends Partial<Record<keyof T["columns"], unknown>> = {}, Binary = ArrayBuffer | Uint8Array> = CheckedRow<{
|
|
28
|
+
[K in keyof T["columns"]]: K extends keyof ValueTypes ? ValueTypes[K] : TableRowFromColumnDefinitions<T["columns"], Binary> extends infer Row ? K extends keyof Row ? Required<Row>[K] : never : never;
|
|
29
|
+
}, T extends ({
|
|
30
|
+
check: {
|
|
31
|
+
$or: readonly (infer Branch extends TableCheckBranch)[];
|
|
32
|
+
};
|
|
33
|
+
}) ? Branch : undefined>;
|
|
34
|
+
/** Insert rows may omit nullable columns and columns supplied by database defaults. */
|
|
35
|
+
export type TableInsertRowFromTableConfig<T extends ManagedTableSchema, ValueTypes extends Partial<Record<keyof T["columns"], unknown>> = {}, Binary = ArrayBuffer | Uint8Array> = CheckedInsertRow<TableRowFromTableConfig<T, ValueTypes, Binary>, GeneratedColumnNames<{
|
|
36
|
+
[K in keyof T["columns"]]: T["columns"][K] extends string ? NormalizeSQL<Uppercase<T["columns"][K]>> : T["columns"][K];
|
|
37
|
+
}>>;
|
|
38
|
+
type CheckedInsertRow<Row, Defaults> = Row extends unknown ? Omit<Row, OptionalInsertKeys<Row, Defaults>> & Partial<Pick<Row, OptionalInsertKeys<Row, Defaults>>> : never;
|
|
39
|
+
type OptionalInsertKeys<Row, Defaults> = {
|
|
40
|
+
[K in keyof Row]: K extends Defaults ? K : null extends Row[K] ? K : never;
|
|
41
|
+
}[keyof Row];
|
|
42
|
+
type CheckedRow<Row, Branch> = Branch extends TableCheckBranch ? {
|
|
43
|
+
[K in keyof Row]: K extends keyof Branch ? Branch[K] extends {
|
|
44
|
+
$ne: null;
|
|
45
|
+
} ? NonNullable<Row[K]> : Branch[K] extends {
|
|
46
|
+
enum: readonly (infer V)[];
|
|
47
|
+
} ? V : Branch[K] extends Record<string, never> ? Row[K] : Branch[K] : null extends Row[K] ? null : Row[K];
|
|
48
|
+
} : Row;
|
|
49
|
+
type InsertRow<T extends Record<string, ManagedTableColumnDefinition>, Binary> = Omit<TableRow<T, Binary>, GeneratedColumnNames<T>> & Partial<Pick<TableRow<T, Binary>, GeneratedColumnNames<T>>>;
|
|
50
|
+
type TableRow<T extends Record<string, ManagedTableColumnDefinition>, Binary> = {
|
|
51
|
+
[K in keyof T]: T[K] extends ({
|
|
52
|
+
jsonbSchema: infer S extends JSONB.JSONBSchema;
|
|
53
|
+
}) ? JSONB.GetType<S> | (T[K] extends {
|
|
54
|
+
nullable: true;
|
|
55
|
+
} ? null : never) : T[K] extends {
|
|
56
|
+
enum: readonly (infer V)[];
|
|
57
|
+
} ? V | (T[K] extends {
|
|
58
|
+
nullable: true;
|
|
59
|
+
} ? null : never) : ColumnValue<T[K], Binary> | (T[K] extends string ? ColumnIsRequired<T[K]> extends true ? never : null : never);
|
|
60
|
+
};
|
|
61
|
+
type ColumnIsRequired<T extends string> = ReadType<T>[0] extends SerialType ? true : ` ${Unquoted<T>} ` extends (`${string} NOT NULL ${string}` | `${string} PRIMARY KEY ${string}` | `${string} GENERATED ${string} AS IDENTITY ${string}`) ? true : false;
|
|
62
|
+
type GeneratedColumnNames<T extends Record<string, ManagedTableColumnDefinition>> = {
|
|
63
|
+
[K in keyof T]: T[K] extends string ? ReadType<T[K]>[0] extends SerialType ? K : ` ${Unquoted<T[K]>} ` extends (`${string} DEFAULT ${string}` | `${string} GENERATED ${string}`) ? K : never : never;
|
|
64
|
+
}[keyof T];
|
|
65
|
+
type SerialType = "SMALLSERIAL" | "SERIAL2" | "SERIAL" | "SERIAL4" | "BIGSERIAL" | "SERIAL8";
|
|
66
|
+
type ColumnValue<T, Binary> = T extends string ? T extends `DOUBLE PRECISION${infer Rest}` ? ColumnValue<`FLOAT8${Rest}`, Binary> : ReadType<T> extends ([
|
|
67
|
+
infer Name extends string,
|
|
68
|
+
infer Rest extends string
|
|
69
|
+
]) ? ArrayValue<ScalarValue<Name, Binary>, Trim<Rest>> : never : never;
|
|
70
|
+
type ScalarValue<T, Binary> = T extends "BYTEA" ? Binary : T extends "JSON" | "JSONB" ? Record<string, unknown> : T extends "BOOL" | "BOOLEAN" ? boolean : T extends ("SMALLINT" | "INT2" | "INT" | "INTEGER" | "INT4" | "SMALLSERIAL" | "SERIAL2" | "SERIAL" | "SERIAL4" | "REAL" | "FLOAT" | "FLOAT4" | "FLOAT8") ? number : T extends ("BIGINT" | "INT8" | "BIGSERIAL" | "SERIAL8" | "NUMERIC" | "DECIMAL" | "DEC") ? string | number : string;
|
|
71
|
+
/** Only consume modifiers/array dimensions immediately following the type. */
|
|
72
|
+
type ArrayValue<Value, Rest extends string> = Rest extends `(${string})${infer Tail}` ? ArrayValue<Value, Trim<Tail>> : Rest extends `[${string}]${infer Tail}` ? ArrayValue<(Value | null)[], Trim<Tail>> : Rest extends "ARRAY" | `ARRAY ${string}` | `ARRAY[${string}` ? Rest extends `ARRAY${infer Tail}` ? Trim<Tail> extends `[${string}` ? ArrayValue<Value, Trim<Tail>> : (Value | null)[] : never : Value;
|
|
73
|
+
type ReadType<T extends string, Name extends string = ""> = T extends `${" " | "(" | "["}${string}` ? [Name, T] : T extends `${infer Char}${infer Rest}` ? ReadType<Rest, `${Name}${Char}`> : [Name, ""];
|
|
74
|
+
type Trim<T extends string> = T extends ` ${infer Rest}` ? Trim<Rest> : T extends `${infer Rest} ` ? Trim<Rest> : T;
|
|
75
|
+
type NormalizeSQL<T extends string> = T extends `${infer Start}\n${infer End}` ? NormalizeSQL<`${Start} ${End}`> : T extends `${infer Start}\r${infer End}` ? NormalizeSQL<`${Start} ${End}`> : T extends `${infer Start}\t${infer End}` ? NormalizeSQL<`${Start} ${End}`> : T extends `${infer Start} ${infer End}` ? NormalizeSQL<`${Start} ${End}`> : Trim<T>;
|
|
76
|
+
/** Quoted values and identifiers do not declare defaults or constraints. */
|
|
77
|
+
type Unquoted<T extends string> = T extends `${infer Start}'${string}'${infer End}` ? Unquoted<`${Start}${End}`> : T extends `${infer Start}"${string}"${infer End}` ? Unquoted<`${Start}${End}`> : T;
|
|
78
|
+
export {};
|
|
79
|
+
//# sourceMappingURL=tableRowFromColumnDefinitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tableRowFromColumnDefinitions.d.ts","sourceRoot":"","sources":["../lib/tableRowFromColumnDefinitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tableRowFromColumnDefinitions.js","sourceRoot":"","sources":["../lib/tableRowFromColumnDefinitions.ts"],"names":[],"mappings":""}
|
|
@@ -44,9 +44,10 @@ const getLookupTSType = (tables: TableSchema[], fieldType: JSONB.Lookup): string
|
|
|
44
44
|
return `${nullType}${postgresToTsType(udtName ?? "text")}${arrayType}`;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
/* Row lookups filter by supplied columns; a primary key alone is sufficient. */
|
|
47
48
|
const rowType =
|
|
48
49
|
!cols ? "any" : (
|
|
49
|
-
`{ ${cols.map((column) => `${JSON.stringify(column.name)}
|
|
50
|
+
`{ ${cols.map((column) => `${JSON.stringify(column.name)}?: ${column.is_nullable ? "null | " : ""} ${postgresToTsType(column.udt_name)}; `).join(" ")} }`
|
|
50
51
|
);
|
|
51
52
|
return `${nullType}${rowType}${arrayType}`;
|
|
52
53
|
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { TableRowFromColumnDefinitions } from "./tableRowFromColumnDefinitions";
|
|
2
|
+
|
|
3
|
+
export const AUDIT_TABLE_COLUMN_DEFINITIONS = {
|
|
4
|
+
id: "BIGSERIAL PRIMARY KEY",
|
|
5
|
+
created_at: "TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()",
|
|
6
|
+
schema_name: "TEXT NOT NULL",
|
|
7
|
+
table_name: "TEXT NOT NULL",
|
|
8
|
+
operation: { enum: ["INSERT", "UPDATE", "DELETE"] },
|
|
9
|
+
old_id: "JSONB",
|
|
10
|
+
new_id: "JSONB",
|
|
11
|
+
old_row: "JSONB",
|
|
12
|
+
new_row: "JSONB",
|
|
13
|
+
actor: "JSONB",
|
|
14
|
+
db_context: {
|
|
15
|
+
jsonbSchema: {
|
|
16
|
+
type: {
|
|
17
|
+
transaction_id: "string",
|
|
18
|
+
transaction_started_at: "string",
|
|
19
|
+
statement_started_at: "string",
|
|
20
|
+
current_role: "string",
|
|
21
|
+
session_user: "string",
|
|
22
|
+
application_name: "string",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
} as const;
|
|
27
|
+
|
|
28
|
+
export type AuditTableInsertRow = TableRowFromColumnDefinitions<
|
|
29
|
+
typeof AUDIT_TABLE_COLUMN_DEFINITIONS
|
|
30
|
+
>;
|
|
31
|
+
export type AuditTableRow = Required<AuditTableInsertRow>;
|
|
32
|
+
export const AUDIT_TABLE_COLUMN_NAMES = Object.fromEntries(
|
|
33
|
+
Object.keys(AUDIT_TABLE_COLUMN_DEFINITIONS).map((columnName) => [
|
|
34
|
+
columnName,
|
|
35
|
+
columnName,
|
|
36
|
+
]),
|
|
37
|
+
) as { [K in keyof AuditTableRow]: K };
|
|
38
|
+
export const AUDIT_TABLE_COLUMNS = Object.values(AUDIT_TABLE_COLUMN_NAMES);
|
package/lib/fileTable.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { TableRowFromColumnDefinitions } from "./tableRowFromColumnDefinitions";
|
|
2
|
+
import { omitKeys } from "./util";
|
|
3
|
+
|
|
4
|
+
export const FILE_TABLE_COLUMN_DEFINITIONS = {
|
|
5
|
+
id: `UUID PRIMARY KEY DEFAULT gen_random_uuid()`,
|
|
6
|
+
/* NULL for legacy objects stored under their file ID. */
|
|
7
|
+
storage_key: `UUID UNIQUE`,
|
|
8
|
+
extension: `TEXT NOT NULL DEFAULT ''`,
|
|
9
|
+
content_type: `TEXT NOT NULL DEFAULT ''`,
|
|
10
|
+
content_length: `BIGINT NOT NULL DEFAULT 0`,
|
|
11
|
+
etag: `TEXT NOT NULL DEFAULT ''`,
|
|
12
|
+
original_name: `TEXT NOT NULL`,
|
|
13
|
+
original_last_modified: `TIMESTAMPTZ`,
|
|
14
|
+
description: `TEXT`,
|
|
15
|
+
url: `TEXT NOT NULL DEFAULT ''`,
|
|
16
|
+
cloud_url: `TEXT`,
|
|
17
|
+
local_file_path: `TEXT`,
|
|
18
|
+
signed_url: `TEXT`,
|
|
19
|
+
signed_url_expires: `BIGINT`,
|
|
20
|
+
added: `TIMESTAMP NOT NULL DEFAULT NOW()`,
|
|
21
|
+
updated: `TIMESTAMP NOT NULL DEFAULT NOW()`,
|
|
22
|
+
deleted: `TIMESTAMPTZ`,
|
|
23
|
+
deleted_from_storage: `TIMESTAMPTZ`,
|
|
24
|
+
/* Actual bytes live in storage; this column only holds a placeholder. */
|
|
25
|
+
data: `BYTEA NOT NULL CHECK (data = decode('01', 'hex'))`,
|
|
26
|
+
} as const;
|
|
27
|
+
|
|
28
|
+
export const FILE_TABLE_VERSION_COLUMN_DEFINITIONS = {
|
|
29
|
+
version: `INTEGER NOT NULL DEFAULT 1`,
|
|
30
|
+
} as const;
|
|
31
|
+
|
|
32
|
+
export const FILE_VERSION_TABLE_COLUMN_DEFINITIONS = {
|
|
33
|
+
...omitKeys(FILE_TABLE_COLUMN_DEFINITIONS, ["data"]),
|
|
34
|
+
storage_key: `UUID NOT NULL`,
|
|
35
|
+
/* The server adds the foreign key constraint. */
|
|
36
|
+
file_id: `UUID NOT NULL`,
|
|
37
|
+
version: `INTEGER NOT NULL`,
|
|
38
|
+
created: `TIMESTAMP NOT NULL DEFAULT NOW()`,
|
|
39
|
+
} as const;
|
|
40
|
+
|
|
41
|
+
export type FileTableInsertRow<Binary = ArrayBuffer | Uint8Array> =
|
|
42
|
+
TableRowFromColumnDefinitions<typeof FILE_TABLE_COLUMN_DEFINITIONS, Binary> &
|
|
43
|
+
Partial<
|
|
44
|
+
TableRowFromColumnDefinitions<
|
|
45
|
+
typeof FILE_TABLE_VERSION_COLUMN_DEFINITIONS
|
|
46
|
+
>
|
|
47
|
+
>;
|
|
48
|
+
export type FileTableRow<Binary = ArrayBuffer | Uint8Array> = Required<
|
|
49
|
+
TableRowFromColumnDefinitions<typeof FILE_TABLE_COLUMN_DEFINITIONS, Binary>
|
|
50
|
+
> &
|
|
51
|
+
Partial<
|
|
52
|
+
Required<
|
|
53
|
+
TableRowFromColumnDefinitions<
|
|
54
|
+
typeof FILE_TABLE_VERSION_COLUMN_DEFINITIONS
|
|
55
|
+
>
|
|
56
|
+
>
|
|
57
|
+
>;
|
|
58
|
+
|
|
59
|
+
export type FileVersionTableInsertRow = TableRowFromColumnDefinitions<
|
|
60
|
+
typeof FILE_VERSION_TABLE_COLUMN_DEFINITIONS
|
|
61
|
+
>;
|
|
62
|
+
export type FileVersionTableRow = Required<FileVersionTableInsertRow>;
|
package/lib/index.ts
CHANGED
|
@@ -1731,7 +1731,11 @@ export const getPossibleNestedInsert = (
|
|
|
1731
1731
|
export * from "./auth";
|
|
1732
1732
|
export * from "./authContract";
|
|
1733
1733
|
export * from "./requestResponse";
|
|
1734
|
+
export * from "./auditTable";
|
|
1735
|
+
export * from "./jobTable";
|
|
1736
|
+
export * from "./tableRowFromColumnDefinitions";
|
|
1734
1737
|
export { CONTENT_TYPE_TO_EXT } from "./files";
|
|
1738
|
+
export * from "./fileTable";
|
|
1735
1739
|
export type {
|
|
1736
1740
|
ALLOWED_CONTENT_TYPE,
|
|
1737
1741
|
ALLOWED_EXTENSION,
|
package/lib/jobControl.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import type { JobRecord } from "./jobTable";
|
|
2
|
+
|
|
3
|
+
export type JobStatus = JobRecord["status"];
|
|
3
4
|
|
|
4
5
|
/** Start new work or retry failed/cancelled work; rerun succeeded work; cancel pending/running work. */
|
|
5
6
|
export type JobControlOperation = "startOrRetry" | "rerun" | "cancel";
|
package/lib/jobTable.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ManagedTableSchema,
|
|
3
|
+
TableInsertRowFromTableConfig,
|
|
4
|
+
TableRowFromTableConfig,
|
|
5
|
+
} from "./tableRowFromColumnDefinitions";
|
|
6
|
+
|
|
7
|
+
const shared = {
|
|
8
|
+
target_table: {},
|
|
9
|
+
user_id: {},
|
|
10
|
+
occurrence: {},
|
|
11
|
+
checkpoint: {},
|
|
12
|
+
progress_message: {},
|
|
13
|
+
progress_numeric: {},
|
|
14
|
+
backoff: { enum: ["fixed", "exponential"] },
|
|
15
|
+
reason: { enum: ["trigger", "rerun"] },
|
|
16
|
+
} as const;
|
|
17
|
+
|
|
18
|
+
export const jobTableSchema = {
|
|
19
|
+
columns: {
|
|
20
|
+
id: "UUID PRIMARY KEY",
|
|
21
|
+
job_name: "TEXT NOT NULL",
|
|
22
|
+
target_table: "TEXT",
|
|
23
|
+
target_row_pkey: "JSONB NOT NULL",
|
|
24
|
+
params: "JSONB NOT NULL",
|
|
25
|
+
user_id: "TEXT",
|
|
26
|
+
/**
|
|
27
|
+
* Scheduled cron time, rounded to a minute (five fields) or second (six fields).
|
|
28
|
+
* Together with job_name, prevents duplicate scheduling across workers and restarts.
|
|
29
|
+
* Null for row-triggered jobs and manual reruns.
|
|
30
|
+
*/
|
|
31
|
+
occurrence: "TIMESTAMPTZ",
|
|
32
|
+
reason: "TEXT NOT NULL DEFAULT 'trigger'",
|
|
33
|
+
status: "TEXT NOT NULL DEFAULT 'pending'",
|
|
34
|
+
attempts: "INTEGER NOT NULL DEFAULT 0",
|
|
35
|
+
max_attempts: "INTEGER NOT NULL",
|
|
36
|
+
delay_ms: "DOUBLE PRECISION NOT NULL",
|
|
37
|
+
backoff: "TEXT NOT NULL",
|
|
38
|
+
cancel_requested: "BOOLEAN NOT NULL DEFAULT FALSE",
|
|
39
|
+
checkpoint: "JSONB",
|
|
40
|
+
has_checkpoint: "BOOLEAN NOT NULL DEFAULT FALSE",
|
|
41
|
+
progress_message: "TEXT",
|
|
42
|
+
progress_numeric: {
|
|
43
|
+
nullable: true,
|
|
44
|
+
jsonbSchema: { type: { done: "number", total: "number" } },
|
|
45
|
+
},
|
|
46
|
+
error: "JSONB",
|
|
47
|
+
run_at: "TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()",
|
|
48
|
+
lease_token: "UUID",
|
|
49
|
+
locked_until: "TIMESTAMPTZ",
|
|
50
|
+
created_at: "TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()",
|
|
51
|
+
finished_at: "TIMESTAMPTZ",
|
|
52
|
+
},
|
|
53
|
+
check: {
|
|
54
|
+
$or: [
|
|
55
|
+
{ ...shared, status: "pending", error: {} },
|
|
56
|
+
{
|
|
57
|
+
...shared,
|
|
58
|
+
status: "running",
|
|
59
|
+
error: {},
|
|
60
|
+
lease_token: { $ne: null },
|
|
61
|
+
locked_until: { $ne: null },
|
|
62
|
+
},
|
|
63
|
+
{ ...shared, status: "succeeded", finished_at: { $ne: null } },
|
|
64
|
+
{
|
|
65
|
+
...shared,
|
|
66
|
+
status: "failed",
|
|
67
|
+
error: { $ne: null },
|
|
68
|
+
finished_at: { $ne: null },
|
|
69
|
+
},
|
|
70
|
+
{ ...shared, status: "cancelled", error: {}, finished_at: { $ne: null } },
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
} as const satisfies ManagedTableSchema;
|
|
74
|
+
|
|
75
|
+
export type JobValue =
|
|
76
|
+
| null
|
|
77
|
+
| string
|
|
78
|
+
| number
|
|
79
|
+
| boolean
|
|
80
|
+
| readonly JobValue[]
|
|
81
|
+
| { readonly [key: string]: JobValue };
|
|
82
|
+
type JobValues = {
|
|
83
|
+
target_row_pkey: Record<string, JobValue>;
|
|
84
|
+
params: Record<string, JobValue>;
|
|
85
|
+
checkpoint: JobValue | null;
|
|
86
|
+
error: JobValue;
|
|
87
|
+
};
|
|
88
|
+
export type JobRecord = TableRowFromTableConfig<
|
|
89
|
+
typeof jobTableSchema,
|
|
90
|
+
JobValues
|
|
91
|
+
>;
|
|
92
|
+
export type JobInsertRecord = TableInsertRowFromTableConfig<
|
|
93
|
+
typeof jobTableSchema,
|
|
94
|
+
JobValues
|
|
95
|
+
>;
|
package/lib/selectFunctions.ts
CHANGED
|
@@ -102,6 +102,7 @@ export type FunctionName =
|
|
|
102
102
|
| "$jsonb_strip_nulls"
|
|
103
103
|
| "$array_element"
|
|
104
104
|
| "$array_search"
|
|
105
|
+
| "$jsonb_diff_text"
|
|
105
106
|
| "$array_agg"
|
|
106
107
|
| "$json_agg"
|
|
107
108
|
| "$jsonb_agg";
|
|
@@ -119,6 +120,7 @@ export type FunctionReturnTypes<ColumnType = any> = {
|
|
|
119
120
|
ColumnType extends readonly (infer ElementType)[] ? ElementType | null
|
|
120
121
|
: null
|
|
121
122
|
: Name extends "$array_search" ? { index: number; offset: number; match: string; snippet: string }[]
|
|
123
|
+
: Name extends "$jsonb_diff_text" ? string
|
|
122
124
|
: Name extends "$column" | "$max" | "$min" | "$jsonb_set" | "$jsonb_strip_nulls" ? ColumnType
|
|
123
125
|
: Name extends "$array_agg" | "$json_agg" | "$jsonb_agg" ? ColumnType[]
|
|
124
126
|
: any;
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import type { JSONB } from "./JSONBSchemaValidation/JSONBSchema";
|
|
2
|
+
|
|
3
|
+
export type TableCheckValue = string | number | boolean | null;
|
|
4
|
+
export type TableCheckBranch = Record<
|
|
5
|
+
string,
|
|
6
|
+
| TableCheckValue
|
|
7
|
+
| { enum: readonly TableCheckValue[] }
|
|
8
|
+
| { $ne: null }
|
|
9
|
+
| Record<string, never>
|
|
10
|
+
>;
|
|
11
|
+
export type TableCheck = { $or: readonly TableCheckBranch[] };
|
|
12
|
+
|
|
13
|
+
export type ManagedTableColumnDefinition =
|
|
14
|
+
| string
|
|
15
|
+
| { enum: readonly (string | number)[]; nullable?: boolean }
|
|
16
|
+
| { jsonbSchema: JSONB.JSONBSchema; nullable?: boolean };
|
|
17
|
+
|
|
18
|
+
export type ManagedTableSchema = {
|
|
19
|
+
columns: Record<string, ManagedTableColumnDefinition>;
|
|
20
|
+
check?: TableCheck;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/** Row types for the column definitions used by managed tables. */
|
|
24
|
+
export type TableRowFromColumnDefinitions<
|
|
25
|
+
T extends Record<string, ManagedTableColumnDefinition>,
|
|
26
|
+
Binary = ArrayBuffer | Uint8Array,
|
|
27
|
+
> = InsertRow<
|
|
28
|
+
{
|
|
29
|
+
[K in keyof T]: T[K] extends string ? NormalizeSQL<Uppercase<T[K]>> : T[K];
|
|
30
|
+
},
|
|
31
|
+
Binary
|
|
32
|
+
>;
|
|
33
|
+
|
|
34
|
+
/** Selected managed rows, narrowed by the same CHECK branches as the generated schema. */
|
|
35
|
+
export type TableRowFromTableConfig<
|
|
36
|
+
T extends ManagedTableSchema,
|
|
37
|
+
ValueTypes extends Partial<Record<keyof T["columns"], unknown>> = {},
|
|
38
|
+
Binary = ArrayBuffer | Uint8Array,
|
|
39
|
+
> = CheckedRow<
|
|
40
|
+
{
|
|
41
|
+
[K in keyof T["columns"]]: K extends keyof ValueTypes ? ValueTypes[K]
|
|
42
|
+
: TableRowFromColumnDefinitions<T["columns"], Binary> extends infer Row ?
|
|
43
|
+
K extends keyof Row ?
|
|
44
|
+
Required<Row>[K]
|
|
45
|
+
: never
|
|
46
|
+
: never;
|
|
47
|
+
},
|
|
48
|
+
T extends (
|
|
49
|
+
{ check: { $or: readonly (infer Branch extends TableCheckBranch)[] } }
|
|
50
|
+
) ?
|
|
51
|
+
Branch
|
|
52
|
+
: undefined
|
|
53
|
+
>;
|
|
54
|
+
|
|
55
|
+
/** Insert rows may omit nullable columns and columns supplied by database defaults. */
|
|
56
|
+
export type TableInsertRowFromTableConfig<
|
|
57
|
+
T extends ManagedTableSchema,
|
|
58
|
+
ValueTypes extends Partial<Record<keyof T["columns"], unknown>> = {},
|
|
59
|
+
Binary = ArrayBuffer | Uint8Array,
|
|
60
|
+
> = CheckedInsertRow<
|
|
61
|
+
TableRowFromTableConfig<T, ValueTypes, Binary>,
|
|
62
|
+
GeneratedColumnNames<{
|
|
63
|
+
[K in keyof T["columns"]]: T["columns"][K] extends string ?
|
|
64
|
+
NormalizeSQL<Uppercase<T["columns"][K]>>
|
|
65
|
+
: T["columns"][K];
|
|
66
|
+
}>
|
|
67
|
+
>;
|
|
68
|
+
|
|
69
|
+
type CheckedInsertRow<Row, Defaults> =
|
|
70
|
+
Row extends unknown ?
|
|
71
|
+
Omit<Row, OptionalInsertKeys<Row, Defaults>> &
|
|
72
|
+
Partial<Pick<Row, OptionalInsertKeys<Row, Defaults>>>
|
|
73
|
+
: never;
|
|
74
|
+
|
|
75
|
+
type OptionalInsertKeys<Row, Defaults> = {
|
|
76
|
+
[K in keyof Row]: K extends Defaults ? K
|
|
77
|
+
: null extends Row[K] ? K
|
|
78
|
+
: never;
|
|
79
|
+
}[keyof Row];
|
|
80
|
+
|
|
81
|
+
type CheckedRow<Row, Branch> =
|
|
82
|
+
Branch extends TableCheckBranch ?
|
|
83
|
+
{
|
|
84
|
+
[K in keyof Row]: K extends keyof Branch ?
|
|
85
|
+
Branch[K] extends { $ne: null } ? NonNullable<Row[K]>
|
|
86
|
+
: Branch[K] extends { enum: readonly (infer V)[] } ? V
|
|
87
|
+
: Branch[K] extends Record<string, never> ? Row[K]
|
|
88
|
+
: Branch[K]
|
|
89
|
+
: null extends Row[K] ? null
|
|
90
|
+
: Row[K];
|
|
91
|
+
}
|
|
92
|
+
: Row;
|
|
93
|
+
|
|
94
|
+
type InsertRow<
|
|
95
|
+
T extends Record<string, ManagedTableColumnDefinition>,
|
|
96
|
+
Binary,
|
|
97
|
+
> = Omit<TableRow<T, Binary>, GeneratedColumnNames<T>> &
|
|
98
|
+
Partial<Pick<TableRow<T, Binary>, GeneratedColumnNames<T>>>;
|
|
99
|
+
|
|
100
|
+
type TableRow<
|
|
101
|
+
T extends Record<string, ManagedTableColumnDefinition>,
|
|
102
|
+
Binary,
|
|
103
|
+
> = {
|
|
104
|
+
[K in keyof T]: T[K] extends (
|
|
105
|
+
{
|
|
106
|
+
jsonbSchema: infer S extends JSONB.JSONBSchema;
|
|
107
|
+
}
|
|
108
|
+
) ?
|
|
109
|
+
JSONB.GetType<S> | (T[K] extends { nullable: true } ? null : never)
|
|
110
|
+
: T[K] extends { enum: readonly (infer V)[] } ?
|
|
111
|
+
V | (T[K] extends { nullable: true } ? null : never)
|
|
112
|
+
: | ColumnValue<T[K], Binary>
|
|
113
|
+
| (T[K] extends string ?
|
|
114
|
+
ColumnIsRequired<T[K]> extends true ?
|
|
115
|
+
never
|
|
116
|
+
: null
|
|
117
|
+
: never);
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
type ColumnIsRequired<T extends string> =
|
|
121
|
+
ReadType<T>[0] extends SerialType ? true
|
|
122
|
+
: ` ${Unquoted<T>} ` extends (
|
|
123
|
+
|
|
124
|
+
| `${string} NOT NULL ${string}`
|
|
125
|
+
| `${string} PRIMARY KEY ${string}`
|
|
126
|
+
| `${string} GENERATED ${string} AS IDENTITY ${string}`
|
|
127
|
+
) ?
|
|
128
|
+
true
|
|
129
|
+
: false;
|
|
130
|
+
|
|
131
|
+
type GeneratedColumnNames<
|
|
132
|
+
T extends Record<string, ManagedTableColumnDefinition>,
|
|
133
|
+
> = {
|
|
134
|
+
[K in keyof T]: T[K] extends string ?
|
|
135
|
+
ReadType<T[K]>[0] extends SerialType ? K
|
|
136
|
+
: ` ${Unquoted<T[K]>} ` extends (
|
|
137
|
+
`${string} DEFAULT ${string}` | `${string} GENERATED ${string}`
|
|
138
|
+
) ?
|
|
139
|
+
K
|
|
140
|
+
: never
|
|
141
|
+
: never;
|
|
142
|
+
}[keyof T];
|
|
143
|
+
|
|
144
|
+
type SerialType =
|
|
145
|
+
"SMALLSERIAL" | "SERIAL2" | "SERIAL" | "SERIAL4" | "BIGSERIAL" | "SERIAL8";
|
|
146
|
+
|
|
147
|
+
type ColumnValue<T, Binary> =
|
|
148
|
+
T extends string ?
|
|
149
|
+
T extends `DOUBLE PRECISION${infer Rest}` ?
|
|
150
|
+
ColumnValue<`FLOAT8${Rest}`, Binary>
|
|
151
|
+
: ReadType<T> extends (
|
|
152
|
+
[infer Name extends string, infer Rest extends string]
|
|
153
|
+
) ?
|
|
154
|
+
ArrayValue<ScalarValue<Name, Binary>, Trim<Rest>>
|
|
155
|
+
: never
|
|
156
|
+
: never;
|
|
157
|
+
|
|
158
|
+
type ScalarValue<T, Binary> =
|
|
159
|
+
T extends "BYTEA" ? Binary
|
|
160
|
+
: T extends "JSON" | "JSONB" ? Record<string, unknown>
|
|
161
|
+
: T extends "BOOL" | "BOOLEAN" ? boolean
|
|
162
|
+
: T extends (
|
|
163
|
+
|
|
164
|
+
| "SMALLINT"
|
|
165
|
+
| "INT2"
|
|
166
|
+
| "INT"
|
|
167
|
+
| "INTEGER"
|
|
168
|
+
| "INT4"
|
|
169
|
+
| "SMALLSERIAL"
|
|
170
|
+
| "SERIAL2"
|
|
171
|
+
| "SERIAL"
|
|
172
|
+
| "SERIAL4"
|
|
173
|
+
| "REAL"
|
|
174
|
+
| "FLOAT"
|
|
175
|
+
| "FLOAT4"
|
|
176
|
+
| "FLOAT8"
|
|
177
|
+
) ?
|
|
178
|
+
number
|
|
179
|
+
: T extends (
|
|
180
|
+
"BIGINT" | "INT8" | "BIGSERIAL" | "SERIAL8" | "NUMERIC" | "DECIMAL" | "DEC"
|
|
181
|
+
) ?
|
|
182
|
+
string | number
|
|
183
|
+
: string;
|
|
184
|
+
|
|
185
|
+
/** Only consume modifiers/array dimensions immediately following the type. */
|
|
186
|
+
type ArrayValue<Value, Rest extends string> =
|
|
187
|
+
Rest extends `(${string})${infer Tail}` ? ArrayValue<Value, Trim<Tail>>
|
|
188
|
+
: Rest extends `[${string}]${infer Tail}` ?
|
|
189
|
+
ArrayValue<(Value | null)[], Trim<Tail>>
|
|
190
|
+
: Rest extends "ARRAY" | `ARRAY ${string}` | `ARRAY[${string}` ?
|
|
191
|
+
Rest extends `ARRAY${infer Tail}` ?
|
|
192
|
+
Trim<Tail> extends `[${string}` ?
|
|
193
|
+
ArrayValue<Value, Trim<Tail>>
|
|
194
|
+
: (Value | null)[]
|
|
195
|
+
: never
|
|
196
|
+
: Value;
|
|
197
|
+
|
|
198
|
+
type ReadType<T extends string, Name extends string = ""> =
|
|
199
|
+
T extends `${" " | "(" | "["}${string}` ? [Name, T]
|
|
200
|
+
: T extends `${infer Char}${infer Rest}` ? ReadType<Rest, `${Name}${Char}`>
|
|
201
|
+
: [Name, ""];
|
|
202
|
+
|
|
203
|
+
type Trim<T extends string> =
|
|
204
|
+
T extends ` ${infer Rest}` ? Trim<Rest>
|
|
205
|
+
: T extends `${infer Rest} ` ? Trim<Rest>
|
|
206
|
+
: T;
|
|
207
|
+
|
|
208
|
+
type NormalizeSQL<T extends string> =
|
|
209
|
+
T extends `${infer Start}\n${infer End}` ? NormalizeSQL<`${Start} ${End}`>
|
|
210
|
+
: T extends `${infer Start}\r${infer End}` ? NormalizeSQL<`${Start} ${End}`>
|
|
211
|
+
: T extends `${infer Start}\t${infer End}` ? NormalizeSQL<`${Start} ${End}`>
|
|
212
|
+
: T extends `${infer Start} ${infer End}` ? NormalizeSQL<`${Start} ${End}`>
|
|
213
|
+
: Trim<T>;
|
|
214
|
+
|
|
215
|
+
/** Quoted values and identifiers do not declare defaults or constraints. */
|
|
216
|
+
type Unquoted<T extends string> =
|
|
217
|
+
T extends `${infer Start}'${string}'${infer End}` ? Unquoted<`${Start}${End}`>
|
|
218
|
+
: T extends `${infer Start}"${string}"${infer End}` ?
|
|
219
|
+
Unquoted<`${Start}${End}`>
|
|
220
|
+
: T;
|