katanakit-js 2.1.5
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/CHANGELOG.md +96 -0
- package/LICENSE +22 -0
- package/README.md +446 -0
- package/dist/adapters/astro/astro.service.d.ts +18 -0
- package/dist/adapters/astro/astro.service.d.ts.map +1 -0
- package/dist/adapters/astro/astro.service.js +83 -0
- package/dist/adapters/astro/astro.service.js.map +1 -0
- package/dist/adapters/astro/index.d.ts +4 -0
- package/dist/adapters/astro/index.d.ts.map +1 -0
- package/dist/adapters/astro/index.js +4 -0
- package/dist/adapters/astro/index.js.map +1 -0
- package/dist/adapters/astro/rss.service.d.ts +115 -0
- package/dist/adapters/astro/rss.service.d.ts.map +1 -0
- package/dist/adapters/astro/rss.service.js +231 -0
- package/dist/adapters/astro/rss.service.js.map +1 -0
- package/dist/adapters/express/app.d.ts +4 -0
- package/dist/adapters/express/app.d.ts.map +1 -0
- package/dist/adapters/express/app.js +4 -0
- package/dist/adapters/express/app.js.map +1 -0
- package/dist/adapters/express/index.d.ts +5 -0
- package/dist/adapters/express/index.d.ts.map +1 -0
- package/dist/adapters/express/index.js +5 -0
- package/dist/adapters/express/index.js.map +1 -0
- package/dist/adapters/express/main.d.ts +2 -0
- package/dist/adapters/express/main.d.ts.map +1 -0
- package/dist/adapters/express/main.js +3 -0
- package/dist/adapters/express/main.js.map +1 -0
- package/dist/adapters/express/products.controller.d.ts +10 -0
- package/dist/adapters/express/products.controller.d.ts.map +1 -0
- package/dist/adapters/express/products.controller.js +53 -0
- package/dist/adapters/express/products.controller.js.map +1 -0
- package/dist/adapters/express/router.d.ts +3 -0
- package/dist/adapters/express/router.d.ts.map +1 -0
- package/dist/adapters/express/router.js +14 -0
- package/dist/adapters/express/router.js.map +1 -0
- package/dist/adapters/express/server.d.ts +15 -0
- package/dist/adapters/express/server.d.ts.map +1 -0
- package/dist/adapters/express/server.js +59 -0
- package/dist/adapters/express/server.js.map +1 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +2 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/nuxt/index.d.ts +2 -0
- package/dist/adapters/nuxt/index.d.ts.map +1 -0
- package/dist/adapters/nuxt/index.js +2 -0
- package/dist/adapters/nuxt/index.js.map +1 -0
- package/dist/adapters/nuxt/nuxt.service.d.ts +83 -0
- package/dist/adapters/nuxt/nuxt.service.d.ts.map +1 -0
- package/dist/adapters/nuxt/nuxt.service.js +104 -0
- package/dist/adapters/nuxt/nuxt.service.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/seo.service.d.ts +72 -0
- package/dist/config/seo.service.d.ts.map +1 -0
- package/dist/config/seo.service.js +190 -0
- package/dist/config/seo.service.js.map +1 -0
- package/dist/config/site.config.d.ts +89 -0
- package/dist/config/site.config.d.ts.map +1 -0
- package/dist/config/site.config.js +59 -0
- package/dist/config/site.config.js.map +1 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/services/dates.service.d.ts +24 -0
- package/dist/core/services/dates.service.d.ts.map +1 -0
- package/dist/core/services/dates.service.js +64 -0
- package/dist/core/services/dates.service.js.map +1 -0
- package/dist/core/services/error.service.d.ts +25 -0
- package/dist/core/services/error.service.d.ts.map +1 -0
- package/dist/core/services/error.service.js +39 -0
- package/dist/core/services/error.service.js.map +1 -0
- package/dist/core/services/formatter.service.d.ts +36 -0
- package/dist/core/services/formatter.service.d.ts.map +1 -0
- package/dist/core/services/formatter.service.js +64 -0
- package/dist/core/services/formatter.service.js.map +1 -0
- package/dist/core/services/generator.service.d.ts +34 -0
- package/dist/core/services/generator.service.d.ts.map +1 -0
- package/dist/core/services/generator.service.js +83 -0
- package/dist/core/services/generator.service.js.map +1 -0
- package/dist/core/services/geometry.service.d.ts +45 -0
- package/dist/core/services/geometry.service.d.ts.map +1 -0
- package/dist/core/services/geometry.service.js +100 -0
- package/dist/core/services/geometry.service.js.map +1 -0
- package/dist/core/services/http.service.d.ts +22 -0
- package/dist/core/services/http.service.d.ts.map +1 -0
- package/dist/core/services/http.service.js +124 -0
- package/dist/core/services/http.service.js.map +1 -0
- package/dist/core/services/logger.service.d.ts +36 -0
- package/dist/core/services/logger.service.d.ts.map +1 -0
- package/dist/core/services/logger.service.js +60 -0
- package/dist/core/services/logger.service.js.map +1 -0
- package/dist/core/services/reactive.service.d.ts +22 -0
- package/dist/core/services/reactive.service.d.ts.map +1 -0
- package/dist/core/services/reactive.service.js +167 -0
- package/dist/core/services/reactive.service.js.map +1 -0
- package/dist/core/services/timing.service.d.ts +23 -0
- package/dist/core/services/timing.service.d.ts.map +1 -0
- package/dist/core/services/timing.service.js +217 -0
- package/dist/core/services/timing.service.js.map +1 -0
- package/dist/core/services/utils.service.d.ts +44 -0
- package/dist/core/services/utils.service.d.ts.map +1 -0
- package/dist/core/services/utils.service.js +143 -0
- package/dist/core/services/utils.service.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/dom/dom.service.d.ts +49 -0
- package/dist/infrastructure/dom/dom.service.d.ts.map +1 -0
- package/dist/infrastructure/dom/dom.service.js +133 -0
- package/dist/infrastructure/dom/dom.service.js.map +1 -0
- package/dist/infrastructure/index.d.ts +11 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +11 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/infrastructure/observer/observer.service.d.ts +34 -0
- package/dist/infrastructure/observer/observer.service.d.ts.map +1 -0
- package/dist/infrastructure/observer/observer.service.js +145 -0
- package/dist/infrastructure/observer/observer.service.js.map +1 -0
- package/dist/infrastructure/sensors/sensors.service.d.ts +25 -0
- package/dist/infrastructure/sensors/sensors.service.d.ts.map +1 -0
- package/dist/infrastructure/sensors/sensors.service.js +133 -0
- package/dist/infrastructure/sensors/sensors.service.js.map +1 -0
- package/dist/infrastructure/storage/storage.service.d.ts +48 -0
- package/dist/infrastructure/storage/storage.service.d.ts.map +1 -0
- package/dist/infrastructure/storage/storage.service.js +108 -0
- package/dist/infrastructure/storage/storage.service.js.map +1 -0
- package/dist/infrastructure/theme/theme.service.d.ts +30 -0
- package/dist/infrastructure/theme/theme.service.d.ts.map +1 -0
- package/dist/infrastructure/theme/theme.service.js +104 -0
- package/dist/infrastructure/theme/theme.service.js.map +1 -0
- package/dist/infrastructure/viewport/viewport.service.d.ts +38 -0
- package/dist/infrastructure/viewport/viewport.service.d.ts.map +1 -0
- package/dist/infrastructure/viewport/viewport.service.js +145 -0
- package/dist/infrastructure/viewport/viewport.service.js.map +1 -0
- package/dist/infrastructure/worker/worker.service.d.ts +42 -0
- package/dist/infrastructure/worker/worker.service.d.ts.map +1 -0
- package/dist/infrastructure/worker/worker.service.js +151 -0
- package/dist/infrastructure/worker/worker.service.js.map +1 -0
- package/dist/prisma/db.d.ts +4 -0
- package/dist/prisma/db.d.ts.map +1 -0
- package/dist/prisma/db.js +12 -0
- package/dist/prisma/db.js.map +1 -0
- package/dist/prisma/schema.json +411 -0
- package/dist/types/index.d.ts +436 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +117 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
function formatGeometry(value, options = {}) {
|
|
2
|
+
const { locale = "en", digits = 2, unit } = options;
|
|
3
|
+
const formatted = new Intl.NumberFormat(locale, {
|
|
4
|
+
maximumFractionDigits: digits,
|
|
5
|
+
minimumFractionDigits: digits,
|
|
6
|
+
}).format(value);
|
|
7
|
+
return unit ? `${formatted} ${unit}` : formatted;
|
|
8
|
+
}
|
|
9
|
+
/** Area calculations for geometric shapes. */
|
|
10
|
+
export class GeometryArea {
|
|
11
|
+
constructor() { }
|
|
12
|
+
static useRectangle(width, height, options) {
|
|
13
|
+
return formatGeometry(width * height, options);
|
|
14
|
+
}
|
|
15
|
+
static useSquare(side, options) {
|
|
16
|
+
return formatGeometry(side ** 2, options);
|
|
17
|
+
}
|
|
18
|
+
static useTriangle(base, height, options) {
|
|
19
|
+
return formatGeometry((base * height) / 2, options);
|
|
20
|
+
}
|
|
21
|
+
static useCircle(radius, options) {
|
|
22
|
+
return formatGeometry(Math.PI * radius ** 2, options);
|
|
23
|
+
}
|
|
24
|
+
static useTrapezoid(parallelSide1, parallelSide2, height, options) {
|
|
25
|
+
return formatGeometry(((parallelSide1 + parallelSide2) * height) / 2, options);
|
|
26
|
+
}
|
|
27
|
+
static useHexagon(side, options) {
|
|
28
|
+
return formatGeometry(((3 * Math.sqrt(3)) / 2) * side ** 2, options);
|
|
29
|
+
}
|
|
30
|
+
static useEllipse(semiMajor, semiMinor, options) {
|
|
31
|
+
return formatGeometry(Math.PI * semiMajor * semiMinor, options);
|
|
32
|
+
}
|
|
33
|
+
static useParallelogram(base, height, options) {
|
|
34
|
+
return formatGeometry(base * height, options);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Perimeter calculations for geometric shapes. */
|
|
38
|
+
export class GeometryPerimeter {
|
|
39
|
+
constructor() { }
|
|
40
|
+
static useRectangle(width, height, options) {
|
|
41
|
+
return formatGeometry(2 * (width + height), options);
|
|
42
|
+
}
|
|
43
|
+
static useSquare(side, options) {
|
|
44
|
+
return formatGeometry(4 * side, options);
|
|
45
|
+
}
|
|
46
|
+
static useTriangle(side1, side2, side3, options) {
|
|
47
|
+
return formatGeometry(side1 + side2 + side3, options);
|
|
48
|
+
}
|
|
49
|
+
static useCircle(radius, options) {
|
|
50
|
+
return formatGeometry(2 * Math.PI * radius, options);
|
|
51
|
+
}
|
|
52
|
+
static useHexagon(side, options) {
|
|
53
|
+
return formatGeometry(6 * side, options);
|
|
54
|
+
}
|
|
55
|
+
static useTrapezoid(side1, side2, side3, side4, options) {
|
|
56
|
+
return formatGeometry(side1 + side2 + side3 + side4, options);
|
|
57
|
+
}
|
|
58
|
+
static useEllipse(semiMajor, semiMinor, options) {
|
|
59
|
+
const a = semiMajor;
|
|
60
|
+
const b = semiMinor;
|
|
61
|
+
const h = (a - b) ** 2 / (a + b) ** 2;
|
|
62
|
+
const perimeter = Math.PI * (a + b) * (1 + (3 * h) / (10 + Math.sqrt(4 - 3 * h)));
|
|
63
|
+
return formatGeometry(perimeter, options);
|
|
64
|
+
}
|
|
65
|
+
static useParallelogram(side1, side2, options) {
|
|
66
|
+
return formatGeometry(2 * (side1 + side2), options);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Volume calculations for 3D geometric shapes. */
|
|
70
|
+
export class GeometryVolume {
|
|
71
|
+
constructor() { }
|
|
72
|
+
static useCube(side, options) {
|
|
73
|
+
return formatGeometry(side ** 3, options);
|
|
74
|
+
}
|
|
75
|
+
static useBox(length, width, height, options) {
|
|
76
|
+
return formatGeometry(length * width * height, options);
|
|
77
|
+
}
|
|
78
|
+
static useSphere(radius, options) {
|
|
79
|
+
return formatGeometry((4 / 3) * Math.PI * radius ** 3, options);
|
|
80
|
+
}
|
|
81
|
+
static useCylinder(radius, height, options) {
|
|
82
|
+
return formatGeometry(Math.PI * radius ** 2 * height, options);
|
|
83
|
+
}
|
|
84
|
+
static useCone(radius, height, options) {
|
|
85
|
+
return formatGeometry((1 / 3) * Math.PI * radius ** 2 * height, options);
|
|
86
|
+
}
|
|
87
|
+
static usePyramid(baseArea, height, options) {
|
|
88
|
+
return formatGeometry((1 / 3) * baseArea * height, options);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Consolidated geometry utilities namespace.
|
|
93
|
+
* Groups area, perimeter and volume calculations.
|
|
94
|
+
*/
|
|
95
|
+
export const GeometryUtils = {
|
|
96
|
+
area: GeometryArea,
|
|
97
|
+
perimeter: GeometryPerimeter,
|
|
98
|
+
volume: GeometryVolume,
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=geometry.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.service.js","sourceRoot":"","sources":["../../../src/core/services/geometry.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ApisConfig, FetchOptions, FetchResult, IFetchApiManager, UrlOptions } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Framework-agnostic HTTP client: builds safe URLs from a JSON-defined registry
|
|
4
|
+
* and wraps `fetch` in a Safe Result. Implemented as a Facade + Singleton.
|
|
5
|
+
*/
|
|
6
|
+
export declare class FetchApiManager implements IFetchApiManager {
|
|
7
|
+
private static instance;
|
|
8
|
+
private apis;
|
|
9
|
+
private constructor();
|
|
10
|
+
static getInstance(): FetchApiManager;
|
|
11
|
+
useInit: (apis: ApisConfig) => void;
|
|
12
|
+
useGetApis: () => ApisConfig;
|
|
13
|
+
private GET_API_ENTRY;
|
|
14
|
+
useBuildUrl: (apiName: string, endpointName: string, options?: UrlOptions) => string;
|
|
15
|
+
useFetch: <T = unknown>(apiName: string, endpointName: string, { urlOptions, ...init }?: FetchOptions) => Promise<FetchResult<T>>;
|
|
16
|
+
useGet: <T = unknown>(apiName: string, endpointName: string, urlOptions?: UrlOptions) => Promise<FetchResult<T>>;
|
|
17
|
+
usePost: <T = unknown>(apiName: string, endpointName: string, body?: unknown, urlOptions?: UrlOptions) => Promise<FetchResult<T>>;
|
|
18
|
+
usePut: <T = unknown>(apiName: string, endpointName: string, body?: unknown, urlOptions?: UrlOptions) => Promise<FetchResult<T>>;
|
|
19
|
+
useDelete: <T = unknown>(apiName: string, endpointName: string, urlOptions?: UrlOptions) => Promise<FetchResult<T>>;
|
|
20
|
+
}
|
|
21
|
+
export declare const useFetch: <T = unknown>(apiName: string, endpointName: string, { urlOptions, ...init }?: FetchOptions) => Promise<FetchResult<T>>, useGetApis: () => ApisConfig, useInit: (apis: ApisConfig) => void, useGet: <T = unknown>(apiName: string, endpointName: string, urlOptions?: UrlOptions) => Promise<FetchResult<T>>, usePost: <T = unknown>(apiName: string, endpointName: string, body?: unknown, urlOptions?: UrlOptions) => Promise<FetchResult<T>>, useDelete: <T = unknown>(apiName: string, endpointName: string, urlOptions?: UrlOptions) => Promise<FetchResult<T>>, usePut: <T = unknown>(apiName: string, endpointName: string, body?: unknown, urlOptions?: UrlOptions) => Promise<FetchResult<T>>, useBuildUrl: (apiName: string, endpointName: string, options?: UrlOptions) => string;
|
|
22
|
+
//# sourceMappingURL=http.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/http.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,MAAM,sBAAsB,CAAC;AAE9B;;;GAGG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IACzC,OAAO,CAAC,IAAI,CAAkB;IAE9B,OAAO,eAAiB;IAExB,OAAc,WAAW,IAAI,eAAe,CAK3C;IAEM,OAAO,SAAU,UAAU,KAAG,IAAI,CAEvC;IAEK,UAAU,QAAO,UAAU,CAAc;IAEhD,OAAO,CAAC,aAAa,CAMnB;IAEK,WAAW,YAAa,MAAM,gBAAgB,MAAM,YAAW,UAAU,KAAQ,MAAM,CAuC5F;IAEK,QAAQ,GAAU,CAAC,GAAG,OAAO,WAC1B,MAAM,gBACD,MAAM,4BACK,YAAY,KACnC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAoDxB;IAEK,MAAM,GAAU,CAAC,GAAG,OAAO,WACxB,MAAM,gBACD,MAAM,eACP,UAAU,KACrB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAC8C;IAEjE,OAAO,GAAU,CAAC,GAAG,OAAO,WACzB,MAAM,gBACD,MAAM,SACb,OAAO,eACD,UAAU,KACrB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAMtB;IAEG,MAAM,GAAU,CAAC,GAAG,OAAO,WACxB,MAAM,gBACD,MAAM,SACb,OAAO,eACD,UAAU,KACrB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAMtB;IAEG,SAAS,GAAU,CAAC,GAAG,OAAO,WAC3B,MAAM,gBACD,MAAM,eACP,UAAU,KACrB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAItB;CACJ;AAGD,eAAO,MACN,QAAQ,GAxGiB,CAAC,qBAChB,MAAM,gBACD,MAAM,4BACK,YAAY,8BAsGtC,UAAU,QA5Jc,UAAU,EA6JlC,OAAO,SAjKiB,UAAU,KAAG,IAAI,EAkKzC,MAAM,GAjDiB,CAAC,qBACd,MAAM,gBACD,MAAM,eACP,UAAU,8BA+CxB,OAAO,GA3CiB,CAAC,qBACf,MAAM,gBACD,MAAM,SACb,OAAO,eACD,UAAU,8BAwCxB,SAAS,GAlBiB,CAAC,qBACjB,MAAM,gBACD,MAAM,eACP,UAAU,8BAgBxB,MAAM,GAhCiB,CAAC,qBACd,MAAM,gBACD,MAAM,SACb,OAAO,eACD,UAAU,8BA6BxB,WAAW,YAxJoB,MAAM,gBAAgB,MAAM,YAAW,UAAU,KAAQ,MAyJvC,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-agnostic HTTP client: builds safe URLs from a JSON-defined registry
|
|
3
|
+
* and wraps `fetch` in a Safe Result. Implemented as a Facade + Singleton.
|
|
4
|
+
*/
|
|
5
|
+
export class FetchApiManager {
|
|
6
|
+
static instance;
|
|
7
|
+
apis = {};
|
|
8
|
+
constructor() { }
|
|
9
|
+
static getInstance() {
|
|
10
|
+
if (!FetchApiManager.instance) {
|
|
11
|
+
FetchApiManager.instance = new FetchApiManager();
|
|
12
|
+
}
|
|
13
|
+
return FetchApiManager.instance;
|
|
14
|
+
}
|
|
15
|
+
useInit = (apis) => {
|
|
16
|
+
this.apis = { ...this.apis, ...apis };
|
|
17
|
+
};
|
|
18
|
+
useGetApis = () => this.apis;
|
|
19
|
+
GET_API_ENTRY = (apiName) => {
|
|
20
|
+
const api = this.apis[apiName];
|
|
21
|
+
if (!api) {
|
|
22
|
+
throw new Error(`[FetchApiManager] API "${apiName}" is not registered.`);
|
|
23
|
+
}
|
|
24
|
+
return api;
|
|
25
|
+
};
|
|
26
|
+
useBuildUrl = (apiName, endpointName, options = {}) => {
|
|
27
|
+
const { params, query, ignoreDefaultQuery = false } = options;
|
|
28
|
+
const api = this.GET_API_ENTRY(apiName);
|
|
29
|
+
let path = api.endpoints?.[endpointName] ?? "";
|
|
30
|
+
if (!path) {
|
|
31
|
+
throw new Error(`[FetchApiManager] Endpoint "${endpointName}" not found in API "${apiName}".`);
|
|
32
|
+
}
|
|
33
|
+
if (params) {
|
|
34
|
+
const escapeRegex = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
35
|
+
path = Object.entries(params).reduce((acc, [key, value]) => acc.replace(new RegExp(`:${escapeRegex(key)}\\b`, "g"), encodeURIComponent(String(value))), path);
|
|
36
|
+
}
|
|
37
|
+
const baseStr = api.baseUri instanceof URL ? api.baseUri.toString() : api.baseUri;
|
|
38
|
+
const baseClean = baseStr.endsWith("/") ? baseStr.slice(0, -1) : baseStr;
|
|
39
|
+
const pathClean = path.startsWith("/") ? path : `/${path}`;
|
|
40
|
+
const url = new URL(`${baseClean}${pathClean}`);
|
|
41
|
+
// Only allow http(s) to prevent SSRF and `javascript:` URLs.
|
|
42
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
43
|
+
throw new Error(`[FetchApiManager] Scheme "${url.protocol}" is not allowed.`);
|
|
44
|
+
}
|
|
45
|
+
const defaultParams = ignoreDefaultQuery ? {} : (api.defaultQueryParams?.[endpointName] ?? {});
|
|
46
|
+
const mergedQuery = { ...defaultParams, ...query };
|
|
47
|
+
for (const [key, value] of Object.entries(mergedQuery)) {
|
|
48
|
+
if (value !== undefined && value !== null) {
|
|
49
|
+
url.searchParams.set(key, String(value));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return url.toString();
|
|
53
|
+
};
|
|
54
|
+
useFetch = async (apiName, endpointName, { urlOptions, ...init } = {}) => {
|
|
55
|
+
let url = "";
|
|
56
|
+
try {
|
|
57
|
+
url = this.useBuildUrl(apiName, endpointName, urlOptions);
|
|
58
|
+
const response = await fetch(url, init);
|
|
59
|
+
if (!response.ok) {
|
|
60
|
+
let errorDetails;
|
|
61
|
+
try {
|
|
62
|
+
errorDetails = await response.json();
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
errorDetails = await response.text();
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
data: null,
|
|
69
|
+
error: {
|
|
70
|
+
message: `HTTP Error: ${response.statusText || "Unsuccessful response"}`,
|
|
71
|
+
status: response.status,
|
|
72
|
+
details: errorDetails,
|
|
73
|
+
},
|
|
74
|
+
url: response.url || url,
|
|
75
|
+
status: response.status,
|
|
76
|
+
ok: false,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const contentType = response.headers.get("content-type");
|
|
80
|
+
const isJson = contentType?.includes("application/json");
|
|
81
|
+
const data = isJson ? (await response.json()) : (await response.text());
|
|
82
|
+
return {
|
|
83
|
+
data,
|
|
84
|
+
error: null,
|
|
85
|
+
url: response.url || url,
|
|
86
|
+
status: response.status,
|
|
87
|
+
ok: true,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
92
|
+
return {
|
|
93
|
+
data: null,
|
|
94
|
+
error: {
|
|
95
|
+
message: `Network/Client Error: ${message}`,
|
|
96
|
+
status: 0,
|
|
97
|
+
},
|
|
98
|
+
url,
|
|
99
|
+
status: 0,
|
|
100
|
+
ok: false,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
useGet = async (apiName, endpointName, urlOptions) => this.useFetch(apiName, endpointName, { method: "GET", urlOptions });
|
|
105
|
+
usePost = async (apiName, endpointName, body, urlOptions) => this.useFetch(apiName, endpointName, {
|
|
106
|
+
method: "POST",
|
|
107
|
+
headers: { "Content-Type": "application/json" },
|
|
108
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
109
|
+
urlOptions,
|
|
110
|
+
});
|
|
111
|
+
usePut = async (apiName, endpointName, body, urlOptions) => this.useFetch(apiName, endpointName, {
|
|
112
|
+
method: "PUT",
|
|
113
|
+
headers: { "Content-Type": "application/json" },
|
|
114
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
115
|
+
urlOptions,
|
|
116
|
+
});
|
|
117
|
+
useDelete = async (apiName, endpointName, urlOptions) => this.useFetch(apiName, endpointName, {
|
|
118
|
+
method: "DELETE",
|
|
119
|
+
urlOptions,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// Singleton instance and destructured exports.
|
|
123
|
+
export const { useFetch, useGetApis, useInit, useGet, usePost, useDelete, usePut, useBuildUrl, } = FetchApiManager.getInstance();
|
|
124
|
+
//# sourceMappingURL=http.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.service.js","sourceRoot":"","sources":["../../../src/core/services/http.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { LogLevel, LogStrategy } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Concrete strategy: native console output.
|
|
4
|
+
*/
|
|
5
|
+
export declare class ConsoleStrategy implements LogStrategy {
|
|
6
|
+
useOutput(level: LogLevel, message: string, data?: unknown): void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Singleton context: holds the active strategy and keeps `this` bound through
|
|
10
|
+
* arrow-function methods so destructured exports remain safe.
|
|
11
|
+
*/
|
|
12
|
+
export declare class LoggerService {
|
|
13
|
+
private static instance;
|
|
14
|
+
private strategy;
|
|
15
|
+
private constructor();
|
|
16
|
+
static getInstance(): LoggerService;
|
|
17
|
+
useSetStrategy: (strategy: LogStrategy) => void;
|
|
18
|
+
/**
|
|
19
|
+
* Overloads allow:
|
|
20
|
+
* - message only: `useLog("message")`
|
|
21
|
+
* - message + data: `useLog("message", { id: 1 })`
|
|
22
|
+
* - level + message + data: `useLog("error", "something failed", { code: 500 })`
|
|
23
|
+
*/
|
|
24
|
+
useLog: {
|
|
25
|
+
(message: string, data?: unknown): void;
|
|
26
|
+
(level: LogLevel, message: string, data?: unknown): void;
|
|
27
|
+
};
|
|
28
|
+
useError: (message: string, data?: unknown) => void;
|
|
29
|
+
useClear: () => void;
|
|
30
|
+
useTable: (data: unknown) => void;
|
|
31
|
+
}
|
|
32
|
+
export declare const useClear: () => void, useLog: {
|
|
33
|
+
(message: string, data?: unknown): void;
|
|
34
|
+
(level: LogLevel, message: string, data?: unknown): void;
|
|
35
|
+
}, useError: (message: string, data?: unknown) => void, useTable: (data: unknown) => void, useSetStrategy: (strategy: LogStrategy) => void;
|
|
36
|
+
//# sourceMappingURL=logger.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/logger.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAElE;;GAEG;AACH,qBAAa,eAAgB,YAAW,WAAW;IAClD,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAMhE;CACD;AAED;;;GAGG;AACH,qBAAa,aAAa;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAc;IAE9B,OAAO,eAEN;IAED,OAAc,WAAW,IAAI,aAAa,CAKzC;IAEM,cAAc,aAAc,WAAW,KAAG,IAAI,CAEnD;IAEF;;;;;OAKG;IACI,MAAM,EAAE;QACd,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;QACxC,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;KACzD,CAWC;IAEK,QAAQ,YAAa,MAAM,SAAS,OAAO,KAAG,IAAI,CAEvD;IAEK,QAAQ,QAAO,IAAI,CAExB;IAEK,QAAQ,SAAU,OAAO,KAAG,IAAI,CAErC;CACF;AAGD,eAAO,MAAQ,QAAQ,QAVA,IAAI,EAUF,MAAM;cA7BnB,MAAM,SAAS,OAAO,GAAG,IAAI;YAC/B,QAAQ,WAAW,MAAM,SAAS,OAAO,GAAG,IAAI;GA4BzB,QAAQ,YAdZ,MAAM,SAAS,OAAO,KAAG,IAAI,EAcf,QAAQ,SANzB,OAAO,KAAG,IAAI,EAMa,cAAc,aAxC/B,WAAW,KAAG,IAyCtB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Concrete strategy: native console output.
|
|
3
|
+
*/
|
|
4
|
+
export class ConsoleStrategy {
|
|
5
|
+
useOutput(level, message, data) {
|
|
6
|
+
if (data !== undefined) {
|
|
7
|
+
console[level](`[${level.toUpperCase()}] ${message}`, data);
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
console[level](`[${level.toUpperCase()}] ${message}`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Singleton context: holds the active strategy and keeps `this` bound through
|
|
15
|
+
* arrow-function methods so destructured exports remain safe.
|
|
16
|
+
*/
|
|
17
|
+
export class LoggerService {
|
|
18
|
+
static instance;
|
|
19
|
+
strategy;
|
|
20
|
+
constructor() {
|
|
21
|
+
this.strategy = new ConsoleStrategy();
|
|
22
|
+
}
|
|
23
|
+
static getInstance() {
|
|
24
|
+
if (!LoggerService.instance) {
|
|
25
|
+
LoggerService.instance = new LoggerService();
|
|
26
|
+
}
|
|
27
|
+
return LoggerService.instance;
|
|
28
|
+
}
|
|
29
|
+
useSetStrategy = (strategy) => {
|
|
30
|
+
this.strategy = strategy;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Overloads allow:
|
|
34
|
+
* - message only: `useLog("message")`
|
|
35
|
+
* - message + data: `useLog("message", { id: 1 })`
|
|
36
|
+
* - level + message + data: `useLog("error", "something failed", { code: 500 })`
|
|
37
|
+
*/
|
|
38
|
+
useLog = (param1, param2, param3) => {
|
|
39
|
+
const levels = ["log", "info", "warn", "error", "debug"];
|
|
40
|
+
if (levels.includes(param1)) {
|
|
41
|
+
const level = param1;
|
|
42
|
+
const message = typeof param2 === "string" ? param2 : String(param2 ?? "");
|
|
43
|
+
this.strategy.useOutput(level, message, param3);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this.strategy.useOutput("info", param1, param2);
|
|
47
|
+
};
|
|
48
|
+
useError = (message, data) => {
|
|
49
|
+
this.strategy.useOutput("error", message, data);
|
|
50
|
+
};
|
|
51
|
+
useClear = () => {
|
|
52
|
+
console.clear();
|
|
53
|
+
};
|
|
54
|
+
useTable = (data) => {
|
|
55
|
+
console.table(data);
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Singleton instance and destructured exports.
|
|
59
|
+
export const { useClear, useLog, useError, useTable, useSetStrategy } = LoggerService.getInstance();
|
|
60
|
+
//# sourceMappingURL=logger.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../../src/core/services/logger.service.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,eAAe;IAC3B,SAAS,CAAC,KAAe,EAAE,OAAe,EAAE,IAAc;QACzD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;YAC5D,OAAO;QACR,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;CACD;AAED;;;GAGG;AACH,MAAM,OAAO,aAAa;IACjB,MAAM,CAAC,QAAQ,CAAgB;IAC/B,QAAQ,CAAc;IAE9B;QACC,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACvC,CAAC;IAEM,MAAM,CAAC,WAAW;QACxB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC7B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC9C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAEM,cAAc,GAAG,CAAC,QAAqB,EAAQ,EAAE;QACvD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,CAAC,CAAC;IAEF;;;;;OAKG;IACI,MAAM,GAGT,CAAC,MAAyB,EAAE,MAAgB,EAAE,MAAgB,EAAQ,EAAE;QAC3E,MAAM,MAAM,GAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAErE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAkB,CAAC,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,MAAkB,CAAC;YACjC,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YAC3E,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAChD,OAAO;QACR,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC,CAAC;IAEK,QAAQ,GAAG,CAAC,OAAe,EAAE,IAAc,EAAQ,EAAE;QAC3D,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC;IAEK,QAAQ,GAAG,GAAS,EAAE;QAC5B,OAAO,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC;IAEK,QAAQ,GAAG,CAAC,IAAa,EAAQ,EAAE;QACzC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC;CACF;AAED,+CAA+C;AAC/C,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,GACpE,aAAa,CAAC,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { IReactiveService, SignalGetter, SignalSetter, StorageTarget, Subscribable, ToggleSignalSetter } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Minimal reactive kernel (Observer / Publisher-Subscriber) implemented as a
|
|
4
|
+
* Facade + Singleton. Signals are closures with explicit dependency tracking.
|
|
5
|
+
*/
|
|
6
|
+
export default class ReactiveService implements IReactiveService {
|
|
7
|
+
private static instance;
|
|
8
|
+
private isBatching;
|
|
9
|
+
private batchQueue;
|
|
10
|
+
private constructor();
|
|
11
|
+
static getInstance(): ReactiveService;
|
|
12
|
+
private NOTIFY;
|
|
13
|
+
useCreateSignal: <T>(initialValue: T) => [SignalGetter<T>, SignalSetter<T>];
|
|
14
|
+
useCreateEffect: (callback: () => void | (() => void), signals: Subscribable<unknown>[]) => (() => void);
|
|
15
|
+
useCreateMemo: <T>(computation: () => T, signals: Subscribable<unknown>[]) => SignalGetter<T>;
|
|
16
|
+
useCreateToggle: (initialValue?: boolean) => [SignalGetter<boolean>, ToggleSignalSetter];
|
|
17
|
+
useCreateStorageSignal: <T>(key: string, fallbackValue: T, target?: StorageTarget) => [SignalGetter<T>, SignalSetter<T>];
|
|
18
|
+
useCreateDebouncedSignal: <T>(initialValue: T, delayMs?: number) => [SignalGetter<T>, SignalSetter<T>];
|
|
19
|
+
useCreateBatch: () => ((callback: () => void) => void);
|
|
20
|
+
}
|
|
21
|
+
export declare const useCreateSignal: <T>(initialValue: T) => [SignalGetter<T>, SignalSetter<T>], useCreateEffect: (callback: () => void | (() => void), signals: Subscribable<unknown>[]) => (() => void), useCreateMemo: <T>(computation: () => T, signals: Subscribable<unknown>[]) => SignalGetter<T>, useCreateToggle: (initialValue?: boolean) => [SignalGetter<boolean>, ToggleSignalSetter], useCreateStorageSignal: <T>(key: string, fallbackValue: T, target?: StorageTarget) => [SignalGetter<T>, SignalSetter<T>], useCreateDebouncedSignal: <T>(initialValue: T, delayMs?: number) => [SignalGetter<T>, SignalSetter<T>], useCreateBatch: () => ((callback: () => void) => void);
|
|
22
|
+
//# sourceMappingURL=reactive.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactive.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/reactive.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,gBAAgB,EAChB,YAAY,EAEZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,MAAM,sBAAsB,CAAC;AAG9B;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,gBAAgB;IAC/D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAA8B;IAEhD,OAAO,eAAiB;IAExB,OAAc,WAAW,IAAI,eAAe,CAK3C;IAED,OAAO,CAAC,MAAM,CAMZ;IAEK,eAAe,GAAI,CAAC,gBAAgB,CAAC,KAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CA+B/E;IAEK,eAAe,aACX,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,WAC1B,YAAY,CAAC,OAAO,CAAC,EAAE,KAC9B,CAAC,MAAM,IAAI,CAAC,CAwCb;IAEK,aAAa,GAAI,CAAC,eACX,MAAM,CAAC,WACX,YAAY,CAAC,OAAO,CAAC,EAAE,KAC9B,YAAY,CAAC,CAAC,CAAC,CAQhB;IAEK,eAAe,8BAA2B,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAK1F;IAEK,sBAAsB,GAAI,CAAC,OAC5B,MAAM,iBACI,CAAC,WACR,aAAa,KACnB,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CA6BnC;IAEK,wBAAwB,GAAI,CAAC,gBACrB,CAAC,uBAEb,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAgBnC;IAEK,cAAc,QAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC,CAgB1D;CACF;AAGD,eAAO,MACN,eAAe,GA/KW,CAAC,0DAgL3B,eAAe,aA9IJ,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,WAC1B,YAAY,CAAC,OAAO,CAAC,EAAE,KAC9B,CAAC,MAAM,IAAI,CAAC,EA6If,aAAa,GAnGW,CAAC,iCAEf,YAAY,CAAC,OAAO,CAAC,EAAE,sBAkGjC,eAAe,8BAvFkC,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC,EAwF5F,sBAAsB,GAjFW,CAAC,OAC5B,MAAM,6BAEH,aAAa,yCA+EtB,wBAAwB,GA/CW,CAAC,4EAgDpC,cAAc,QA3Bc,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CA4BV,CAAC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { useGetStorage, useSetStorage } from "../../infrastructure/storage/storage.service.js";
|
|
2
|
+
import { useLog } from "./logger.service.js";
|
|
3
|
+
/**
|
|
4
|
+
* Minimal reactive kernel (Observer / Publisher-Subscriber) implemented as a
|
|
5
|
+
* Facade + Singleton. Signals are closures with explicit dependency tracking.
|
|
6
|
+
*/
|
|
7
|
+
export default class ReactiveService {
|
|
8
|
+
static instance;
|
|
9
|
+
isBatching = false;
|
|
10
|
+
batchQueue = new Set();
|
|
11
|
+
constructor() { }
|
|
12
|
+
static getInstance() {
|
|
13
|
+
if (!ReactiveService.instance) {
|
|
14
|
+
ReactiveService.instance = new ReactiveService();
|
|
15
|
+
}
|
|
16
|
+
return ReactiveService.instance;
|
|
17
|
+
}
|
|
18
|
+
NOTIFY = (notifyFn) => {
|
|
19
|
+
if (this.isBatching) {
|
|
20
|
+
this.batchQueue.add(notifyFn);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
notifyFn();
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
useCreateSignal = (initialValue) => {
|
|
27
|
+
let value = initialValue;
|
|
28
|
+
const listeners = new Set();
|
|
29
|
+
const get = (() => value);
|
|
30
|
+
const set = (nextValue) => {
|
|
31
|
+
const oldValue = value;
|
|
32
|
+
value = typeof nextValue === "function" ? nextValue(oldValue) : nextValue;
|
|
33
|
+
if (value !== oldValue) {
|
|
34
|
+
this.NOTIFY(() => {
|
|
35
|
+
for (const listener of listeners) {
|
|
36
|
+
try {
|
|
37
|
+
listener(value, oldValue);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
useLog("error", "[createSignal] Listener error:", error);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
get.useSubscribe = (listener) => {
|
|
47
|
+
listeners.add(listener);
|
|
48
|
+
return () => {
|
|
49
|
+
listeners.delete(listener);
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
return [get, set];
|
|
53
|
+
};
|
|
54
|
+
useCreateEffect = (callback, signals) => {
|
|
55
|
+
let cleanup;
|
|
56
|
+
const execute = () => {
|
|
57
|
+
if (typeof cleanup === "function") {
|
|
58
|
+
try {
|
|
59
|
+
cleanup();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
useLog("error", "[createEffect] Previous cleanup error:", error);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
cleanup = callback();
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
useLog("error", "[createEffect] Effect execution error:", error);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const unsubscribes = signals.map((signal) => {
|
|
73
|
+
if (signal && typeof signal.useSubscribe === "function") {
|
|
74
|
+
return signal.useSubscribe(execute);
|
|
75
|
+
}
|
|
76
|
+
return () => { };
|
|
77
|
+
});
|
|
78
|
+
execute();
|
|
79
|
+
return () => {
|
|
80
|
+
if (typeof cleanup === "function") {
|
|
81
|
+
try {
|
|
82
|
+
cleanup();
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
useLog("error", "[createEffect] Final cleanup error:", error);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
for (const unsub of unsubscribes) {
|
|
89
|
+
unsub();
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
useCreateMemo = (computation, signals) => {
|
|
94
|
+
const [get, set] = this.useCreateSignal(computation());
|
|
95
|
+
this.useCreateEffect(() => {
|
|
96
|
+
set(computation());
|
|
97
|
+
}, signals);
|
|
98
|
+
return get;
|
|
99
|
+
};
|
|
100
|
+
useCreateToggle = (initialValue = false) => {
|
|
101
|
+
const [get, set] = this.useCreateSignal(initialValue);
|
|
102
|
+
const toggle = () => set((prev) => !prev);
|
|
103
|
+
return [get, { useSet: set, useToggle: toggle }];
|
|
104
|
+
};
|
|
105
|
+
useCreateStorageSignal = (key, fallbackValue, target = "localStorage") => {
|
|
106
|
+
let initial = fallbackValue;
|
|
107
|
+
try {
|
|
108
|
+
const stored = useGetStorage(key, target);
|
|
109
|
+
if (stored !== null && stored !== undefined) {
|
|
110
|
+
initial = stored;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
useLog("error", `[createStorageSignal] Error reading from ${target}:`, error);
|
|
115
|
+
}
|
|
116
|
+
const [get, set] = this.useCreateSignal(initial);
|
|
117
|
+
const setWithStorage = (nextValue) => {
|
|
118
|
+
set((prev) => {
|
|
119
|
+
const newValue = typeof nextValue === "function" ? nextValue(prev) : nextValue;
|
|
120
|
+
try {
|
|
121
|
+
useSetStorage(key, newValue, target);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
useLog("error", `[createStorageSignal] Error writing to ${target}:`, error);
|
|
125
|
+
}
|
|
126
|
+
return newValue;
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
return [get, setWithStorage];
|
|
130
|
+
};
|
|
131
|
+
useCreateDebouncedSignal = (initialValue, delayMs = 300) => {
|
|
132
|
+
const [get, set] = this.useCreateSignal(initialValue);
|
|
133
|
+
let timeoutId;
|
|
134
|
+
const debouncedSet = (nextValue) => {
|
|
135
|
+
if (timeoutId !== undefined) {
|
|
136
|
+
clearTimeout(timeoutId);
|
|
137
|
+
}
|
|
138
|
+
timeoutId = setTimeout(() => {
|
|
139
|
+
set(nextValue);
|
|
140
|
+
timeoutId = undefined;
|
|
141
|
+
}, delayMs);
|
|
142
|
+
};
|
|
143
|
+
return [get, debouncedSet];
|
|
144
|
+
};
|
|
145
|
+
useCreateBatch = () => {
|
|
146
|
+
return (callback) => {
|
|
147
|
+
this.isBatching = true;
|
|
148
|
+
try {
|
|
149
|
+
callback();
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
useLog("error", "[createBatch] Batch block error:", error);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
this.isBatching = false;
|
|
156
|
+
const queue = Array.from(this.batchQueue);
|
|
157
|
+
this.batchQueue.clear();
|
|
158
|
+
for (const notify of queue) {
|
|
159
|
+
notify();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// Singleton instance and destructured exports.
|
|
166
|
+
export const { useCreateSignal, useCreateEffect, useCreateMemo, useCreateToggle, useCreateStorageSignal, useCreateDebouncedSignal, useCreateBatch, } = ReactiveService.getInstance();
|
|
167
|
+
//# sourceMappingURL=reactive.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactive.service.js","sourceRoot":"","sources":["../../../src/core/services/reactive.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { IntervalControl, TimeoutControl } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Timing utilities: delays, debouncing, throttling and timeouts.
|
|
4
|
+
* Implemented as a Singleton facade with factory methods.
|
|
5
|
+
*/
|
|
6
|
+
export default class TimingService {
|
|
7
|
+
private static instance;
|
|
8
|
+
private constructor();
|
|
9
|
+
static getInstance(): TimingService;
|
|
10
|
+
useDelay: (ms: number) => Promise<void>;
|
|
11
|
+
/** Alias for delay, more semantic for sleep operations. */
|
|
12
|
+
useSleep: (ms: number) => Promise<void>;
|
|
13
|
+
useSetTimeout: <T>(callback: () => T | Promise<T>, ms: number) => TimeoutControl<T>;
|
|
14
|
+
useInterval: (callback: () => void | Promise<void>, ms: number, immediate?: boolean) => IntervalControl;
|
|
15
|
+
useDebounce: <T extends (...args: unknown[]) => unknown>(func: T, delayMs: number) => ((...args: Parameters<T>) => void);
|
|
16
|
+
useDebounceImmediate: <T extends (...args: unknown[]) => unknown>(func: T, delayMs: number) => ((...args: Parameters<T>) => void);
|
|
17
|
+
useThrottle: <T extends (...args: unknown[]) => unknown>(func: T, limitMs: number) => ((...args: Parameters<T>) => void);
|
|
18
|
+
useThrottleTrailing: <T extends (...args: unknown[]) => unknown>(func: T, limitMs: number) => ((...args: Parameters<T>) => void);
|
|
19
|
+
useRepeat: (callback: (iteration: number) => void | Promise<void>, iterations: number, delayMs?: number) => Promise<void>;
|
|
20
|
+
useRace: <T>(promise: Promise<T>, timeoutMs: number, errorMessage?: string) => Promise<T>;
|
|
21
|
+
}
|
|
22
|
+
export declare const useDelay: (ms: number) => Promise<void>, useSetTimeout: <T>(callback: () => T | Promise<T>, ms: number) => TimeoutControl<T>, useInterval: (callback: () => void | Promise<void>, ms: number, immediate?: boolean) => IntervalControl, useDebounce: <T extends (...args: unknown[]) => unknown>(func: T, delayMs: number) => (...args: Parameters<T>) => void, useDebounceImmediate: <T extends (...args: unknown[]) => unknown>(func: T, delayMs: number) => (...args: Parameters<T>) => void, useThrottle: <T extends (...args: unknown[]) => unknown>(func: T, limitMs: number) => (...args: Parameters<T>) => void, useThrottleTrailing: <T extends (...args: unknown[]) => unknown>(func: T, limitMs: number) => (...args: Parameters<T>) => void, useRepeat: (callback: (iteration: number) => void | Promise<void>, iterations: number, delayMs?: number) => Promise<void>, useRace: <T>(promise: Promise<T>, timeoutMs: number, errorMessage?: string) => Promise<T>;
|
|
23
|
+
//# sourceMappingURL=timing.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/timing.service.ts"],"names":[],"mappings":"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"}
|