@thisisagile/easy 17.19.0 → 17.20.1

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/dist/index.mjs CHANGED
@@ -111,8 +111,4 @@ export * from "./utils/Wait";
111
111
  export * from "./validation/Contraints";
112
112
  export * from "./validation/Validate";
113
113
  export * from "./validation/When";
114
- import { IdName } from "./types/IdName";
115
- export {
116
- IdName
117
- };
118
114
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './data/Condition';\nexport * from './data/InMemoryGateway';\nexport * from './data/Database';\nexport * from './data/DataProvider';\nexport * from './data/Field';\nexport * from './data/Query';\nexport * from './data/QueryProvider';\n\nexport * from './domain/Audit';\nexport * from './domain/Child';\nexport * from './domain/DateTime';\nexport * from './domain/Entity';\nexport * from './domain/Struct';\nexport * from './domain/Repo';\nexport * from './domain/Typo';\n\nexport * from './http/CacheControl';\nexport * from './http/ContentType';\nexport * from './http/HttpHeader';\nexport * from './http/HttpStatus';\nexport * from './http/HttpVerb';\nexport * from './http/Request';\nexport * from './http/RequestOptions';\nexport * from './http/RequestProvider';\nexport * from './http/Response';\nexport * from './http/RestResult';\nexport * from './http/toResponse';\n\nexport * from './process/App';\nexport * from './process/Manage';\nexport * from './process/Scope';\nexport * from './process/Search';\nexport * from './process/UseCase';\n\nexport * from './resources/Req';\n\nexport * from './security/Jwt';\n\nexport * from './services/Api';\nexport * from './services/ApiGateway';\nexport * from './services/AxiosProvider';\nexport * from './services/MappedRouteGateway';\nexport * from './services/RouteGateway';\nexport * from './services/ViewRouteGateway';\n\nexport * from './sql/Clause';\nexport * from './sql/Column';\nexport * from './sql/Delete';\nexport * from './sql/Insert';\nexport * from './sql/Join';\nexport * from './sql/SqlQuery';\nexport * from './sql/Select';\nexport * from './sql/Table';\nexport * from './sql/TableGateway';\nexport * from './sql/Update';\n\nexport * from './types/AnyKey';\nexport * from './types/Array';\nexport * from './types/Builder';\nexport * from './types/Cache';\nexport * from './types/CacheAge';\nexport * from './types/Case';\nexport * from './types/Constructor';\nexport * from './types/Context';\nexport * from './types/Currency';\nexport * from './types/Enum';\nexport * from './types/Environment';\nexport * from './types/ErrorOrigin';\nexport * from './types/Exception';\nexport * from './types/Falsy';\nexport * from './types/Func';\nexport * from './types/Gateway';\nexport * from './types/Get';\nexport * from './types/Id';\nexport * from './types/Identity';\nexport * from './types/IdName';\nexport * from './types/Is';\nexport * from './types/IsA';\nexport * from './types/IsDate';\nexport * from './types/IsEqual';\nexport * from './types/Json';\nexport * from './types/List';\nexport * from './types/Message';\nexport * from './types/Meta';\nexport * from './types/Nullish';\nexport * from './types/Number';\nexport * from './types/Object';\nexport * from './types/PageList';\nexport * from './types/Parser';\nexport * from './types/Primitive';\nexport * from './types/Repository';\nexport * from './types/Result';\nexport * from './types/Results';\nexport * from './types/Sort';\nexport * from './types/Tag';\nexport * from './types/Template';\nexport * from './types/Text';\nexport * from './types/Try';\nexport * from './types/TypeGuard';\nexport * from './types/Types';\nexport * from './types/Uri';\nexport * from './types/Uuid';\nexport * from './types/Validatable';\nexport * from './types/Value';\n\nexport * from './utils/Base64';\nexport * from './utils/Convert';\nexport * from './utils/If';\nexport * from './utils/Loading';\nexport * from './utils/Log';\nexport * from './utils/Mapper';\nexport * from './utils/Promise';\nexport * from './utils/Property';\nexport * from './utils/Seconds';\nexport * from './utils/State';\nexport * from './utils/Sentence';\nexport * from './utils/Traverse';\nexport * from './utils/View';\nexport * from './utils/Wait';\n\nexport * from './validation/Contraints';\nexport * from './validation/Validate';\nexport * from './validation/When';\nexport { IdName } from './types/IdName';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AAEd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,cAAc;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './data/Condition';\nexport * from './data/InMemoryGateway';\nexport * from './data/Database';\nexport * from './data/DataProvider';\nexport * from './data/Field';\nexport * from './data/Query';\nexport * from './data/QueryProvider';\n\nexport * from './domain/Audit';\nexport * from './domain/Child';\nexport * from './domain/DateTime';\nexport * from './domain/Entity';\nexport * from './domain/Struct';\nexport * from './domain/Repo';\nexport * from './domain/Typo';\n\nexport * from './http/CacheControl';\nexport * from './http/ContentType';\nexport * from './http/HttpHeader';\nexport * from './http/HttpStatus';\nexport * from './http/HttpVerb';\nexport * from './http/Request';\nexport * from './http/RequestOptions';\nexport * from './http/RequestProvider';\nexport * from './http/Response';\nexport * from './http/RestResult';\nexport * from './http/toResponse';\n\nexport * from './process/App';\nexport * from './process/Manage';\nexport * from './process/Scope';\nexport * from './process/Search';\nexport * from './process/UseCase';\n\nexport * from './resources/Req';\n\nexport * from './security/Jwt';\n\nexport * from './services/Api';\nexport * from './services/ApiGateway';\nexport * from './services/AxiosProvider';\nexport * from './services/MappedRouteGateway';\nexport * from './services/RouteGateway';\nexport * from './services/ViewRouteGateway';\n\nexport * from './sql/Clause';\nexport * from './sql/Column';\nexport * from './sql/Delete';\nexport * from './sql/Insert';\nexport * from './sql/Join';\nexport * from './sql/SqlQuery';\nexport * from './sql/Select';\nexport * from './sql/Table';\nexport * from './sql/TableGateway';\nexport * from './sql/Update';\n\nexport * from './types/AnyKey';\nexport * from './types/Array';\nexport * from './types/Builder';\nexport * from './types/Cache';\nexport * from './types/CacheAge';\nexport * from './types/Case';\nexport * from './types/Constructor';\nexport * from './types/Context';\nexport * from './types/Currency';\nexport * from './types/Enum';\nexport * from './types/Environment';\nexport * from './types/ErrorOrigin';\nexport * from './types/Exception';\nexport * from './types/Falsy';\nexport * from './types/Func';\nexport * from './types/Gateway';\nexport * from './types/Get';\nexport * from './types/Id';\nexport * from './types/Identity';\nexport * from './types/IdName';\nexport * from './types/Is';\nexport * from './types/IsA';\nexport * from './types/IsDate';\nexport * from './types/IsEqual';\nexport * from './types/Json';\nexport * from './types/List';\nexport * from './types/Message';\nexport * from './types/Meta';\nexport * from './types/Nullish';\nexport * from './types/Number';\nexport * from './types/Object';\nexport * from './types/PageList';\nexport * from './types/Parser';\nexport * from './types/Primitive';\nexport * from './types/Repository';\nexport * from './types/Result';\nexport * from './types/Results';\nexport * from './types/Sort';\nexport * from './types/Tag';\nexport * from './types/Template';\nexport * from './types/Text';\nexport * from './types/Try';\nexport * from './types/TypeGuard';\nexport * from './types/Types';\nexport * from './types/Uri';\nexport * from './types/Uuid';\nexport * from './types/Validatable';\nexport * from './types/Value';\n\nexport * from './utils/Base64';\nexport * from './utils/Convert';\nexport * from './utils/If';\nexport * from './utils/Loading';\nexport * from './utils/Log';\nexport * from './utils/Mapper';\nexport * from './utils/Promise';\nexport * from './utils/Property';\nexport * from './utils/Seconds';\nexport * from './utils/State';\nexport * from './utils/Sentence';\nexport * from './utils/Traverse';\nexport * from './utils/View';\nexport * from './utils/Wait';\n\nexport * from './validation/Contraints';\nexport * from './validation/Validate';\nexport * from './validation/When';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AAEd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  import "../chunk-WJZFE5NE.mjs";
5
5
  import {
6
6
  RouteGateway
7
- } from "../chunk-3XD77BIN.mjs";
7
+ } from "../chunk-S5I6XCJK.mjs";
8
8
  import "../chunk-3MDXTFJG.mjs";
9
9
  import {
10
10
  Api
@@ -1,25 +1,25 @@
1
- import { Api, RouteOptions } from './Api';
1
+ import { Api } from './Api';
2
2
  import { ApiGateway } from './ApiGateway';
3
3
  import { Func } from '../types/Func';
4
- import { Uri } from '../types/Uri';
4
+ import { Uri, UriExpandProps } from '../types/Uri';
5
5
  import { PageList } from '../types/PageList';
6
6
  import { Json, JsonValue } from '../types/Json';
7
7
  import { Id } from '../types/Id';
8
8
  import { Optional } from '../types/Types';
9
9
  import { List } from '../types/List';
10
- export declare class RouteGateway extends ApiGateway {
11
- readonly route: Func<Uri>;
12
- readonly routeId: Func<Uri>;
10
+ export declare class RouteGateway<Props extends UriExpandProps = UriExpandProps> extends ApiGateway {
11
+ readonly route: Func<Uri<Props>>;
12
+ readonly routeId: Func<Uri<Props>>;
13
13
  readonly api: Api;
14
- constructor(route: Func<Uri>, routeId: Func<Uri>, api?: Api);
15
- all(options?: RouteOptions): Promise<PageList<Json>>;
16
- byId(id: Id, options?: RouteOptions): Promise<Optional<Json>>;
14
+ constructor(route: Func<Uri<Props>>, routeId: Func<Uri<Props>>, api?: Api);
15
+ all(options?: Props): Promise<PageList<Json>>;
16
+ byId(id: Id): Promise<Optional<Json>>;
17
17
  byIds(...ids: Id[]): Promise<List<Json>>;
18
- search(q: JsonValue, options?: RouteOptions): Promise<PageList<Json>>;
19
- exists(id: Id, options?: RouteOptions): Promise<boolean>;
20
- add(item: Json, options?: RouteOptions): Promise<Json>;
21
- filter(options?: RouteOptions): Promise<PageList<Json>>;
22
- update(item: Json, options?: RouteOptions): Promise<Json>;
23
- upsert(item: Json, options?: RouteOptions): Promise<Json>;
24
- remove(id: Id, options?: RouteOptions): Promise<boolean>;
18
+ search(q: JsonValue, options?: Props): Promise<PageList<Json>>;
19
+ exists(id: Id): Promise<boolean>;
20
+ add(item: Json): Promise<Json>;
21
+ filter(options?: Props): Promise<PageList<Json>>;
22
+ update(item: Json): Promise<Json>;
23
+ upsert(item: Json): Promise<Json>;
24
+ remove(id: Id): Promise<boolean>;
25
25
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  RouteGateway
3
- } from "../chunk-3XD77BIN.mjs";
3
+ } from "../chunk-S5I6XCJK.mjs";
4
4
  import "../chunk-3MDXTFJG.mjs";
5
5
  import "../chunk-RTTVCEWR.mjs";
6
6
  import "../chunk-XH47BBYI.mjs";
@@ -5,7 +5,7 @@ import "../chunk-PVWD7L7K.mjs";
5
5
  import "../chunk-SSROJBD5.mjs";
6
6
  import {
7
7
  RouteGateway
8
- } from "../chunk-3XD77BIN.mjs";
8
+ } from "../chunk-S5I6XCJK.mjs";
9
9
  import "../chunk-3MDXTFJG.mjs";
10
10
  import {
11
11
  Api
@@ -12,8 +12,8 @@ export declare class Repository<T, Options = FetchOptions> {
12
12
  search(q: JsonValue, options?: Options): Promise<PageList<T>>;
13
13
  filter(options?: Options): Promise<PageList<T>>;
14
14
  exists(id: Id): Promise<boolean>;
15
- add(t: T | Json): Promise<T>;
16
- update(id: Id, json: Json): Promise<T>;
15
+ add(t: Partial<T> | Json): Promise<T>;
16
+ update(id: Id, json: Partial<T> | Json): Promise<T>;
17
17
  remove(id: Id): Promise<boolean>;
18
- upsert(id: Id, item: Json): Promise<T>;
18
+ upsert(id: Id, item: Partial<T> | Json): Promise<T>;
19
19
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Repository
3
- } from "../chunk-ZEZBMEWP.mjs";
3
+ } from "../chunk-WVYZIPWC.mjs";
4
4
  import "../chunk-KXOBVHGI.mjs";
5
5
  import "../chunk-PKILDKWU.mjs";
6
6
  import "../chunk-3Y7X2UQ6.mjs";
@@ -13,7 +13,7 @@ export declare const toSegment: (key?: Text, { segment, query, }?: {
13
13
  }) => Segment;
14
14
  export declare const uri: {
15
15
  host: (key?: string) => Segment;
16
- resource: (resource: Uri) => Segment;
16
+ resource: <Props extends UriExpandProps>(resource: Uri<Props>) => Segment;
17
17
  segment: (key?: Text) => Segment;
18
18
  path: (key: Text) => Segment;
19
19
  query: (key: Text) => Segment;
@@ -23,23 +23,26 @@ type Prop = {
23
23
  segment: Segment;
24
24
  value: any;
25
25
  };
26
- export type Uri = {
27
- id: (id?: unknown) => Uri;
28
- ids: (ids: OneOrMore<unknown>) => Uri;
29
- query: (q?: unknown) => Uri;
30
- sort: (q?: any) => Uri;
31
- skip: (n?: number) => Uri;
32
- take: (n?: number) => Uri;
26
+ export type Uri<Props extends UriExpandProps = UriExpandProps> = {
27
+ id: (id?: unknown) => Uri<Props>;
28
+ ids: (ids: OneOrMore<unknown>) => Uri<Props>;
29
+ query: (q?: unknown) => Uri<Props>;
30
+ sort: (q?: any) => Uri<Props>;
31
+ skip: (n?: number) => Uri<Props>;
32
+ take: (n?: number) => Uri<Props>;
33
33
  path: string;
34
34
  route: (resource: string) => string;
35
35
  isInternal: boolean;
36
36
  toString: () => string;
37
+ expand: (props: Partial<Props>) => Uri<Props>;
37
38
  };
38
39
  export type UriExpandProps = {
39
- q: string;
40
- s: string;
40
+ q?: string;
41
+ s?: string;
42
+ skip?: number;
43
+ take?: number;
41
44
  };
42
- export declare class EasyUri<Props = UriExpandProps> implements Uri {
45
+ export declare class EasyUri<Props extends UriExpandProps = UriExpandProps> implements Uri<Props> {
43
46
  readonly segments: Segment[];
44
47
  static readonly id: Segment;
45
48
  static readonly ids: Segment;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/Uri.ts"],"sourcesContent":["import { isBoolean, isNotEmpty, isTrue } from './Is';\nimport { asString, Text } from './Text';\nimport { toName } from './Constructor';\nimport { ctx } from './Context';\nimport { List, toList } from './List';\nimport { meta } from './Meta';\nimport { tryTo } from './Try';\nimport { Optional } from './Types';\nimport { OneOrMore, toArray } from './Array';\nimport { entries } from './Object';\n\nexport type Segment = Text & { key?: string; segment?: string; query?: (value: unknown) => string };\n\nexport const toSegment = (\n key?: Text,\n {\n segment,\n query,\n }: {\n segment?: string;\n query?: (value: unknown) => string;\n } = {}\n): Segment => ({\n key: key as string,\n segment,\n query,\n toString: () => asString(key),\n});\n\nexport const uri = {\n host: (key?: string): Segment => toSegment(key, { segment: key ?? ctx.env.host ?? '$host' }),\n resource: (resource: Uri): Segment => toSegment(toName(resource, 'Uri'), { segment: toName(resource, 'Uri') }),\n segment: (key?: Text): Segment => toSegment(key, { segment: key as string }),\n path: (key: Text): Segment => toSegment(key, { segment: `:${key}` }),\n query: (key: Text): Segment =>\n toSegment(key, {\n query: (value: unknown): string =>\n tryTo(value)\n .is.defined()\n .map(v => encodeURIComponent(asString(v)))\n .map(v => `${key}=${v}`)\n .orElse('') ?? '',\n }),\n boolean: (key: Text): Segment => toSegment(key, { query: (value: unknown): string => (isTrue(value) ? `${key}` : '') }),\n};\n\ntype Prop = { segment: Segment; value: any };\n\nconst toRoute = (...segments: Segment[]): string =>\n toList(segments)\n .mapDefined(s => s.segment)\n .join('/');\n\nexport type Uri = {\n id: (id?: unknown) => Uri;\n ids: (ids: OneOrMore<unknown>) => Uri;\n query: (q?: unknown) => Uri;\n sort: (q?: any) => Uri;\n skip: (n?: number) => Uri;\n take: (n?: number) => Uri;\n path: string;\n route: (resource: string) => string;\n isInternal: boolean;\n toString: () => string;\n};\n\nexport type UriExpandProps = { q: string; s: string };\n\nexport class EasyUri<Props = UriExpandProps> implements Uri {\n static readonly id = uri.path('id');\n static readonly ids = uri.query('ids');\n static readonly query = uri.query('q');\n static readonly sort = uri.query('s');\n static readonly skip = uri.query('skip');\n static readonly take = uri.query('take');\n\n readonly host = uri.host();\n protected resource = uri.resource(this);\n\n protected state: any = {};\n\n constructor(readonly segments: Segment[] = []) {}\n\n get path(): string {\n return toRoute(uri.segment(''), this.resource, ...this.segments);\n }\n\n get complete(): string {\n return toRoute(this.host, this.resource, ...this.segments);\n }\n\n get isInternal(): boolean {\n return toRoute(this.host) === (ctx.env.host ?? '$host');\n }\n\n protected get props(): List<Prop> {\n return meta(this.state).values<Prop>();\n }\n\n route = (resource: Optional<string> = this.resource.key): string => toRoute(uri.segment(''), uri.segment(resource?.toLowerCase()), ...this.segments);\n\n set = (segment: Segment, value?: unknown): this => {\n tryTo(value)\n .is.defined()\n .accept(value => (this.state[segment.key ?? ''] = { segment, value }));\n return this;\n };\n\n toString(): string {\n return tryTo(() => this.props)\n .map(ps => ps.filter(p => p.segment?.segment))\n .map(ps => ps.reduce((r: string, p: Prop) => r.replace(asString(p.segment.segment), asString(p.value)), this.complete))\n .map(route => ({\n route,\n query: this.props.mapDefined(p => (p.segment?.query ? p.segment?.query(p.value) : undefined))?.join('&'),\n }))\n .map(({ route, query }) => (isNotEmpty(query) ? `${route}?${query}` : route)).value;\n }\n\n id = (id?: unknown): this => this.set(EasyUri.id, id);\n ids = (ids: OneOrMore<unknown>): this => this.set(EasyUri.ids, toArray(ids).join(','));\n query = (q?: unknown): this => this.set(EasyUri.query, q);\n sort = (s?: any): this => this.set(EasyUri.sort, asString(s));\n\n skip = (index?: number): this => this.set(EasyUri.skip, index);\n take = (items?: number): this => this.set(EasyUri.take, items);\n\n expand(props: Partial<Props>): this {\n return entries(props)\n .filter(([_, v]) => isNotEmpty(v))\n .reduce((u, [k, v]) => (isBoolean(v) ? u.set(uri.boolean(k), v) : u.set(uri.query(k), toArray(v).join(','))), this);\n }\n}\n\nexport const clipUri = (uri?: EasyUri | string | null): string =>\n tryTo(() => asString(uri))\n .map(uri => uri.replace(/^(https?:\\/\\/)?(www\\.)?/, ''))\n .map(uri => uri.replace(/\\/$/, '')).value;\n"],"mappings":"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","names":["value","uri"]}
1
+ {"version":3,"sources":["../../src/types/Uri.ts"],"sourcesContent":["import { isBoolean, isNotEmpty, isTrue } from './Is';\nimport { asString, Text } from './Text';\nimport { toName } from './Constructor';\nimport { ctx } from './Context';\nimport { List, toList } from './List';\nimport { meta } from './Meta';\nimport { tryTo } from './Try';\nimport { Optional } from './Types';\nimport { OneOrMore, toArray } from './Array';\nimport { entries } from './Object';\n\nexport type Segment = Text & { key?: string; segment?: string; query?: (value: unknown) => string };\n\nexport const toSegment = (\n key?: Text,\n {\n segment,\n query,\n }: {\n segment?: string;\n query?: (value: unknown) => string;\n } = {}\n): Segment => ({\n key: key as string,\n segment,\n query,\n toString: () => asString(key),\n});\n\nexport const uri = {\n host: (key?: string): Segment => toSegment(key, { segment: key ?? ctx.env.host ?? '$host' }),\n resource: <Props extends UriExpandProps>(resource: Uri<Props>): Segment => toSegment(toName(resource, 'Uri'), { segment: toName(resource, 'Uri') }),\n segment: (key?: Text): Segment => toSegment(key, { segment: key as string }),\n path: (key: Text): Segment => toSegment(key, { segment: `:${key}` }),\n query: (key: Text): Segment =>\n toSegment(key, {\n query: (value: unknown): string =>\n tryTo(value)\n .is.defined()\n .map(v => encodeURIComponent(asString(v)))\n .map(v => `${key}=${v}`)\n .orElse('') ?? '',\n }),\n boolean: (key: Text): Segment => toSegment(key, { query: (value: unknown): string => (isTrue(value) ? `${key}` : '') }),\n};\n\ntype Prop = { segment: Segment; value: any };\n\nconst toRoute = (...segments: Segment[]): string =>\n toList(segments)\n .mapDefined(s => s.segment)\n .join('/');\n\nexport type Uri<Props extends UriExpandProps = UriExpandProps> = {\n id: (id?: unknown) => Uri<Props>;\n ids: (ids: OneOrMore<unknown>) => Uri<Props>;\n query: (q?: unknown) => Uri<Props>;\n sort: (q?: any) => Uri<Props>;\n skip: (n?: number) => Uri<Props>;\n take: (n?: number) => Uri<Props>;\n path: string;\n route: (resource: string) => string;\n isInternal: boolean;\n toString: () => string;\n expand: (props: Partial<Props>) => Uri<Props>;\n};\n\nexport type UriExpandProps = { q?: string; s?: string; skip?: number; take?: number };\n\nexport class EasyUri<Props extends UriExpandProps = UriExpandProps> implements Uri<Props> {\n static readonly id = uri.path('id');\n static readonly ids = uri.query('ids');\n static readonly query = uri.query('q');\n static readonly sort = uri.query('s');\n static readonly skip = uri.query('skip');\n static readonly take = uri.query('take');\n\n readonly host = uri.host();\n protected resource = uri.resource(this);\n\n protected state: any = {};\n\n constructor(readonly segments: Segment[] = []) {}\n\n get path(): string {\n return toRoute(uri.segment(''), this.resource, ...this.segments);\n }\n\n get complete(): string {\n return toRoute(this.host, this.resource, ...this.segments);\n }\n\n get isInternal(): boolean {\n return toRoute(this.host) === (ctx.env.host ?? '$host');\n }\n\n protected get props(): List<Prop> {\n return meta(this.state).values<Prop>();\n }\n\n route = (resource: Optional<string> = this.resource.key): string => toRoute(uri.segment(''), uri.segment(resource?.toLowerCase()), ...this.segments);\n\n set = (segment: Segment, value?: unknown): this => {\n tryTo(value)\n .is.defined()\n .accept(value => (this.state[segment.key ?? ''] = { segment, value }));\n return this;\n };\n\n toString(): string {\n return tryTo(() => this.props)\n .map(ps => ps.filter(p => p.segment?.segment))\n .map(ps => ps.reduce((r: string, p: Prop) => r.replace(asString(p.segment.segment), asString(p.value)), this.complete))\n .map(route => ({\n route,\n query: this.props.mapDefined(p => (p.segment?.query ? p.segment?.query(p.value) : undefined))?.join('&'),\n }))\n .map(({ route, query }) => (isNotEmpty(query) ? `${route}?${query}` : route)).value;\n }\n\n id = (id?: unknown): this => this.set(EasyUri.id, id);\n ids = (ids: OneOrMore<unknown>): this => this.set(EasyUri.ids, toArray(ids).join(','));\n query = (q?: unknown): this => this.set(EasyUri.query, q);\n sort = (s?: any): this => this.set(EasyUri.sort, asString(s));\n\n skip = (index?: number): this => this.set(EasyUri.skip, index);\n take = (items?: number): this => this.set(EasyUri.take, items);\n\n expand(props: Partial<Props>): this {\n return entries(props as any)\n .filter(([_, v]) => isNotEmpty(v))\n .reduce((u, [k, v]) => (isBoolean(v) ? u.set(uri.boolean(k), v) : u.set(uri.query(k), toArray(v).join(','))), this);\n }\n}\n\nexport const clipUri = (uri?: EasyUri | string | null): string =>\n tryTo(() => asString(uri))\n .map(uri => uri.replace(/^(https?:\\/\\/)?(www\\.)?/, ''))\n .map(uri => uri.replace(/\\/$/, '')).value;\n"],"mappings":"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","names":["value","uri"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thisisagile/easy",
3
- "version": "17.19.0",
3
+ "version": "17.20.1",
4
4
  "description": "Straightforward library for building domain-driven microservice architectures",
5
5
  "author": "Sander Hoogendoorn",
6
6
  "license": "MIT",
@@ -1,14 +1,16 @@
1
1
  import { View } from '../utils/View';
2
2
  import { FetchOptions, Gateway } from '../types/Gateway';
3
3
  import { Repository } from '../types/Repository';
4
- import { Json, JsonValue } from '../types/Json';
4
+ import { Json, JsonValue, toJson } from '../types/Json';
5
5
  import { PageList } from '../types/PageList';
6
6
  import { Id, Key } from '../types/Id';
7
7
  import { when } from '../validation/When';
8
8
  import { Exception } from '../types/Exception';
9
9
  import { List } from '../types/List';
10
+ import { RouteGateway } from '../services/RouteGateway';
11
+ import { RouteOptions } from '../services/Api';
10
12
 
11
- export class Typo<T, Options = FetchOptions> extends Repository<T, Options> {
13
+ export class Typo<T, Options extends RouteOptions = RouteOptions> extends Repository<T, Options> {
12
14
  constructor(
13
15
  protected view: View<T>,
14
16
  private readonly gateway: Gateway<Options>
@@ -53,3 +55,57 @@ export class Typo<T, Options = FetchOptions> extends Repository<T, Options> {
53
55
  return this.gateway.exists(id);
54
56
  }
55
57
  }
58
+
59
+ export class Agent<T, Options extends FetchOptions = FetchOptions> extends Repository<T, Options> {
60
+ constructor(private gateway: RouteGateway) {
61
+ super();
62
+ }
63
+
64
+ all(options?: Options): Promise<PageList<T>> {
65
+ return this.gateway.all(options) as Promise<PageList<T>>;
66
+ }
67
+
68
+ byId(id: Id): Promise<T> {
69
+ return this.gateway.byId(id) as Promise<T>;
70
+ }
71
+
72
+ byIds(...ids: Id[]): Promise<List<T>> {
73
+ return this.gateway.byIds(...ids) as Promise<List<T>>;
74
+ }
75
+
76
+ byKey(key: Key, options?: Options): Promise<PageList<T>> {
77
+ return this.gateway.by('key', key, options) as Promise<PageList<T>>;
78
+ }
79
+
80
+ by(key: keyof T, value: JsonValue, options?: Options): Promise<PageList<T>> {
81
+ return this.gateway.by(key.toString(), value, options) as Promise<PageList<T>>;
82
+ }
83
+
84
+ search(q: JsonValue, options?: Options): Promise<PageList<T>> {
85
+ return this.gateway.search(q, options) as Promise<PageList<T>>;
86
+ }
87
+
88
+ filter(options?: Options): Promise<PageList<T>> {
89
+ return this.gateway.filter(options) as Promise<PageList<T>>;
90
+ }
91
+
92
+ exists(id: Id): Promise<boolean> {
93
+ return this.gateway.exists(id);
94
+ }
95
+
96
+ add(t: Partial<T>): Promise<T> {
97
+ return this.gateway.add(toJson(t)) as Promise<T>;
98
+ }
99
+
100
+ update(id: Id, t: Partial<T>): Promise<T> {
101
+ return this.gateway.update({ ...toJson(t), id }) as Promise<T>;
102
+ }
103
+
104
+ upsert(id: Id, t: Partial<T>): Promise<T> {
105
+ return this.gateway.upsert({ ...toJson(t), id }) as Promise<T>;
106
+ }
107
+
108
+ remove(id: Id): Promise<boolean> {
109
+ return this.gateway.remove(id);
110
+ }
111
+ }
package/src/index.ts CHANGED
@@ -121,4 +121,3 @@ export * from './utils/Wait';
121
121
  export * from './validation/Contraints';
122
122
  export * from './validation/Validate';
123
123
  export * from './validation/When';
124
- export { IdName } from './types/IdName';
@@ -1,7 +1,7 @@
1
- import { Api, RouteOptions } from './Api';
1
+ import { Api } from './Api';
2
2
  import { ApiGateway } from './ApiGateway';
3
3
  import { Func } from '../types/Func';
4
- import { Uri } from '../types/Uri';
4
+ import { Uri, UriExpandProps } from '../types/Uri';
5
5
  import { PageList } from '../types/PageList';
6
6
  import { Json, JsonValue } from '../types/Json';
7
7
  import { Id } from '../types/Id';
@@ -9,55 +9,56 @@ import { Optional } from '../types/Types';
9
9
  import { List } from '../types/List';
10
10
  import { toArray } from '../types/Array';
11
11
  import { HttpStatus } from '../http/HttpStatus';
12
+ import { isDefined } from '../types/Is';
12
13
 
13
- export class RouteGateway extends ApiGateway {
14
+ export class RouteGateway<Props extends UriExpandProps = UriExpandProps> extends ApiGateway {
14
15
  constructor(
15
- readonly route: Func<Uri>,
16
- readonly routeId: Func<Uri>,
16
+ readonly route: Func<Uri<Props>>,
17
+ readonly routeId: Func<Uri<Props>>,
17
18
  readonly api: Api = new Api()
18
19
  ) {
19
20
  super(api);
20
21
  }
21
22
 
22
- all(options?: RouteOptions): Promise<PageList<Json>> {
23
- return this.get(this.route(), options);
23
+ all(options?: Props): Promise<PageList<Json>> {
24
+ return this.get(this.route().expand(options ?? {}) as Uri, options);
24
25
  }
25
26
 
26
- byId(id: Id, options?: RouteOptions): Promise<Optional<Json>> {
27
- return this.getOne(this.routeId().id(id));
27
+ byId(id: Id): Promise<Optional<Json>> {
28
+ return this.getOne(this.routeId().id(id) as Uri);
28
29
  }
29
30
 
30
31
  byIds(...ids: Id[]): Promise<List<Json>> {
31
- return this.get(this.route().ids(toArray(...ids)));
32
+ return this.get(this.route().ids(toArray(...ids)) as Uri);
32
33
  }
33
34
 
34
- search(q: JsonValue, options?: RouteOptions): Promise<PageList<Json>> {
35
- return this.get(this.route().query(q), options);
35
+ search(q: JsonValue, options?: Props): Promise<PageList<Json>> {
36
+ return this.get(this.route().expand({ ...options, q } as Props) as Uri);
36
37
  }
37
38
 
38
- exists(id: Id, options?: RouteOptions): Promise<boolean> {
39
- return this.get(this.routeId().id(id))
40
- .then(r => r.length === 1)
39
+ exists(id: Id): Promise<boolean> {
40
+ return this.byId(id)
41
+ .then(r => isDefined(r))
41
42
  .catch(r => (HttpStatus.NotFound.equals(r.status) ? false : Promise.reject(r)));
42
43
  }
43
44
 
44
- add(item: Json, options?: RouteOptions): Promise<Json> {
45
- return this.post(this.route(), item, options);
45
+ add(item: Json): Promise<Json> {
46
+ return this.post(this.route() as Uri, item);
46
47
  }
47
48
 
48
- filter(options?: RouteOptions): Promise<PageList<Json>> {
49
- return this.postSearch(this.route(), options);
49
+ filter(options?: Props): Promise<PageList<Json>> {
50
+ return this.postSearch(this.route().expand(options ?? {}) as Uri);
50
51
  }
51
52
 
52
- update(item: Json, options?: RouteOptions): Promise<Json> {
53
- return this.patch(this.routeId().id(item.id), item, options);
53
+ update(item: Json): Promise<Json> {
54
+ return this.patch(this.routeId().id(item.id) as Uri, item);
54
55
  }
55
56
 
56
- upsert(item: Json, options?: RouteOptions): Promise<Json> {
57
- return this.put(this.routeId().id(item.id), item, options);
57
+ upsert(item: Json): Promise<Json> {
58
+ return this.put(this.routeId().id(item.id) as Uri, item);
58
59
  }
59
60
 
60
- remove(id: Id, options?: RouteOptions): Promise<boolean> {
61
- return this.delete(this.routeId().id(id), options);
61
+ remove(id: Id): Promise<boolean> {
62
+ return this.delete(this.routeId().id(id) as Uri);
62
63
  }
63
64
  }
@@ -39,11 +39,11 @@ export class Repository<T, Options = FetchOptions> {
39
39
  return reject(Exception.IsNotImplemented);
40
40
  }
41
41
 
42
- add(t: T | Json): Promise<T> {
42
+ add(t: Partial<T> | Json): Promise<T> {
43
43
  return reject(Exception.IsNotImplemented);
44
44
  }
45
45
 
46
- update(id: Id, json: Json): Promise<T> {
46
+ update(id: Id, json: Partial<T> | Json): Promise<T> {
47
47
  return reject(Exception.IsNotImplemented);
48
48
  }
49
49
 
@@ -51,7 +51,7 @@ export class Repository<T, Options = FetchOptions> {
51
51
  return reject(Exception.IsNotImplemented);
52
52
  }
53
53
 
54
- upsert(id: Id, item: Json): Promise<T> {
54
+ upsert(id: Id, item: Partial<T> | Json): Promise<T> {
55
55
  return reject(Exception.IsNotImplemented);
56
56
  }
57
57
  }
package/src/types/Uri.ts CHANGED
@@ -29,7 +29,7 @@ export const toSegment = (
29
29
 
30
30
  export const uri = {
31
31
  host: (key?: string): Segment => toSegment(key, { segment: key ?? ctx.env.host ?? '$host' }),
32
- resource: (resource: Uri): Segment => toSegment(toName(resource, 'Uri'), { segment: toName(resource, 'Uri') }),
32
+ resource: <Props extends UriExpandProps>(resource: Uri<Props>): Segment => toSegment(toName(resource, 'Uri'), { segment: toName(resource, 'Uri') }),
33
33
  segment: (key?: Text): Segment => toSegment(key, { segment: key as string }),
34
34
  path: (key: Text): Segment => toSegment(key, { segment: `:${key}` }),
35
35
  query: (key: Text): Segment =>
@@ -51,22 +51,23 @@ const toRoute = (...segments: Segment[]): string =>
51
51
  .mapDefined(s => s.segment)
52
52
  .join('/');
53
53
 
54
- export type Uri = {
55
- id: (id?: unknown) => Uri;
56
- ids: (ids: OneOrMore<unknown>) => Uri;
57
- query: (q?: unknown) => Uri;
58
- sort: (q?: any) => Uri;
59
- skip: (n?: number) => Uri;
60
- take: (n?: number) => Uri;
54
+ export type Uri<Props extends UriExpandProps = UriExpandProps> = {
55
+ id: (id?: unknown) => Uri<Props>;
56
+ ids: (ids: OneOrMore<unknown>) => Uri<Props>;
57
+ query: (q?: unknown) => Uri<Props>;
58
+ sort: (q?: any) => Uri<Props>;
59
+ skip: (n?: number) => Uri<Props>;
60
+ take: (n?: number) => Uri<Props>;
61
61
  path: string;
62
62
  route: (resource: string) => string;
63
63
  isInternal: boolean;
64
64
  toString: () => string;
65
+ expand: (props: Partial<Props>) => Uri<Props>;
65
66
  };
66
67
 
67
- export type UriExpandProps = { q: string; s: string };
68
+ export type UriExpandProps = { q?: string; s?: string; skip?: number; take?: number };
68
69
 
69
- export class EasyUri<Props = UriExpandProps> implements Uri {
70
+ export class EasyUri<Props extends UriExpandProps = UriExpandProps> implements Uri<Props> {
70
71
  static readonly id = uri.path('id');
71
72
  static readonly ids = uri.query('ids');
72
73
  static readonly query = uri.query('q');
@@ -126,7 +127,7 @@ export class EasyUri<Props = UriExpandProps> implements Uri {
126
127
  take = (items?: number): this => this.set(EasyUri.take, items);
127
128
 
128
129
  expand(props: Partial<Props>): this {
129
- return entries(props)
130
+ return entries(props as any)
130
131
  .filter(([_, v]) => isNotEmpty(v))
131
132
  .reduce((u, [k, v]) => (isBoolean(v) ? u.set(uri.boolean(k), v) : u.set(uri.query(k), toArray(v).join(','))), this);
132
133
  }
@@ -1,57 +0,0 @@
1
- import {
2
- ApiGateway
3
- } from "./chunk-3MDXTFJG.mjs";
4
- import {
5
- Api
6
- } from "./chunk-RTTVCEWR.mjs";
7
- import {
8
- HttpStatus
9
- } from "./chunk-H27UMLDT.mjs";
10
- import {
11
- toArray
12
- } from "./chunk-CO2AFYVD.mjs";
13
-
14
- // src/services/RouteGateway.ts
15
- var RouteGateway = class extends ApiGateway {
16
- constructor(route, routeId, api = new Api()) {
17
- super(api);
18
- this.route = route;
19
- this.routeId = routeId;
20
- this.api = api;
21
- }
22
- all(options) {
23
- return this.get(this.route(), options);
24
- }
25
- byId(id, options) {
26
- return this.getOne(this.routeId().id(id));
27
- }
28
- byIds(...ids) {
29
- return this.get(this.route().ids(toArray(...ids)));
30
- }
31
- search(q, options) {
32
- return this.get(this.route().query(q), options);
33
- }
34
- exists(id, options) {
35
- return this.get(this.routeId().id(id)).then((r) => r.length === 1).catch((r) => HttpStatus.NotFound.equals(r.status) ? false : Promise.reject(r));
36
- }
37
- add(item, options) {
38
- return this.post(this.route(), item, options);
39
- }
40
- filter(options) {
41
- return this.postSearch(this.route(), options);
42
- }
43
- update(item, options) {
44
- return this.patch(this.routeId().id(item.id), item, options);
45
- }
46
- upsert(item, options) {
47
- return this.put(this.routeId().id(item.id), item, options);
48
- }
49
- remove(id, options) {
50
- return this.delete(this.routeId().id(id), options);
51
- }
52
- };
53
-
54
- export {
55
- RouteGateway
56
- };
57
- //# sourceMappingURL=chunk-3XD77BIN.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/services/RouteGateway.ts"],"sourcesContent":["import { Api, RouteOptions } from './Api';\nimport { ApiGateway } from './ApiGateway';\nimport { Func } from '../types/Func';\nimport { Uri } from '../types/Uri';\nimport { PageList } from '../types/PageList';\nimport { Json, JsonValue } from '../types/Json';\nimport { Id } from '../types/Id';\nimport { Optional } from '../types/Types';\nimport { List } from '../types/List';\nimport { toArray } from '../types/Array';\nimport { HttpStatus } from '../http/HttpStatus';\n\nexport class RouteGateway extends ApiGateway {\n constructor(\n readonly route: Func<Uri>,\n readonly routeId: Func<Uri>,\n readonly api: Api = new Api()\n ) {\n super(api);\n }\n\n all(options?: RouteOptions): Promise<PageList<Json>> {\n return this.get(this.route(), options);\n }\n\n byId(id: Id, options?: RouteOptions): Promise<Optional<Json>> {\n return this.getOne(this.routeId().id(id));\n }\n\n byIds(...ids: Id[]): Promise<List<Json>> {\n return this.get(this.route().ids(toArray(...ids)));\n }\n\n search(q: JsonValue, options?: RouteOptions): Promise<PageList<Json>> {\n return this.get(this.route().query(q), options);\n }\n\n exists(id: Id, options?: RouteOptions): Promise<boolean> {\n return this.get(this.routeId().id(id))\n .then(r => r.length === 1)\n .catch(r => (HttpStatus.NotFound.equals(r.status) ? false : Promise.reject(r)));\n }\n\n add(item: Json, options?: RouteOptions): Promise<Json> {\n return this.post(this.route(), item, options);\n }\n\n filter(options?: RouteOptions): Promise<PageList<Json>> {\n return this.postSearch(this.route(), options);\n }\n\n update(item: Json, options?: RouteOptions): Promise<Json> {\n return this.patch(this.routeId().id(item.id), item, options);\n }\n\n upsert(item: Json, options?: RouteOptions): Promise<Json> {\n return this.put(this.routeId().id(item.id), item, options);\n }\n\n remove(id: Id, options?: RouteOptions): Promise<boolean> {\n return this.delete(this.routeId().id(id), options);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAYO,IAAM,eAAN,cAA2B,WAAW;AAAA,EAC3C,YACW,OACA,SACA,MAAW,IAAI,IAAI,GAC5B;AACA,UAAM,GAAG;AAJA;AACA;AACA;AAAA,EAGX;AAAA,EAEA,IAAI,SAAiD;AACnD,WAAO,KAAK,IAAI,KAAK,MAAM,GAAG,OAAO;AAAA,EACvC;AAAA,EAEA,KAAK,IAAQ,SAAiD;AAC5D,WAAO,KAAK,OAAO,KAAK,QAAQ,EAAE,GAAG,EAAE,CAAC;AAAA,EAC1C;AAAA,EAEA,SAAS,KAAgC;AACvC,WAAO,KAAK,IAAI,KAAK,MAAM,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,CAAC;AAAA,EACnD;AAAA,EAEA,OAAO,GAAc,SAAiD;AACpE,WAAO,KAAK,IAAI,KAAK,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO;AAAA,EAChD;AAAA,EAEA,OAAO,IAAQ,SAA0C;AACvD,WAAO,KAAK,IAAI,KAAK,QAAQ,EAAE,GAAG,EAAE,CAAC,EAClC,KAAK,OAAK,EAAE,WAAW,CAAC,EACxB,MAAM,OAAM,WAAW,SAAS,OAAO,EAAE,MAAM,IAAI,QAAQ,QAAQ,OAAO,CAAC,CAAE;AAAA,EAClF;AAAA,EAEA,IAAI,MAAY,SAAuC;AACrD,WAAO,KAAK,KAAK,KAAK,MAAM,GAAG,MAAM,OAAO;AAAA,EAC9C;AAAA,EAEA,OAAO,SAAiD;AACtD,WAAO,KAAK,WAAW,KAAK,MAAM,GAAG,OAAO;AAAA,EAC9C;AAAA,EAEA,OAAO,MAAY,SAAuC;AACxD,WAAO,KAAK,MAAM,KAAK,QAAQ,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,OAAO;AAAA,EAC7D;AAAA,EAEA,OAAO,MAAY,SAAuC;AACxD,WAAO,KAAK,IAAI,KAAK,QAAQ,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,OAAO;AAAA,EAC3D;AAAA,EAEA,OAAO,IAAQ,SAA0C;AACvD,WAAO,KAAK,OAAO,KAAK,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO;AAAA,EACnD;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types/Repository.ts"],"sourcesContent":["import { FetchOptions } from './Gateway';\nimport { PageList } from './PageList';\nimport { Exception } from './Exception';\nimport { reject } from '../utils/Promise';\nimport { Id, Key } from './Id';\nimport { List } from './List';\nimport { Json, JsonValue } from './Json';\n\nexport class Repository<T, Options = FetchOptions> {\n all(options?: Options): Promise<PageList<T>> {\n return reject(Exception.IsNotImplemented);\n }\n\n byId(id: Id): Promise<T> {\n return reject(Exception.IsNotImplemented);\n }\n\n byIds(...ids: Id[]): Promise<List<T>> {\n return reject(Exception.IsNotImplemented);\n }\n\n byKey(key: Key, options?: Options): Promise<PageList<T>> {\n return reject(Exception.IsNotImplemented);\n }\n\n by(key: keyof T, value: JsonValue, options?: Options): Promise<PageList<T>> {\n return reject(Exception.IsNotImplemented);\n }\n\n search(q: JsonValue, options?: Options): Promise<PageList<T>> {\n return reject(Exception.IsNotImplemented);\n }\n\n filter(options?: Options): Promise<PageList<T>> {\n return reject(Exception.IsNotImplemented);\n }\n\n exists(id: Id): Promise<boolean> {\n return reject(Exception.IsNotImplemented);\n }\n\n add(t: T | Json): Promise<T> {\n return reject(Exception.IsNotImplemented);\n }\n\n update(id: Id, json: Json): Promise<T> {\n return reject(Exception.IsNotImplemented);\n }\n\n remove(id: Id): Promise<boolean> {\n return reject(Exception.IsNotImplemented);\n }\n\n upsert(id: Id, item: Json): Promise<T> {\n return reject(Exception.IsNotImplemented);\n }\n}\n"],"mappings":";;;;;;;;AAQO,IAAM,aAAN,MAA4C;AAAA,EACjD,IAAI,SAAyC;AAC3C,WAAO,OAAO,UAAU,gBAAgB;AAAA,EAC1C;AAAA,EAEA,KAAK,IAAoB;AACvB,WAAO,OAAO,UAAU,gBAAgB;AAAA,EAC1C;AAAA,EAEA,SAAS,KAA6B;AACpC,WAAO,OAAO,UAAU,gBAAgB;AAAA,EAC1C;AAAA,EAEA,MAAM,KAAU,SAAyC;AACvD,WAAO,OAAO,UAAU,gBAAgB;AAAA,EAC1C;AAAA,EAEA,GAAG,KAAc,OAAkB,SAAyC;AAC1E,WAAO,OAAO,UAAU,gBAAgB;AAAA,EAC1C;AAAA,EAEA,OAAO,GAAc,SAAyC;AAC5D,WAAO,OAAO,UAAU,gBAAgB;AAAA,EAC1C;AAAA,EAEA,OAAO,SAAyC;AAC9C,WAAO,OAAO,UAAU,gBAAgB;AAAA,EAC1C;AAAA,EAEA,OAAO,IAA0B;AAC/B,WAAO,OAAO,UAAU,gBAAgB;AAAA,EAC1C;AAAA,EAEA,IAAI,GAAyB;AAC3B,WAAO,OAAO,UAAU,gBAAgB;AAAA,EAC1C;AAAA,EAEA,OAAO,IAAQ,MAAwB;AACrC,WAAO,OAAO,UAAU,gBAAgB;AAAA,EAC1C;AAAA,EAEA,OAAO,IAA0B;AAC/B,WAAO,OAAO,UAAU,gBAAgB;AAAA,EAC1C;AAAA,EAEA,OAAO,IAAQ,MAAwB;AACrC,WAAO,OAAO,UAAU,gBAAgB;AAAA,EAC1C;AACF;","names":[]}