@gettersethya/mira-collection 0.1.0-alpha.16 → 0.1.0-alpha.17
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/README.md +156 -166
- package/dist/src/collection/auth.d.ts +1 -40
- package/dist/src/collection/auth.d.ts.map +1 -1
- package/dist/src/collection/auth.js +3 -15
- package/dist/src/collection/auth.js.map +1 -1
- package/dist/src/collection/base.d.ts +7 -31
- package/dist/src/collection/base.d.ts.map +1 -1
- package/dist/src/collection/base.js +3 -11
- package/dist/src/collection/base.js.map +1 -1
- package/dist/src/collection/field.d.ts +1 -1
- package/dist/src/collection/field.d.ts.map +1 -1
- package/dist/src/collection/field.js +0 -1
- package/dist/src/collection/field.js.map +1 -1
- package/dist/src/collection/index.d.ts +2 -2
- package/dist/src/collection/index.d.ts.map +1 -1
- package/dist/src/collection/index.js.map +1 -1
- package/dist/src/collection/serialize.d.ts +0 -2
- package/dist/src/collection/serialize.d.ts.map +1 -1
- package/dist/src/collection/serialize.js +8 -5
- package/dist/src/collection/serialize.js.map +1 -1
- package/dist/src/collection/types.d.ts +5 -4
- package/dist/src/collection/types.d.ts.map +1 -1
- package/dist/src/collection/view.d.ts +4 -11
- package/dist/src/collection/view.d.ts.map +1 -1
- package/dist/src/collection/view.js +1 -6
- package/dist/src/collection/view.js.map +1 -1
- package/dist/src/filter/builder.d.ts.map +1 -1
- package/dist/src/filter/builder.js.map +1 -1
- package/dist/src/filter/compiler.d.ts +1 -1
- package/dist/src/filter/compiler.d.ts.map +1 -1
- package/dist/src/filter/compiler.js.map +1 -1
- package/dist/src/filter/index.d.ts +2 -2
- package/dist/src/filter/index.d.ts.map +1 -1
- package/dist/src/filter/index.js.map +1 -1
- package/dist/src/filter/types.d.ts +3 -3
- package/dist/src/filter/types.d.ts.map +1 -1
- package/dist/src/filter/types.js +32 -26
- package/dist/src/filter/types.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/rule/builder.d.ts +2 -0
- package/dist/src/rule/builder.d.ts.map +1 -1
- package/dist/src/rule/builder.js +2 -1
- package/dist/src/rule/builder.js.map +1 -1
- package/dist/src/rule/index.d.ts +1 -1
- package/dist/src/rule/index.d.ts.map +1 -1
- package/dist/src/rule/index.js +1 -1
- package/dist/src/rule/index.js.map +1 -1
- package/dist/tests/collection/auth.test.js +5 -5
- package/dist/tests/collection/auth.test.js.map +1 -1
- package/dist/tests/collection/base.test.js +4 -21
- package/dist/tests/collection/base.test.js.map +1 -1
- package/dist/tests/collection/index-type.test.js +1 -1
- package/dist/tests/collection/index-type.test.js.map +1 -1
- package/dist/tests/collection/serialize.test.js +2 -19
- package/dist/tests/collection/serialize.test.js.map +1 -1
- package/dist/tests/collection/view.test.js +1 -1
- package/dist/tests/collection/view.test.js.map +1 -1
- package/dist/tests/filter/compiler.test.js +10 -11
- package/dist/tests/filter/compiler.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -1,166 +1,156 @@
|
|
|
1
|
-
# @gettersethya/mira-collection
|
|
2
|
-
|
|
3
|
-
[](https://www.npmjs.com/package/@gettersethya/mira-collection)
|
|
4
|
-
|
|
5
|
-
> **Early pre-alpha.** Breaking changes may occur without notice.
|
|
6
|
-
|
|
7
|
-
Collection definitions, filter DSL, and access rule builder for [Mira](https://github.com/gettersethya/mira). Shared between server and client — isomorphic, no runtime dependencies beyond `effect`.
|
|
8
|
-
|
|
9
|
-
## Installation
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
npm install @gettersethya/mira-collection effect
|
|
13
|
-
# or
|
|
14
|
-
pnpm add @gettersethya/mira-collection effect
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Collection types
|
|
18
|
-
|
|
19
|
-
### Base collection
|
|
20
|
-
|
|
21
|
-
Standard CRUD collection. System fields `id`, `seqId`, `created`, and `updated` are added automatically.
|
|
22
|
-
|
|
23
|
-
```typescript
|
|
24
|
-
import { BaseCollection, Bytes, Field
|
|
25
|
-
|
|
26
|
-
const Posts = BaseCollection.define("posts", {
|
|
27
|
-
title: Field.text({ maxLength: 200 }),
|
|
28
|
-
slug: Field.text({ unique: true }),
|
|
29
|
-
content: Field.text(),
|
|
30
|
-
published: Field.boolean({ default: false }),
|
|
31
|
-
authorId: Field.relation(Users),
|
|
32
|
-
thumbnail: Field.file({ maxSize: Bytes.fromMB(5), mimeTypes: ["image/*"] }),
|
|
33
|
-
})
|
|
34
|
-
.indexes((I) => [
|
|
35
|
-
I.on("authorId"),
|
|
36
|
-
I.unique("slug"),
|
|
37
|
-
])
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
)
|
|
85
|
-
.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
Rule.
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
Rule.
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
f.field("price").between(10, 100)
|
|
158
|
-
|
|
159
|
-
f.and(f.field("published").eq(true), f.field("viewCount").gte(100))
|
|
160
|
-
f.or(f.field("category").eq("tech"), f.field("category").eq("science"))
|
|
161
|
-
f.not(f.field("archived").eq(true))
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
## More
|
|
165
|
-
|
|
166
|
-
See the [Mira root README](https://github.com/gettersethya/mira) for full documentation.
|
|
1
|
+
# @gettersethya/mira-collection
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@gettersethya/mira-collection)
|
|
4
|
+
|
|
5
|
+
> **Early pre-alpha.** Breaking changes may occur without notice.
|
|
6
|
+
|
|
7
|
+
Collection definitions, filter DSL, and access rule builder for [Mira](https://github.com/gettersethya/mira). Shared between server and client — isomorphic, no runtime dependencies beyond `effect`.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @gettersethya/mira-collection effect
|
|
13
|
+
# or
|
|
14
|
+
pnpm add @gettersethya/mira-collection effect
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Collection types
|
|
18
|
+
|
|
19
|
+
### Base collection
|
|
20
|
+
|
|
21
|
+
Standard CRUD collection. System fields `id`, `seqId`, `created`, and `updated` are added automatically.
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { BaseCollection, Bytes, Field } from "@gettersethya/mira-collection"
|
|
25
|
+
|
|
26
|
+
export const Posts = BaseCollection.define("posts", {
|
|
27
|
+
title: Field.text({ maxLength: 200 }),
|
|
28
|
+
slug: Field.text({ unique: true }),
|
|
29
|
+
content: Field.text(),
|
|
30
|
+
published: Field.boolean({ default: false }),
|
|
31
|
+
authorId: Field.relation(Users),
|
|
32
|
+
thumbnail: Field.file({ maxSize: Bytes.fromMB(5), mimeTypes: ["image/*"] }),
|
|
33
|
+
})
|
|
34
|
+
.indexes((I) => [
|
|
35
|
+
I.on("authorId"),
|
|
36
|
+
I.unique("slug"),
|
|
37
|
+
])
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Auth collection
|
|
41
|
+
|
|
42
|
+
Adds `email`, `password` (hashed with scrypt on create/update), and `emailVerified` system fields. Exposes an `authWithPassword` endpoint.
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
import { AuthCollection, Field } from "@gettersethya/mira-collection"
|
|
46
|
+
|
|
47
|
+
export const Users = AuthCollection.define("users", {
|
|
48
|
+
displayName: Field.text(),
|
|
49
|
+
username: Field.text({ unique: true }),
|
|
50
|
+
role: Field.text({ default: "user" }),
|
|
51
|
+
})
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### View collection
|
|
55
|
+
|
|
56
|
+
Read-only, backed by a SQL `VIEW`. Supports `list` and `view` access rules. Every field must be marked `.view()`.
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { Field, ViewCollection } from "@gettersethya/mira-collection"
|
|
60
|
+
|
|
61
|
+
export const PostsWithAuthors = ViewCollection.define(
|
|
62
|
+
"posts_with_authors",
|
|
63
|
+
`SELECT p.id, p.seqId, p.title, u.displayName AS authorName
|
|
64
|
+
FROM posts p LEFT JOIN users u ON p.authorId = u.id`,
|
|
65
|
+
{
|
|
66
|
+
id: Field.text().view(),
|
|
67
|
+
seqId: Field.integer().view(),
|
|
68
|
+
title: Field.text().view(),
|
|
69
|
+
authorName: Field.text().view(),
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Rules for collections are defined server-side using `defineRule()` from `@gettersethya/mira`.
|
|
75
|
+
|
|
76
|
+
## Field types
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
Field.text({ minLength?, maxLength?, unique?, indexed?, required?, default? })
|
|
80
|
+
Field.literalText({ literal: ["a", "b"], default? })
|
|
81
|
+
Field.email()
|
|
82
|
+
Field.integer({ min?, max?, unique?, indexed?, default? })
|
|
83
|
+
Field.number({ min?, max? })
|
|
84
|
+
Field.boolean({ default? })
|
|
85
|
+
Field.date()
|
|
86
|
+
Field.json()
|
|
87
|
+
Field.file({ maxSize?, mimeTypes?, protected? })
|
|
88
|
+
Field.relation(Collection)
|
|
89
|
+
|
|
90
|
+
// File size helpers
|
|
91
|
+
Bytes.fromKB(n)
|
|
92
|
+
Bytes.fromMB(n)
|
|
93
|
+
Bytes.fromGB(n)
|
|
94
|
+
Bytes.fromTB(n)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Indexes
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
// Field-level (single column)
|
|
101
|
+
Field.text({ unique: true }) // unique index
|
|
102
|
+
Field.text({ indexed: true }) // non-unique index
|
|
103
|
+
|
|
104
|
+
// Callback (composite or explicit)
|
|
105
|
+
.indexes((I) => [
|
|
106
|
+
I.on("authorId"), // non-unique
|
|
107
|
+
I.on("authorId", "published"), // composite
|
|
108
|
+
I.unique("slug"), // unique constraint
|
|
109
|
+
I.unique("teamId", "userId"), // composite unique
|
|
110
|
+
])
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Rules
|
|
114
|
+
|
|
115
|
+
Rules are evaluated server-side on every request. A missing key means **deny all** for that action.
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
Rule.public() // allow all
|
|
119
|
+
R.authId(Users).neq(R.literal(null)) // logged-in users only
|
|
120
|
+
R.field("ownerId").eq(R.authId(Users)) // owner-only
|
|
121
|
+
R.field("role").in(R.literal(["admin", "mod"])) // role check
|
|
122
|
+
R.auth(Users, "role").eq(R.literal("admin")) // check a field on the auth record
|
|
123
|
+
Rule.not(R.field("archived").eq(R.literal(true))) // negation
|
|
124
|
+
Rule.or(R.field("isPublic").eq(R.literal(true)), R.field("ownerId").eq(R.authId(Users)))
|
|
125
|
+
Rule.and(R.field("published").eq(R.literal(true)), R.field("ownerId").eq(R.authId(Users)))
|
|
126
|
+
|
|
127
|
+
// Date arithmetic
|
|
128
|
+
R.field("created").gte(Rule.dateAdd(Rule.now(), -30, "day"))
|
|
129
|
+
|
|
130
|
+
// Request values (header, query param, or body field)
|
|
131
|
+
Rule.request("header", "x-api-key").eq(R.literal("secret"))
|
|
132
|
+
|
|
133
|
+
// Subquery membership check
|
|
134
|
+
Rule.subquery(Members, "teamId").where(R.field("userId").eq(R.authId(Users)))
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Filters
|
|
138
|
+
|
|
139
|
+
Used in client queries. Type-checked against the collection's field types.
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
f.field("published").eq(true)
|
|
143
|
+
f.field("viewCount").gte(100)
|
|
144
|
+
f.field("status").in(["draft", "published"])
|
|
145
|
+
f.field("title").like("%effect%")
|
|
146
|
+
f.field("deletedAt").null()
|
|
147
|
+
f.field("price").between(10, 100)
|
|
148
|
+
|
|
149
|
+
f.and(f.field("published").eq(true), f.field("viewCount").gte(100))
|
|
150
|
+
f.or(f.field("category").eq("tech"), f.field("category").eq("science"))
|
|
151
|
+
f.not(f.field("archived").eq(true))
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## More
|
|
155
|
+
|
|
156
|
+
See the [Mira root README](https://github.com/gettersethya/mira) for full documentation.
|
|
@@ -1,30 +1,7 @@
|
|
|
1
|
-
import type { RuleBuilder } from "../rule/builder.js";
|
|
2
|
-
import type { RuleMap } from "../rule/types.js";
|
|
3
|
-
import type { OperandNode } from "../rule/types.js";
|
|
4
1
|
import type { IndexBuilder, IndexEntry } from "./index-builder.js";
|
|
5
2
|
import type { CollectionSchema, FieldDef, FieldsMap } from "./types.js";
|
|
6
3
|
type AuthSystemField = "id" | "email" | "password" | "emailVerified" | "created" | "updated" | "seqId";
|
|
7
4
|
type AuthRuleField = "id" | "email" | "emailVerified" | "created" | "updated" | "seqId";
|
|
8
|
-
type AuthSystemFieldDefs = {
|
|
9
|
-
id: FieldDef & {
|
|
10
|
-
kind: "text";
|
|
11
|
-
};
|
|
12
|
-
email: FieldDef & {
|
|
13
|
-
kind: "email";
|
|
14
|
-
};
|
|
15
|
-
emailVerified: FieldDef & {
|
|
16
|
-
kind: "boolean";
|
|
17
|
-
};
|
|
18
|
-
created: FieldDef & {
|
|
19
|
-
kind: "date";
|
|
20
|
-
};
|
|
21
|
-
updated: FieldDef & {
|
|
22
|
-
kind: "date";
|
|
23
|
-
};
|
|
24
|
-
seqId: FieldDef & {
|
|
25
|
-
kind: "seqId";
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
5
|
/** Only the auth-specific fields not already provided by InferRecord's base type. */
|
|
29
6
|
type AuthPublicFieldDefs = {
|
|
30
7
|
email: FieldDef & {
|
|
@@ -34,17 +11,11 @@ type AuthPublicFieldDefs = {
|
|
|
34
11
|
kind: "boolean";
|
|
35
12
|
};
|
|
36
13
|
};
|
|
37
|
-
/** Rule builder for auth collections — extends RuleBuilder with `selfId()`. */
|
|
38
|
-
type AuthRuleBuilder<F extends FieldsMap> = RuleBuilder<F> & {
|
|
39
|
-
/** authId operand for this collection. Use instead of `Rule.authId(ThisCollection)` to avoid circular references. */
|
|
40
|
-
selfId(): OperandNode<any, string>;
|
|
41
|
-
};
|
|
42
14
|
type IndexCb<F extends FieldsMap> = (I: IndexBuilder<(keyof F & string) | AuthRuleField>) => Array<IndexEntry<(keyof F & string) | AuthRuleField>>;
|
|
43
|
-
type RuleCb<F extends FieldsMap> = (R: AuthRuleBuilder<F & AuthSystemFieldDefs>) => RuleMap;
|
|
44
15
|
/**
|
|
45
16
|
* Builder returned by `AuthCollection.define()`.
|
|
46
17
|
* Immediately satisfies `AnyCollectionDef` — no terminal `.build()` needed.
|
|
47
|
-
* Chain `.indexes()`
|
|
18
|
+
* Chain `.indexes()` to add optional indexes.
|
|
48
19
|
* Each chained method returns a new builder; the original is unchanged.
|
|
49
20
|
*/
|
|
50
21
|
export type AuthCollectionBuilder<F extends FieldsMap> = {
|
|
@@ -59,12 +30,6 @@ export type AuthCollectionBuilder<F extends FieldsMap> = {
|
|
|
59
30
|
* Pass a callback to get a typed index builder with auto-completion over field names.
|
|
60
31
|
*/
|
|
61
32
|
indexes(cb: IndexCb<F>): AuthCollectionBuilder<F>;
|
|
62
|
-
/**
|
|
63
|
-
* Add per-action access rules. No rule means deny all.
|
|
64
|
-
* The rule builder includes `.selfId()` as a shorthand for the authenticated user's id
|
|
65
|
-
* on this collection — use it instead of `Rule.authId(ThisCollection)` to avoid circular references.
|
|
66
|
-
*/
|
|
67
|
-
rules(cb: RuleCb<F>): AuthCollectionBuilder<F>;
|
|
68
33
|
};
|
|
69
34
|
/**
|
|
70
35
|
* Defines an auth collection for user authentication.
|
|
@@ -76,10 +41,6 @@ export type AuthCollectionBuilder<F extends FieldsMap> = {
|
|
|
76
41
|
* name: Field.text(),
|
|
77
42
|
* avatar: Field.file({ maxSize: Bytes.fromMB(2) })
|
|
78
43
|
* })
|
|
79
|
-
* .rules((R) => ({
|
|
80
|
-
* list: R.field("id").eq(R.selfId()),
|
|
81
|
-
* create: R.public()
|
|
82
|
-
* }))
|
|
83
44
|
*/
|
|
84
45
|
export declare const AuthCollection: {
|
|
85
46
|
define<F extends FieldsMap & { [K in keyof F & AuthSystemField]?: never; }>(name: string, extraFields: F): AuthCollectionBuilder<F>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/collection/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/collection/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAGlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAgC,MAAM,YAAY,CAAA;AAErG,KAAK,eAAe,GAAG,IAAI,GAAG,OAAO,GAAG,UAAU,GAAG,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;AACtG,KAAK,aAAa,GAAG,IAAI,GAAG,OAAO,GAAG,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;AAEvF,qFAAqF;AACrF,KAAK,mBAAmB,GAAG;IACzB,KAAK,EAAU,QAAQ,GAAG;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,CAAA;IAC3C,aAAa,EAAE,QAAQ,GAAG;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,CAAA;CAC9C,CAAA;AAED,KAAK,OAAO,CAAC,CAAC,SAAS,SAAS,IAAI,CAClC,CAAC,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,aAAa,CAAC,KAChD,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,SAAS,IAAI;IACvD,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,CAAC,GAAG,mBAAmB,CAAA;IAC/B,MAAM,EAAE,gBAAgB,GAAG;QAAE,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1D;;;;OAIG;IACH,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAA;CAClD,CAAA;AAuCD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc;WAClB,CAAC,SAAS,SAAS,GAAG,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,KAAK,GAAE,QACjE,MAAM,eACC,CAAC,GACb,qBAAqB,CAAC,CAAC,CAAC;CAG5B,CAAA"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { makeRuleBuilder } from "../rule/builder.js";
|
|
2
1
|
import { Index } from "./index-builder.js";
|
|
3
2
|
import { toJSONSchema } from "./serialize.js";
|
|
4
3
|
const AUTH_SYSTEM_PROPERTIES = {
|
|
5
4
|
email: { type: "string", format: "email", "x-system": true },
|
|
6
|
-
password: { type: "string", "x-system": true, "x-hidden": true },
|
|
5
|
+
password: { type: "string", "x-system": true, "x-hidden": true, "x-kind": "password" },
|
|
7
6
|
emailVerified: { type: "boolean", "x-system": true, default: false }
|
|
8
7
|
};
|
|
9
8
|
const AUTH_SYSTEM_FIELD_DEFS = {
|
|
@@ -11,7 +10,7 @@ const AUTH_SYSTEM_FIELD_DEFS = {
|
|
|
11
10
|
emailVerified: { _tag: "FieldDef", kind: "boolean" },
|
|
12
11
|
};
|
|
13
12
|
const AUTH_SYSTEM_INDEXES = [{ fields: ["email"], unique: true }];
|
|
14
|
-
function makeAuthBuilder(name, extraFields, indexesCb
|
|
13
|
+
function makeAuthBuilder(name, extraFields, indexesCb) {
|
|
15
14
|
let _schema;
|
|
16
15
|
return {
|
|
17
16
|
name,
|
|
@@ -19,21 +18,14 @@ function makeAuthBuilder(name, extraFields, indexesCb, rulesCb) {
|
|
|
19
18
|
get schema() {
|
|
20
19
|
if (_schema === undefined) {
|
|
21
20
|
const indexes = indexesCb?.(Index);
|
|
22
|
-
const authRuleBuilder = {
|
|
23
|
-
...makeRuleBuilder(),
|
|
24
|
-
selfId() { return { kind: "authId", collection: name }; }
|
|
25
|
-
};
|
|
26
|
-
const rules = rulesCb?.(authRuleBuilder);
|
|
27
21
|
_schema = toJSONSchema("auth", name, extraFields, {
|
|
28
22
|
indexes: [...AUTH_SYSTEM_INDEXES, ...(indexes ?? [])],
|
|
29
23
|
systemFields: AUTH_SYSTEM_PROPERTIES,
|
|
30
|
-
...(rules !== undefined ? { rules } : {})
|
|
31
24
|
});
|
|
32
25
|
}
|
|
33
26
|
return _schema;
|
|
34
27
|
},
|
|
35
|
-
indexes: (cb) => makeAuthBuilder(name, extraFields, cb
|
|
36
|
-
rules: (cb) => makeAuthBuilder(name, extraFields, indexesCb, cb)
|
|
28
|
+
indexes: (cb) => makeAuthBuilder(name, extraFields, cb)
|
|
37
29
|
};
|
|
38
30
|
}
|
|
39
31
|
/**
|
|
@@ -46,10 +38,6 @@ function makeAuthBuilder(name, extraFields, indexesCb, rulesCb) {
|
|
|
46
38
|
* name: Field.text(),
|
|
47
39
|
* avatar: Field.file({ maxSize: Bytes.fromMB(2) })
|
|
48
40
|
* })
|
|
49
|
-
* .rules((R) => ({
|
|
50
|
-
* list: R.field("id").eq(R.selfId()),
|
|
51
|
-
* create: R.public()
|
|
52
|
-
* }))
|
|
53
41
|
*/
|
|
54
42
|
export const AuthCollection = {
|
|
55
43
|
define(name, extraFields) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/collection/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/collection/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAkC7C,MAAM,sBAAsB,GAAuC;IACjE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE;IAC5D,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE;IACtF,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;CACrE,CAAA;AAED,MAAM,sBAAsB,GAAwB;IAClD,KAAK,EAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;IAClD,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;CACrD,CAAA;AAED,MAAM,mBAAmB,GAAoB,CAAC,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;AAElF,SAAS,eAAe,CACtB,IAAY,EACZ,WAAc,EACd,SAAsB;IAGtB,IAAI,OAAyE,CAAA;IAC7E,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,sBAAsB,EAAE,WAAW,CAAC;QAC9D,IAAI,MAAM;YACR,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,KAAyB,CAAC,CAAA;gBACtD,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE;oBAChD,OAAO,EAAE,CAAC,GAAG,mBAAmB,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;oBACrD,YAAY,EAAE,sBAAsB;iBACrC,CAAuD,CAAA;YAC1D,CAAC;YACD,OAAO,OAAQ,CAAA;QACjB,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;KACxD,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM,CACJ,IAAY,EACZ,WAAc;QAEd,OAAO,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IAC3C,CAAC;CACF,CAAA"}
|
|
@@ -1,45 +1,25 @@
|
|
|
1
|
-
import type { RuleBuilder } from "../rule/builder.js";
|
|
2
|
-
import type { RuleMap } from "../rule/types.js";
|
|
3
1
|
import type { IndexBuilder, IndexEntry } from "./index-builder.js";
|
|
4
|
-
import type { CollectionSchema,
|
|
2
|
+
import type { CollectionSchema, FieldsMap } from "./types.js";
|
|
5
3
|
type BaseForbiddenField = "id" | "seqId";
|
|
6
4
|
type BaseSystemField = "id" | "seqId" | "created" | "updated";
|
|
7
|
-
type BaseSystemFieldDefs = {
|
|
8
|
-
id: FieldDef & {
|
|
9
|
-
kind: "text";
|
|
10
|
-
};
|
|
11
|
-
created: FieldDef & {
|
|
12
|
-
kind: "date";
|
|
13
|
-
};
|
|
14
|
-
updated: FieldDef & {
|
|
15
|
-
kind: "date";
|
|
16
|
-
};
|
|
17
|
-
seqId: FieldDef & {
|
|
18
|
-
kind: "seqId";
|
|
19
|
-
};
|
|
20
|
-
};
|
|
21
5
|
type IndexCb<F extends FieldsMap> = (I: IndexBuilder<(keyof F & string) | BaseSystemField>) => Array<IndexEntry<(keyof F & string) | BaseSystemField>>;
|
|
22
|
-
type RuleCb<F extends FieldsMap> = (R: RuleBuilder<F & BaseSystemFieldDefs>) => RuleMap;
|
|
23
6
|
/**
|
|
24
7
|
* Builder returned by `BaseCollection.define()`.
|
|
25
8
|
* Immediately satisfies `AnyCollectionDef` — no terminal `.build()` needed.
|
|
26
|
-
* Chain `.indexes()`
|
|
9
|
+
* Chain `.indexes()` to add optional indexes.
|
|
27
10
|
* Each chained method returns a new builder; the original is unchanged.
|
|
28
11
|
*/
|
|
29
12
|
export type BaseCollectionBuilder<F extends FieldsMap> = {
|
|
30
|
-
name: string;
|
|
31
|
-
fields: F;
|
|
32
|
-
schema: CollectionSchema
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly fields: F;
|
|
15
|
+
readonly schema: CollectionSchema & {
|
|
16
|
+
"x-collection-kind": "base";
|
|
17
|
+
};
|
|
33
18
|
/**
|
|
34
19
|
* Add collection-level indexes (in addition to field-level `unique`/`indexed` flags).
|
|
35
20
|
* Pass a callback to get a typed index builder with auto-completion over field names.
|
|
36
21
|
*/
|
|
37
22
|
indexes(cb: IndexCb<F>): BaseCollectionBuilder<F>;
|
|
38
|
-
/**
|
|
39
|
-
* Add per-action access rules. No rule means deny all.
|
|
40
|
-
* Pass a callback to get a typed rule builder with auto-completion over field names.
|
|
41
|
-
*/
|
|
42
|
-
rules(cb: RuleCb<F>): BaseCollectionBuilder<F>;
|
|
43
23
|
};
|
|
44
24
|
/**
|
|
45
25
|
* Defines a standard data collection.
|
|
@@ -52,10 +32,6 @@ export type BaseCollectionBuilder<F extends FieldsMap> = {
|
|
|
52
32
|
* ownerId: Field.text()
|
|
53
33
|
* })
|
|
54
34
|
* .indexes((I) => [I.on("ownerId")])
|
|
55
|
-
* .rules((R) => ({
|
|
56
|
-
* list: Rule.public(),
|
|
57
|
-
* view: R.field("ownerId").eq(R.authId(Users))
|
|
58
|
-
* }))
|
|
59
35
|
*/
|
|
60
36
|
export declare const BaseCollection: {
|
|
61
37
|
define<F extends FieldsMap & { [K in keyof F & BaseForbiddenField]?: never; }>(name: string, fields: F): BaseCollectionBuilder<F>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/collection/base.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/collection/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAGlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE7D,KAAK,kBAAkB,GAAG,IAAI,GAAG,OAAO,CAAA;AACxC,KAAK,eAAe,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;AAE7D,KAAK,OAAO,CAAC,CAAC,SAAS,SAAS,IAAI,CAClC,CAAC,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,eAAe,CAAC,KAClD,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAA;AAE5D;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,SAAS,IAAI;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAClB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG;QAAE,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAAA;IACnE;;;OAGG;IACH,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAA;CAClD,CAAA;AAyBD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc;WAClB,CAAC,SAAS,SAAS,GAAG,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,EAAE,KAAK,GAAE,QACpE,MAAM,UACJ,CAAC,GACR,qBAAqB,CAAC,CAAC,CAAC;CAG5B,CAAA"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { makeRuleBuilder } from "../rule/builder.js";
|
|
2
1
|
import { Index } from "./index-builder.js";
|
|
3
2
|
import { toJSONSchema } from "./serialize.js";
|
|
4
|
-
function makeBaseBuilder(name, fields, indexesCb
|
|
3
|
+
function makeBaseBuilder(name, fields, indexesCb) {
|
|
5
4
|
let _schema;
|
|
6
5
|
return {
|
|
7
6
|
name,
|
|
@@ -9,16 +8,13 @@ function makeBaseBuilder(name, fields, indexesCb, rulesCb) {
|
|
|
9
8
|
get schema() {
|
|
10
9
|
if (_schema === undefined) {
|
|
11
10
|
const indexes = indexesCb?.(Index);
|
|
12
|
-
const rules = rulesCb?.(makeRuleBuilder());
|
|
13
11
|
_schema = toJSONSchema("base", name, fields, {
|
|
14
|
-
...(indexes !== undefined ? { indexes } : {})
|
|
15
|
-
...(rules !== undefined ? { rules } : {})
|
|
12
|
+
...(indexes !== undefined ? { indexes } : {})
|
|
16
13
|
});
|
|
17
14
|
}
|
|
18
15
|
return _schema;
|
|
19
16
|
},
|
|
20
|
-
indexes: (cb) => makeBaseBuilder(name, fields, cb
|
|
21
|
-
rules: (cb) => makeBaseBuilder(name, fields, indexesCb, cb)
|
|
17
|
+
indexes: (cb) => makeBaseBuilder(name, fields, cb)
|
|
22
18
|
};
|
|
23
19
|
}
|
|
24
20
|
/**
|
|
@@ -32,10 +28,6 @@ function makeBaseBuilder(name, fields, indexesCb, rulesCb) {
|
|
|
32
28
|
* ownerId: Field.text()
|
|
33
29
|
* })
|
|
34
30
|
* .indexes((I) => [I.on("ownerId")])
|
|
35
|
-
* .rules((R) => ({
|
|
36
|
-
* list: Rule.public(),
|
|
37
|
-
* view: R.field("ownerId").eq(R.authId(Users))
|
|
38
|
-
* }))
|
|
39
31
|
*/
|
|
40
32
|
export const BaseCollection = {
|
|
41
33
|
define(name, fields) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/collection/base.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/collection/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AA2B7C,SAAS,eAAe,CACtB,IAAY,EACZ,MAAS,EACT,SAAsB;IAGtB,IAAI,OAAyE,CAAA;IAC7E,OAAO;QACL,IAAI;QACJ,MAAM;QACN,IAAI,MAAM;YACR,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,KAAyB,CAAC,CAAA;gBACtD,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;oBAC3C,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC9C,CAAC,CAAA;YACJ,CAAC;YACD,OAAO,OAAQ,CAAA;QACjB,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;KACnD,CAAA;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM,CACJ,IAAY,EACZ,MAAS;QAET,OAAO,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACtC,CAAC;CACF,CAAA"}
|
|
@@ -76,7 +76,7 @@ export declare const Field: {
|
|
|
76
76
|
* Field.literalText({ literal: ["admin", "agent", "readonly"] })
|
|
77
77
|
* Field.literalText({ literal: ["draft", "published"], default: "draft" })
|
|
78
78
|
*/
|
|
79
|
-
literalText: <const L extends
|
|
79
|
+
literalText: <const L extends ReadonlyArray<string>, O extends Omit<BaseFieldOptions, "default"> & {
|
|
80
80
|
default?: L[number];
|
|
81
81
|
}>(opts: {
|
|
82
82
|
literal: L;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../../src/collection/field.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,EAER,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,YAAY,CAAA;AAEnB,gDAAgD;AAChD,KAAK,gBAAgB,GAAG;IACtB,sFAAsF;IACtF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,gDAAgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAqBD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK;IAChB;;;;;;;;;;;;;;;;;OAiBG;WACI,CAAC,SAAS,gBAAgB,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,SACrE,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,MAAM,GAAG,SAAS,CAAA;KAAE;;;gBAAlD,CAAC,IAAI,EAAE,kBAAkB,KAAK,MAAM,GAAG,SAAS;;;;;oBAAhD,CAAC,IAAI,EAAE,kBAAkB,KAAK,MAAM,GAAG,SAAS;;sBArCU,IAAI;;;IAwCrF;;;;;;;;;;;;;;OAcG;wBACiB,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../../src/collection/field.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,EAER,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,YAAY,CAAA;AAEnB,gDAAgD;AAChD,KAAK,gBAAgB,GAAG;IACtB,sFAAsF;IACtF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,gDAAgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAqBD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK;IAChB;;;;;;;;;;;;;;;;;OAiBG;WACI,CAAC,SAAS,gBAAgB,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,SACrE,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,MAAM,GAAG,SAAS,CAAA;KAAE;;;gBAAlD,CAAC,IAAI,EAAE,kBAAkB,KAAK,MAAM,GAAG,SAAS;;;;;oBAAhD,CAAC,IAAI,EAAE,kBAAkB,KAAK,MAAM,GAAG,SAAS;;sBArCU,IAAI;;;IAwCrF;;;;;;;;;;;;;;OAcG;wBACiB,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;KAAE,QAClH;QAAE,OAAO,EAAE,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,yBAAyB,KAAK,MAAM,GAAG,SAAS,CAAA;KAAE;cAStE,aAAa;iBAAW,CAAC;kBAAY,CAAC;;;kBAAtC,aAAa;qBAAW,CAAC;sBAAY,CAAC;;sBA7EW,IAAI;;;IAiF/E;;;;;;;;;;OAUG;aACM,CAAC,SAAS,gBAAgB,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,SAC3D,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS,CAAA;KAAE;;;gBAApD,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS;;;;;oBAAlD,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS;;sBAjFQ,IAAI;;;IAoFrF;;;;;;;;;OASG;cACO,CAAC,SAAS,gBAAgB,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,SAC5D,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,MAAM,GAAG,SAAS,CAAA;KAAE;;;gBAArD,CAAC,IAAI,EAAE,qBAAqB,KAAK,MAAM,GAAG,SAAS;;;;;oBAAnD,CAAC,IAAI,EAAE,qBAAqB,KAAK,MAAM,GAAG,SAAS;;sBA/FO,IAAI;;;IAkGrF;;;;;;;;;OASG;cACO,CAAC,SAAS,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,SACpE,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS,CAAA;KAAE;;;gBAApD,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS;;;;;oBAAlD,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS;;sBA7GQ,IAAI;;;IAgHrF;;;;;;;OAOG;WACI,CAAC,SAAS,gBAAgB,SACxB,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS,CAAA;KAAE;;;gBAApD,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS;;;;;oBAAlD,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS;;sBAzHQ,IAAI;;;IA4HrF;;;;;;;OAOG;YACK,CAAC,SAAS,gBAAgB,SACzB,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,MAAM,GAAG,SAAS,CAAA;KAAE;;;gBAAnD,CAAC,IAAI,EAAE,mBAAmB,KAAK,MAAM,GAAG,SAAS;;;;;oBAAjD,CAAC,IAAI,EAAE,mBAAmB,KAAK,MAAM,GAAG,SAAS;;sBArIS,IAAI;;;IAwIrF;;;;;;;OAOG;WACI,CAAC,SAAS,gBAAgB,SACxB,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS,CAAA;KAAE;;;gBAApD,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS;;;;;oBAAlD,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS;;sBAjJQ,IAAI;;;IAoJrF;;;;;;;;;;OAUG;mBACY,gBAAgB,KAAG,QAAQ;IAM1C;;;;;;;;;;;;;;;;;OAiBG;WACI,CAAC,SAAS,gBAAgB,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,SAC/F,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS,CAAA;KAAE;;;gBAApD,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS;;;;;oBAAlD,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS;;sBAxLQ,IAAI;;;IA2LrF;;;;;;;;;;;;;;;;;OAiBG;eACQ,CAAC,SAAS,gBAAgB,EAAE,CAAC,SAAS,gBAAgB,cACnD,CAAC,SACN,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,MAAM,GAAG,SAAS,CAAA;KAAE;cAUtH,UAAU;iBAAW,CAAC;;;kBAAtB,UAAU;qBAAW,CAAC;;sBArO2B,IAAI;;;CAwOhF,CAAA"}
|