@gettersethya/mira-client 0.1.0-alpha.2
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/dist/src/client/auth.d.ts +66 -0
- package/dist/src/client/auth.d.ts.map +1 -0
- package/dist/src/client/auth.js +60 -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 +76 -0
- package/dist/src/client/factory.d.ts.map +1 -0
- package/dist/src/client/factory.js +106 -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 +11 -0
- package/dist/src/client/index.d.ts.map +1 -0
- package/dist/src/client/index.js +6 -0
- package/dist/src/client/index.js.map +1 -0
- package/dist/src/client/types.d.ts +138 -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 +543 -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,138 @@
|
|
|
1
|
+
import type { AnyCollectionDef, FieldKindToType, FieldsMap } from "@gettersethya/mira-collection";
|
|
2
|
+
import type { ProtectedFileFieldClient, PublicFileFieldClient } from "./file.js";
|
|
3
|
+
type FieldKindToInputType = Omit<FieldKindToType, "file"> & {
|
|
4
|
+
file: File | Blob;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* The input type for creating/updating records when file uploads are involved.
|
|
8
|
+
* Same structure as `InferCreateInput` but file fields accept `File | Blob`
|
|
9
|
+
* instead of the server-returned URL string.
|
|
10
|
+
*
|
|
11
|
+
* When the input contains any `Blob` values, the client SDK automatically
|
|
12
|
+
* dispatches a `multipart/form-data` request instead of JSON.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // For a collection with { avatar: Field.file() }
|
|
16
|
+
* // InferMutationInput resolves avatar to: File | Blob
|
|
17
|
+
*
|
|
18
|
+
* @see InferCreateInput — create input without file upload support
|
|
19
|
+
* @see InferRecord — the corresponding output type
|
|
20
|
+
*/
|
|
21
|
+
export type InferMutationInput<F extends FieldsMap> = {
|
|
22
|
+
[K in keyof F as F[K]["kind"] extends "seqId" ? never : F[K]["viewOnly"] extends true ? never : F[K]["required"] extends false ? K : never]?: FieldKindToInputType[F[K]["kind"]] | null;
|
|
23
|
+
} & {
|
|
24
|
+
[K in keyof F as F[K]["kind"] extends "seqId" ? never : F[K]["viewOnly"] extends true ? never : F[K]["required"] extends false ? never : K]: FieldKindToInputType[F[K]["kind"]];
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* The full record type returned from the server for a collection.
|
|
28
|
+
* Includes the system-managed `id`, `created`, and `updated` fields plus all
|
|
29
|
+
* user-defined fields with their correct TypeScript types.
|
|
30
|
+
*
|
|
31
|
+
* Optional fields (`required: false`) are typed as `T | null`.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* interface Post { title: Field.text(); body: Field.text({ required: false }) }
|
|
35
|
+
* // InferRecord<Post> resolves to:
|
|
36
|
+
* // { id: string; created: string; updated: string } & {
|
|
37
|
+
* // title: string;
|
|
38
|
+
* // body: string | null;
|
|
39
|
+
* // }
|
|
40
|
+
*
|
|
41
|
+
* @see InferCreateInput — input type for creating records
|
|
42
|
+
* @see InferMutationInput — mutation input type (file fields use File | Blob)
|
|
43
|
+
*/
|
|
44
|
+
export type InferRecord<F extends FieldsMap> = {
|
|
45
|
+
id: string;
|
|
46
|
+
created: string;
|
|
47
|
+
updated: string;
|
|
48
|
+
} & {
|
|
49
|
+
[K in keyof F as F[K]["kind"] extends "seqId" ? never : K]: F[K]["required"] extends false ? FieldKindToType[F[K]["kind"]] | null : FieldKindToType[F[K]["kind"]];
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* The input type for creating a new record.
|
|
53
|
+
* Excludes system-managed fields (`seqId`) and view-only fields.
|
|
54
|
+
* Optional fields (`required: false`) are typed as `T | null` and are
|
|
55
|
+
* themselves optional (`K?`)
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* // InferCreateInput<Post> resolves to:
|
|
59
|
+
* // { title: string; body?: string | null }
|
|
60
|
+
*
|
|
61
|
+
* @see InferRecord — the corresponding output type
|
|
62
|
+
* @see InferMutationInput — mutation variant that uses File | Blob for file fields
|
|
63
|
+
*/
|
|
64
|
+
export type InferCreateInput<F extends FieldsMap> = {
|
|
65
|
+
[K in keyof F as F[K]["kind"] extends "seqId" ? never : F[K]["viewOnly"] extends true ? never : F[K]["required"] extends false ? K : never]?: FieldKindToType[F[K]["kind"]] | null;
|
|
66
|
+
} & {
|
|
67
|
+
[K in keyof F as F[K]["kind"] extends "seqId" ? never : F[K]["viewOnly"] extends true ? never : F[K]["required"] extends false ? never : K]: FieldKindToType[F[K]["kind"]];
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Extracts the field names of type `relation` from a FieldsMap.
|
|
71
|
+
* Used to constrain the `expand` option in collection queries.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* // For { author: Field.relation(Users), title: Field.text() }
|
|
75
|
+
* // RelationKeys resolves to: "author"
|
|
76
|
+
*
|
|
77
|
+
* @see WithExpand — uses RelationKeys to type the expand parameter
|
|
78
|
+
*/
|
|
79
|
+
export type RelationKeys<F extends FieldsMap> = {
|
|
80
|
+
[K in keyof F]: F[K]["kind"] extends "relation" ? K : never;
|
|
81
|
+
}[keyof F] & string;
|
|
82
|
+
/**
|
|
83
|
+
* Extracts the field names of type `file` from a FieldsMap.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* // For { avatar: Field.file(), name: Field.text() }
|
|
87
|
+
* // FileKeys resolves to: "avatar"
|
|
88
|
+
*
|
|
89
|
+
* @see CollectionFileFields — maps file fields to their client interfaces
|
|
90
|
+
*/
|
|
91
|
+
export type FileKeys<F extends FieldsMap> = {
|
|
92
|
+
[K in keyof F]: F[K]["kind"] extends "file" ? K : never;
|
|
93
|
+
}[keyof F] & string;
|
|
94
|
+
/**
|
|
95
|
+
* Augments `InferRecord<F>` with an `expand` property containing the resolved
|
|
96
|
+
* related records for the requested relation field names.
|
|
97
|
+
*
|
|
98
|
+
* When `E` is an empty tuple (no expand requested), the result is just
|
|
99
|
+
* `InferRecord<F>` without the `expand` property.
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* // WithExpand<PostFields, ["author"]> resolves to:
|
|
103
|
+
* // InferRecord<Post> & {
|
|
104
|
+
* // expand: { author: InferRecord<UserFields> }
|
|
105
|
+
* // }
|
|
106
|
+
*
|
|
107
|
+
* @see InferRecord — the base record type
|
|
108
|
+
* @see RelationKeys — used to constrain E to relation fields
|
|
109
|
+
*/
|
|
110
|
+
export type WithExpand<F extends FieldsMap, E extends ReadonlyArray<string>> = InferRecord<F> & ([
|
|
111
|
+
E
|
|
112
|
+
] extends [[]] ? {} : {
|
|
113
|
+
expand: {
|
|
114
|
+
[K in E[number] & RelationKeys<F>]: F[K] extends {
|
|
115
|
+
_target: infer Target extends AnyCollectionDef;
|
|
116
|
+
} ? InferRecord<Target["fields"]> : Record<string, unknown>;
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
/**
|
|
120
|
+
* Maps file-type fields in a FieldsMap to their corresponding client interfaces.
|
|
121
|
+
* Protected file fields get `ProtectedFileFieldClient`; public file fields get
|
|
122
|
+
* `PublicFileFieldClient`.
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* // For { avatar: Field.file({ protected: true }), cover: Field.file() }
|
|
126
|
+
* // CollectionFileFields resolves to:
|
|
127
|
+
* // { avatar: ProtectedFileFieldClient; cover: PublicFileFieldClient }
|
|
128
|
+
*
|
|
129
|
+
* @see PublicFileFieldClient — synchronous URL builder
|
|
130
|
+
* @see ProtectedFileFieldClient — async URL builder with token acquisition
|
|
131
|
+
*/
|
|
132
|
+
export type CollectionFileFields<F extends FieldsMap> = {
|
|
133
|
+
[K in keyof F as F[K]["kind"] extends "file" ? K : never]: F[K] extends {
|
|
134
|
+
protected: true;
|
|
135
|
+
} ? ProtectedFileFieldClient : PublicFileFieldClient;
|
|
136
|
+
};
|
|
137
|
+
export {};
|
|
138
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/client/types.ts"],"names":[],"mappings":""}
|
|
@@ -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;AAqCD;;;;;;;;;;;;;;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,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"}
|