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.
Files changed (2) hide show
  1. package/index.d.ts +114 -0
  2. 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
+ }