@gettersethya/mira-collection 0.1.0-alpha.10

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 (112) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +164 -0
  3. package/dist/src/collection/auth.d.ts +79 -0
  4. package/dist/src/collection/auth.d.ts.map +1 -0
  5. package/dist/src/collection/auth.js +55 -0
  6. package/dist/src/collection/auth.js.map +1 -0
  7. package/dist/src/collection/base.d.ts +64 -0
  8. package/dist/src/collection/base.d.ts.map +1 -0
  9. package/dist/src/collection/base.js +45 -0
  10. package/dist/src/collection/base.js.map +1 -0
  11. package/dist/src/collection/bytes.d.ts +51 -0
  12. package/dist/src/collection/bytes.d.ts.map +1 -0
  13. package/dist/src/collection/bytes.js +51 -0
  14. package/dist/src/collection/bytes.js.map +1 -0
  15. package/dist/src/collection/errors.d.ts +29 -0
  16. package/dist/src/collection/errors.d.ts.map +1 -0
  17. package/dist/src/collection/errors.js +23 -0
  18. package/dist/src/collection/errors.js.map +1 -0
  19. package/dist/src/collection/field.d.ts +334 -0
  20. package/dist/src/collection/field.d.ts.map +1 -0
  21. package/dist/src/collection/field.js +201 -0
  22. package/dist/src/collection/field.js.map +1 -0
  23. package/dist/src/collection/index-builder.d.ts +59 -0
  24. package/dist/src/collection/index-builder.d.ts.map +1 -0
  25. package/dist/src/collection/index-builder.js +43 -0
  26. package/dist/src/collection/index-builder.js.map +1 -0
  27. package/dist/src/collection/index.d.ts +22 -0
  28. package/dist/src/collection/index.d.ts.map +1 -0
  29. package/dist/src/collection/index.js +21 -0
  30. package/dist/src/collection/index.js.map +1 -0
  31. package/dist/src/collection/serialize.d.ts +24 -0
  32. package/dist/src/collection/serialize.d.ts.map +1 -0
  33. package/dist/src/collection/serialize.js +133 -0
  34. package/dist/src/collection/serialize.js.map +1 -0
  35. package/dist/src/collection/types.d.ts +127 -0
  36. package/dist/src/collection/types.d.ts.map +1 -0
  37. package/dist/src/collection/types.js +2 -0
  38. package/dist/src/collection/types.js.map +1 -0
  39. package/dist/src/collection/view.d.ts +57 -0
  40. package/dist/src/collection/view.d.ts.map +1 -0
  41. package/dist/src/collection/view.js +54 -0
  42. package/dist/src/collection/view.js.map +1 -0
  43. package/dist/src/filter/builder.d.ts +127 -0
  44. package/dist/src/filter/builder.d.ts.map +1 -0
  45. package/dist/src/filter/builder.js +72 -0
  46. package/dist/src/filter/builder.js.map +1 -0
  47. package/dist/src/filter/compiler.d.ts +48 -0
  48. package/dist/src/filter/compiler.d.ts.map +1 -0
  49. package/dist/src/filter/compiler.js +132 -0
  50. package/dist/src/filter/compiler.js.map +1 -0
  51. package/dist/src/filter/index.d.ts +6 -0
  52. package/dist/src/filter/index.d.ts.map +1 -0
  53. package/dist/src/filter/index.js +4 -0
  54. package/dist/src/filter/index.js.map +1 -0
  55. package/dist/src/filter/types.d.ts +96 -0
  56. package/dist/src/filter/types.d.ts.map +1 -0
  57. package/dist/src/filter/types.js +44 -0
  58. package/dist/src/filter/types.js.map +1 -0
  59. package/dist/src/index.d.ts +5 -0
  60. package/dist/src/index.d.ts.map +1 -0
  61. package/dist/src/index.js +4 -0
  62. package/dist/src/index.js.map +1 -0
  63. package/dist/src/rule/builder.d.ts +91 -0
  64. package/dist/src/rule/builder.d.ts.map +1 -0
  65. package/dist/src/rule/builder.js +138 -0
  66. package/dist/src/rule/builder.js.map +1 -0
  67. package/dist/src/rule/index.d.ts +3 -0
  68. package/dist/src/rule/index.d.ts.map +1 -0
  69. package/dist/src/rule/index.js +3 -0
  70. package/dist/src/rule/index.js.map +1 -0
  71. package/dist/src/rule/types.d.ts +132 -0
  72. package/dist/src/rule/types.d.ts.map +1 -0
  73. package/dist/src/rule/types.js +2 -0
  74. package/dist/src/rule/types.js.map +1 -0
  75. package/dist/tests/collection/auth.test.d.ts +2 -0
  76. package/dist/tests/collection/auth.test.d.ts.map +1 -0
  77. package/dist/tests/collection/auth.test.js +44 -0
  78. package/dist/tests/collection/auth.test.js.map +1 -0
  79. package/dist/tests/collection/base.test.d.ts +2 -0
  80. package/dist/tests/collection/base.test.d.ts.map +1 -0
  81. package/dist/tests/collection/base.test.js +70 -0
  82. package/dist/tests/collection/base.test.js.map +1 -0
  83. package/dist/tests/collection/bytes.test.d.ts +2 -0
  84. package/dist/tests/collection/bytes.test.d.ts.map +1 -0
  85. package/dist/tests/collection/bytes.test.js +9 -0
  86. package/dist/tests/collection/bytes.test.js.map +1 -0
  87. package/dist/tests/collection/field.test.d.ts +2 -0
  88. package/dist/tests/collection/field.test.d.ts.map +1 -0
  89. package/dist/tests/collection/field.test.js +165 -0
  90. package/dist/tests/collection/field.test.js.map +1 -0
  91. package/dist/tests/collection/index-type.test.d.ts +2 -0
  92. package/dist/tests/collection/index-type.test.d.ts.map +1 -0
  93. package/dist/tests/collection/index-type.test.js +28 -0
  94. package/dist/tests/collection/index-type.test.js.map +1 -0
  95. package/dist/tests/collection/serialize.test.d.ts +2 -0
  96. package/dist/tests/collection/serialize.test.d.ts.map +1 -0
  97. package/dist/tests/collection/serialize.test.js +193 -0
  98. package/dist/tests/collection/serialize.test.js.map +1 -0
  99. package/dist/tests/collection/view.test.d.ts +2 -0
  100. package/dist/tests/collection/view.test.d.ts.map +1 -0
  101. package/dist/tests/collection/view.test.js +66 -0
  102. package/dist/tests/collection/view.test.js.map +1 -0
  103. package/dist/tests/filter/compiler.test.d.ts +2 -0
  104. package/dist/tests/filter/compiler.test.d.ts.map +1 -0
  105. package/dist/tests/filter/compiler.test.js +156 -0
  106. package/dist/tests/filter/compiler.test.js.map +1 -0
  107. package/dist/tests/rule/builder.test.d.ts +2 -0
  108. package/dist/tests/rule/builder.test.d.ts.map +1 -0
  109. package/dist/tests/rule/builder.test.js +342 -0
  110. package/dist/tests/rule/builder.test.js.map +1 -0
  111. package/dist/tsconfig.tsbuildinfo +1 -0
  112. package/package.json +36 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Getter Sethya
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,164 @@
1
+ # @gettersethya/mira-collection
2
+
3
+ > **Early pre-alpha.** Breaking changes may occur without notice.
4
+
5
+ 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`.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @gettersethya/mira-collection effect
11
+ # or
12
+ pnpm add @gettersethya/mira-collection effect
13
+ ```
14
+
15
+ ## Collection types
16
+
17
+ ### Base collection
18
+
19
+ Standard CRUD collection. System fields `id`, `seqId`, `created`, and `updated` are added automatically.
20
+
21
+ ```typescript
22
+ import { BaseCollection, Bytes, Field, Rule } from "@gettersethya/mira-collection"
23
+
24
+ const Posts = BaseCollection.define("posts", {
25
+ title: Field.text({ maxLength: 200 }),
26
+ slug: Field.text({ unique: true }),
27
+ content: Field.text(),
28
+ published: Field.boolean({ default: false }),
29
+ authorId: Field.relation(Users),
30
+ thumbnail: Field.file({ maxSize: Bytes.fromMB(5), mimeTypes: ["image/*"] }),
31
+ })
32
+ .indexes((I) => [
33
+ I.on("authorId"),
34
+ I.unique("slug"),
35
+ ])
36
+ .rules((R) => ({
37
+ list: R.field("published").eq(R.literal(true)),
38
+ view: Rule.or(R.field("published").eq(R.literal(true)), R.field("authorId").eq(R.authId(Users))),
39
+ create: R.authId(Users).neq(R.literal(null)),
40
+ update: R.field("authorId").eq(R.authId(Users)),
41
+ delete: R.field("authorId").eq(R.authId(Users)),
42
+ }))
43
+ ```
44
+
45
+ ### Auth collection
46
+
47
+ Adds `email`, `password` (hashed), and `emailVerified` system fields. Exposes an `authWithPassword` endpoint.
48
+
49
+ ```typescript
50
+ import { AuthCollection, Field, Rule } from "@gettersethya/mira-collection"
51
+
52
+ const Users = AuthCollection.define("users", {
53
+ displayName: Field.text(),
54
+ username: Field.text({ unique: true }),
55
+ role: Field.text({ default: "user" }),
56
+ })
57
+ .rules((R) => ({
58
+ list: Rule.public(),
59
+ view: Rule.public(),
60
+ create: Rule.public(),
61
+ update: R.selfId().eq(R.authId(Users)), // users can only edit themselves
62
+ }))
63
+ ```
64
+
65
+ ### View collection
66
+
67
+ Read-only, backed by a SQL `VIEW`. Supports `list` and `view` only. Every field must be marked `.view()`.
68
+
69
+ ```typescript
70
+ import { Field, Rule, ViewCollection } from "@gettersethya/mira-collection"
71
+
72
+ const PostsWithAuthors = ViewCollection.define(
73
+ "posts_with_authors",
74
+ `SELECT p.id, p.seqId, p.title, u.displayName AS authorName
75
+ FROM posts p LEFT JOIN users u ON p.authorId = u.id`,
76
+ {
77
+ id: Field.text().view(),
78
+ seqId: Field.integer().view(),
79
+ title: Field.text().view(),
80
+ authorName: Field.text().view(),
81
+ }
82
+ )
83
+ .rules((R) => ({ list: Rule.public(), view: Rule.public() }))
84
+ ```
85
+
86
+ ## Field types
87
+
88
+ ```typescript
89
+ Field.text({ minLength?, maxLength?, unique?, indexed?, required?, default? })
90
+ Field.email()
91
+ Field.integer({ min?, max?, unique?, indexed?, default? })
92
+ Field.number({ min?, max? })
93
+ Field.boolean({ default? })
94
+ Field.date()
95
+ Field.json()
96
+ Field.file({ maxSize?, mimeTypes?, protected? })
97
+ Field.relation(Collection)
98
+
99
+ // File size helpers
100
+ Bytes.fromKB(n)
101
+ Bytes.fromMB(n)
102
+ Bytes.fromGB(n)
103
+ ```
104
+
105
+ ## Indexes
106
+
107
+ ```typescript
108
+ // Field-level (single column)
109
+ Field.text({ unique: true }) // unique index
110
+ Field.text({ indexed: true }) // non-unique index
111
+
112
+ // Callback (composite or explicit)
113
+ .indexes((I) => [
114
+ I.on("authorId"), // non-unique
115
+ I.on("authorId", "published"), // composite
116
+ I.unique("slug"), // unique constraint
117
+ I.unique("teamId", "userId"), // composite unique
118
+ ])
119
+ ```
120
+
121
+ ## Rules
122
+
123
+ Rules are evaluated server-side on every request. A missing key means **deny all** for that action.
124
+
125
+ ```typescript
126
+ Rule.public() // allow all
127
+ R.authId(Users).neq(R.literal(null)) // logged-in users only
128
+ R.field("ownerId").eq(R.authId(Users)) // owner-only
129
+ R.field("role").in(R.literal(["admin", "mod"])) // role check
130
+ R.auth(Users, "role").eq(R.literal("admin")) // check a field on the auth record
131
+ Rule.not(R.field("archived").eq(R.literal(true))) // negation
132
+ Rule.or(R.field("isPublic").eq(R.literal(true)), R.field("ownerId").eq(R.authId(Users)))
133
+ Rule.and(R.field("published").eq(R.literal(true)), R.field("ownerId").eq(R.authId(Users)))
134
+
135
+ // Date arithmetic
136
+ R.field("created").gte(Rule.dateAdd(Rule.now(), -30, "day"))
137
+
138
+ // Request values (header, query param, or body field)
139
+ Rule.request("header", "x-api-key").eq(R.literal("secret"))
140
+
141
+ // Subquery membership check
142
+ Rule.subquery(Members, "teamId").where(R.field("userId").eq(R.authId(Users)))
143
+ ```
144
+
145
+ ## Filters
146
+
147
+ Used in client queries. Type-checked against the collection's field types.
148
+
149
+ ```typescript
150
+ f.field("published").eq(true)
151
+ f.field("viewCount").gte(100)
152
+ f.field("status").in(["draft", "published"])
153
+ f.field("title").like("%effect%")
154
+ f.field("deletedAt").null()
155
+ f.field("price").between(10, 100)
156
+
157
+ f.and(f.field("published").eq(true), f.field("viewCount").gte(100))
158
+ f.or(f.field("category").eq("tech"), f.field("category").eq("science"))
159
+ f.not(f.field("archived").eq(true))
160
+ ```
161
+
162
+ ## More
163
+
164
+ See the [Mira root README](https://github.com/gettersethya/mira) for full documentation.
@@ -0,0 +1,79 @@
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
+ import type { IndexBuilder, IndexEntry } from "./index-builder.js";
5
+ import type { CollectionSchema, FieldDef, FieldsMap } from "./types.js";
6
+ type AuthSystemField = "id" | "email" | "password" | "emailVerified" | "created" | "updated" | "seqId";
7
+ 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
+ /** Rule builder for auth collections — extends RuleBuilder with `selfId()`. */
29
+ type AuthRuleBuilder<F extends FieldsMap> = RuleBuilder<F> & {
30
+ /** authId operand for this collection. Use instead of `Rule.authId(ThisCollection)` to avoid circular references. */
31
+ selfId(): OperandNode<any, string>;
32
+ };
33
+ type IndexCb<F extends FieldsMap> = (I: IndexBuilder<(keyof F & string) | AuthRuleField>) => Array<IndexEntry<(keyof F & string) | AuthRuleField>>;
34
+ type RuleCb<F extends FieldsMap> = (R: AuthRuleBuilder<F & AuthSystemFieldDefs>) => RuleMap;
35
+ /**
36
+ * Builder returned by `AuthCollection.define()`.
37
+ * Immediately satisfies `AnyCollectionDef` — no terminal `.build()` needed.
38
+ * Chain `.indexes()` and/or `.rules()` to add optional concerns.
39
+ * Each chained method returns a new builder; the original is unchanged.
40
+ */
41
+ export type AuthCollectionBuilder<F extends FieldsMap> = {
42
+ name: string;
43
+ fields: F;
44
+ schema: CollectionSchema & {
45
+ "x-collection-kind": "auth";
46
+ };
47
+ /**
48
+ * Add collection-level indexes (in addition to the system email unique index
49
+ * and any field-level `unique`/`indexed` flags).
50
+ * Pass a callback to get a typed index builder with auto-completion over field names.
51
+ */
52
+ indexes(cb: IndexCb<F>): AuthCollectionBuilder<F>;
53
+ /**
54
+ * Add per-action access rules. No rule means deny all.
55
+ * The rule builder includes `.selfId()` as a shorthand for the authenticated user's id
56
+ * on this collection — use it instead of `Rule.authId(ThisCollection)` to avoid circular references.
57
+ */
58
+ rules(cb: RuleCb<F>): AuthCollectionBuilder<F>;
59
+ };
60
+ /**
61
+ * Defines an auth collection for user authentication.
62
+ * Includes system-managed fields: `id`, `email`, `password`, `emailVerified`, `created`, `updated`, `seqId`.
63
+ * Only `extraFields` are user-defined; system field names are forbidden in `extraFields`.
64
+ *
65
+ * @example
66
+ * const Users = AuthCollection.define("users", {
67
+ * name: Field.text(),
68
+ * avatar: Field.file({ maxSize: Bytes.fromMB(2) })
69
+ * })
70
+ * .rules((R) => ({
71
+ * list: R.field("id").eq(R.selfId()),
72
+ * create: R.public()
73
+ * }))
74
+ */
75
+ export declare const AuthCollection: {
76
+ define<F extends FieldsMap & { [K in keyof F & AuthSystemField]?: never; }>(name: string, extraFields: F): AuthCollectionBuilder<F>;
77
+ };
78
+ export {};
79
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/collection/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAElE,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,KAAK,mBAAmB,GAAG;IACzB,EAAE,EAAa,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,KAAK,EAAU,QAAQ,GAAG;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,CAAA;IAC3C,aAAa,EAAE,QAAQ,GAAG;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,CAAA;IAC7C,OAAO,EAAQ,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,OAAO,EAAQ,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,KAAK,EAAU,QAAQ,GAAG;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,CAAA;CAC5C,CAAA;AAED,+EAA+E;AAC/E,KAAK,eAAe,CAAC,CAAC,SAAS,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG;IAC3D,qHAAqH;IACrH,MAAM,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;CACnC,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,KAAK,MAAM,CAAC,CAAC,SAAS,SAAS,IAAI,CACjC,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,mBAAmB,CAAC,KACxC,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,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;IACjD;;;;OAIG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAA;CAC/C,CAAA;AA0CD;;;;;;;;;;;;;;GAcG;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"}
@@ -0,0 +1,55 @@
1
+ import { makeRuleBuilder } from "../rule/builder.js";
2
+ import { Index } from "./index-builder.js";
3
+ import { toJSONSchema } from "./serialize.js";
4
+ const AUTH_SYSTEM_PROPERTIES = {
5
+ email: { type: "string", format: "email", "x-system": true },
6
+ password: { type: "string", "x-system": true, "x-hidden": true },
7
+ emailVerified: { type: "boolean", "x-system": true, default: false }
8
+ };
9
+ const AUTH_SYSTEM_INDEXES = [{ fields: ["email"], unique: true }];
10
+ function makeAuthBuilder(name, extraFields, indexesCb, rulesCb) {
11
+ let _schema;
12
+ return {
13
+ name,
14
+ fields: extraFields,
15
+ get schema() {
16
+ if (_schema === undefined) {
17
+ const indexes = indexesCb?.(Index);
18
+ const authRuleBuilder = {
19
+ ...makeRuleBuilder(),
20
+ selfId() { return { kind: "authId", collection: name }; }
21
+ };
22
+ const rules = rulesCb?.(authRuleBuilder);
23
+ _schema = toJSONSchema("auth", name, extraFields, {
24
+ indexes: [...AUTH_SYSTEM_INDEXES, ...(indexes ?? [])],
25
+ systemFields: AUTH_SYSTEM_PROPERTIES,
26
+ ...(rules !== undefined ? { rules } : {})
27
+ });
28
+ }
29
+ return _schema;
30
+ },
31
+ indexes: (cb) => makeAuthBuilder(name, extraFields, cb, rulesCb),
32
+ rules: (cb) => makeAuthBuilder(name, extraFields, indexesCb, cb)
33
+ };
34
+ }
35
+ /**
36
+ * Defines an auth collection for user authentication.
37
+ * Includes system-managed fields: `id`, `email`, `password`, `emailVerified`, `created`, `updated`, `seqId`.
38
+ * Only `extraFields` are user-defined; system field names are forbidden in `extraFields`.
39
+ *
40
+ * @example
41
+ * const Users = AuthCollection.define("users", {
42
+ * name: Field.text(),
43
+ * avatar: Field.file({ maxSize: Bytes.fromMB(2) })
44
+ * })
45
+ * .rules((R) => ({
46
+ * list: R.field("id").eq(R.selfId()),
47
+ * create: R.public()
48
+ * }))
49
+ */
50
+ export const AuthCollection = {
51
+ define(name, extraFields) {
52
+ return makeAuthBuilder(name, extraFields);
53
+ }
54
+ };
55
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +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;AAqD7C,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,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,WAAW;QACnB,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"}
@@ -0,0 +1,64 @@
1
+ import type { RuleBuilder } from "../rule/builder.js";
2
+ import type { RuleMap } from "../rule/types.js";
3
+ import type { IndexBuilder, IndexEntry } from "./index-builder.js";
4
+ import type { CollectionSchema, FieldDef, FieldsMap } from "./types.js";
5
+ type BaseForbiddenField = "id" | "seqId";
6
+ 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
+ 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
+ /**
24
+ * Builder returned by `BaseCollection.define()`.
25
+ * Immediately satisfies `AnyCollectionDef` — no terminal `.build()` needed.
26
+ * Chain `.indexes()` and/or `.rules()` to add optional concerns.
27
+ * Each chained method returns a new builder; the original is unchanged.
28
+ */
29
+ export type BaseCollectionBuilder<F extends FieldsMap> = {
30
+ name: string;
31
+ fields: F;
32
+ schema: CollectionSchema;
33
+ /**
34
+ * Add collection-level indexes (in addition to field-level `unique`/`indexed` flags).
35
+ * Pass a callback to get a typed index builder with auto-completion over field names.
36
+ */
37
+ 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
+ };
44
+ /**
45
+ * Defines a standard data collection.
46
+ * Base collections are the primary storage type with full CRUD support.
47
+ *
48
+ * @example
49
+ * const Tasks = BaseCollection.define("tasks", {
50
+ * title: Field.text({ maxLength: 200 }),
51
+ * completed: Field.boolean({ default: false }),
52
+ * ownerId: Field.text()
53
+ * })
54
+ * .indexes((I) => [I.on("ownerId")])
55
+ * .rules((R) => ({
56
+ * list: Rule.public(),
57
+ * view: R.field("ownerId").eq(R.authId(Users))
58
+ * }))
59
+ */
60
+ export declare const BaseCollection: {
61
+ define<F extends FieldsMap & { [K in keyof F & BaseForbiddenField]?: never; }>(name: string, fields: F): BaseCollectionBuilder<F>;
62
+ };
63
+ export {};
64
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,45 @@
1
+ import { makeRuleBuilder } from "../rule/builder.js";
2
+ import { Index } from "./index-builder.js";
3
+ import { toJSONSchema } from "./serialize.js";
4
+ function makeBaseBuilder(name, fields, indexesCb, rulesCb) {
5
+ let _schema;
6
+ return {
7
+ name,
8
+ fields,
9
+ get schema() {
10
+ if (_schema === undefined) {
11
+ const indexes = indexesCb?.(Index);
12
+ const rules = rulesCb?.(makeRuleBuilder());
13
+ _schema = toJSONSchema("base", name, fields, {
14
+ ...(indexes !== undefined ? { indexes } : {}),
15
+ ...(rules !== undefined ? { rules } : {})
16
+ });
17
+ }
18
+ return _schema;
19
+ },
20
+ indexes: (cb) => makeBaseBuilder(name, fields, cb, rulesCb),
21
+ rules: (cb) => makeBaseBuilder(name, fields, indexesCb, cb)
22
+ };
23
+ }
24
+ /**
25
+ * Defines a standard data collection.
26
+ * Base collections are the primary storage type with full CRUD support.
27
+ *
28
+ * @example
29
+ * const Tasks = BaseCollection.define("tasks", {
30
+ * title: Field.text({ maxLength: 200 }),
31
+ * completed: Field.boolean({ default: false }),
32
+ * ownerId: Field.text()
33
+ * })
34
+ * .indexes((I) => [I.on("ownerId")])
35
+ * .rules((R) => ({
36
+ * list: Rule.public(),
37
+ * view: R.field("ownerId").eq(R.authId(Users))
38
+ * }))
39
+ */
40
+ export const BaseCollection = {
41
+ define(name, fields) {
42
+ return makeBaseBuilder(name, fields);
43
+ }
44
+ };
45
+ //# sourceMappingURL=base.js.map
@@ -0,0 +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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Human-readable byte size helpers.
3
+ * Use instead of raw byte values in `Field.file({ maxSize })`.
4
+ *
5
+ * @example
6
+ * Field.file({ maxSize: Bytes.fromMB(5) })
7
+ * Bytes.fromGB(2) // => 2 * 1024^3
8
+ */
9
+ export declare const Bytes: {
10
+ /**
11
+ * Convert kilobytes to bytes.
12
+ *
13
+ * @param n - Size in kilobytes
14
+ * @returns Size in bytes
15
+ *
16
+ * @example
17
+ * Bytes.fromKB(500) // 512000
18
+ */
19
+ fromKB: (n: number) => number;
20
+ /**
21
+ * Convert megabytes to bytes.
22
+ *
23
+ * @param n - Size in megabytes
24
+ * @returns Size in bytes
25
+ *
26
+ * @example
27
+ * Bytes.fromMB(5) // 5242880
28
+ */
29
+ fromMB: (n: number) => number;
30
+ /**
31
+ * Convert gigabytes to bytes.
32
+ *
33
+ * @param n - Size in gigabytes
34
+ * @returns Size in bytes
35
+ *
36
+ * @example
37
+ * Bytes.fromGB(2) // 2147483648
38
+ */
39
+ fromGB: (n: number) => number;
40
+ /**
41
+ * Convert terabytes to bytes.
42
+ *
43
+ * @param n - Size in terabytes
44
+ * @returns Size in bytes
45
+ *
46
+ * @example
47
+ * Bytes.fromTB(1) // 1099511627776
48
+ */
49
+ fromTB: (n: number) => number;
50
+ };
51
+ //# sourceMappingURL=bytes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../../src/collection/bytes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,KAAK;IAChB;;;;;;;;OAQG;gBACS,MAAM;IAElB;;;;;;;;OAQG;gBACS,MAAM;IAElB;;;;;;;;OAQG;gBACS,MAAM;IAElB;;;;;;;;OAQG;gBACS,MAAM;CACnB,CAAA"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Human-readable byte size helpers.
3
+ * Use instead of raw byte values in `Field.file({ maxSize })`.
4
+ *
5
+ * @example
6
+ * Field.file({ maxSize: Bytes.fromMB(5) })
7
+ * Bytes.fromGB(2) // => 2 * 1024^3
8
+ */
9
+ export const Bytes = {
10
+ /**
11
+ * Convert kilobytes to bytes.
12
+ *
13
+ * @param n - Size in kilobytes
14
+ * @returns Size in bytes
15
+ *
16
+ * @example
17
+ * Bytes.fromKB(500) // 512000
18
+ */
19
+ fromKB: (n) => n * 1024,
20
+ /**
21
+ * Convert megabytes to bytes.
22
+ *
23
+ * @param n - Size in megabytes
24
+ * @returns Size in bytes
25
+ *
26
+ * @example
27
+ * Bytes.fromMB(5) // 5242880
28
+ */
29
+ fromMB: (n) => n * 1024 ** 2,
30
+ /**
31
+ * Convert gigabytes to bytes.
32
+ *
33
+ * @param n - Size in gigabytes
34
+ * @returns Size in bytes
35
+ *
36
+ * @example
37
+ * Bytes.fromGB(2) // 2147483648
38
+ */
39
+ fromGB: (n) => n * 1024 ** 3,
40
+ /**
41
+ * Convert terabytes to bytes.
42
+ *
43
+ * @param n - Size in terabytes
44
+ * @returns Size in bytes
45
+ *
46
+ * @example
47
+ * Bytes.fromTB(1) // 1099511627776
48
+ */
49
+ fromTB: (n) => n * 1024 ** 4
50
+ };
51
+ //# sourceMappingURL=bytes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../../src/collection/bytes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB;;;;;;;;OAQG;IACH,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI;IAE/B;;;;;;;;OAQG;IACH,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC;IAEpC;;;;;;;;OAQG;IACH,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC;IAEpC;;;;;;;;OAQG;IACH,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC;CACrC,CAAA"}
@@ -0,0 +1,29 @@
1
+ declare const ValidationError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
2
+ readonly _tag: "ValidationError";
3
+ } & Readonly<A>;
4
+ /**
5
+ * Error raised when collection field validation fails.
6
+ * Contains the collection name and a list of human-readable issue descriptions.
7
+ *
8
+ * Raised by:
9
+ * - `filterNodeToWhereClause()` — when a filter references an unknown field
10
+ * - `CollectionService` — when field-level constraints (type, required, min/max length, etc.)
11
+ * fail validation on create or update
12
+ * - Effect Schema validation — when input fails schema decoding
13
+ *
14
+ * @example
15
+ * new ValidationError({
16
+ * collection: "posts",
17
+ * issues: ['Field "title" is required']
18
+ * })
19
+ *
20
+ * @see CollectionService — service that raises ValidationError
21
+ * @see filterNodeToWhereClause — raises ValidationError for unknown filter fields
22
+ */
23
+ export declare class ValidationError extends ValidationError_base<{
24
+ collection: string;
25
+ issues: ReadonlyArray<string>;
26
+ }> {
27
+ }
28
+ export {};
29
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/collection/errors.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAC9B,CAAC;CAAG"}
@@ -0,0 +1,23 @@
1
+ import { Data } from "effect";
2
+ /**
3
+ * Error raised when collection field validation fails.
4
+ * Contains the collection name and a list of human-readable issue descriptions.
5
+ *
6
+ * Raised by:
7
+ * - `filterNodeToWhereClause()` — when a filter references an unknown field
8
+ * - `CollectionService` — when field-level constraints (type, required, min/max length, etc.)
9
+ * fail validation on create or update
10
+ * - Effect Schema validation — when input fails schema decoding
11
+ *
12
+ * @example
13
+ * new ValidationError({
14
+ * collection: "posts",
15
+ * issues: ['Field "title" is required']
16
+ * })
17
+ *
18
+ * @see CollectionService — service that raises ValidationError
19
+ * @see filterNodeToWhereClause — raises ValidationError for unknown filter fields
20
+ */
21
+ export class ValidationError extends Data.TaggedError("ValidationError") {
22
+ }
23
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/collection/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,eAAgB,SAAQ,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAGrE;CAAG"}