@arcote.tech/arc 0.1.2 → 0.1.4

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 (38) hide show
  1. package/dist/collection/collection.d.ts +12 -1
  2. package/dist/command/command.d.ts +14 -11
  3. package/dist/context/context.d.ts +7 -7
  4. package/dist/context/element.d.ts +27 -5
  5. package/dist/context/event.d.ts +12 -1
  6. package/dist/context/index.d.ts +1 -0
  7. package/dist/context/simple-query.d.ts +33 -0
  8. package/dist/data-storage/data-storage-builder.d.ts +16 -0
  9. package/dist/data-storage/index.d.ts +2 -0
  10. package/dist/data-storage/query-processor.d.ts +22 -0
  11. package/dist/data-storage/store-state-authorized.d.ts +26 -0
  12. package/dist/db/sqliteAdapter.d.ts +3 -1
  13. package/dist/elements/blob.d.ts +79 -0
  14. package/dist/elements/boolean.d.ts +13 -2
  15. package/dist/elements/date.d.ts +1 -1
  16. package/dist/elements/file.d.ts +139 -0
  17. package/dist/elements/index.d.ts +3 -0
  18. package/dist/elements/object.d.ts +7 -0
  19. package/dist/index.d.ts +1 -0
  20. package/dist/index.js +1106 -194
  21. package/dist/listener/index.d.ts +2 -0
  22. package/dist/listener/listener.d.ts +23 -0
  23. package/dist/model/model.d.ts +37 -16
  24. package/dist/tests/utils/test-model.d.ts +0 -1
  25. package/dist/view/index.d.ts +4 -0
  26. package/dist/view/queries/abstract-view-query.d.ts +20 -0
  27. package/dist/view/queries/find-one.d.ts +18 -0
  28. package/dist/view/queries/find.d.ts +20 -0
  29. package/dist/view/queries/index.d.ts +3 -0
  30. package/dist/view/query-builders/find-one.d.ts +13 -0
  31. package/dist/view/query-builders/find.d.ts +13 -0
  32. package/dist/view/query-builders/index.d.ts +2 -0
  33. package/dist/view/view.d.ts +25 -13
  34. package/package.json +1 -1
  35. package/dist/db/index-query.d.ts +0 -3
  36. package/dist/dist/index.d.ts +0 -513
  37. package/dist/elements/tests/example.d.ts +0 -6
  38. package/dist/elements/tests/test.d.ts +0 -2
@@ -0,0 +1,2 @@
1
+ export * from "./listener";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,23 @@
1
+ import { type ArcCommandContext, type AuthContext } from "../context";
2
+ import { ArcContextElement, type ArcContextElementAny, type ListenerConfig } from "../context/element";
3
+ type GetEvents<Elements extends ArcContextElementAny[]> = Elements[number]["$event"];
4
+ export type ArcListenerHandler<ContextElements extends ArcContextElementAny[], EventElements extends ArcContextElementAny[]> = (ctx: ArcCommandContext<ContextElements>, event: GetEvents<EventElements>) => Promise<void> | void;
5
+ export declare class ArcListener<Name extends string, const Elements extends ArcContextElementAny[], EventElements extends ArcContextElementAny[] = ArcContextElementAny[]> extends ArcContextElement<null, Name> {
6
+ readonly name: Name;
7
+ private _description?;
8
+ private _elements?;
9
+ private _eventElements?;
10
+ private _handler?;
11
+ private _isAsync;
12
+ constructor(name: Name);
13
+ use<const E extends ArcContextElementAny[]>(elements: E): ArcListener<Name, E, EventElements>;
14
+ description(description: string): ArcListener<Name, Elements, EventElements>;
15
+ listenTo<const E extends ArcContextElementAny[]>(events: E): ArcListener<Name, Elements, E>;
16
+ async(): ArcListener<Name, Elements, EventElements>;
17
+ handle(handler: ArcListenerHandler<Elements, EventElements>): ArcListener<Name, Elements, EventElements>;
18
+ observer: (authContext: AuthContext) => Record<string, ListenerConfig>;
19
+ private clone;
20
+ }
21
+ export declare function listener<Name extends string>(name: Name): ArcListener<Name, any[], any[]>;
22
+ export {};
23
+ //# sourceMappingURL=listener.d.ts.map
@@ -1,46 +1,67 @@
1
1
  import { type ArcContextAny, type IArcQueryBuilder } from "../context";
2
+ import type { ArcContextElementMethodReturnType } from "../context/context";
3
+ import type { AuthContext } from "../context/element";
2
4
  import { type DataStorage } from "../data-storage";
3
5
  type UnaryFunction<T, R> = (input: T) => R;
4
6
  export declare abstract class ModelBase<C extends ArcContextAny> {
5
- abstract query<Q extends IArcQueryBuilder>(queryBuilderFn: UnaryFunction<ReturnType<C["queryBuilder"]>, Q>): Promise<ReturnType<Q["toQuery"]>["lastResult"]>;
6
- abstract subscribe<Q extends IArcQueryBuilder>(queryBuilderFn: UnaryFunction<ReturnType<C["queryBuilder"]>, Q>, callback: (result: ReturnType<Q["toQuery"]>["lastResult"]) => void): {
7
+ protected token: string | null;
8
+ /**
9
+ * Set the authentication token for API requests
10
+ */
11
+ setAuthToken(token: string | null): void;
12
+ abstract query<Q extends IArcQueryBuilder>(queryBuilderFn: UnaryFunction<ReturnType<C["queryBuilder"]>, Q>, authContext: AuthContext): Promise<ReturnType<Q["toQuery"]>["lastResult"]>;
13
+ abstract subscribe<Q extends IArcQueryBuilder>(queryBuilderFn: UnaryFunction<ReturnType<C["queryBuilder"]>, Q>, callback: (result: ReturnType<Q["toQuery"]>["lastResult"]) => void, authContext: AuthContext): {
7
14
  result: ReturnType<Q["toQuery"]>["lastResult"];
8
15
  unsubscribe: () => void;
9
16
  };
10
- abstract commands(): ReturnType<C["commandsClient"]>;
17
+ abstract commands(authContext: AuthContext): ArcContextElementMethodReturnType<C["elements"], "commandClient">;
11
18
  }
12
19
  export declare class Model<C extends ArcContextAny> extends ModelBase<C> {
13
20
  private readonly context;
14
21
  private readonly dataStorage;
15
- private readonly client;
16
22
  private readonly catchErrorCallback;
17
23
  private queryCache;
18
- constructor(context: C, dataStorage: DataStorage, client: string, catchErrorCallback: (error: any) => void);
19
- query<Q extends IArcQueryBuilder>(queryBuilderFn: UnaryFunction<ReturnType<C["queryBuilder"]>, Q>): Promise<ReturnType<Q["toQuery"]>["lastResult"]>;
20
- subscribe<Q extends IArcQueryBuilder>(queryBuilderFn: UnaryFunction<ReturnType<C["queryBuilder"]>, Q>, callback: (result: ReturnType<Q["toQuery"]>["lastResult"]) => void): {
24
+ constructor(context: C, dataStorage: DataStorage, catchErrorCallback: (error: any) => void);
25
+ query<Q extends IArcQueryBuilder>(queryBuilderFn: UnaryFunction<ReturnType<C["queryBuilder"]>, Q>, authContext: AuthContext): Promise<ReturnType<Q["toQuery"]>["lastResult"]>;
26
+ subscribe<Q extends IArcQueryBuilder>(queryBuilderFn: UnaryFunction<ReturnType<C["queryBuilder"]>, Q>, callback: (result: ReturnType<Q["toQuery"]>["lastResult"]) => void, authContext: AuthContext): {
21
27
  result: ReturnType<Q["toQuery"]>["lastResult"];
22
28
  unsubscribe: () => void;
23
29
  };
24
- commands(): ReturnType<C["commandsClient"]>;
25
- fork(): ForkedModel<C>;
30
+ commands(authContext: AuthContext): ArcContextElementMethodReturnType<C["elements"], "commandClient">;
26
31
  get $debug(): {};
27
32
  }
28
- export declare class ForkedModel<C extends ArcContextAny> extends Model<C> {
29
- constructor(context: C, dataStorage: DataStorage, client: string, catchErrorCallback: (error: any) => void);
30
- merge(): void;
31
- }
32
33
  export declare class RemoteModelClient<C extends ArcContextAny> extends ModelBase<C> {
33
34
  private readonly context;
34
35
  private readonly apiBaseUrl;
35
36
  private readonly client;
36
37
  private readonly catchErrorCallback;
37
38
  constructor(context: C, apiBaseUrl: string, client: string, catchErrorCallback: (error: any) => void);
38
- query<Q extends IArcQueryBuilder>(queryBuilderFn: UnaryFunction<ReturnType<C["queryBuilder"]>, Q>): Promise<ReturnType<Q["toQuery"]>["lastResult"]>;
39
- subscribe<Q extends IArcQueryBuilder>(queryBuilderFn: UnaryFunction<ReturnType<C["queryBuilder"]>, Q>, callback: (result: ReturnType<Q["toQuery"]>["lastResult"]) => void): {
39
+ /**
40
+ * Check if a schema contains blob or file elements
41
+ */
42
+ private schemaContainsBlobOrFile;
43
+ /**
44
+ * Recursively check object shape for blob/file elements
45
+ */
46
+ private checkShapeForBlobOrFile;
47
+ /**
48
+ * Check if an element is a blob or file element
49
+ */
50
+ private isBlobOrFileElement;
51
+ /**
52
+ * Convert an object to FormData, handling nested objects and blobs
53
+ */
54
+ private objectToFormData;
55
+ /**
56
+ * Get authorization headers for API requests
57
+ */
58
+ private getAuthHeaders;
59
+ query<Q extends IArcQueryBuilder>(queryBuilderFn: UnaryFunction<ReturnType<C["queryBuilder"]>, Q>, authContext: AuthContext): Promise<ReturnType<Q["toQuery"]>["lastResult"]>;
60
+ subscribe<Q extends IArcQueryBuilder>(queryBuilderFn: UnaryFunction<ReturnType<C["queryBuilder"]>, Q>, callback: (result: ReturnType<Q["toQuery"]>["lastResult"]) => void, authContext: AuthContext): {
40
61
  result: ReturnType<Q["toQuery"]>["lastResult"];
41
62
  unsubscribe: () => void;
42
63
  };
43
- commands(): ReturnType<C["commandsClient"]>;
64
+ commands(authContext: AuthContext): ArcContextElementMethodReturnType<C["elements"], "commandClient">;
44
65
  }
45
66
  export {};
46
67
  //# sourceMappingURL=model.d.ts.map
@@ -20,7 +20,6 @@ export declare class TestRTCAdapter implements RealTimeCommunicationAdapter {
20
20
  export declare function testModel<C extends ArcContextAny>(arcContext: C): {
21
21
  model: Model<C>;
22
22
  getRTCAdapter(): TestRTCAdapter;
23
- fork(): import("../..").ForkedModel<C>;
24
23
  clearRTCHistory(): void;
25
24
  };
26
25
  //# sourceMappingURL=test-model.d.ts.map
@@ -0,0 +1,4 @@
1
+ export * from "./queries";
2
+ export * from "./query-builders";
3
+ export * from "./view";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,20 @@
1
+ import { ArcSerializableQuery } from "../../context/serializable-query";
2
+ import type { DataStorage, ListenerEvent, StoreState } from "../../data-storage";
3
+ import type { ArcIdAny, ArcObjectAny } from "../../elements";
4
+ import type { $type } from "../../utils";
5
+ import type { ArcView } from "../view";
6
+ export type ArcViewItem<Id extends ArcIdAny, Schema extends ArcObjectAny> = {
7
+ _id: $type<Id>;
8
+ } & $type<Schema>;
9
+ export type ArcViewAny = ArcView<any, any, any, any>;
10
+ export declare abstract class ArcViewQuery<View extends ArcViewAny, Result, Params> extends ArcSerializableQuery<Result, Params> {
11
+ protected view: View;
12
+ protected bindedChangeHandler: (changes: ListenerEvent<ArcViewItem<View["id"], View["schema"]>>[]) => void;
13
+ private store;
14
+ constructor(view: View, params: Params);
15
+ run(dataStorage: DataStorage): Promise<Result>;
16
+ protected abstract onChange(change: ListenerEvent<ArcViewItem<View["id"], View["schema"]>>): Result | false;
17
+ protected abstract fetch(store: StoreState<ArcViewItem<View["id"], View["schema"]>>): Promise<Result>;
18
+ protected changeHandler(changes: ListenerEvent<ArcViewItem<View["id"], View["schema"]>>[]): void;
19
+ }
20
+ //# sourceMappingURL=abstract-view-query.d.ts.map
@@ -0,0 +1,18 @@
1
+ import type { ListenerEvent, StoreState } from "../../data-storage";
2
+ import type { FindOptions } from "../../data-storage/types";
3
+ import { ArcViewQuery, type ArcViewAny, type ArcViewItem } from "./abstract-view-query";
4
+ export declare class QueryViewFindOneResult<V extends ArcViewAny> {
5
+ private result;
6
+ constructor(result: ArcViewItem<V["id"], V["schema"]> | undefined);
7
+ get(): ArcViewItem<V["id"], V["schema"]> | undefined;
8
+ exists(): boolean;
9
+ }
10
+ export declare class ArcViewFindOneQuery<View extends ArcViewAny> extends ArcViewQuery<View, QueryViewFindOneResult<View>, FindOptions<ArcViewItem<View["id"], View["schema"]>>> {
11
+ protected params: FindOptions<ArcViewItem<View["id"], View["schema"]>>;
12
+ constructor(view: View, params: FindOptions<ArcViewItem<View["id"], View["schema"]>>);
13
+ protected fetch(store: StoreState<ArcViewItem<View["id"], View["schema"]>>): Promise<QueryViewFindOneResult<View>>;
14
+ protected checkItem(item: ArcViewItem<View["id"], View["schema"]>): boolean;
15
+ protected onChange(change: ListenerEvent<ArcViewItem<View["id"], View["schema"]>>): false | QueryViewFindOneResult<View>;
16
+ protected createResult(result: ArcViewItem<View["id"], View["schema"]> | undefined): QueryViewFindOneResult<View>;
17
+ }
18
+ //# sourceMappingURL=find-one.d.ts.map
@@ -0,0 +1,20 @@
1
+ import type { ListenerEvent, StoreState } from "../../data-storage";
2
+ import type { FindOptions } from "../../data-storage/types";
3
+ import type { util } from "../../utils";
4
+ import { ArcViewQuery, type ArcViewAny, type ArcViewItem } from "./abstract-view-query";
5
+ export declare class QueryViewResult<V extends ArcViewAny> {
6
+ private result;
7
+ constructor(result: ArcViewItem<V["id"], V["schema"]>[]);
8
+ get(id: util.GetType<V["id"]> | null): ArcViewItem<V["id"], V["schema"]> | undefined;
9
+ map<U>(callbackfn: (value: ArcViewItem<V["id"], V["schema"]>, index: number, array: ArcViewItem<V["id"], V["schema"]>[]) => U): U[];
10
+ toArray(): ArcViewItem<V["id"], V["schema"]>[];
11
+ }
12
+ export declare class ArcViewFindQuery<View extends ArcViewAny> extends ArcViewQuery<View, QueryViewResult<View>, FindOptions<ArcViewItem<View["id"], View["schema"]>>> {
13
+ protected params: FindOptions<ArcViewItem<View["id"], View["schema"]>>;
14
+ constructor(view: View, params: FindOptions<ArcViewItem<View["id"], View["schema"]>>);
15
+ protected fetch(store: StoreState<ArcViewItem<View["id"], View["schema"]>>): Promise<QueryViewResult<View>>;
16
+ protected checkItem(item: ArcViewItem<View["id"], View["schema"]>): boolean;
17
+ protected onChange(change: ListenerEvent<ArcViewItem<View["id"], View["schema"]>>): false | QueryViewResult<View>;
18
+ protected createResult(result: ArcViewItem<View["id"], View["schema"]>[]): QueryViewResult<View>;
19
+ }
20
+ //# sourceMappingURL=find.d.ts.map
@@ -0,0 +1,3 @@
1
+ export * from "./abstract-view-query";
2
+ export * from "./find";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,13 @@
1
+ import { QueryBuilderContext } from "../../context/query-builder-context";
2
+ import type { FindOptions } from "../../data-storage/types";
3
+ import type { ArcViewAny, ArcViewItem } from "../queries/abstract-view-query";
4
+ import { ArcViewFindOneQuery } from "../queries/find-one";
5
+ export declare class ArcViewFindOneQueryBuilder<V extends ArcViewAny> {
6
+ private view;
7
+ protected queryContext: QueryBuilderContext;
8
+ protected options: FindOptions<ArcViewItem<V["id"], V["schema"]>>;
9
+ constructor(view: V, queryContext: QueryBuilderContext, options: FindOptions<ArcViewItem<V["id"], V["schema"]>>);
10
+ toQuery(): ArcViewFindOneQuery<ArcViewAny>;
11
+ run(): import("../queries/find-one").QueryViewFindOneResult<ArcViewAny>;
12
+ }
13
+ //# sourceMappingURL=find-one.d.ts.map
@@ -0,0 +1,13 @@
1
+ import { QueryBuilderContext } from "../../context/query-builder-context";
2
+ import type { FindOptions } from "../../data-storage/types";
3
+ import type { ArcViewAny, ArcViewItem } from "../queries/abstract-view-query";
4
+ import { ArcViewFindQuery } from "../queries/find";
5
+ export declare class ArcViewFindQueryBuilder<V extends ArcViewAny> {
6
+ private view;
7
+ protected queryContext: QueryBuilderContext;
8
+ protected options: FindOptions<ArcViewItem<V["id"], V["schema"]>>;
9
+ constructor(view: V, queryContext: QueryBuilderContext, options: FindOptions<ArcViewItem<V["id"], V["schema"]>>);
10
+ toQuery(): ArcViewFindQuery<ArcViewAny>;
11
+ run(): import("..").QueryViewResult<ArcViewAny>;
12
+ }
13
+ //# sourceMappingURL=find.d.ts.map
@@ -0,0 +1,2 @@
1
+ export * from "./find";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -1,16 +1,19 @@
1
- import { ArcContextElementWithStore, type ArcContextElementAny, type StoreSchema } from "../context/element";
1
+ import { ArcContextElementWithStore, type ArcContextElementAny, type AuthContext, type ListenerConfig, type PublishEventFunction, type StoreSchema } from "../context/element";
2
2
  import type { QueryBuilderContext } from "../context/query-builder-context";
3
3
  import type { DataStorage } from "../data-storage";
4
- import type { FindOptions } from "../data-storage/types";
4
+ import type { FindOptions, WhereCondition } from "../data-storage/types";
5
5
  import { type ArcIdAny, type ArcObjectAny } from "../elements";
6
6
  import type { $type } from "../utils";
7
+ import { ArcViewFindQueryBuilder } from "./query-builders/find";
8
+ import { ArcViewFindOneQueryBuilder } from "./query-builders/find-one";
7
9
  type GetEvents<Elements extends ArcContextElementAny[]> = Elements[number]["$event"];
8
10
  type ArcViewHandlerContext<Id extends ArcIdAny, Schema extends ArcObjectAny> = {
9
- modify: (id: $type<Id>, data: $type<Schema>) => Promise<void>;
11
+ modify: (id: $type<Id>, data: Partial<$type<Schema>>) => Promise<void>;
10
12
  set: (id: $type<Id>, data: $type<Schema>) => Promise<void>;
11
13
  remove: (id: $type<Id>) => Promise<void>;
12
14
  find: (options: FindOptions<ArcViewItem<Id, Schema>>) => Promise<ArcViewItem<Id, Schema>[]>;
13
15
  findOne: (where: FindOptions<ArcViewItem<Id, Schema>>["where"]) => Promise<ArcViewItem<Id, Schema> | undefined>;
16
+ $auth: AuthContext;
14
17
  };
15
18
  type ArcViewItem<Id extends ArcIdAny, Schema extends ArcObjectAny> = {
16
19
  _id: $type<Id>;
@@ -25,23 +28,32 @@ export declare class ArcView<Name extends string, Id extends ArcIdAny, Schema ex
25
28
  private _description?;
26
29
  private _elements?;
27
30
  private _handler?;
31
+ private _isAsync;
32
+ private restrictions?;
28
33
  constructor(name: Name, id: Id, schema: Schema);
29
34
  storeSchema: () => StoreSchema;
35
+ /**
36
+ * Define read access restrictions for this view
37
+ * @param restrictionsFn - Function that takes auth context and returns where condition for read access
38
+ */
39
+ auth(restrictionsFn: (authContext: AuthContext) => WhereCondition): ArcView<Name, Id, Schema, Elements>;
30
40
  use<const E extends ArcContextElementAny[]>(elements: E): ArcView<Name, Id, Schema, E>;
31
41
  description(description: string): ArcView<Name, Id, Schema, Elements>;
42
+ async(): ArcView<Name, Id, Schema, Elements>;
32
43
  handle<Handler extends ArcViewHandler<Elements, Id, Schema>>(handler: Handler): ArcView<Name, Id, Schema, Elements>;
33
- queryBuilder: (context: QueryBuilderContext) => {
34
- readonly find: (options?: FindOptions<$type<Schema>>) => never;
44
+ /**
45
+ * Helper function to merge where conditions from restrictions with query options
46
+ */
47
+ private applyRestrictions;
48
+ queryBuilder: (context: QueryBuilderContext, authContext: AuthContext) => {
49
+ readonly find: (options?: FindOptions<ArcViewItem<Id, Schema>>) => ArcViewFindQueryBuilder<ArcView<Name, Id, Schema, Elements>>;
50
+ readonly findOne: (where: FindOptions<ArcViewItem<Id, Schema>>["where"]) => ArcViewFindOneQueryBuilder<ArcView<Name, Id, Schema, Elements>>;
35
51
  };
36
- commandContext: (dataStorage: DataStorage, publishEvent: (event: this["$event"]) => Promise<void>) => {
37
- readonly find: (options: FindOptions<ArcViewItem<Id, Schema>>) => Promise<{
38
- _id: string;
39
- }[]>;
40
- readonly findOne: (where: FindOptions<ArcViewItem<Id, Schema>>["where"]) => Promise<{
41
- _id: string;
42
- }>;
52
+ commandContext: (dataStorage: DataStorage, publishEvent: PublishEventFunction, authContext: AuthContext) => {
53
+ readonly find: (options: FindOptions<ArcViewItem<Id, Schema>>) => Promise<ArcViewItem<Id, Schema>[]>;
54
+ readonly findOne: (where: FindOptions<ArcViewItem<Id, Schema>>["where"]) => Promise<ArcViewItem<Id, Schema> | undefined>;
43
55
  };
44
- observer: () => Record<string, any>;
56
+ observer: (authContext: AuthContext) => Record<string, ListenerConfig>;
45
57
  private clone;
46
58
  }
47
59
  export declare function view<Name extends string, Id extends ArcIdAny, Schema extends ArcObjectAny>(name: Name, id: Id, schema: Schema): ArcView<Name, Id, Schema, any[]>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@arcote.tech/arc",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "private": false,
6
6
  "author": "Przemysław Krasiński [arcote.tech]",
7
7
  "description": "Arc is a framework designed to align code closely with business logic, streamlining development and enhancing productivity.",
@@ -1,3 +0,0 @@
1
- import { type IndexQueryArgument } from "./interface";
2
- export declare function indexQueryPredicate<T>(item: T, query: IndexQueryArgument<any>): boolean;
3
- //# sourceMappingURL=index-query.d.ts.map