@gettersethya/mira-client 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.
- package/LICENSE +21 -0
- package/README.md +140 -0
- package/dist/src/client/auth.d.ts +73 -0
- package/dist/src/client/auth.d.ts.map +1 -0
- package/dist/src/client/auth.js +72 -0
- package/dist/src/client/auth.js.map +1 -0
- package/dist/src/client/collection.d.ts +239 -0
- package/dist/src/client/collection.d.ts.map +1 -0
- package/dist/src/client/collection.js +137 -0
- package/dist/src/client/collection.js.map +1 -0
- package/dist/src/client/errors.d.ts +46 -0
- package/dist/src/client/errors.d.ts.map +1 -0
- package/dist/src/client/errors.js +40 -0
- package/dist/src/client/errors.js.map +1 -0
- package/dist/src/client/factory.d.ts +78 -0
- package/dist/src/client/factory.d.ts.map +1 -0
- package/dist/src/client/factory.js +108 -0
- package/dist/src/client/factory.js.map +1 -0
- package/dist/src/client/file.d.ts +116 -0
- package/dist/src/client/file.d.ts.map +1 -0
- package/dist/src/client/file.js +99 -0
- package/dist/src/client/file.js.map +1 -0
- package/dist/src/client/handler.d.ts +92 -0
- package/dist/src/client/handler.d.ts.map +1 -0
- package/dist/src/client/handler.js +62 -0
- package/dist/src/client/handler.js.map +1 -0
- package/dist/src/client/index.d.ts +13 -0
- package/dist/src/client/index.d.ts.map +1 -0
- package/dist/src/client/index.js +7 -0
- package/dist/src/client/index.js.map +1 -0
- package/dist/src/client/telemetry.d.ts +50 -0
- package/dist/src/client/telemetry.d.ts.map +1 -0
- package/dist/src/client/telemetry.js +32 -0
- package/dist/src/client/telemetry.js.map +1 -0
- package/dist/src/client/types.d.ts +137 -0
- package/dist/src/client/types.d.ts.map +1 -0
- package/dist/src/client/types.js +2 -0
- package/dist/src/client/types.js.map +1 -0
- package/dist/src/collection/auth.d.ts +79 -0
- package/dist/src/collection/auth.d.ts.map +1 -0
- package/dist/src/collection/auth.js +50 -0
- package/dist/src/collection/auth.js.map +1 -0
- package/dist/src/collection/base.d.ts +64 -0
- package/dist/src/collection/base.d.ts.map +1 -0
- package/dist/src/collection/base.js +40 -0
- package/dist/src/collection/base.js.map +1 -0
- package/dist/src/collection/bytes.d.ts +51 -0
- package/dist/src/collection/bytes.d.ts.map +1 -0
- package/dist/src/collection/bytes.js +51 -0
- package/dist/src/collection/bytes.js.map +1 -0
- package/dist/src/collection/errors.d.ts +29 -0
- package/dist/src/collection/errors.d.ts.map +1 -0
- package/dist/src/collection/errors.js +23 -0
- package/dist/src/collection/errors.js.map +1 -0
- package/dist/src/collection/field.d.ts +300 -0
- package/dist/src/collection/field.d.ts.map +1 -0
- package/dist/src/collection/field.js +175 -0
- package/dist/src/collection/field.js.map +1 -0
- package/dist/src/collection/index-builder.d.ts +59 -0
- package/dist/src/collection/index-builder.d.ts.map +1 -0
- package/dist/src/collection/index-builder.js +43 -0
- package/dist/src/collection/index-builder.js.map +1 -0
- package/dist/src/collection/index.d.ts +22 -0
- package/dist/src/collection/index.d.ts.map +1 -0
- package/dist/src/collection/index.js +21 -0
- package/dist/src/collection/index.js.map +1 -0
- package/dist/src/collection/serialize.d.ts +24 -0
- package/dist/src/collection/serialize.d.ts.map +1 -0
- package/dist/src/collection/serialize.js +127 -0
- package/dist/src/collection/serialize.js.map +1 -0
- package/dist/src/collection/types.d.ts +119 -0
- package/dist/src/collection/types.d.ts.map +1 -0
- package/dist/src/collection/types.js +2 -0
- package/dist/src/collection/types.js.map +1 -0
- package/dist/src/collection/view.d.ts +57 -0
- package/dist/src/collection/view.d.ts.map +1 -0
- package/dist/src/collection/view.js +49 -0
- package/dist/src/collection/view.js.map +1 -0
- package/dist/src/filter/builder.d.ts +127 -0
- package/dist/src/filter/builder.d.ts.map +1 -0
- package/dist/src/filter/builder.js +72 -0
- package/dist/src/filter/builder.js.map +1 -0
- package/dist/src/filter/compiler.d.ts +48 -0
- package/dist/src/filter/compiler.d.ts.map +1 -0
- package/dist/src/filter/compiler.js +132 -0
- package/dist/src/filter/compiler.js.map +1 -0
- package/dist/src/filter/index.d.ts +6 -0
- package/dist/src/filter/index.d.ts.map +1 -0
- package/dist/src/filter/index.js +4 -0
- package/dist/src/filter/index.js.map +1 -0
- package/dist/src/filter/types.d.ts +96 -0
- package/dist/src/filter/types.d.ts.map +1 -0
- package/dist/src/filter/types.js +44 -0
- package/dist/src/filter/types.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/rule/builder.d.ts +97 -0
- package/dist/src/rule/builder.d.ts.map +1 -0
- package/dist/src/rule/builder.js +126 -0
- package/dist/src/rule/builder.js.map +1 -0
- package/dist/src/rule/index.d.ts +3 -0
- package/dist/src/rule/index.d.ts.map +1 -0
- package/dist/src/rule/index.js +3 -0
- package/dist/src/rule/index.js.map +1 -0
- package/dist/src/rule/types.d.ts +129 -0
- package/dist/src/rule/types.d.ts.map +1 -0
- package/dist/src/rule/types.js +2 -0
- package/dist/src/rule/types.js.map +1 -0
- package/dist/tests/client/auth.test.d.ts +2 -0
- package/dist/tests/client/auth.test.d.ts.map +1 -0
- package/dist/tests/client/auth.test.js +67 -0
- package/dist/tests/client/auth.test.js.map +1 -0
- package/dist/tests/client/collection.test.d.ts +2 -0
- package/dist/tests/client/collection.test.d.ts.map +1 -0
- package/dist/tests/client/collection.test.js +593 -0
- package/dist/tests/client/collection.test.js.map +1 -0
- package/dist/tests/client/file.test.d.ts +2 -0
- package/dist/tests/client/file.test.d.ts.map +1 -0
- package/dist/tests/client/file.test.js +21 -0
- package/dist/tests/client/file.test.js.map +1 -0
- package/dist/tests/client/handler.test.d.ts +2 -0
- package/dist/tests/client/handler.test.d.ts.map +1 -0
- package/dist/tests/client/handler.test.js +24 -0
- package/dist/tests/client/handler.test.js.map +1 -0
- package/dist/tests/client/types.test.d.ts +2 -0
- package/dist/tests/client/types.test.d.ts.map +1 -0
- package/dist/tests/client/types.test.js +168 -0
- package/dist/tests/client/types.test.js.map +1 -0
- package/dist/tests/collection/auth.test.d.ts +2 -0
- package/dist/tests/collection/auth.test.d.ts.map +1 -0
- package/dist/tests/collection/auth.test.js +44 -0
- package/dist/tests/collection/auth.test.js.map +1 -0
- package/dist/tests/collection/base.test.d.ts +2 -0
- package/dist/tests/collection/base.test.d.ts.map +1 -0
- package/dist/tests/collection/base.test.js +70 -0
- package/dist/tests/collection/base.test.js.map +1 -0
- package/dist/tests/collection/bytes.test.d.ts +2 -0
- package/dist/tests/collection/bytes.test.d.ts.map +1 -0
- package/dist/tests/collection/bytes.test.js +9 -0
- package/dist/tests/collection/bytes.test.js.map +1 -0
- package/dist/tests/collection/field.test.d.ts +2 -0
- package/dist/tests/collection/field.test.d.ts.map +1 -0
- package/dist/tests/collection/field.test.js +140 -0
- package/dist/tests/collection/field.test.js.map +1 -0
- package/dist/tests/collection/index-type.test.d.ts +2 -0
- package/dist/tests/collection/index-type.test.d.ts.map +1 -0
- package/dist/tests/collection/index-type.test.js +28 -0
- package/dist/tests/collection/index-type.test.js.map +1 -0
- package/dist/tests/collection/serialize.test.d.ts +2 -0
- package/dist/tests/collection/serialize.test.d.ts.map +1 -0
- package/dist/tests/collection/serialize.test.js +165 -0
- package/dist/tests/collection/serialize.test.js.map +1 -0
- package/dist/tests/collection/view.test.d.ts +2 -0
- package/dist/tests/collection/view.test.d.ts.map +1 -0
- package/dist/tests/collection/view.test.js +66 -0
- package/dist/tests/collection/view.test.js.map +1 -0
- package/dist/tests/filter/compiler.test.d.ts +2 -0
- package/dist/tests/filter/compiler.test.d.ts.map +1 -0
- package/dist/tests/filter/compiler.test.js +156 -0
- package/dist/tests/filter/compiler.test.js.map +1 -0
- package/dist/tests/rule/builder.test.d.ts +2 -0
- package/dist/tests/rule/builder.test.d.ts.map +1 -0
- package/dist/tests/rule/builder.test.js +290 -0
- package/dist/tests/rule/builder.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
const indexes = indexesCb?.(Index);
|
|
12
|
+
const authRuleBuilder = {
|
|
13
|
+
...makeRuleBuilder(),
|
|
14
|
+
selfId() { return { kind: "authId", collection: name }; }
|
|
15
|
+
};
|
|
16
|
+
const rules = rulesCb?.(authRuleBuilder);
|
|
17
|
+
const schema = toJSONSchema("auth", name, extraFields, {
|
|
18
|
+
indexes: [...AUTH_SYSTEM_INDEXES, ...(indexes ?? [])],
|
|
19
|
+
systemFields: AUTH_SYSTEM_PROPERTIES,
|
|
20
|
+
...(rules !== undefined ? { rules } : {})
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
name,
|
|
24
|
+
fields: extraFields,
|
|
25
|
+
schema,
|
|
26
|
+
indexes: (cb) => makeAuthBuilder(name, extraFields, cb, rulesCb),
|
|
27
|
+
rules: (cb) => makeAuthBuilder(name, extraFields, indexesCb, cb)
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Defines an auth collection for user authentication.
|
|
32
|
+
* Includes system-managed fields: `id`, `email`, `password`, `emailVerified`, `created`, `updated`, `seqId`.
|
|
33
|
+
* Only `extraFields` are user-defined; system field names are forbidden in `extraFields`.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* const Users = AuthCollection.define("users", {
|
|
37
|
+
* name: Field.text(),
|
|
38
|
+
* avatar: Field.file({ maxSize: Bytes.fromMB(2) })
|
|
39
|
+
* })
|
|
40
|
+
* .rules((R) => ({
|
|
41
|
+
* list: R.field("id").eq(R.selfId()),
|
|
42
|
+
* create: R.public()
|
|
43
|
+
* }))
|
|
44
|
+
*/
|
|
45
|
+
export const AuthCollection = {
|
|
46
|
+
define(name, extraFields) {
|
|
47
|
+
return makeAuthBuilder(name, extraFields);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
//# 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,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,KAAyB,CAAC,CAAA;IACtD,MAAM,eAAe,GAA6C;QAChE,GAAG,eAAe,EAA2B;QAC7C,MAAM,KAA+B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA,CAAC,CAAC;KACnF,CAAA;IACD,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,eAAe,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE;QACrD,OAAO,EAAE,CAAC,GAAG,mBAAmB,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACrD,YAAY,EAAE,sBAAsB;QACpC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC,CAAA;IACF,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,WAAW;QACnB,MAAM;QACN,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;AAwBD;;;;;;;;;;;;;;;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,40 @@
|
|
|
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
|
+
const indexes = indexesCb?.(Index);
|
|
6
|
+
const rules = rulesCb?.(makeRuleBuilder());
|
|
7
|
+
const schema = toJSONSchema("base", name, fields, {
|
|
8
|
+
...(indexes !== undefined ? { indexes } : {}),
|
|
9
|
+
...(rules !== undefined ? { rules } : {})
|
|
10
|
+
});
|
|
11
|
+
return {
|
|
12
|
+
name,
|
|
13
|
+
fields,
|
|
14
|
+
schema,
|
|
15
|
+
indexes: (cb) => makeBaseBuilder(name, fields, cb, rulesCb),
|
|
16
|
+
rules: (cb) => makeBaseBuilder(name, fields, indexesCb, cb)
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Defines a standard data collection.
|
|
21
|
+
* Base collections are the primary storage type with full CRUD support.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* const Tasks = BaseCollection.define("tasks", {
|
|
25
|
+
* title: Field.text({ maxLength: 200 }),
|
|
26
|
+
* completed: Field.boolean({ default: false }),
|
|
27
|
+
* ownerId: Field.text()
|
|
28
|
+
* })
|
|
29
|
+
* .indexes((I) => [I.on("ownerId")])
|
|
30
|
+
* .rules((R) => ({
|
|
31
|
+
* list: Rule.public(),
|
|
32
|
+
* view: R.field("ownerId").eq(R.authId(Users))
|
|
33
|
+
* }))
|
|
34
|
+
*/
|
|
35
|
+
export const BaseCollection = {
|
|
36
|
+
define(name, fields) {
|
|
37
|
+
return makeBaseBuilder(name, fields);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
//# 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,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,KAAyB,CAAC,CAAA;IACtD,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,eAAe,EAA2B,CAAC,CAAA;IACnE,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;QAChD,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC,CAAA;IACF,OAAO;QACL,IAAI;QACJ,MAAM;QACN,MAAM;QACN,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"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import type { AnyCollectionDef, EmailConstraintKind, FieldDef, IntegerConstraintKind, NumberConstraintKind, SimpleConstraintKind, TextConstraintKind } from "./types.js";
|
|
2
|
+
/** Common options shared by all field types. */
|
|
3
|
+
type BaseFieldOptions = {
|
|
4
|
+
/** Alternative field name in the database (defaults to the key in the fields map). */
|
|
5
|
+
name?: string;
|
|
6
|
+
/** Whether the field is required (defaults to `true` if no default is set). */
|
|
7
|
+
required?: boolean;
|
|
8
|
+
/** Creates a unique index on this field. */
|
|
9
|
+
unique?: boolean;
|
|
10
|
+
/** Creates a non-unique index on this field. */
|
|
11
|
+
indexed?: boolean;
|
|
12
|
+
/** Default value for the field when creating a record. */
|
|
13
|
+
default?: unknown;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Field builder API.
|
|
17
|
+
* Every method returns a typed `FieldDef` with `.view()` for use in `ViewCollection`.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* const Posts = BaseCollection.define("posts", {
|
|
21
|
+
* title: Field.text({ maxLength: 200 }),
|
|
22
|
+
* body: Field.text({ required: false }),
|
|
23
|
+
* published: Field.boolean({ default: false }),
|
|
24
|
+
* author: Field.relation(Users)
|
|
25
|
+
* })
|
|
26
|
+
*/
|
|
27
|
+
export declare const Field: {
|
|
28
|
+
/**
|
|
29
|
+
* A UTF-8 text/string field with optional min/max length constraints.
|
|
30
|
+
* Stored as `TEXT` in SQLite.
|
|
31
|
+
*
|
|
32
|
+
* @param opts.required - Whether the field is required (default: true, unless `default` is set)
|
|
33
|
+
* @param opts.default - Default value for new records
|
|
34
|
+
* @param opts.unique - Create a unique index on this field
|
|
35
|
+
* @param opts.indexed - Create a non-unique index on this field
|
|
36
|
+
* @param opts.name - Alternative column name in the database
|
|
37
|
+
* @param opts.minLength - Minimum string length (validated on create and update)
|
|
38
|
+
* @param opts.maxLength - Maximum string length (validated on create and update)
|
|
39
|
+
* @param opts.error - Callback for custom validation error messages, keyed by constraint kind
|
|
40
|
+
* @returns A text-type FieldDef with `.view()` method
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* Field.text({ maxLength: 500, required: true })
|
|
44
|
+
* Field.text({ minLength: 3, maxLength: 100, default: "untitled" })
|
|
45
|
+
*/
|
|
46
|
+
text: <O extends BaseFieldOptions & {
|
|
47
|
+
minLength?: number;
|
|
48
|
+
maxLength?: number;
|
|
49
|
+
}>(opts?: O & {
|
|
50
|
+
error?: (kind: TextConstraintKind) => string | undefined;
|
|
51
|
+
}) => FieldDef & {
|
|
52
|
+
kind: "text";
|
|
53
|
+
} & O & {
|
|
54
|
+
error?: (kind: TextConstraintKind) => string | undefined;
|
|
55
|
+
} & {
|
|
56
|
+
view(): FieldDef & {
|
|
57
|
+
kind: "text";
|
|
58
|
+
} & O & {
|
|
59
|
+
error?: (kind: TextConstraintKind) => string | undefined;
|
|
60
|
+
} & {
|
|
61
|
+
viewOnly: true;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* A floating-point number field with optional min/max constraints.
|
|
66
|
+
* Stored as `REAL` in SQLite.
|
|
67
|
+
*
|
|
68
|
+
* @param opts.min - Minimum allowed value (inclusive)
|
|
69
|
+
* @param opts.max - Maximum allowed value (inclusive)
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* Field.number({ min: 0, max: 100 })
|
|
73
|
+
* Field.number({ required: false })
|
|
74
|
+
*/
|
|
75
|
+
number: <O extends BaseFieldOptions & {
|
|
76
|
+
min?: number;
|
|
77
|
+
max?: number;
|
|
78
|
+
}>(opts?: O & {
|
|
79
|
+
error?: (kind: NumberConstraintKind) => string | undefined;
|
|
80
|
+
}) => FieldDef & {
|
|
81
|
+
kind: "number";
|
|
82
|
+
} & O & {
|
|
83
|
+
error?: (kind: NumberConstraintKind) => string | undefined;
|
|
84
|
+
} & {
|
|
85
|
+
view(): FieldDef & {
|
|
86
|
+
kind: "number";
|
|
87
|
+
} & O & {
|
|
88
|
+
error?: (kind: NumberConstraintKind) => string | undefined;
|
|
89
|
+
} & {
|
|
90
|
+
viewOnly: true;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* An integer field with optional min/max constraints.
|
|
95
|
+
* Stored as `INTEGER` in SQLite. Values are validated to be whole numbers.
|
|
96
|
+
*
|
|
97
|
+
* @param opts.min - Minimum allowed value (inclusive)
|
|
98
|
+
* @param opts.max - Maximum allowed value (inclusive)
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* Field.integer({ min: 1, max: 5 })
|
|
102
|
+
*/
|
|
103
|
+
integer: <O extends BaseFieldOptions & {
|
|
104
|
+
min?: number;
|
|
105
|
+
max?: number;
|
|
106
|
+
}>(opts?: O & {
|
|
107
|
+
error?: (kind: IntegerConstraintKind) => string | undefined;
|
|
108
|
+
}) => FieldDef & {
|
|
109
|
+
kind: "integer";
|
|
110
|
+
} & O & {
|
|
111
|
+
error?: (kind: IntegerConstraintKind) => string | undefined;
|
|
112
|
+
} & {
|
|
113
|
+
view(): FieldDef & {
|
|
114
|
+
kind: "integer";
|
|
115
|
+
} & O & {
|
|
116
|
+
error?: (kind: IntegerConstraintKind) => string | undefined;
|
|
117
|
+
} & {
|
|
118
|
+
viewOnly: true;
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* A boolean (true/false) field.
|
|
123
|
+
* Stored as `INTEGER` (0/1) in SQLite.
|
|
124
|
+
* Typically paired with a `default` value since new records default to false.
|
|
125
|
+
*
|
|
126
|
+
* @param opts.default - Default value (recommended to always set this)
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* Field.boolean({ default: false })
|
|
130
|
+
*/
|
|
131
|
+
boolean: <O extends Omit<BaseFieldOptions, "default"> & {
|
|
132
|
+
default?: boolean;
|
|
133
|
+
}>(opts?: O & {
|
|
134
|
+
error?: (kind: SimpleConstraintKind) => string | undefined;
|
|
135
|
+
}) => FieldDef & {
|
|
136
|
+
kind: "boolean";
|
|
137
|
+
} & O & {
|
|
138
|
+
error?: (kind: SimpleConstraintKind) => string | undefined;
|
|
139
|
+
} & {
|
|
140
|
+
view(): FieldDef & {
|
|
141
|
+
kind: "boolean";
|
|
142
|
+
} & O & {
|
|
143
|
+
error?: (kind: SimpleConstraintKind) => string | undefined;
|
|
144
|
+
} & {
|
|
145
|
+
viewOnly: true;
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* A date/time field stored as an ISO 8601 string.
|
|
150
|
+
* Stored as `TEXT` in SQLite. Values should be ISO 8601 strings.
|
|
151
|
+
* The server does not parse or transform date values — they are stored verbatim.
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* Field.date({ required: true })
|
|
155
|
+
*/
|
|
156
|
+
date: <O extends BaseFieldOptions>(opts?: O & {
|
|
157
|
+
error?: (kind: SimpleConstraintKind) => string | undefined;
|
|
158
|
+
}) => FieldDef & {
|
|
159
|
+
kind: "date";
|
|
160
|
+
} & O & {
|
|
161
|
+
error?: (kind: SimpleConstraintKind) => string | undefined;
|
|
162
|
+
} & {
|
|
163
|
+
view(): FieldDef & {
|
|
164
|
+
kind: "date";
|
|
165
|
+
} & O & {
|
|
166
|
+
error?: (kind: SimpleConstraintKind) => string | undefined;
|
|
167
|
+
} & {
|
|
168
|
+
viewOnly: true;
|
|
169
|
+
};
|
|
170
|
+
};
|
|
171
|
+
/**
|
|
172
|
+
* An email address field with built-in format validation.
|
|
173
|
+
* Stored as `TEXT` in SQLite. The server validates the email format
|
|
174
|
+
* on both create and update operations.
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* Field.email({ required: false })
|
|
178
|
+
*/
|
|
179
|
+
email: <O extends BaseFieldOptions>(opts?: O & {
|
|
180
|
+
error?: (kind: EmailConstraintKind) => string | undefined;
|
|
181
|
+
}) => FieldDef & {
|
|
182
|
+
kind: "email";
|
|
183
|
+
} & O & {
|
|
184
|
+
error?: (kind: EmailConstraintKind) => string | undefined;
|
|
185
|
+
} & {
|
|
186
|
+
view(): FieldDef & {
|
|
187
|
+
kind: "email";
|
|
188
|
+
} & O & {
|
|
189
|
+
error?: (kind: EmailConstraintKind) => string | undefined;
|
|
190
|
+
} & {
|
|
191
|
+
viewOnly: true;
|
|
192
|
+
};
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* A JSON field for storing arbitrary structured data.
|
|
196
|
+
* Stored as `TEXT` (JSON string) in SQLite. The server serializes/deserializes
|
|
197
|
+
* values automatically. Can be used for dynamic metadata, nested objects, arrays, etc.
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* Field.json({ required: false })
|
|
201
|
+
*/
|
|
202
|
+
json: <O extends BaseFieldOptions>(opts?: O & {
|
|
203
|
+
error?: (kind: SimpleConstraintKind) => string | undefined;
|
|
204
|
+
}) => FieldDef & {
|
|
205
|
+
kind: "json";
|
|
206
|
+
} & O & {
|
|
207
|
+
error?: (kind: SimpleConstraintKind) => string | undefined;
|
|
208
|
+
} & {
|
|
209
|
+
view(): FieldDef & {
|
|
210
|
+
kind: "json";
|
|
211
|
+
} & O & {
|
|
212
|
+
error?: (kind: SimpleConstraintKind) => string | undefined;
|
|
213
|
+
} & {
|
|
214
|
+
viewOnly: true;
|
|
215
|
+
};
|
|
216
|
+
};
|
|
217
|
+
/**
|
|
218
|
+
* Auto-incrementing sequence ID (system-managed, hidden from API responses).
|
|
219
|
+
* Stored as `INTEGER` in SQLite with `AUTOINCREMENT`.
|
|
220
|
+
* This field is always present on base and auth collections and does NOT expose
|
|
221
|
+
* `.view()` — it is always a physical column.
|
|
222
|
+
*
|
|
223
|
+
* @example
|
|
224
|
+
* // seqId is automatically included in base/auth collections — typically
|
|
225
|
+
* // only used in ViewCollection where you map a query column to seqId.
|
|
226
|
+
* Field.seqId()
|
|
227
|
+
*/
|
|
228
|
+
seqId: (opts?: BaseFieldOptions) => FieldDef;
|
|
229
|
+
/**
|
|
230
|
+
* A file/attachment field referencing an uploaded file.
|
|
231
|
+
* Stored as `TEXT` (filename string) in SQLite. The actual file content is
|
|
232
|
+
* stored in the file storage backend (local disk or S3).
|
|
233
|
+
*
|
|
234
|
+
* When `protected: true`, the file requires a short-lived JWT token to access.
|
|
235
|
+
* Protected files are served via the async token endpoint.
|
|
236
|
+
*
|
|
237
|
+
* @param opts.maxSize - Maximum file size in bytes (use `Bytes.*` helpers)
|
|
238
|
+
* @param opts.mimeTypes - Allowed MIME types (e.g., ["image/jpeg", "image/png"])
|
|
239
|
+
* @param opts.protected - Whether the file requires auth token to access
|
|
240
|
+
*
|
|
241
|
+
* @example
|
|
242
|
+
* Field.file({ maxSize: Bytes.fromMB(5), mimeTypes: ["image/jpeg"] })
|
|
243
|
+
* Field.file({ protected: true, maxSize: Bytes.fromMB(10) })
|
|
244
|
+
*
|
|
245
|
+
* @see Bytes — byte size helpers for maxSize
|
|
246
|
+
*/
|
|
247
|
+
file: <O extends BaseFieldOptions & {
|
|
248
|
+
maxSize?: number;
|
|
249
|
+
mimeTypes?: Array<string>;
|
|
250
|
+
protected?: boolean;
|
|
251
|
+
}>(opts?: O & {
|
|
252
|
+
error?: (kind: SimpleConstraintKind) => string | undefined;
|
|
253
|
+
}) => FieldDef & {
|
|
254
|
+
kind: "file";
|
|
255
|
+
} & O & {
|
|
256
|
+
error?: (kind: SimpleConstraintKind) => string | undefined;
|
|
257
|
+
} & {
|
|
258
|
+
view(): FieldDef & {
|
|
259
|
+
kind: "file";
|
|
260
|
+
} & O & {
|
|
261
|
+
error?: (kind: SimpleConstraintKind) => string | undefined;
|
|
262
|
+
} & {
|
|
263
|
+
viewOnly: true;
|
|
264
|
+
};
|
|
265
|
+
};
|
|
266
|
+
/**
|
|
267
|
+
* A relation field referencing another collection's record.
|
|
268
|
+
* Stores the target record's field value (defaults to `"id"`).
|
|
269
|
+
* Resolves collection names at definition time — only the name string survives
|
|
270
|
+
* into the serialized JSON Schema.
|
|
271
|
+
*
|
|
272
|
+
* The `_target` phantom property carries the collection definition at compile time
|
|
273
|
+
* for type inference in `WithExpand`.
|
|
274
|
+
*
|
|
275
|
+
* @param collection - The target collection definition (AnyCollectionDef)
|
|
276
|
+
* @param opts.field - The target field to reference (defaults to `"id"`)
|
|
277
|
+
*
|
|
278
|
+
* @example
|
|
279
|
+
* Field.relation(Users)
|
|
280
|
+
* Field.relation(Users, { field: "email" })
|
|
281
|
+
*
|
|
282
|
+
* @see WithExpand — uses _target to type expanded related records
|
|
283
|
+
*/
|
|
284
|
+
relation: <C extends AnyCollectionDef, O extends BaseFieldOptions>(collection: C, opts?: O & {
|
|
285
|
+
field?: (keyof C["fields"] & string) | "id" | "created" | "updated";
|
|
286
|
+
error?: (kind: SimpleConstraintKind) => string | undefined;
|
|
287
|
+
}) => FieldDef & {
|
|
288
|
+
kind: "relation";
|
|
289
|
+
_target: C;
|
|
290
|
+
} & O & {
|
|
291
|
+
view(): FieldDef & {
|
|
292
|
+
kind: "relation";
|
|
293
|
+
_target: C;
|
|
294
|
+
} & O & {
|
|
295
|
+
viewOnly: true;
|
|
296
|
+
};
|
|
297
|
+
};
|
|
298
|
+
};
|
|
299
|
+
export {};
|
|
300
|
+
//# sourceMappingURL=field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../../src/collection/field.ts"],"names":[],"mappings":"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"}
|