@superbia/untrue 2.1.8 → 2.3.0

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.
@@ -0,0 +1,15 @@
1
+ import { Context, State } from "untrue";
2
+ import { Client, EndpointRecord, ResponseResult } from "@superbia/client";
3
+ import { DocumentContext, ApiDocuments } from "./DocumentContext";
4
+ import { RequestContext, ApiRequest, RequestResult } from "./RequestContext";
5
+ import { IdDocumentRecord } from "./SuperbiaContext";
6
+ export default class Api<O extends string, K extends IdDocumentRecord<O>, M extends EndpointRecord, N extends EndpointRecord = {}, P = any> extends Context<State, P> {
7
+ readonly client: Client<M, N>;
8
+ readonly documents: DocumentContext<O, K>;
9
+ readonly requests: RequestContext<O, M>;
10
+ constructor(client: Client<M, N>, idKey: string);
11
+ useDocuments<W>(selector: (documents: ApiDocuments<O, K>) => W): W;
12
+ useRequest<Y extends ResponseResult, W, X extends any[] = any[]>(key: string, selector: (request: ApiRequest<RequestResult<O, Y>>) => W, requester?: (...args: X) => Promise<Y>): [W, (...args: X) => Promise<void>];
13
+ useLoad<Y extends ResponseResult, W, X extends any[]>(key: string, selector: (request: ApiRequest<RequestResult<O, Y>>) => W, loader: (...args: X) => Promise<Y>): [W, (...args: X) => Promise<void>];
14
+ useRequestKey(params?: any[]): string;
15
+ }
@@ -1,15 +1,16 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const untrue_1 = require("untrue");
4
- const uuid_1 = require("uuid");
5
- const DocumentContext_1 = require("./DocumentContext");
6
- const RequestContext_1 = require("./RequestContext");
7
- class Api extends untrue_1.Context {
8
- constructor(client, idKey = "id") {
1
+ import { Context, Hook } from "untrue";
2
+ import { v4 as uuid } from "uuid";
3
+ import { DocumentContext } from "./DocumentContext";
4
+ import { RequestContext, PaginationResult, } from "./RequestContext";
5
+ export default class Api extends Context {
6
+ client;
7
+ documents;
8
+ requests;
9
+ constructor(client, idKey) {
9
10
  super();
10
11
  this.client = client;
11
- this.documents = new DocumentContext_1.DocumentContext(client, idKey);
12
- this.requests = new RequestContext_1.RequestContext(idKey);
12
+ this.documents = new DocumentContext(client, idKey);
13
+ this.requests = new RequestContext(idKey);
13
14
  const listener = () => {
14
15
  this.update();
15
16
  };
@@ -17,17 +18,17 @@ class Api extends untrue_1.Context {
17
18
  this.requests.on("update", listener);
18
19
  }
19
20
  useDocuments(selector) {
20
- return untrue_1.Hook.useContext(this.documents, () => selector(this.documents.data));
21
+ return Hook.useContext(this.documents, () => selector(this.documents.data));
21
22
  }
22
23
  useRequest(key, selector, requester) {
23
- const value = untrue_1.Hook.useContext(this.requests, () => {
24
+ const value = Hook.useContext(this.requests, () => {
24
25
  let request = (this.requests.data[key] ?? null);
25
- request ?? (request = {
26
+ request ??= {
26
27
  loading: false,
27
28
  done: false,
28
29
  result: null,
29
30
  error: null,
30
- });
31
+ };
31
32
  return selector(request);
32
33
  });
33
34
  const request = async (...args) => {
@@ -62,14 +63,14 @@ class Api extends untrue_1.Context {
62
63
  return [value, request];
63
64
  }
64
65
  useLoad(key, selector, loader) {
65
- const value = untrue_1.Hook.useContext(this.requests, () => {
66
+ const value = Hook.useContext(this.requests, () => {
66
67
  let request = (this.requests.data[key] ?? null);
67
- request ?? (request = {
68
+ request ??= {
68
69
  loading: false,
69
70
  done: false,
70
71
  result: null,
71
72
  error: null,
72
- });
73
+ };
73
74
  return selector(request);
74
75
  });
75
76
  const load = async (...args) => {
@@ -85,8 +86,8 @@ class Api extends untrue_1.Context {
85
86
  throw new Error('Request is in "error" state.');
86
87
  }
87
88
  const tmpResult = request.result;
88
- let tmpPagination;
89
89
  let endpointName;
90
+ let tmpPagination;
90
91
  let rethrow = false;
91
92
  this.client.once("request", (endpoints) => {
92
93
  const keys = Object.keys(endpoints);
@@ -99,7 +100,7 @@ class Api extends untrue_1.Context {
99
100
  if (tmpPagination === undefined) {
100
101
  throw new Error(`Endpoint "${endpointName}" not in request result.`);
101
102
  }
102
- if (!(tmpPagination instanceof RequestContext_1.PaginationResult)) {
103
+ if (!(tmpPagination instanceof PaginationResult)) {
103
104
  throw new Error(`Endpoint "${endpointName}" is not of Pagination type.`);
104
105
  }
105
106
  }
@@ -140,7 +141,6 @@ class Api extends untrue_1.Context {
140
141
  return [value, load];
141
142
  }
142
143
  useRequestKey(params) {
143
- return untrue_1.Hook.useMemo(() => (0, uuid_1.v4)(), params);
144
+ return Hook.useMemo(() => uuid(), params);
144
145
  }
145
146
  }
146
- exports.default = Api;
@@ -0,0 +1,15 @@
1
+ import { Client, Result, ResponseResult } from "@superbia/client";
2
+ import { IdDocument, IdDocumentRecord, ParsedResult, SuperbiaContext } from "./SuperbiaContext";
3
+ export type ApiDocument<O extends string, T extends IdDocument<O>> = {
4
+ [K in keyof T]: ParsedResult<O, T[K]>;
5
+ };
6
+ export type ApiDocuments<O extends string, T extends IdDocumentRecord<O>> = Partial<{
7
+ [K in keyof T]: Record<string, Result<ApiDocument<O, T[K]>>>;
8
+ }>;
9
+ export declare class DocumentContext<O extends string, K extends IdDocumentRecord<O>> extends SuperbiaContext {
10
+ data: ApiDocuments<O, K>;
11
+ private updateAfterResultLoop;
12
+ constructor(client: Client<any, any>, idKey: string);
13
+ handleResult(result: ResponseResult): void;
14
+ private parseResultValue;
15
+ }
@@ -0,0 +1,53 @@
1
+ import { SuperbiaContext, } from "./SuperbiaContext";
2
+ export class DocumentContext extends SuperbiaContext {
3
+ data = {};
4
+ updateAfterResultLoop = false;
5
+ constructor(client, idKey) {
6
+ super(idKey);
7
+ const listener = (endpoints, emitter) => {
8
+ emitter.on("result", (result) => {
9
+ this.handleResult(result);
10
+ });
11
+ };
12
+ client.on("request", listener);
13
+ client.on("subscribe", listener);
14
+ }
15
+ handleResult(result) {
16
+ const endpointResults = Object.values(result);
17
+ for (const endpointResult of endpointResults) {
18
+ this.parseResultValue(endpointResult);
19
+ }
20
+ if (this.updateAfterResultLoop) {
21
+ this.update();
22
+ }
23
+ this.updateAfterResultLoop = false;
24
+ }
25
+ parseResultValue(value) {
26
+ if (value === null) {
27
+ return null;
28
+ }
29
+ if (Array.isArray(value)) {
30
+ return value.map((tmpValue) => this.parseResultValue(tmpValue));
31
+ }
32
+ if (typeof value === "object") {
33
+ const tmpValue = {};
34
+ for (const key in value) {
35
+ tmpValue[key] = this.parseResultValue(value[key]);
36
+ }
37
+ const isIdDocument = this.isIdDocument(value);
38
+ if (!isIdDocument) {
39
+ return tmpValue;
40
+ }
41
+ const id = value[this.idKey];
42
+ const typename = value[this.typenameKey];
43
+ const documents = this.data;
44
+ if (!(typename in documents)) {
45
+ documents[typename] = {};
46
+ }
47
+ documents[typename][id] = tmpValue;
48
+ this.updateAfterResultLoop = true;
49
+ return id;
50
+ }
51
+ return value;
52
+ }
53
+ }
@@ -0,0 +1,29 @@
1
+ import { Result, Pagination, EndpointRecord, ResponseResult } from "@superbia/client";
2
+ import { ParsedResult, SuperbiaContext } from "./SuperbiaContext";
3
+ export declare class PaginationResult<O extends string, T extends Pagination<any>> {
4
+ loading: boolean;
5
+ result: ParsedResult<O, T>;
6
+ error: any;
7
+ constructor({ loading, result, error, }: {
8
+ loading: boolean;
9
+ result: ParsedResult<O, T>;
10
+ error: any;
11
+ });
12
+ }
13
+ export type RequestResult<O extends string, T extends ResponseResult> = {
14
+ [K in keyof T]: T[K] extends Pagination<any> ? PaginationResult<O, T[K]> : ParsedResult<O, T[K]>;
15
+ };
16
+ export type ApiRequest<T extends ResponseResult> = {
17
+ loading: boolean;
18
+ done: boolean;
19
+ result: T | null;
20
+ error: any;
21
+ };
22
+ export type ApiRequests<O extends string, T extends EndpointRecord> = Record<string, ApiRequest<Partial<RequestResult<O, {
23
+ [K in keyof T]: Result<T[K]["result"]>;
24
+ }>>>>;
25
+ export declare class RequestContext<O extends string, M extends EndpointRecord> extends SuperbiaContext {
26
+ data: ApiRequests<O, M>;
27
+ parseResult(result: ResponseResult): ResponseResult;
28
+ private parseResultValue;
29
+ }
@@ -0,0 +1,57 @@
1
+ import { SuperbiaContext } from "./SuperbiaContext";
2
+ export class PaginationResult {
3
+ loading;
4
+ result;
5
+ error;
6
+ constructor({ loading, result, error, }) {
7
+ this.loading = loading;
8
+ this.result = result;
9
+ this.error = error;
10
+ }
11
+ }
12
+ export class RequestContext extends SuperbiaContext {
13
+ data = {};
14
+ parseResult(result) {
15
+ const tmpResult = {};
16
+ for (const key in result) {
17
+ const endpointResult = result[key];
18
+ let tmpEndpointResult;
19
+ if (endpointResult !== null &&
20
+ typeof endpointResult === "object" &&
21
+ this.typenameKey in endpointResult &&
22
+ endpointResult[this.typenameKey] === "__pagination__") {
23
+ tmpEndpointResult = new PaginationResult({
24
+ loading: false,
25
+ result: this.parseResultValue(endpointResult),
26
+ error: null,
27
+ });
28
+ }
29
+ else {
30
+ tmpEndpointResult = this.parseResultValue(endpointResult);
31
+ }
32
+ tmpResult[key] = tmpEndpointResult;
33
+ }
34
+ return tmpResult;
35
+ }
36
+ parseResultValue(value) {
37
+ if (value === null) {
38
+ return null;
39
+ }
40
+ if (Array.isArray(value)) {
41
+ return value.map((tmpValue) => this.parseResultValue(tmpValue));
42
+ }
43
+ if (typeof value === "object") {
44
+ const isIdDocument = this.isIdDocument(value);
45
+ if (isIdDocument) {
46
+ const id = value[this.idKey];
47
+ return id;
48
+ }
49
+ const tmpValue = {};
50
+ for (const key in value) {
51
+ tmpValue[key] = this.parseResultValue(value[key]);
52
+ }
53
+ return tmpValue;
54
+ }
55
+ return value;
56
+ }
57
+ }
@@ -0,0 +1,15 @@
1
+ import { Context } from "untrue";
2
+ import { Document } from "@superbia/client";
3
+ export type IdDocument<O extends string> = Document & {
4
+ [K in O]: string;
5
+ };
6
+ export type IdDocumentRecord<O extends string> = Record<string, IdDocument<O>>;
7
+ export type ParsedResult<O extends string, T> = T extends string | number | boolean | null ? T : T extends IdDocument<O> ? string : {
8
+ [K in keyof T]: ParsedResult<O, T[K]>;
9
+ };
10
+ export declare class SuperbiaContext extends Context {
11
+ protected idKey: string;
12
+ protected typenameKey: string;
13
+ constructor(idKey: string);
14
+ protected isIdDocument(value: Record<string, any>): boolean;
15
+ }
@@ -0,0 +1,15 @@
1
+ import { Context } from "untrue";
2
+ export class SuperbiaContext extends Context {
3
+ idKey;
4
+ typenameKey = "__typename__";
5
+ constructor(idKey) {
6
+ super();
7
+ this.idKey = idKey;
8
+ }
9
+ isIdDocument(value) {
10
+ return (this.idKey in value &&
11
+ this.typenameKey in value &&
12
+ typeof value[this.idKey] === "string" &&
13
+ typeof value[this.typenameKey] === "string");
14
+ }
15
+ }
@@ -0,0 +1,4 @@
1
+ export { default } from "./Api";
2
+ export { ParsedResult } from "./SuperbiaContext";
3
+ export { ApiDocument, ApiDocuments } from "./DocumentContext";
4
+ export { ApiRequest, ApiRequests, RequestResult, PaginationResult, } from "./RequestContext";
@@ -0,0 +1,2 @@
1
+ export { default } from "./Api";
2
+ export { PaginationResult, } from "./RequestContext";
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@superbia/untrue",
3
- "version": "2.1.8",
3
+ "version": "2.3.0",
4
4
  "description": "Integrate Superbia and Untrue.",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/iconshot/superbia-untrue.git"
8
8
  },
9
- "main": "dist/index.js",
9
+ "type": "module",
10
+ "main": "dist/esm/index.js",
10
11
  "scripts": {
11
12
  "clean": "rm -rf dist",
12
13
  "build": "npm run clean && tsc",
@@ -18,8 +19,8 @@
18
19
  ],
19
20
  "license": "MIT",
20
21
  "peerDependencies": {
21
- "@superbia/client": "^2.1.3",
22
- "untrue": "^5.15.2"
22
+ "@superbia/client": "^2.3.0",
23
+ "untrue": "^5.18.0"
23
24
  },
24
25
  "dependencies": {
25
26
  "uuid": "^10.0.0"
package/dist/Api.d.ts DELETED
@@ -1,15 +0,0 @@
1
- import { Context, State } from "untrue";
2
- import { Client, EndpointRecord, ResponseResult } from "@superbia/client";
3
- import { DocumentSchemaRecord } from "./SuperbiaContext";
4
- import { DocumentContext, Documents } from "./DocumentContext";
5
- import { RequestContext, Request, RequestResult } from "./RequestContext";
6
- export default class Api<K extends DocumentSchemaRecord, M extends EndpointRecord, N extends EndpointRecord = {}, O extends string = "id", P = any> extends Context<State, P> {
7
- readonly client: Client<M, N>;
8
- readonly documents: DocumentContext<K, M, O>;
9
- readonly requests: RequestContext<M, O>;
10
- constructor(client: Client<M, N>, idKey?: string);
11
- useDocuments<W>(selector: (documents: Documents<K, O>) => W): W;
12
- useRequest<Y extends ResponseResult, W, X extends any[] = any[]>(key: string, selector: (request: Request<RequestResult<Y, O>>) => W, requester?: (...args: X) => Promise<Y>): [W, (...args: X) => Promise<void>];
13
- useLoad<Y extends ResponseResult, W, X extends any[]>(key: string, selector: (request: Request<RequestResult<Y, O>>) => W, loader: (...args: X) => Promise<Y>): [W, (...args: X) => Promise<void>];
14
- useRequestKey(params?: any[]): string;
15
- }
@@ -1,13 +0,0 @@
1
- import { Client, Result, ResponseResult, EndpointRecord } from "@superbia/client";
2
- import { ParsedResult, SuperbiaContext, DocumentSchema, DocumentSchemaRecord } from "./SuperbiaContext";
3
- export type Document<T extends DocumentSchema, O extends string = "id"> = {
4
- [K in keyof T]: ParsedResult<T[K], O>;
5
- };
6
- export type Documents<T extends DocumentSchemaRecord, O extends string = "id"> = Partial<{
7
- [K in keyof T]: Record<string, Result<Document<T[K], O>>>;
8
- }>;
9
- export declare class DocumentContext<K extends DocumentSchemaRecord, M extends EndpointRecord, O extends string> extends SuperbiaContext {
10
- data: Documents<K, O>;
11
- constructor(client: Client<M, any>, idKey: string);
12
- handleResult(result: ResponseResult): void;
13
- }
@@ -1,39 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DocumentContext = void 0;
4
- const SuperbiaContext_1 = require("./SuperbiaContext");
5
- class DocumentContext extends SuperbiaContext_1.SuperbiaContext {
6
- constructor(client, idKey) {
7
- super(idKey);
8
- this.data = {};
9
- const listener = (endpoints, emitter) => {
10
- emitter.on("result", (result) => {
11
- this.handleResult(result);
12
- });
13
- };
14
- client.on("request", listener);
15
- client.on("subscribe", listener);
16
- }
17
- handleResult(result) {
18
- const data = {};
19
- for (const tmpResult of Object.values(result)) {
20
- this.parseResultValue(tmpResult, data);
21
- }
22
- const types = Object.keys(data);
23
- if (types.length === 0) {
24
- return;
25
- }
26
- const documents = this.data;
27
- for (const type of types) {
28
- if (!(type in documents)) {
29
- documents[type] = {};
30
- }
31
- const tmpDocuments = data[type];
32
- for (const id in tmpDocuments) {
33
- documents[type][id] = tmpDocuments[id];
34
- }
35
- }
36
- this.update();
37
- }
38
- }
39
- exports.DocumentContext = DocumentContext;
@@ -1,28 +0,0 @@
1
- import { Result, Pagination, EndpointRecord, ResponseResult } from "@superbia/client";
2
- import { ParsedResult, SuperbiaContext } from "./SuperbiaContext";
3
- export declare class PaginationResult<T extends Pagination<any>, O extends string = "id"> {
4
- loading: boolean;
5
- result: ParsedResult<T, O>;
6
- error: Error | null;
7
- constructor({ loading, result, error, }: {
8
- loading: boolean;
9
- result: ParsedResult<T, O>;
10
- error: Error | null;
11
- });
12
- }
13
- export type RequestResult<T extends ResponseResult, O extends string = "id"> = {
14
- [K in keyof T]: T[K] extends Pagination<any> ? PaginationResult<T[K], O> : ParsedResult<T[K], O>;
15
- };
16
- export type Request<T extends ResponseResult> = {
17
- loading: boolean;
18
- done: boolean;
19
- result: T | null;
20
- error: Error | null;
21
- };
22
- export type Requests<T extends EndpointRecord, O extends string = "id"> = Record<string, Request<Partial<RequestResult<{
23
- [K in keyof T]: Result<T[K]["result"]>;
24
- }, O>>>>;
25
- export declare class RequestContext<M extends EndpointRecord, O extends string> extends SuperbiaContext {
26
- data: Requests<M, O>;
27
- parseResult(result: ResponseResult): ResponseResult;
28
- }
@@ -1,41 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RequestContext = exports.PaginationResult = void 0;
4
- const SuperbiaContext_1 = require("./SuperbiaContext");
5
- class PaginationResult {
6
- constructor({ loading, result, error, }) {
7
- this.loading = loading;
8
- this.result = result;
9
- this.error = error;
10
- }
11
- }
12
- exports.PaginationResult = PaginationResult;
13
- class RequestContext extends SuperbiaContext_1.SuperbiaContext {
14
- constructor() {
15
- super(...arguments);
16
- this.data = {};
17
- }
18
- parseResult(result) {
19
- const tmpResult = {};
20
- for (const key in result) {
21
- const endpointResult = result[key];
22
- let tmpEndpointResult;
23
- if (endpointResult !== null &&
24
- typeof endpointResult === "object" &&
25
- this.typenameKey in endpointResult &&
26
- endpointResult[this.typenameKey].endsWith("Pagination")) {
27
- tmpEndpointResult = new PaginationResult({
28
- loading: false,
29
- result: this.parseResultValue(endpointResult),
30
- error: null,
31
- });
32
- }
33
- else {
34
- tmpEndpointResult = this.parseResultValue(endpointResult);
35
- }
36
- tmpResult[key] = tmpEndpointResult;
37
- }
38
- return tmpResult;
39
- }
40
- }
41
- exports.RequestContext = RequestContext;
@@ -1,17 +0,0 @@
1
- import { Context } from "untrue";
2
- type IdObject<O extends string> = {
3
- [K in O]: string;
4
- };
5
- export type ParsedResult<T, O extends string = "id"> = T extends string | number | boolean | null ? T : T extends IdObject<O> ? string : {
6
- [K in keyof T]: ParsedResult<T[K], O>;
7
- };
8
- export type DocumentSchema = Record<string, any>;
9
- export type DocumentSchemaRecord = Record<string, DocumentSchema>;
10
- export type DocumentData = Record<string, Record<string, DocumentSchema>>;
11
- export declare class SuperbiaContext extends Context {
12
- protected idKey: string;
13
- protected typenameKey: string;
14
- constructor(idKey: string);
15
- parseResultValue(result: any, data?: DocumentData): any;
16
- }
17
- export {};
@@ -1,38 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SuperbiaContext = void 0;
4
- const untrue_1 = require("untrue");
5
- class SuperbiaContext extends untrue_1.Context {
6
- constructor(idKey) {
7
- super();
8
- this.idKey = idKey;
9
- this.typenameKey = "_typename";
10
- }
11
- parseResultValue(result, data = {}) {
12
- if (result === null) {
13
- return null;
14
- }
15
- if (Array.isArray(result)) {
16
- return result.map((element) => this.parseResultValue(element, data));
17
- }
18
- if (typeof result === "object") {
19
- const tmpResult = {};
20
- for (const key in result) {
21
- tmpResult[key] = this.parseResultValue(result[key], data);
22
- }
23
- const isDocument = this.idKey in result && this.typenameKey in result;
24
- if (!isDocument) {
25
- return tmpResult;
26
- }
27
- const id = result[this.idKey];
28
- const typename = result[this.typenameKey];
29
- if (!(typename in data)) {
30
- data[typename] = {};
31
- }
32
- data[typename][id] = tmpResult;
33
- return result[this.idKey];
34
- }
35
- return result;
36
- }
37
- }
38
- exports.SuperbiaContext = SuperbiaContext;
package/dist/index.d.ts DELETED
@@ -1,4 +0,0 @@
1
- export { default } from "./Api";
2
- export { ParsedResult } from "./SuperbiaContext";
3
- export { Document, Documents } from "./DocumentContext";
4
- export { Request, Requests, RequestResult, PaginationResult, } from "./RequestContext";
package/dist/index.js DELETED
@@ -1,10 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.PaginationResult = exports.default = void 0;
7
- var Api_1 = require("./Api");
8
- Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(Api_1).default; } });
9
- var RequestContext_1 = require("./RequestContext");
10
- Object.defineProperty(exports, "PaginationResult", { enumerable: true, get: function () { return RequestContext_1.PaginationResult; } });