kodzero-front-sdk-alfa 0.0.4 → 0.0.6
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/README.md +6 -6
- package/dist/Kodzero.d.ts +1 -0
- package/dist/Kodzero.js +7 -3
- package/dist/__mocks__/fluid-fetch.d.ts +1 -0
- package/dist/__mocks__/fluid-fetch.js +23 -0
- package/dist/__mocks__/validno.d.ts +5 -0
- package/dist/__mocks__/validno.js +9 -0
- package/dist/auth/base.d.ts +3 -3
- package/dist/auth/base.js +8 -5
- package/dist/auth/email.d.ts +4 -4
- package/dist/auth/email.js +62 -60
- package/dist/auth/index.js +6 -3
- package/dist/auth/tokens.js +2 -0
- package/dist/errors/KodzeroApiError.js +3 -0
- package/dist/errors/KodzeroValidationError.js +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -48
- package/dist/model/BaseModel.d.ts +2 -2
- package/dist/model/BaseModel.js +25 -28
- package/dist/model/PaginatedResult.d.ts +28 -0
- package/dist/model/PaginatedResult.js +49 -0
- package/dist/model/createModel.d.ts +3 -1
- package/dist/model/createModel.js +145 -147
- package/dist/schemas/baseAuth.js +13 -13
- package/dist/schemas/baseModel.js +20 -20
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/buildURL.js +3 -1
- package/dist/utils/validateApiResponse.js +1 -1
- package/jest.config.ts +23 -19
- package/package.json +6 -5
- package/src/__mocks__/fluid-fetch.ts +35 -0
- package/src/__mocks__/validno.ts +12 -0
- package/src/__tests__/Kodzero.test.ts +9 -0
- package/src/__tests__/utils/buildURL.test.ts +18 -0
- package/src/auth/base.ts +3 -3
- package/src/auth/email.ts +11 -11
- package/src/auth/index.ts +3 -3
- package/src/index.ts +3 -0
- package/src/model/BaseModel.ts +10 -12
- package/src/model/PaginatedResult.ts +81 -0
- package/src/model/createModel.ts +39 -15
- package/src/schemas/baseAuth.ts +2 -1
- package/src/schemas/baseModel.ts +1 -1
- package/src/tsconfig.json +9 -8
- package/src/utils/buildURL.ts +2 -1
- package/dist/fetcher/InterceptorManager.d.ts +0 -9
- package/dist/fetcher/InterceptorManager.js +0 -42
- package/dist/fetcher/MiddlewareManager.d.ts +0 -9
- package/dist/fetcher/MiddlewareManager.js +0 -42
- package/dist/fetcher/index.d.ts +0 -77
- package/dist/fetcher/index.js +0 -194
- package/dist/model/baseModelOptionsSchema.d.ts +0 -2
- package/dist/model/baseModelOptionsSchema.js +0 -10
- package/dist/model/configSchema.d.ts +0 -0
- package/dist/model/configSchema.js +0 -1
- package/dist/model/errors/KodzeroApiError.d.ts +0 -7
- package/dist/model/errors/KodzeroApiError.js +0 -10
- package/dist/model/modelFactory.d.ts +0 -50
- package/dist/model/modelFactory.js +0 -41
- package/dist/model/modelSchema.d.ts +0 -0
- package/dist/model/modelSchema.js +0 -1
- package/dist/model/schemas/baseModel.d.ts +0 -6
- package/dist/model/schemas/baseModel.js +0 -25
- package/dist/model/schemas/baseModelOptionsSchema.d.ts +0 -2
- package/dist/model/schemas/baseModelOptionsSchema.js +0 -10
- package/dist/model/statics/getAll.d.ts +0 -2
- package/dist/model/statics/getAll.js +0 -4
- package/dist/model/utils/processUrl.d.ts +0 -2
- package/dist/model/utils/processUrl.js +0 -7
- package/dist/model/utils/validateApiResponse.d.ts +0 -2
- package/dist/model/utils/validateApiResponse.js +0 -14
- package/dist/schemas/baseModel copy.d.ts +0 -6
- package/dist/schemas/baseModel copy.js +0 -25
- package/dist/utils/buildURL_rename.d.ts +0 -2
- package/dist/utils/buildURL_rename.js +0 -7
- package/dist/utils/processUrl.d.ts +0 -2
- package/dist/utils/processUrl.js +0 -7
- /package/{.eslintrc.cjs → eslintrc.cjs} +0 -0
package/dist/fetcher/index.js
DELETED
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
import MiddlewareManager from './MiddlewareManager.js';
|
|
2
|
-
class TimeoutError extends Error {
|
|
3
|
-
constructor(message) {
|
|
4
|
-
super(message);
|
|
5
|
-
this.name = 'TimeoutError';
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
class FluidFetch {
|
|
9
|
-
constructor() {
|
|
10
|
-
this.cache = new Map();
|
|
11
|
-
this.pendingRequests = new Map();
|
|
12
|
-
const requestManager = new MiddlewareManager();
|
|
13
|
-
const responseManager = new MiddlewareManager();
|
|
14
|
-
this.middlewares = {
|
|
15
|
-
request: requestManager,
|
|
16
|
-
response: responseManager
|
|
17
|
-
};
|
|
18
|
-
this.interceptors = {
|
|
19
|
-
request: requestManager,
|
|
20
|
-
response: responseManager
|
|
21
|
-
};
|
|
22
|
-
Object.defineProperty(this.interceptors.request, 'push', {
|
|
23
|
-
value: (fn) => requestManager.use(fn)
|
|
24
|
-
});
|
|
25
|
-
Object.defineProperty(this.interceptors.response, 'push', {
|
|
26
|
-
value: (fn) => responseManager.use(fn)
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
get(url, config = {}) {
|
|
30
|
-
return this._createRequest('GET', url, null, config);
|
|
31
|
-
}
|
|
32
|
-
post(url, data = null, config = {}) {
|
|
33
|
-
return this._createRequest('POST', url, data, config);
|
|
34
|
-
}
|
|
35
|
-
put(url, data = null, config = {}) {
|
|
36
|
-
return this._createRequest('PUT', url, data, config);
|
|
37
|
-
}
|
|
38
|
-
delete(url, config = {}) {
|
|
39
|
-
return this._createRequest('DELETE', url, null, config);
|
|
40
|
-
}
|
|
41
|
-
_createRequest(method, url, data = null, config = {}) {
|
|
42
|
-
const request = {
|
|
43
|
-
method,
|
|
44
|
-
url,
|
|
45
|
-
data,
|
|
46
|
-
headers: Object.assign({}, (config.headers || {})),
|
|
47
|
-
params: Object.assign({}, (config.params || {})),
|
|
48
|
-
cache: config.cache,
|
|
49
|
-
timeout: config.timeout,
|
|
50
|
-
abortController: new AbortController()
|
|
51
|
-
};
|
|
52
|
-
return new FluidFetchRequest(this, request);
|
|
53
|
-
}
|
|
54
|
-
_getCacheKey(request) {
|
|
55
|
-
return `${request.method}:${request.url}:${JSON.stringify(request.params)}`;
|
|
56
|
-
}
|
|
57
|
-
_buildUrl(url, params) {
|
|
58
|
-
if (!params || Object.keys(params).length === 0)
|
|
59
|
-
return url;
|
|
60
|
-
const query = Object.entries(params)
|
|
61
|
-
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)
|
|
62
|
-
.join('&');
|
|
63
|
-
return `${url}?${query}`;
|
|
64
|
-
}
|
|
65
|
-
getCachedResponse(cacheKey) {
|
|
66
|
-
const entry = this.cache.get(cacheKey);
|
|
67
|
-
if (entry && entry.expires > Date.now()) {
|
|
68
|
-
return entry.response;
|
|
69
|
-
}
|
|
70
|
-
if (entry) {
|
|
71
|
-
this.cache.delete(cacheKey);
|
|
72
|
-
}
|
|
73
|
-
return undefined;
|
|
74
|
-
}
|
|
75
|
-
getPendingRequest(cacheKey) {
|
|
76
|
-
return this.pendingRequests.get(cacheKey);
|
|
77
|
-
}
|
|
78
|
-
registerPendingRequest(cacheKey, controller) {
|
|
79
|
-
this.pendingRequests.set(cacheKey, controller);
|
|
80
|
-
}
|
|
81
|
-
removePendingRequest(cacheKey) {
|
|
82
|
-
this.pendingRequests.delete(cacheKey);
|
|
83
|
-
}
|
|
84
|
-
cacheResponse(cacheKey, response, ttl) {
|
|
85
|
-
const duration = typeof ttl === 'number' ? ttl : 3600000;
|
|
86
|
-
const entry = {
|
|
87
|
-
response: response,
|
|
88
|
-
expires: Date.now() + duration
|
|
89
|
-
};
|
|
90
|
-
this.cache.set(cacheKey, entry);
|
|
91
|
-
}
|
|
92
|
-
clearRequestMiddlewares() {
|
|
93
|
-
this.middlewares.request.clear();
|
|
94
|
-
}
|
|
95
|
-
clearResponseMiddlewares() {
|
|
96
|
-
this.middlewares.response.clear();
|
|
97
|
-
}
|
|
98
|
-
clearRequestInterceptors() {
|
|
99
|
-
this.clearRequestMiddlewares();
|
|
100
|
-
}
|
|
101
|
-
clearResponseInterceptors() {
|
|
102
|
-
this.clearResponseMiddlewares();
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
class FluidFetchRequest {
|
|
106
|
-
constructor(fluidFetch, request) {
|
|
107
|
-
this.fluidFetch = fluidFetch;
|
|
108
|
-
this.request = request;
|
|
109
|
-
this.promise = null;
|
|
110
|
-
}
|
|
111
|
-
headers(headers) {
|
|
112
|
-
Object.assign(this.request.headers, headers);
|
|
113
|
-
return this;
|
|
114
|
-
}
|
|
115
|
-
params(params) {
|
|
116
|
-
Object.assign(this.request.params, params);
|
|
117
|
-
return this;
|
|
118
|
-
}
|
|
119
|
-
body(data) {
|
|
120
|
-
this.request.data = data;
|
|
121
|
-
return this;
|
|
122
|
-
}
|
|
123
|
-
cache(ttl) {
|
|
124
|
-
this.request.cache = typeof ttl === 'boolean' ?
|
|
125
|
-
3600000 :
|
|
126
|
-
ttl;
|
|
127
|
-
return this;
|
|
128
|
-
}
|
|
129
|
-
timeout(ms) {
|
|
130
|
-
this.request.timeout = ms;
|
|
131
|
-
return this;
|
|
132
|
-
}
|
|
133
|
-
cancel() {
|
|
134
|
-
this.request.abortController.abort();
|
|
135
|
-
return this;
|
|
136
|
-
}
|
|
137
|
-
then(onFulfilled, onRejected) {
|
|
138
|
-
if (!this.promise) {
|
|
139
|
-
this.promise = this._executeRequest();
|
|
140
|
-
}
|
|
141
|
-
return this.promise.then(onFulfilled, onRejected);
|
|
142
|
-
}
|
|
143
|
-
catch(onRejected) {
|
|
144
|
-
if (!this.promise) {
|
|
145
|
-
this.promise = this._executeRequest();
|
|
146
|
-
}
|
|
147
|
-
return this.promise.catch(onRejected);
|
|
148
|
-
}
|
|
149
|
-
async _executeRequest() {
|
|
150
|
-
let request = this.request;
|
|
151
|
-
request = await this.fluidFetch.middlewares.request.runMiddlewares(request);
|
|
152
|
-
const cacheKey = this.fluidFetch._getCacheKey(request);
|
|
153
|
-
if (request.cache) {
|
|
154
|
-
const cachedResponse = this.fluidFetch.getCachedResponse(cacheKey);
|
|
155
|
-
if (cachedResponse) {
|
|
156
|
-
return cachedResponse.clone();
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
const pendingController = this.fluidFetch.getPendingRequest(cacheKey);
|
|
160
|
-
if (pendingController) {
|
|
161
|
-
pendingController.abort();
|
|
162
|
-
}
|
|
163
|
-
this.fluidFetch.registerPendingRequest(cacheKey, request.abortController);
|
|
164
|
-
let timeoutId;
|
|
165
|
-
if (request.timeout && request.timeout > 0) {
|
|
166
|
-
timeoutId = setTimeout(() => {
|
|
167
|
-
const timeoutError = new TimeoutError(`Request timed out after ${request.timeout}ms`);
|
|
168
|
-
request.abortController.abort(timeoutError);
|
|
169
|
-
}, request.timeout);
|
|
170
|
-
}
|
|
171
|
-
try {
|
|
172
|
-
const response = await fetch(this.fluidFetch._buildUrl(request.url, request.params), {
|
|
173
|
-
method: request.method,
|
|
174
|
-
headers: request.headers,
|
|
175
|
-
body: request.data ? JSON.stringify(request.data) : undefined,
|
|
176
|
-
signal: request.abortController.signal
|
|
177
|
-
});
|
|
178
|
-
let processedResponse = response;
|
|
179
|
-
processedResponse = await this.fluidFetch.middlewares.response.runMiddlewares(processedResponse);
|
|
180
|
-
if (request.cache) {
|
|
181
|
-
this.fluidFetch.cacheResponse(cacheKey, processedResponse.clone(), typeof request.cache === 'boolean' ? undefined : request.cache);
|
|
182
|
-
}
|
|
183
|
-
return processedResponse;
|
|
184
|
-
}
|
|
185
|
-
finally {
|
|
186
|
-
if (timeoutId) {
|
|
187
|
-
clearTimeout(timeoutId);
|
|
188
|
-
}
|
|
189
|
-
this.fluidFetch.removePendingRequest(cacheKey);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
export { TimeoutError, MiddlewareManager };
|
|
194
|
-
export default FluidFetch;
|
|
File without changes
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
class KodzeroApiError extends Error {
|
|
2
|
-
constructor(url, statusCode, message, details) {
|
|
3
|
-
super(message);
|
|
4
|
-
this.name = "KodzeroApiError";
|
|
5
|
-
this.url = url;
|
|
6
|
-
this.statusCode = statusCode;
|
|
7
|
-
this.details = details || '';
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
export default KodzeroApiError;
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import FluidFetch from 'fluid-fetch';
|
|
2
|
-
import BaseModel, { ModelOptions } from './BaseModel.js';
|
|
3
|
-
export declare const createModel: (options: ModelOptions) => {
|
|
4
|
-
new (data: Record<string, any>): {
|
|
5
|
-
url: string;
|
|
6
|
-
collection: string;
|
|
7
|
-
api: typeof FluidFetch;
|
|
8
|
-
modelData: Record<string, any>;
|
|
9
|
-
id: string | null;
|
|
10
|
-
_setId: (id: string | null) => void;
|
|
11
|
-
_setModelData: (data: Record<string, any>) => void;
|
|
12
|
-
_handleApiError(response: Response): Promise<void>;
|
|
13
|
-
data(): Record<string, any>;
|
|
14
|
-
dataWithoutId(): {
|
|
15
|
-
[x: string]: any;
|
|
16
|
-
};
|
|
17
|
-
setNested(key: string, value: any): Record<string, any>;
|
|
18
|
-
set(data: Record<string, any> | string, value?: any): Record<string, any>;
|
|
19
|
-
update(): Promise<Record<string, any>>;
|
|
20
|
-
delete(): Promise<boolean>;
|
|
21
|
-
create(): Promise<Record<string, any>>;
|
|
22
|
-
save(): Promise<Record<string, any>>;
|
|
23
|
-
};
|
|
24
|
-
url: string;
|
|
25
|
-
collection: string;
|
|
26
|
-
api: any;
|
|
27
|
-
_handleApiError(response: Response): Promise<void>;
|
|
28
|
-
get(id: string): Promise<{
|
|
29
|
-
url: string;
|
|
30
|
-
collection: string;
|
|
31
|
-
api: typeof FluidFetch;
|
|
32
|
-
modelData: Record<string, any>;
|
|
33
|
-
id: string | null;
|
|
34
|
-
_setId: (id: string | null) => void;
|
|
35
|
-
_setModelData: (data: Record<string, any>) => void;
|
|
36
|
-
_handleApiError(response: Response): Promise<void>;
|
|
37
|
-
data(): Record<string, any>;
|
|
38
|
-
dataWithoutId(): {
|
|
39
|
-
[x: string]: any;
|
|
40
|
-
};
|
|
41
|
-
setNested(key: string, value: any): Record<string, any>;
|
|
42
|
-
set(data: Record<string, any> | string, value?: any): Record<string, any>;
|
|
43
|
-
update(): Promise<Record<string, any>>;
|
|
44
|
-
delete(): Promise<boolean>;
|
|
45
|
-
create(): Promise<Record<string, any>>;
|
|
46
|
-
save(): Promise<Record<string, any>>;
|
|
47
|
-
}>;
|
|
48
|
-
getAll(): Promise<any>;
|
|
49
|
-
};
|
|
50
|
-
export default BaseModel;
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
var __setFunctionName = (this && this.__setFunctionName) || function (f, name, prefix) {
|
|
2
|
-
if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
|
|
3
|
-
return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
|
|
4
|
-
};
|
|
5
|
-
import FluidFetch from 'fluid-fetch';
|
|
6
|
-
import BaseModel from './BaseModel.js';
|
|
7
|
-
import validateApiResponse from './utils/validateApiResponse.js';
|
|
8
|
-
export const createModel = (options) => {
|
|
9
|
-
var _a;
|
|
10
|
-
const Model = (_a = class extends BaseModel {
|
|
11
|
-
static async _handleApiError(response) {
|
|
12
|
-
return validateApiResponse(response);
|
|
13
|
-
}
|
|
14
|
-
static async get(id) {
|
|
15
|
-
const getUrl = Model.url + '/' + Model.collection + '/' + id;
|
|
16
|
-
const response = await Model.api.get(getUrl);
|
|
17
|
-
await Model._handleApiError(response);
|
|
18
|
-
const json = await response.json();
|
|
19
|
-
return new Model(json.result);
|
|
20
|
-
}
|
|
21
|
-
static async getAll() {
|
|
22
|
-
const getUrl = Model.url + '/' + Model.collection;
|
|
23
|
-
const response = await Model.api.get(getUrl);
|
|
24
|
-
await Model._handleApiError(response);
|
|
25
|
-
const data = await response.json();
|
|
26
|
-
return data;
|
|
27
|
-
}
|
|
28
|
-
constructor(data) {
|
|
29
|
-
super(options);
|
|
30
|
-
this.modelData = data;
|
|
31
|
-
this.id = (data === null || data === void 0 ? void 0 : data._id) || null;
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
__setFunctionName(_a, "Model"),
|
|
35
|
-
_a.url = options.url,
|
|
36
|
-
_a.collection = options.collection,
|
|
37
|
-
_a.api = new FluidFetch(),
|
|
38
|
-
_a);
|
|
39
|
-
return Model;
|
|
40
|
-
};
|
|
41
|
-
export default BaseModel;
|
|
File without changes
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import Schema from 'validno';
|
|
2
|
-
import KodzeroValidationError from '../../errors/KodzeroValidationError.js';
|
|
3
|
-
class BaseModelSchema {
|
|
4
|
-
}
|
|
5
|
-
BaseModelSchema.schema = new Schema({
|
|
6
|
-
host: {
|
|
7
|
-
type: String
|
|
8
|
-
},
|
|
9
|
-
collection: {
|
|
10
|
-
type: String
|
|
11
|
-
},
|
|
12
|
-
schema: {
|
|
13
|
-
type: Schema,
|
|
14
|
-
required: false
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
BaseModelSchema.validate = (options) => BaseModelSchema.schema.validate(options);
|
|
18
|
-
BaseModelSchema.validateOrThrow = (options) => {
|
|
19
|
-
const validation = BaseModelSchema.schema.validate(options);
|
|
20
|
-
if (!validation.ok) {
|
|
21
|
-
throw new KodzeroValidationError('Invalid model options: ' + validation.failed.join(', '), validation.errors);
|
|
22
|
-
}
|
|
23
|
-
return true;
|
|
24
|
-
};
|
|
25
|
-
export default BaseModelSchema;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import KodzeroApiError from "../errors/KodzeroApiError.js";
|
|
2
|
-
const validateApiResponse = async (response) => {
|
|
3
|
-
if (response.ok)
|
|
4
|
-
return;
|
|
5
|
-
let json;
|
|
6
|
-
try {
|
|
7
|
-
json = await response.json();
|
|
8
|
-
}
|
|
9
|
-
catch (err) {
|
|
10
|
-
json = null;
|
|
11
|
-
}
|
|
12
|
-
throw new KodzeroApiError(response.url, response.status, `API Request failed with status ${response.status}. Details: ${(json === null || json === void 0 ? void 0 : json.details) || (json === null || json === void 0 ? void 0 : json.error) || response.statusText}`, (json === null || json === void 0 ? void 0 : json.details) || (json === null || json === void 0 ? void 0 : json.error) || response.statusText);
|
|
13
|
-
};
|
|
14
|
-
export default validateApiResponse;
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import Schema from 'validno';
|
|
2
|
-
import KodzeroValidationError from '../../errors/KodzeroValidationError.js';
|
|
3
|
-
class BaseModelSchema {
|
|
4
|
-
}
|
|
5
|
-
BaseModelSchema.schema = new Schema({
|
|
6
|
-
host: {
|
|
7
|
-
type: String
|
|
8
|
-
},
|
|
9
|
-
collection: {
|
|
10
|
-
type: String
|
|
11
|
-
},
|
|
12
|
-
schema: {
|
|
13
|
-
type: Schema,
|
|
14
|
-
required: false
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
BaseModelSchema.validate = (options) => BaseModelSchema.schema.validate(options);
|
|
18
|
-
BaseModelSchema.validateOrThrow = (options) => {
|
|
19
|
-
const validation = BaseModelSchema.schema.validate(options);
|
|
20
|
-
if (!validation.ok) {
|
|
21
|
-
throw new KodzeroValidationError('Invalid model options: ' + validation.failed.join(', '), validation.errors);
|
|
22
|
-
}
|
|
23
|
-
return true;
|
|
24
|
-
};
|
|
25
|
-
export default BaseModelSchema;
|
package/dist/utils/processUrl.js
DELETED
|
File without changes
|