@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.
Files changed (63) hide show
  1. package/README.md +156 -166
  2. package/dist/src/collection/auth.d.ts +1 -40
  3. package/dist/src/collection/auth.d.ts.map +1 -1
  4. package/dist/src/collection/auth.js +3 -15
  5. package/dist/src/collection/auth.js.map +1 -1
  6. package/dist/src/collection/base.d.ts +7 -31
  7. package/dist/src/collection/base.d.ts.map +1 -1
  8. package/dist/src/collection/base.js +3 -11
  9. package/dist/src/collection/base.js.map +1 -1
  10. package/dist/src/collection/field.d.ts +1 -1
  11. package/dist/src/collection/field.d.ts.map +1 -1
  12. package/dist/src/collection/field.js +0 -1
  13. package/dist/src/collection/field.js.map +1 -1
  14. package/dist/src/collection/index.d.ts +2 -2
  15. package/dist/src/collection/index.d.ts.map +1 -1
  16. package/dist/src/collection/index.js.map +1 -1
  17. package/dist/src/collection/serialize.d.ts +0 -2
  18. package/dist/src/collection/serialize.d.ts.map +1 -1
  19. package/dist/src/collection/serialize.js +8 -5
  20. package/dist/src/collection/serialize.js.map +1 -1
  21. package/dist/src/collection/types.d.ts +5 -4
  22. package/dist/src/collection/types.d.ts.map +1 -1
  23. package/dist/src/collection/view.d.ts +4 -11
  24. package/dist/src/collection/view.d.ts.map +1 -1
  25. package/dist/src/collection/view.js +1 -6
  26. package/dist/src/collection/view.js.map +1 -1
  27. package/dist/src/filter/builder.d.ts.map +1 -1
  28. package/dist/src/filter/builder.js.map +1 -1
  29. package/dist/src/filter/compiler.d.ts +1 -1
  30. package/dist/src/filter/compiler.d.ts.map +1 -1
  31. package/dist/src/filter/compiler.js.map +1 -1
  32. package/dist/src/filter/index.d.ts +2 -2
  33. package/dist/src/filter/index.d.ts.map +1 -1
  34. package/dist/src/filter/index.js.map +1 -1
  35. package/dist/src/filter/types.d.ts +3 -3
  36. package/dist/src/filter/types.d.ts.map +1 -1
  37. package/dist/src/filter/types.js +32 -26
  38. package/dist/src/filter/types.js.map +1 -1
  39. package/dist/src/index.d.ts +1 -1
  40. package/dist/src/index.d.ts.map +1 -1
  41. package/dist/src/index.js.map +1 -1
  42. package/dist/src/rule/builder.d.ts +2 -0
  43. package/dist/src/rule/builder.d.ts.map +1 -1
  44. package/dist/src/rule/builder.js +2 -1
  45. package/dist/src/rule/builder.js.map +1 -1
  46. package/dist/src/rule/index.d.ts +1 -1
  47. package/dist/src/rule/index.d.ts.map +1 -1
  48. package/dist/src/rule/index.js +1 -1
  49. package/dist/src/rule/index.js.map +1 -1
  50. package/dist/tests/collection/auth.test.js +5 -5
  51. package/dist/tests/collection/auth.test.js.map +1 -1
  52. package/dist/tests/collection/base.test.js +4 -21
  53. package/dist/tests/collection/base.test.js.map +1 -1
  54. package/dist/tests/collection/index-type.test.js +1 -1
  55. package/dist/tests/collection/index-type.test.js.map +1 -1
  56. package/dist/tests/collection/serialize.test.js +2 -19
  57. package/dist/tests/collection/serialize.test.js.map +1 -1
  58. package/dist/tests/collection/view.test.js +1 -1
  59. package/dist/tests/collection/view.test.js.map +1 -1
  60. package/dist/tests/filter/compiler.test.js +10 -11
  61. package/dist/tests/filter/compiler.test.js.map +1 -1
  62. package/dist/tsconfig.tsbuildinfo +1 -1
  63. package/package.json +5 -4
package/README.md CHANGED
@@ -1,166 +1,156 @@
1
- # @gettersethya/mira-collection
2
-
3
- [![npm](https://img.shields.io/npm/v/@gettersethya/mira-collection)](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, Rule } from "@gettersethya/mira-collection"
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
- .rules((R) => ({
39
- list: R.field("published").eq(R.literal(true)),
40
- view: Rule.or(R.field("published").eq(R.literal(true)), R.field("authorId").eq(R.authId(Users))),
41
- create: R.authId(Users).neq(R.literal(null)),
42
- update: R.field("authorId").eq(R.authId(Users)),
43
- delete: R.field("authorId").eq(R.authId(Users)),
44
- }))
45
- ```
46
-
47
- ### Auth collection
48
-
49
- Adds `email`, `password` (hashed), and `emailVerified` system fields. Exposes an `authWithPassword` endpoint.
50
-
51
- ```typescript
52
- import { AuthCollection, Field, Rule } from "@gettersethya/mira-collection"
53
-
54
- const Users = AuthCollection.define("users", {
55
- displayName: Field.text(),
56
- username: Field.text({ unique: true }),
57
- role: Field.text({ default: "user" }),
58
- })
59
- .rules((R) => ({
60
- list: Rule.public(),
61
- view: Rule.public(),
62
- create: Rule.public(),
63
- update: R.selfId().eq(R.authId(Users)), // users can only edit themselves
64
- }))
65
- ```
66
-
67
- ### View collection
68
-
69
- Read-only, backed by a SQL `VIEW`. Supports `list` and `view` only. Every field must be marked `.view()`.
70
-
71
- ```typescript
72
- import { Field, Rule, ViewCollection } from "@gettersethya/mira-collection"
73
-
74
- const PostsWithAuthors = ViewCollection.define(
75
- "posts_with_authors",
76
- `SELECT p.id, p.seqId, p.title, u.displayName AS authorName
77
- FROM posts p LEFT JOIN users u ON p.authorId = u.id`,
78
- {
79
- id: Field.text().view(),
80
- seqId: Field.integer().view(),
81
- title: Field.text().view(),
82
- authorName: Field.text().view(),
83
- }
84
- )
85
- .rules((R) => ({ list: Rule.public(), view: Rule.public() }))
86
- ```
87
-
88
- ## Field types
89
-
90
- ```typescript
91
- Field.text({ minLength?, maxLength?, unique?, indexed?, required?, default? })
92
- Field.email()
93
- Field.integer({ min?, max?, unique?, indexed?, default? })
94
- Field.number({ min?, max? })
95
- Field.boolean({ default? })
96
- Field.date()
97
- Field.json()
98
- Field.file({ maxSize?, mimeTypes?, protected? })
99
- Field.relation(Collection)
100
-
101
- // File size helpers
102
- Bytes.fromKB(n)
103
- Bytes.fromMB(n)
104
- Bytes.fromGB(n)
105
- ```
106
-
107
- ## Indexes
108
-
109
- ```typescript
110
- // Field-level (single column)
111
- Field.text({ unique: true }) // unique index
112
- Field.text({ indexed: true }) // non-unique index
113
-
114
- // Callback (composite or explicit)
115
- .indexes((I) => [
116
- I.on("authorId"), // non-unique
117
- I.on("authorId", "published"), // composite
118
- I.unique("slug"), // unique constraint
119
- I.unique("teamId", "userId"), // composite unique
120
- ])
121
- ```
122
-
123
- ## Rules
124
-
125
- Rules are evaluated server-side on every request. A missing key means **deny all** for that action.
126
-
127
- ```typescript
128
- Rule.public() // allow all
129
- R.authId(Users).neq(R.literal(null)) // logged-in users only
130
- R.field("ownerId").eq(R.authId(Users)) // owner-only
131
- R.field("role").in(R.literal(["admin", "mod"])) // role check
132
- R.auth(Users, "role").eq(R.literal("admin")) // check a field on the auth record
133
- Rule.not(R.field("archived").eq(R.literal(true))) // negation
134
- Rule.or(R.field("isPublic").eq(R.literal(true)), R.field("ownerId").eq(R.authId(Users)))
135
- Rule.and(R.field("published").eq(R.literal(true)), R.field("ownerId").eq(R.authId(Users)))
136
-
137
- // Date arithmetic
138
- R.field("created").gte(Rule.dateAdd(Rule.now(), -30, "day"))
139
-
140
- // Request values (header, query param, or body field)
141
- Rule.request("header", "x-api-key").eq(R.literal("secret"))
142
-
143
- // Subquery membership check
144
- Rule.subquery(Members, "teamId").where(R.field("userId").eq(R.authId(Users)))
145
- ```
146
-
147
- ## Filters
148
-
149
- Used in client queries. Type-checked against the collection's field types.
150
-
151
- ```typescript
152
- f.field("published").eq(true)
153
- f.field("viewCount").gte(100)
154
- f.field("status").in(["draft", "published"])
155
- f.field("title").like("%effect%")
156
- f.field("deletedAt").null()
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
+ [![npm](https://img.shields.io/npm/v/@gettersethya/mira-collection)](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()` and/or `.rules()` to add optional concerns.
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":"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"}
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, rulesCb) {
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, rulesCb),
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":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAInD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AA2D7C,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;IAChE,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,EACtB,OAAmB;IAGnB,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,MAAM,eAAe,GAA6C;oBAChE,GAAG,eAAe,EAA2B;oBAC7C,MAAM,KAA+B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA,CAAC,CAAC;iBACnF,CAAA;gBACD,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,eAAe,CAAC,CAAA;gBACxC,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;oBACpC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC1C,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,EAAE,OAAO,CAAC;QAChE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC;KACjE,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;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
+ {"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, FieldDef, FieldsMap } from "./types.js";
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()` and/or `.rules()` to add optional concerns.
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":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAElE,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEvE,KAAK,kBAAkB,GAAG,IAAI,GAAG,OAAO,CAAA;AACxC,KAAK,eAAe,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;AAE7D,KAAK,mBAAmB,GAAG;IACzB,EAAE,EAAO,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,OAAO,EAAE,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,OAAO,EAAE,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,KAAK,EAAI,QAAQ,GAAG;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,CAAA;CACtC,CAAA;AAED,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,KAAK,MAAM,CAAC,CAAC,SAAS,SAAS,IAAI,CACjC,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,mBAAmB,CAAC,KACpC,OAAO,CAAA;AAEZ;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,SAAS,IAAI;IACvD,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,CAAC,CAAA;IACT,MAAM,EAAE,gBAAgB,CAAA;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAA;IACjD;;;OAGG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAA;CAC/C,CAAA;AA6BD;;;;;;;;;;;;;;;GAeG;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
+ {"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, rulesCb) {
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, rulesCb),
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":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAGnD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AA2C7C,SAAS,eAAe,CACtB,IAAY,EACZ,MAAS,EACT,SAAsB,EACtB,OAAmB;IAGnB,IAAI,OAAqC,CAAA;IACzC,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,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,eAAe,EAA2B,CAAC,CAAA;gBACnE,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;oBAC7C,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC1C,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,EAAE,OAAO,CAAC;QAC3D,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;KAC5D,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;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"}
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 readonly string[], O extends Omit<BaseFieldOptions, "default"> & {
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":"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"}
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../../src/collection/field.ts"],"names":[],"mappings":"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"}
@@ -192,7 +192,6 @@ export const Field = {
192
192
  kind: "relation",
193
193
  targetCollection: collection.name,
194
194
  targetField,
195
- _target: collection,
196
195
  ...fieldOpts
197
196
  };
198
197
  return withView(def);