@ailnaf/zoddb 0.0.0-stage → 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 (93) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +15 -0
  3. package/README.md +412 -2
  4. package/dist/aggregate.d.ts +42 -0
  5. package/dist/aggregate.d.ts.map +1 -0
  6. package/dist/aggregate.js +77 -0
  7. package/dist/aggregate.js.map +1 -0
  8. package/dist/auth-schema.d.ts +26 -0
  9. package/dist/auth-schema.d.ts.map +1 -0
  10. package/dist/auth-schema.js +139 -0
  11. package/dist/auth-schema.js.map +1 -0
  12. package/dist/better-auth-adapter.d.ts +21 -0
  13. package/dist/better-auth-adapter.d.ts.map +1 -0
  14. package/dist/better-auth-adapter.js +175 -0
  15. package/dist/better-auth-adapter.js.map +1 -0
  16. package/dist/cli.d.ts +3 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +341 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/config.d.ts +22 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +52 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/db.d.ts +183 -0
  25. package/dist/db.d.ts.map +1 -0
  26. package/dist/db.js +946 -0
  27. package/dist/db.js.map +1 -0
  28. package/dist/ddl.d.ts +21 -0
  29. package/dist/ddl.d.ts.map +1 -0
  30. package/dist/ddl.js +127 -0
  31. package/dist/ddl.js.map +1 -0
  32. package/dist/dev.d.ts +9 -0
  33. package/dist/dev.d.ts.map +1 -0
  34. package/dist/dev.js +21 -0
  35. package/dist/dev.js.map +1 -0
  36. package/dist/errors.d.ts +63 -0
  37. package/dist/errors.d.ts.map +1 -0
  38. package/dist/errors.js +122 -0
  39. package/dist/errors.js.map +1 -0
  40. package/dist/filter.d.ts +66 -0
  41. package/dist/filter.d.ts.map +1 -0
  42. package/dist/filter.js +219 -0
  43. package/dist/filter.js.map +1 -0
  44. package/dist/graph.d.ts +54 -0
  45. package/dist/graph.d.ts.map +1 -0
  46. package/dist/graph.js +52 -0
  47. package/dist/graph.js.map +1 -0
  48. package/dist/index.d.ts +8 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +6 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/init.d.ts +12 -0
  53. package/dist/init.d.ts.map +1 -0
  54. package/dist/init.js +62 -0
  55. package/dist/init.js.map +1 -0
  56. package/dist/migrate.d.ts +58 -0
  57. package/dist/migrate.d.ts.map +1 -0
  58. package/dist/migrate.js +447 -0
  59. package/dist/migrate.js.map +1 -0
  60. package/dist/migrations.d.ts +80 -0
  61. package/dist/migrations.d.ts.map +1 -0
  62. package/dist/migrations.js +281 -0
  63. package/dist/migrations.js.map +1 -0
  64. package/dist/relation-graph.d.ts +50 -0
  65. package/dist/relation-graph.d.ts.map +1 -0
  66. package/dist/relation-graph.js +93 -0
  67. package/dist/relation-graph.js.map +1 -0
  68. package/dist/relations.d.ts +94 -0
  69. package/dist/relations.d.ts.map +1 -0
  70. package/dist/relations.js +21 -0
  71. package/dist/relations.js.map +1 -0
  72. package/dist/schema.d.ts +247 -0
  73. package/dist/schema.d.ts.map +1 -0
  74. package/dist/schema.js +584 -0
  75. package/dist/schema.js.map +1 -0
  76. package/dist/studio/page.d.ts +3 -0
  77. package/dist/studio/page.d.ts.map +1 -0
  78. package/dist/studio/page.js +708 -0
  79. package/dist/studio/page.js.map +1 -0
  80. package/dist/studio/server.d.ts +26 -0
  81. package/dist/studio/server.d.ts.map +1 -0
  82. package/dist/studio/server.js +415 -0
  83. package/dist/studio/server.js.map +1 -0
  84. package/dist/table.d.ts +156 -0
  85. package/dist/table.d.ts.map +1 -0
  86. package/dist/table.js +165 -0
  87. package/dist/table.js.map +1 -0
  88. package/dist/where.d.ts +18 -0
  89. package/dist/where.d.ts.map +1 -0
  90. package/dist/where.js +76 -0
  91. package/dist/where.js.map +1 -0
  92. package/docs/api.md +444 -0
  93. package/package.json +70 -4
package/dist/filter.js ADDED
@@ -0,0 +1,219 @@
1
+ import { resolveRelationColumn } from './relations.js';
2
+ const OPS = new Set([
3
+ 'eq', 'ne', 'lt', 'lte', 'gt', 'gte', 'in', 'notIn',
4
+ 'like', 'contains', 'startsWith', 'endsWith', 'isNull', 'mode',
5
+ ]);
6
+ const quoteIdent = (s) => `"${s.replace(/"/g, '""')}"`;
7
+ export const escapeLike = (s) => s.replace(/[\\%_]/g, m => `\\${m}`);
8
+ const isPlainObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v) && !(v instanceof Date) && !(v instanceof Uint8Array);
9
+ function compileField(col, v, push) {
10
+ if (v === null)
11
+ return `${col} is null`;
12
+ if (!isPlainObject(v))
13
+ return `${col} = ${push(v)}`;
14
+ if (!Object.keys(v).some(k => OPS.has(k)))
15
+ return `${col} = ${push(v)}`; // jsonb 等值
16
+ const mode = v.mode;
17
+ const likeOp = mode === 'insensitive' ? 'ilike' : 'like';
18
+ const parts = [];
19
+ for (const [op, val] of Object.entries(v)) {
20
+ if (op === 'mode' || val === undefined)
21
+ continue;
22
+ switch (op) {
23
+ case 'eq':
24
+ parts.push(val === null ? `${col} is null` : `${col} = ${push(val)}`);
25
+ break;
26
+ case 'ne':
27
+ parts.push(val === null ? `${col} is not null` : `${col} <> ${push(val)}`);
28
+ break;
29
+ case 'lt':
30
+ parts.push(`${col} < ${push(val)}`);
31
+ break;
32
+ case 'lte':
33
+ parts.push(`${col} <= ${push(val)}`);
34
+ break;
35
+ case 'gt':
36
+ parts.push(`${col} > ${push(val)}`);
37
+ break;
38
+ case 'gte':
39
+ parts.push(`${col} >= ${push(val)}`);
40
+ break;
41
+ case 'in': {
42
+ const arr = val;
43
+ parts.push(arr.length === 0 ? 'false' : `${col} = any(${push(arr)})`);
44
+ break;
45
+ }
46
+ case 'notIn': {
47
+ const arr = val;
48
+ parts.push(arr.length === 0 ? 'true' : `not (${col} = any(${push(arr)}))`);
49
+ break;
50
+ }
51
+ case 'like':
52
+ parts.push(`${col} ${likeOp} ${push(val)}`);
53
+ break;
54
+ case 'contains':
55
+ parts.push(`${col} ${likeOp} ${push(`%${escapeLike(String(val))}%`)} escape '\\'`);
56
+ break;
57
+ case 'startsWith':
58
+ parts.push(`${col} ${likeOp} ${push(`${escapeLike(String(val))}%`)} escape '\\'`);
59
+ break;
60
+ case 'endsWith':
61
+ parts.push(`${col} ${likeOp} ${push(`%${escapeLike(String(val))}`)} escape '\\'`);
62
+ break;
63
+ case 'isNull':
64
+ parts.push(val ? `${col} is null` : `${col} is not null`);
65
+ break;
66
+ default: throw new Error(`where: 未知操作符 ${op}`);
67
+ }
68
+ }
69
+ return parts.length === 0 ? null : parts.join(' and ');
70
+ }
71
+ export function compileWhere(table, filter, offset = 0, relations = [], sourceAlias) {
72
+ const params = [];
73
+ const push = (x) => {
74
+ params.push(x);
75
+ return `$${offset + params.length}`;
76
+ };
77
+ let aliasSeq = 0;
78
+ const maxRelationDepth = 2;
79
+ const compile = (f, alias, currentTable = table, depth = 0) => {
80
+ const parts = [];
81
+ const obj = f;
82
+ const rels = relations.find(r => r.table === currentTable);
83
+ for (const [k, v] of Object.entries(obj)) {
84
+ if (v === undefined || k === 'AND' || k === 'OR' || k === 'NOT')
85
+ continue;
86
+ const plan = currentTable.__plan.find(p => p.outKey === k);
87
+ if (plan) {
88
+ const col = alias ? `${quoteIdent(alias)}.${quoteIdent(plan.dbKey)}` : quoteIdent(plan.dbKey);
89
+ const text = compileField(col, v, push);
90
+ if (text)
91
+ parts.push(text);
92
+ continue;
93
+ }
94
+ const def = rels?.map[k];
95
+ if (!def)
96
+ throw new Error(`where: 未知列 ${currentTable.name}.${k}`);
97
+ if (depth >= maxRelationDepth) {
98
+ throw new Error(`where: 关系过滤超过最大深度 ${maxRelationDepth}`);
99
+ }
100
+ if (!isPlainObject(v))
101
+ throw new Error(`where: 关系 ${currentTable.name}.${k} 需要 { some } 或 { none }`);
102
+ const ops = Object.entries(v).filter(([, value]) => value !== undefined);
103
+ if (ops.length === 0)
104
+ continue;
105
+ for (const [op, value] of ops) {
106
+ if (op !== 'some' && op !== 'none') {
107
+ throw new Error(`where: 关系 ${currentTable.name}.${k} 只支持 some/none(收到 ${op})`);
108
+ }
109
+ if (!isPlainObject(value))
110
+ throw new Error(`where: 关系 ${currentTable.name}.${k}.${op} 必须是对象`);
111
+ const target = def.table;
112
+ const fromCol = resolveRelationColumn(def.from);
113
+ const toCol = resolveRelationColumn(def.to);
114
+ const sourceRef = alias
115
+ ? `${quoteIdent(alias)}.${quoteIdent(fromCol.dbKey)}`
116
+ : `${quoteIdent(currentTable.name)}.${quoteIdent(fromCol.dbKey)}`;
117
+ let sub;
118
+ let targetAliasName;
119
+ if (def.through) {
120
+ const throughFrom = resolveRelationColumn(def.through.from);
121
+ const throughTo = resolveRelationColumn(def.through.to);
122
+ const throughAlias = quoteIdent(`t${aliasSeq++}`);
123
+ targetAliasName = `r${aliasSeq++}`;
124
+ const targetAlias = quoteIdent(targetAliasName);
125
+ sub = `select 1 from ${quoteIdent(def.through.table.name)} as ${throughAlias}`
126
+ + ` join ${quoteIdent(target.name)} as ${targetAlias}`
127
+ + ` on ${targetAlias}.${quoteIdent(toCol.dbKey)} = ${throughAlias}.${quoteIdent(throughTo.dbKey)}`
128
+ + ` where ${throughAlias}.${quoteIdent(throughFrom.dbKey)} = ${sourceRef}`;
129
+ }
130
+ else {
131
+ targetAliasName = `r${aliasSeq++}`;
132
+ const targetAlias = quoteIdent(targetAliasName);
133
+ sub = `select 1 from ${quoteIdent(target.name)} as ${targetAlias} where ${targetAlias}.${quoteIdent(toCol.dbKey)} = ${sourceRef}`;
134
+ }
135
+ const predicate = compile(value, targetAliasName, target, depth + 1);
136
+ if (predicate)
137
+ sub += ` and (${predicate})`;
138
+ parts.push(op === 'some' ? `exists (${sub})` : `not exists (${sub})`);
139
+ }
140
+ }
141
+ const and = obj.AND;
142
+ if (and)
143
+ for (const sub of and) {
144
+ const t = compile(sub, alias, currentTable, depth);
145
+ if (t)
146
+ parts.push(t);
147
+ }
148
+ const or = obj.OR;
149
+ if (or)
150
+ parts.push(or.length === 0 ? 'false' : `(${or.map(sub => compile(sub, alias, currentTable, depth) || 'true').join(' or ')})`);
151
+ const not = obj.NOT;
152
+ if (not)
153
+ parts.push(`not (${compile(not, alias, currentTable, depth) || 'true'})`);
154
+ return parts.length === 0 ? '' : parts.length === 1 ? parts[0] : `(${parts.join(' and ')})`;
155
+ };
156
+ return { text: compile(filter, sourceAlias), params };
157
+ }
158
+ /** keyset:把游标编译为参数化条件;startParam 用于与 where 参数拼接 */
159
+ export function compileCursor(table, orderBy, cursor, startParam) {
160
+ if (!orderBy)
161
+ throw new Error('cursor: 需要同时提供 orderBy');
162
+ const items = Array.isArray(orderBy) ? orderBy : [orderBy];
163
+ const order = [];
164
+ for (const item of items) {
165
+ for (const [k, dir] of Object.entries(item)) {
166
+ const plan = table.__plan.find(p => p.outKey === k);
167
+ if (!plan)
168
+ throw new Error(`cursor: 未知列 ${table.name}.${k}`);
169
+ if (dir !== 'asc' && dir !== 'desc')
170
+ throw new Error(`cursor: 方向必须是 asc 或 desc(${k})`);
171
+ order.push([k, dir]);
172
+ }
173
+ }
174
+ if (order.length === 0)
175
+ throw new Error('cursor: orderBy 不能为空');
176
+ for (const k of Object.keys(cursor)) {
177
+ if (!order.some(([c]) => c === k))
178
+ throw new Error(`cursor 含未知列 ${table.name}.${k}`);
179
+ }
180
+ const values = order.map(([k]) => {
181
+ const v = cursor[k];
182
+ if (v === undefined)
183
+ throw new Error(`cursor 缺少排序列 ${k}`);
184
+ if (v === null)
185
+ throw new Error(`cursor 不能为 null(${k})`);
186
+ return v;
187
+ });
188
+ const cols = order.map(([k]) => quoteIdent(table.__plan.find(p => p.outKey === k).dbKey));
189
+ const placeholders = order.map((_, i) => `$${startParam + i}`);
190
+ const dirs = order.map(([, d]) => d);
191
+ if (dirs.every(d => d === dirs[0])) {
192
+ return {
193
+ text: `(${cols.join(', ')}) ${dirs[0] === 'asc' ? '>' : '<'} (${placeholders.join(', ')})`,
194
+ params: values,
195
+ };
196
+ }
197
+ const terms = order.map(([k, dir], i) => {
198
+ const parts = order.slice(0, i).map(([prev], j) => `${quoteIdent(table.__plan.find(p => p.outKey === prev).dbKey)} = $${startParam + j}`);
199
+ parts.push(`${cols[i]} ${dir === 'asc' ? '>' : '<'} $${startParam + i}`);
200
+ return `(${parts.join(' and ')})`;
201
+ });
202
+ return { text: `(${terms.join(' or ')})`, params: values };
203
+ }
204
+ export function compileOrderBy(table, orderBy) {
205
+ const items = Array.isArray(orderBy) ? orderBy : [orderBy];
206
+ const parts = [];
207
+ for (const item of items) {
208
+ for (const [k, dir] of Object.entries(item)) {
209
+ const plan = table.__plan.find(p => p.outKey === k);
210
+ if (!plan)
211
+ throw new Error(`orderBy: 未知列 ${table.name}.${k}`);
212
+ if (dir !== 'asc' && dir !== 'desc')
213
+ throw new Error(`orderBy: 方向必须是 asc 或 desc(${k})`);
214
+ parts.push(`${quoteIdent(plan.dbKey)} ${dir}`);
215
+ }
216
+ }
217
+ return parts.join(', ');
218
+ }
219
+ //# sourceMappingURL=filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../src/filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { ZodOnDelete, ZodRelationSpec } from './schema.js';
2
+ export interface EdgeOptions<From extends string = string, To extends string = string> {
3
+ /** 源表字段(outKey) */
4
+ from: From;
5
+ /** 目标列;默认目标表主键 id */
6
+ to?: To;
7
+ kind?: 'one' | 'many';
8
+ onDelete?: ZodOnDelete;
9
+ /** false 时只生成读取关系,不生成 FK */
10
+ foreignKey?: boolean;
11
+ /** 反向关系名;省略则不生成反向关系 */
12
+ reverse?: string;
13
+ /** 反向关系基数;默认 many。仅 reverse 存在时生效 */
14
+ reverseKind?: 'one' | 'many';
15
+ }
16
+ /** 关系边:目标表只写一次,目标列默认 id */
17
+ export type EdgeSpec<Target extends string, From extends string, To extends string = 'id', Reverse extends string | undefined = undefined, ReverseKind extends 'one' | 'many' = 'many'> = ZodRelationSpec & {
18
+ readonly to: `${Target}.${To}`;
19
+ readonly from: From;
20
+ /** 内部标记:用于 defineSchema 的 target key 类型校验 */
21
+ readonly _target: Target;
22
+ } & (Reverse extends string ? {
23
+ readonly reverse: Reverse;
24
+ readonly reverseKind: ReverseKind;
25
+ } : {});
26
+ export interface ManyToManyOptions<Through extends string, From extends string, To extends string, Source extends string = 'id', TargetColumn extends string = 'id'> {
27
+ /** through 表的 schema key */
28
+ through: Through;
29
+ /** through 表中指向当前表的列 */
30
+ from: From;
31
+ /** through 表中指向目标表的列 */
32
+ to: To;
33
+ /** 当前表的连接列;默认 id */
34
+ source?: Source;
35
+ /** 目标表的连接列;默认 id */
36
+ target?: TargetColumn;
37
+ }
38
+ /** many-to-many:通过显式 through 表连接;只读关系,不生成 FK */
39
+ export type ManyToManySpec<Target extends string, Through extends string, From extends string, To extends string, Source extends string = 'id', TargetColumn extends string = 'id'> = ZodRelationSpec & {
40
+ readonly to: `${Target}.${TargetColumn}`;
41
+ readonly from: Source;
42
+ readonly through: Through;
43
+ readonly throughFrom: From;
44
+ readonly throughTo: To;
45
+ readonly _manyToMany: true;
46
+ /** 内部标记:用于 defineSchema 的 target key 类型校验 */
47
+ readonly _target: Target;
48
+ };
49
+ export declare function manyToMany<const Target extends string, const Through extends string, const From extends string, const To extends string, const Source extends string = 'id', const TargetColumn extends string = 'id'>(target: Target, opts: ManyToManyOptions<Through, From, To, Source, TargetColumn>): ManyToManySpec<Target, Through, From, To, Source, TargetColumn>;
50
+ export declare function edge<const Target extends string, const From extends string, const To extends string = 'id', const Reverse extends string | undefined = undefined, const ReverseKind extends 'one' | 'many' = 'many'>(target: Target, opts: EdgeOptions<From, To> & {
51
+ reverse?: Reverse;
52
+ reverseKind?: ReverseKind;
53
+ }): EdgeSpec<Target, From, To, Reverse, ReverseKind>;
54
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE/D,MAAM,WAAW,WAAW,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM;IACnF,mBAAmB;IACnB,IAAI,EAAE,IAAI,CAAA;IACV,qBAAqB;IACrB,EAAE,CAAC,EAAE,EAAE,CAAA;IACP,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,qCAAqC;IACrC,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;CAC7B;AAED,2BAA2B;AAC3B,MAAM,MAAM,QAAQ,CAClB,MAAM,SAAS,MAAM,EACrB,IAAI,SAAS,MAAM,EACnB,EAAE,SAAS,MAAM,GAAG,IAAI,EACxB,OAAO,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,EAC9C,WAAW,SAAS,KAAK,GAAG,MAAM,GAAG,MAAM,IACzC,eAAe,GAAG;IACpB,QAAQ,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,EAAE,EAAE,CAAA;IAC9B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB,GAAG,CAAC,OAAO,SAAS,MAAM,GAAG;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;CAClC,GAAG,EAAE,CAAC,CAAA;AAEP,MAAM,WAAW,iBAAiB,CAChC,OAAO,SAAS,MAAM,EACtB,IAAI,SAAS,MAAM,EACnB,EAAE,SAAS,MAAM,EACjB,MAAM,SAAS,MAAM,GAAG,IAAI,EAC5B,YAAY,SAAS,MAAM,GAAG,IAAI;IAElC,4BAA4B;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,wBAAwB;IACxB,IAAI,EAAE,IAAI,CAAA;IACV,wBAAwB;IACxB,EAAE,EAAE,EAAE,CAAA;IACN,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oBAAoB;IACpB,MAAM,CAAC,EAAE,YAAY,CAAA;CACtB;AAED,gDAAgD;AAChD,MAAM,MAAM,cAAc,CACxB,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,MAAM,EACtB,IAAI,SAAS,MAAM,EACnB,EAAE,SAAS,MAAM,EACjB,MAAM,SAAS,MAAM,GAAG,IAAI,EAC5B,YAAY,SAAS,MAAM,GAAG,IAAI,IAChC,eAAe,GAAG;IACpB,QAAQ,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,YAAY,EAAE,CAAA;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAA;IACtB,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAA;IAC1B,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,wBAAgB,UAAU,CACxB,KAAK,CAAC,MAAM,SAAS,MAAM,EAC3B,KAAK,CAAC,OAAO,SAAS,MAAM,EAC5B,KAAK,CAAC,IAAI,SAAS,MAAM,EACzB,KAAK,CAAC,EAAE,SAAS,MAAM,EACvB,KAAK,CAAC,MAAM,SAAS,MAAM,GAAG,IAAI,EAClC,KAAK,CAAC,YAAY,SAAS,MAAM,GAAG,IAAI,EAExC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,GAC/D,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,CAoBjE;AAED,wBAAgB,IAAI,CAClB,KAAK,CAAC,MAAM,SAAS,MAAM,EAC3B,KAAK,CAAC,IAAI,SAAS,MAAM,EACzB,KAAK,CAAC,EAAE,SAAS,MAAM,GAAG,IAAI,EAC9B,KAAK,CAAC,OAAO,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,EACpD,KAAK,CAAC,WAAW,SAAS,KAAK,GAAG,MAAM,GAAG,MAAM,EAEjD,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,WAAW,CAAA;CAAE,GAC7E,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CA6BlD"}
package/dist/graph.js ADDED
@@ -0,0 +1,52 @@
1
+ export function manyToMany(target, opts) {
2
+ if (!opts.through)
3
+ throw new Error('manyToMany: through 不能为空');
4
+ if (!opts.from || opts.from.includes('.')) {
5
+ throw new Error(`manyToMany: from 必须是 through 表的单列名(收到 "${opts.from}")`);
6
+ }
7
+ if (!opts.to || opts.to.includes('.')) {
8
+ throw new Error(`manyToMany: to 必须是 through 表的单列名(收到 "${opts.to}")`);
9
+ }
10
+ if (opts.from === opts.to)
11
+ throw new Error('manyToMany: from 和 to 不能是同一列');
12
+ const source = opts.source ?? 'id';
13
+ const targetColumn = opts.target ?? 'id';
14
+ return {
15
+ from: source,
16
+ to: `${target}.${targetColumn}`,
17
+ through: opts.through,
18
+ throughFrom: opts.from,
19
+ throughTo: opts.to,
20
+ _manyToMany: true,
21
+ _target: target,
22
+ };
23
+ }
24
+ export function edge(target, opts) {
25
+ const column = opts.to ?? 'id';
26
+ if (!column || column.includes('.')) {
27
+ throw new Error(`edge: 目标列必须是不含 "." 的单列名(收到 "${column}")`);
28
+ }
29
+ if (opts.reverse !== undefined && !opts.reverse) {
30
+ throw new Error('edge: reverse 不能为空字符串');
31
+ }
32
+ if (opts.reverse === undefined && opts.reverseKind !== undefined) {
33
+ throw new Error('edge: reverseKind 需要同时提供 reverse');
34
+ }
35
+ const base = {
36
+ from: opts.from,
37
+ to: `${target}.${column}`,
38
+ _target: target,
39
+ ...(opts.kind ? { kind: opts.kind } : {}),
40
+ ...(opts.onDelete ? { onDelete: opts.onDelete } : {}),
41
+ ...(opts.foreignKey !== undefined ? { foreignKey: opts.foreignKey } : {}),
42
+ };
43
+ if (opts.reverse !== undefined) {
44
+ return {
45
+ ...base,
46
+ reverse: opts.reverse,
47
+ reverseKind: opts.reverseKind ?? 'many',
48
+ };
49
+ }
50
+ return base;
51
+ }
52
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAwEA,MAAM,UAAU,UAAU,CAQxB,MAAc,EACd,IAAgE;IAEhE,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IAC9D,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,CAAC,IAAI,IAAI,CAAC,CAAA;IAC1E,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;IACtE,CAAC;IACD,IAAK,IAAI,CAAC,IAAe,KAAM,IAAI,CAAC,EAAa;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAClG,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAA;IAClC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAA;IACxC,OAAO;QACL,IAAI,EAAE,MAAgB;QACtB,EAAE,EAAE,GAAG,MAAM,IAAI,YAAY,EAAiC;QAC9D,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,IAAI,CAAC,IAAI;QACtB,SAAS,EAAE,IAAI,CAAC,EAAE;QAClB,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE,MAAM;KAChB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAOlB,MAAc,EACd,IAA8E;IAE9E,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAA;IAC9B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,IAAI,CAAC,CAAA;IAC5D,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;IAC1C,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACrD,CAAC;IAED,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,EAAE,EAAE,GAAG,MAAM,IAAI,MAAM,EAAuB;QAC9C,OAAO,EAAE,MAAM;QACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1E,CAAA;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,GAAG,IAAI;YACP,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,MAAM;SACuB,CAAA;IAClE,CAAC;IACD,OAAO,IAAwD,CAAA;AACjE,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { defineSchema, node, zoddb, type DefinedSchema, type GraphEdges, type GraphNode, type GraphNodeOptions, type GraphNodes, type GraphSchemaInput, type SchemaDb, type SchemaDefinition, type SchemaInsertOf, type TableClient, type ZodColumnMeta, type ZodDbOptions, type ZodOnDelete, type ZodRelationSpec, type ZodSchemaOptions, type ZodSchemaShape, type ZodTableOptions, type ZodTables, } from './schema.js';
2
+ export { edge, manyToMany, type EdgeOptions, type EdgeSpec, type ManyToManyOptions, type ManyToManySpec, } from './graph.js';
3
+ export { relationGraph, type RelationGraph, type RelationGraphColumn, type RelationGraphEdge, type RelationGraphNode, type RelationGraphThrough, } from './relation-graph.js';
4
+ export type { CreateInput, CreateResult, LinkWrite, NestedWrite, UpdateInput, UpdateNestedWrite, WithInput, WithRelationOptions, WithResult, WithRow, } from './relations.js';
5
+ export type { FilterOperator, FilterValue, FindManyOptions, OrderBy, WhereFilter, } from './filter.js';
6
+ export type { AggregateOptions, AggKey, AggRow } from './aggregate.js';
7
+ export { ZodDbError, UndefinedParamError, NoRowsError, RowValidationError, IncludeAliasError, PgError, UniqueViolationError, NotNullViolationError, ForeignKeyViolationError, } from './errors.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EAAE,IAAI,EAAE,KAAK,EACzB,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAC3F,KAAK,gBAAgB,EAAE,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAClG,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAC7E,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,GACjF,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,IAAI,EAAE,UAAU,EAChB,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,GAC7E,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,aAAa,EACb,KAAK,aAAa,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EACpE,KAAK,iBAAiB,EAAE,KAAK,oBAAoB,GAClD,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EACV,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EACjF,SAAS,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,GACpD,MAAM,gBAAgB,CAAA;AACvB,YAAY,EACV,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,GACnE,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACtE,OAAO,EACL,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EACnF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,wBAAwB,GAC/E,MAAM,aAAa,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ // graph-only public surface:开发者只需要建模入口 + zoddb 运行时 + graph IR。
2
+ export { defineSchema, node, zoddb, } from './schema.js';
3
+ export { edge, manyToMany, } from './graph.js';
4
+ export { relationGraph, } from './relation-graph.js';
5
+ export { ZodDbError, UndefinedParamError, NoRowsError, RowValidationError, IncludeAliasError, PgError, UniqueViolationError, NotNullViolationError, ForeignKeyViolationError, } from './errors.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,OAAO,EACL,YAAY,EAAE,IAAI,EAAE,KAAK,GAK1B,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,IAAI,EAAE,UAAU,GAEjB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,aAAa,GAGd,MAAM,qBAAqB,CAAA;AAS5B,OAAO,EACL,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EACnF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,wBAAwB,GAC/E,MAAM,aAAa,CAAA"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export interface InitOptions {
2
+ cwd: string;
3
+ force?: boolean;
4
+ docker?: boolean;
5
+ }
6
+ export interface InitResult {
7
+ created: string[];
8
+ skipped: string[];
9
+ }
10
+ /** 只写已知 scaffold 文件;已有文件默认跳过,force 才覆盖。 */
11
+ export declare function initProject(opts: InitOptions): InitResult;
12
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAyCD,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAsBzD"}
package/dist/init.js ADDED
@@ -0,0 +1,62 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const CONFIG = `export default {
4
+ schema: './schema.mts',
5
+ migrations: './migrations',
6
+ }
7
+ `;
8
+ const SCHEMA = `import { z } from 'zod'
9
+ import { defineSchema, node } from '@ailnaf/zoddb'
10
+
11
+ export const schema = defineSchema({
12
+ nodes: {
13
+ posts: node(z.object({
14
+ id: z.uuid(),
15
+ title: z.string(),
16
+ createdAt: z.date(),
17
+ })),
18
+ },
19
+ })
20
+ `;
21
+ const ENV = `DATABASE_URL=postgres://postgres:postgres@localhost:5432/zoddb
22
+ `;
23
+ const COMPOSE = `services:
24
+ db:
25
+ image: postgres:17
26
+ environment:
27
+ POSTGRES_USER: postgres
28
+ POSTGRES_PASSWORD: postgres
29
+ POSTGRES_DB: zoddb
30
+ ports:
31
+ - "5432:5432"
32
+ volumes:
33
+ - zoddb-data:/var/lib/postgresql/data
34
+
35
+ volumes:
36
+ zoddb-data:
37
+ `;
38
+ /** 只写已知 scaffold 文件;已有文件默认跳过,force 才覆盖。 */
39
+ export function initProject(opts) {
40
+ const cwd = opts.cwd;
41
+ mkdirSync(cwd, { recursive: true });
42
+ const files = [
43
+ ['zoddb.config.mts', CONFIG],
44
+ ['schema.mts', SCHEMA],
45
+ ['.env.example', ENV],
46
+ ];
47
+ if (opts.docker)
48
+ files.push(['docker-compose.yml', COMPOSE]);
49
+ const created = [];
50
+ const skipped = [];
51
+ for (const [name, content] of files) {
52
+ const path = join(cwd, name);
53
+ if (existsSync(path) && !opts.force) {
54
+ skipped.push(name);
55
+ continue;
56
+ }
57
+ writeFileSync(path, content, 'utf8');
58
+ created.push(name);
59
+ }
60
+ return { created, skipped };
61
+ }
62
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAahC,MAAM,MAAM,GAAG;;;;CAId,CAAA;AAED,MAAM,MAAM,GAAG;;;;;;;;;;;;CAYd,CAAA;AAED,MAAM,GAAG,GAAG;CACX,CAAA;AAED,MAAM,OAAO,GAAG;;;;;;;;;;;;;;CAcf,CAAA;AAED,2CAA2C;AAC3C,MAAM,UAAU,WAAW,CAAC,IAAiB;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;IACpB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACnC,MAAM,KAAK,GAA4B;QACrC,CAAC,kBAAkB,EAAE,MAAM,CAAC;QAC5B,CAAC,YAAY,EAAE,MAAM,CAAC;QACtB,CAAC,cAAc,EAAE,GAAG,CAAC;KACtB,CAAA;IACD,IAAI,IAAI,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAA;IAE5D,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAC5B,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClB,SAAQ;QACV,CAAC;QACD,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QACpC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA;AAC7B,CAAC"}
@@ -0,0 +1,58 @@
1
+ import type postgres from 'postgres';
2
+ import type { Db } from './db.js';
3
+ import type { Table } from './table.js';
4
+ import type { RelationGraph } from './relation-graph.js';
5
+ export interface LiveColumn {
6
+ name: string;
7
+ type: string;
8
+ notNull: boolean;
9
+ default: string | null;
10
+ }
11
+ export interface SchemaDiff {
12
+ /** 可直接执行的 SQL(additive) */
13
+ statements: string[];
14
+ /** 破坏性语句:默认拒绝,需要 allowDestructive */
15
+ destructive: string[];
16
+ }
17
+ export interface LiveIndex {
18
+ table: string;
19
+ name: string;
20
+ columns: string[];
21
+ unique: boolean;
22
+ }
23
+ export interface LiveConstraint {
24
+ table: string;
25
+ name: string;
26
+ kind: 'u' | 'f' | 'p';
27
+ columns: string[];
28
+ /** FK 目标表 */
29
+ refTable?: string;
30
+ /** FK 目标列 */
31
+ refColumns?: string[];
32
+ /** FK on delete 动作 */
33
+ onDelete?: string;
34
+ }
35
+ export interface LiveCheck {
36
+ table: string;
37
+ name: string;
38
+ definition: string;
39
+ }
40
+ /** 把 format_type() 与我们的 sqlType 归一到同一写法 */
41
+ export declare function normalizeType(t: string): string;
42
+ /** 去掉 PG 的 ::cast 与外层括号,便于比较默认值 */
43
+ export declare function normalizeDefault(d: string | null): string | null;
44
+ export declare function introspect(client: postgres.Sql, tableNames: readonly string[]): Promise<Map<string, Map<string, LiveColumn>>>;
45
+ export interface DiffOptions {
46
+ /** defineSchema 的 relationGraph;用于校验 graph 与 references() 的 FK 语义一致 */
47
+ graph?: RelationGraph;
48
+ }
49
+ export declare function diffSchema(db: {
50
+ raw: postgres.Sql;
51
+ }, tables: readonly Table[], opts?: DiffOptions): Promise<SchemaDiff>;
52
+ export interface PushOptions {
53
+ /** 明确允许删列/改类型等破坏性操作 */
54
+ allowDestructive?: boolean;
55
+ }
56
+ /** 把数据库推到 tables 定义的结构;返回本次 diff。幂等:无差异时不执行任何 SQL。 */
57
+ export declare function pushSchema(db: Db, tables: readonly Table[], opts?: PushOptions): Promise<SchemaDiff>;
58
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AAGpC,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,qCAAqC;IACrC,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB;AAID,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;IACrB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa;IACb,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB;AAsBD,2CAA2C;AAC3C,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAMhE;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,QAAQ,CAAC,GAAG,EACpB,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAiC/C;AA2MD,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE;IAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAA;CAAE,EACzB,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,UAAU,CAAC,CAkLrB;AAED,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,sDAAsD;AACtD,wBAAsB,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,KAAK,EAAE,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAW9G"}