supabase-tagged 0.1.0
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/index.d.ts +114 -0
- package/package.json +37 -0
package/index.d.ts
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { IsUnion, MergeDeep, OmitDeep, OptionalKeysOf, SetOptional, SimplifyDeep, TaggedUnion, UnionToIntersection } from "type-fest";
|
|
2
|
+
|
|
3
|
+
type ParseTablePath<S> = S extends string
|
|
4
|
+
? S extends `${infer Schema}.${infer Table}`
|
|
5
|
+
? {
|
|
6
|
+
schema: Schema;
|
|
7
|
+
table: Table;
|
|
8
|
+
}
|
|
9
|
+
: never
|
|
10
|
+
: never;
|
|
11
|
+
|
|
12
|
+
type TableSubtypeOptions = "Row" | "Insert" | "Update";
|
|
13
|
+
|
|
14
|
+
type TableSubtype<D, S extends PropertyKey, T extends PropertyKey, Subtype extends "Row" | "Insert" | "Update"> =
|
|
15
|
+
D extends { [K in S]: { Tables: { [K in T]: { [K in Subtype]: any } } } }
|
|
16
|
+
? D[S]["Tables"][T][Subtype]
|
|
17
|
+
: never;
|
|
18
|
+
|
|
19
|
+
type Table<D, S extends PropertyKey, T extends PropertyKey> = TableSubtype<D, S, T, "Row">;
|
|
20
|
+
|
|
21
|
+
type TableColumns<T> = T extends object
|
|
22
|
+
? Extract<keyof T, string | number>
|
|
23
|
+
: never
|
|
24
|
+
|
|
25
|
+
type TablesInSchema<D, S extends PropertyKey> = D extends Record<S, { Tables: infer Tables }>
|
|
26
|
+
? Tables extends Record<infer TableName, any>
|
|
27
|
+
? {
|
|
28
|
+
[T in TableName]: `${Extract<S, string | number>}.${Extract<T, string | number>}`
|
|
29
|
+
}[TableName]
|
|
30
|
+
: never
|
|
31
|
+
: never
|
|
32
|
+
|
|
33
|
+
type AllowedTablePath<D> = D extends Record<infer Schema, unknown>
|
|
34
|
+
? { [K in Schema]: TablesInSchema<D, K> }[Schema]
|
|
35
|
+
: never
|
|
36
|
+
|
|
37
|
+
type TableMapConfigInner<Table extends object, Tag extends keyof Table> = OptionalKeysOf<Table> extends never
|
|
38
|
+
? never
|
|
39
|
+
: IsUnion<NonNullable<Table[Tag]>> extends true
|
|
40
|
+
? [Tag, {
|
|
41
|
+
[K in Extract<Table[Tag], number | string>]: OptionalKeysOf<Table>
|
|
42
|
+
}]
|
|
43
|
+
: never;
|
|
44
|
+
|
|
45
|
+
type TableMapConfig<D, P> = ParseTablePath<P> extends { schema: infer Schema extends PropertyKey; table: infer TableName extends PropertyKey }
|
|
46
|
+
? Table<D, Schema, TableName> extends infer T extends object
|
|
47
|
+
? TableColumns<T> extends infer TCols extends keyof T
|
|
48
|
+
? NonNullable<{ [C in TCols]: TableMapConfigInner<T, C> }[TCols]>
|
|
49
|
+
: never
|
|
50
|
+
: never
|
|
51
|
+
: never
|
|
52
|
+
|
|
53
|
+
type TableToTaggedUnion<
|
|
54
|
+
Table extends object,
|
|
55
|
+
Tag,
|
|
56
|
+
Mapping,
|
|
57
|
+
Subtype extends TableSubtypeOptions,
|
|
58
|
+
> = Tag extends keyof Table
|
|
59
|
+
? Required<Table>[Tag] extends string
|
|
60
|
+
? Mapping extends Record<Required<Table>[Tag], any>
|
|
61
|
+
? TaggedUnion<Extract<Tag, string>, {
|
|
62
|
+
[MappedKey in keyof Mapping]:
|
|
63
|
+
{ [K in keyof Omit<Table, Tag | Mapping[keyof Mapping]>]: Table[K] } &
|
|
64
|
+
{ [ObjectKey in Mapping[MappedKey]]: NonNullable<Table[ObjectKey]> }
|
|
65
|
+
}> extends infer TUnion
|
|
66
|
+
? Subtype extends "Update"
|
|
67
|
+
? Partial<TUnion>
|
|
68
|
+
: Subtype extends "Insert"
|
|
69
|
+
? SetOptional<TUnion, Mapping[keyof Mapping] & OptionalKeysOf<Table>>
|
|
70
|
+
: TUnion
|
|
71
|
+
: never
|
|
72
|
+
: never
|
|
73
|
+
: never
|
|
74
|
+
: never;
|
|
75
|
+
|
|
76
|
+
type PrepareTableUnions<D, M> = {
|
|
77
|
+
[K in keyof M]: M[K] extends [infer TCol, infer MapConfig]
|
|
78
|
+
? ParseTablePath<K> extends { schema: infer Schema extends PropertyKey; table: infer TableName extends PropertyKey }
|
|
79
|
+
? {
|
|
80
|
+
[Subtype in TableSubtypeOptions as `${Extract<Schema, string>}.Tables.${Extract<TableName, string>}.${Subtype}`]:
|
|
81
|
+
TableSubtype<D, Schema, TableName, Subtype> extends infer T extends object
|
|
82
|
+
? TableToTaggedUnion<T, TCol, MapConfig, Subtype>
|
|
83
|
+
: never
|
|
84
|
+
} extends infer MappedTables
|
|
85
|
+
? SimplifyDeep<MappedTables>
|
|
86
|
+
: never
|
|
87
|
+
: never
|
|
88
|
+
: never
|
|
89
|
+
}[keyof M] extends infer MappedTablesUnion
|
|
90
|
+
? UnionToIntersection<MappedTablesUnion>
|
|
91
|
+
: never;
|
|
92
|
+
|
|
93
|
+
type PathToObject<Path extends string, Value> =
|
|
94
|
+
Path extends `${infer Head}.${infer Tail}`
|
|
95
|
+
? { [K in Head]: PathToObject<Tail, Value> }
|
|
96
|
+
: { [K in Path]: Value };
|
|
97
|
+
|
|
98
|
+
type OverrideDatabase<D, Entry> = Entry extends [infer Path extends string, infer Table]
|
|
99
|
+
? PathToObject<Path, Table> extends infer ObjectOverride
|
|
100
|
+
? MergeDeep<D, ObjectOverride>
|
|
101
|
+
: never
|
|
102
|
+
: never;
|
|
103
|
+
|
|
104
|
+
type PreparePartialUpdates<D, Entries extends object> = {
|
|
105
|
+
[K in keyof Entries]: OverrideDatabase<D, [K, Entries[K]]>
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
type OverwriteInitialType<D, Entries extends object> = UnionToIntersection<D | PreparePartialUpdates<D, Entries>[keyof Entries]>
|
|
109
|
+
|
|
110
|
+
export type Unionize<D, M extends {
|
|
111
|
+
[K in AllowedTablePath<D>]?: TableMapConfig<D, K>
|
|
112
|
+
}> = PrepareTableUnions<D, M> extends infer PreparedTables extends object
|
|
113
|
+
? OverwriteInitialType<OmitDeep<D, Extract<keyof PreparedTables, string>>, PreparedTables>
|
|
114
|
+
: never;
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "supabase-tagged",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A way to define tagged variants for records of a single table in Supabase",
|
|
5
|
+
"license": "(MIT OR Apache-2.0)",
|
|
6
|
+
"repository": "dsplce-co/supabase-tagged",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./index.d.ts"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"types": "./index.d.ts",
|
|
14
|
+
"sideEffects": false,
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=20"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"index.d.ts"
|
|
20
|
+
],
|
|
21
|
+
"keywords": [
|
|
22
|
+
"supabase",
|
|
23
|
+
"tagged",
|
|
24
|
+
"typescript",
|
|
25
|
+
"ts",
|
|
26
|
+
"types",
|
|
27
|
+
"utility",
|
|
28
|
+
"util",
|
|
29
|
+
"utilities"
|
|
30
|
+
],
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"typescript": "^5.9.2"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"type-fest": "^5.4.1"
|
|
36
|
+
}
|
|
37
|
+
}
|