katanakit-js 2.2.1 → 2.12.9
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 +72 -437
- package/dist/adapters/astro/astro.service.d.ts +103 -15
- package/dist/adapters/astro/astro.service.d.ts.map +1 -1
- package/dist/adapters/astro/astro.service.js +145 -75
- package/dist/adapters/astro/astro.service.js.map +1 -1
- package/dist/adapters/astro/index.d.ts +1 -1
- package/dist/adapters/astro/index.d.ts.map +1 -1
- package/dist/adapters/astro/index.js +1 -1
- package/dist/adapters/astro/index.js.map +1 -1
- package/dist/adapters/astro/rss.service.d.ts +85 -105
- package/dist/adapters/astro/rss.service.d.ts.map +1 -1
- package/dist/adapters/astro/rss.service.js +172 -168
- package/dist/adapters/astro/rss.service.js.map +1 -1
- package/dist/adapters/astro/seo.service.d.ts +10 -0
- package/dist/adapters/astro/seo.service.d.ts.map +1 -0
- package/dist/adapters/astro/seo.service.js +3 -0
- package/dist/adapters/astro/seo.service.js.map +1 -0
- package/dist/adapters/express/app.d.ts +30 -1
- package/dist/adapters/express/app.d.ts.map +1 -1
- package/dist/adapters/express/app.js +31 -3
- package/dist/adapters/express/app.js.map +1 -1
- package/dist/adapters/express/index.d.ts +2 -2
- package/dist/adapters/express/index.d.ts.map +1 -1
- package/dist/adapters/express/index.js +2 -2
- package/dist/adapters/express/index.js.map +1 -1
- package/dist/adapters/express/main.js +2 -2
- package/dist/adapters/express/main.js.map +1 -1
- package/dist/adapters/express/products.controller.d.ts +67 -8
- package/dist/adapters/express/products.controller.d.ts.map +1 -1
- package/dist/adapters/express/products.controller.js +105 -49
- package/dist/adapters/express/products.controller.js.map +1 -1
- package/dist/adapters/express/server.d.ts +37 -13
- package/dist/adapters/express/server.d.ts.map +1 -1
- package/dist/adapters/express/server.js +118 -53
- package/dist/adapters/express/server.js.map +1 -1
- package/dist/adapters/nuxt/nuxt.service.d.ts +8 -6
- package/dist/adapters/nuxt/nuxt.service.d.ts.map +1 -1
- package/dist/adapters/nuxt/nuxt.service.js +34 -10
- package/dist/adapters/nuxt/nuxt.service.js.map +1 -1
- package/dist/adapters/vue/vue.service.d.ts +5 -2
- package/dist/adapters/vue/vue.service.d.ts.map +1 -1
- package/dist/adapters/vue/vue.service.js +41 -7
- package/dist/adapters/vue/vue.service.js.map +1 -1
- package/dist/config/index.d.ts +2 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/seo-meta.types.d.ts +177 -0
- package/dist/config/seo-meta.types.d.ts.map +1 -0
- package/dist/config/seo-meta.types.js +11 -0
- package/dist/config/seo-meta.types.js.map +1 -0
- package/dist/config/seo.service.d.ts +41 -58
- package/dist/config/seo.service.d.ts.map +1 -1
- package/dist/config/seo.service.js +468 -136
- package/dist/config/seo.service.js.map +1 -1
- package/dist/config/site.config.d.ts +10 -50
- package/dist/config/site.config.d.ts.map +1 -1
- package/dist/config/site.config.js +8 -36
- package/dist/config/site.config.js.map +1 -1
- package/dist/core/index.d.ts +1 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/services/dates.service.d.ts +149 -22
- package/dist/core/services/dates.service.d.ts.map +1 -1
- package/dist/core/services/dates.service.js +201 -54
- package/dist/core/services/dates.service.js.map +1 -1
- package/dist/core/services/error.service.d.ts +32 -20
- package/dist/core/services/error.service.d.ts.map +1 -1
- package/dist/core/services/error.service.js +44 -32
- package/dist/core/services/error.service.js.map +1 -1
- package/dist/core/services/formatter.service.d.ts +245 -35
- package/dist/core/services/formatter.service.d.ts.map +1 -1
- package/dist/core/services/formatter.service.js +281 -57
- package/dist/core/services/formatter.service.js.map +1 -1
- package/dist/core/services/generator.service.d.ts +115 -26
- package/dist/core/services/generator.service.d.ts.map +1 -1
- package/dist/core/services/generator.service.js +191 -56
- package/dist/core/services/generator.service.js.map +1 -1
- package/dist/core/services/geometry.service.d.ts +369 -39
- package/dist/core/services/geometry.service.d.ts.map +1 -1
- package/dist/core/services/geometry.service.js +424 -66
- package/dist/core/services/geometry.service.js.map +1 -1
- package/dist/core/services/http.service.d.ts +244 -21
- package/dist/core/services/http.service.d.ts.map +1 -1
- package/dist/core/services/http.service.js +419 -98
- package/dist/core/services/http.service.js.map +1 -1
- package/dist/core/services/logger.service.d.ts +95 -29
- package/dist/core/services/logger.service.d.ts.map +1 -1
- package/dist/core/services/logger.service.js +167 -41
- package/dist/core/services/logger.service.js.map +1 -1
- package/dist/core/services/reactive.service.d.ts +146 -19
- package/dist/core/services/reactive.service.d.ts.map +1 -1
- package/dist/core/services/reactive.service.js +278 -137
- package/dist/core/services/reactive.service.js.map +1 -1
- package/dist/core/services/timing.service.d.ts +142 -20
- package/dist/core/services/timing.service.d.ts.map +1 -1
- package/dist/core/services/timing.service.js +324 -185
- package/dist/core/services/timing.service.js.map +1 -1
- package/dist/core/services/utils.service.d.ts +228 -43
- package/dist/core/services/utils.service.d.ts.map +1 -1
- package/dist/core/services/utils.service.js +305 -125
- package/dist/core/services/utils.service.js.map +1 -1
- package/dist/infrastructure/dom/dom.service.d.ts +307 -44
- package/dist/infrastructure/dom/dom.service.d.ts.map +1 -1
- package/dist/infrastructure/dom/dom.service.js +408 -129
- package/dist/infrastructure/dom/dom.service.js.map +1 -1
- package/dist/infrastructure/index.d.ts +0 -3
- package/dist/infrastructure/index.d.ts.map +1 -1
- package/dist/infrastructure/index.js +0 -3
- package/dist/infrastructure/index.js.map +1 -1
- package/dist/infrastructure/observer/observer.service.d.ts +124 -31
- package/dist/infrastructure/observer/observer.service.d.ts.map +1 -1
- package/dist/infrastructure/observer/observer.service.js +227 -131
- package/dist/infrastructure/observer/observer.service.js.map +1 -1
- package/dist/infrastructure/sensors/sensors.service.d.ts +154 -22
- package/dist/infrastructure/sensors/sensors.service.d.ts.map +1 -1
- package/dist/infrastructure/sensors/sensors.service.js +264 -112
- package/dist/infrastructure/sensors/sensors.service.js.map +1 -1
- package/dist/infrastructure/storage/storage.service.d.ts +123 -45
- package/dist/infrastructure/storage/storage.service.d.ts.map +1 -1
- package/dist/infrastructure/storage/storage.service.js +236 -66
- package/dist/infrastructure/storage/storage.service.js.map +1 -1
- package/dist/infrastructure/theme/theme.service.d.ts +93 -29
- package/dist/infrastructure/theme/theme.service.d.ts.map +1 -1
- package/dist/infrastructure/theme/theme.service.js +198 -96
- package/dist/infrastructure/theme/theme.service.js.map +1 -1
- package/dist/infrastructure/viewport/viewport.service.d.ts +233 -35
- package/dist/infrastructure/viewport/viewport.service.d.ts.map +1 -1
- package/dist/infrastructure/viewport/viewport.service.js +358 -139
- package/dist/infrastructure/viewport/viewport.service.js.map +1 -1
- package/dist/infrastructure/worker/worker.service.d.ts +84 -38
- package/dist/infrastructure/worker/worker.service.d.ts.map +1 -1
- package/dist/infrastructure/worker/worker.service.js +234 -133
- package/dist/infrastructure/worker/worker.service.js.map +1 -1
- package/dist/prisma/index.d.ts +2 -0
- package/dist/prisma/index.d.ts.map +1 -0
- package/dist/prisma/index.js +2 -0
- package/dist/prisma/index.js.map +1 -0
- package/dist/prisma/schema.json +11 -33
- package/dist/prisma/use-prisma.d.ts +68 -0
- package/dist/prisma/use-prisma.d.ts.map +1 -0
- package/dist/prisma/use-prisma.js +82 -0
- package/dist/prisma/use-prisma.js.map +1 -0
- package/dist/types/index.d.ts +20 -12
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +124 -125
- package/CHANGELOG.md +0 -101
|
@@ -1,10 +1,69 @@
|
|
|
1
1
|
import type { Request, Response } from "express";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Get all products.
|
|
4
|
+
*
|
|
5
|
+
* @param _request - Express request (unused)
|
|
6
|
+
* @param response - Express response
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* router.get("/products", useExpressGetAllProducts);
|
|
11
|
+
* // GET /products → [{ id: 1, name: "Widget", price: 9.99 }]
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare const useExpressGetAllProducts: (_request: Request, response: Response) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Get a product by ID.
|
|
17
|
+
*
|
|
18
|
+
* @param request - Express request with `id` param
|
|
19
|
+
* @param response - Express response
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* router.get("/products/:id", useExpressGetProductById);
|
|
24
|
+
* // GET /products/1 → { productById: { id: 1, name: "Widget", price: 9.99 } }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare const useExpressGetProductById: (request: Request, response: Response) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Create a new product.
|
|
30
|
+
*
|
|
31
|
+
* @param request - Express request with `name` and `price` in body
|
|
32
|
+
* @param response - Express response
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* router.post("/products", useExpressCreateProduct);
|
|
37
|
+
* // POST /products { name: "Gadget", price: 19.99 }
|
|
38
|
+
* // → { id: 1, name: "Gadget", price: 19.99 }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare const useExpressCreateProduct: (request: Request, response: Response) => void;
|
|
42
|
+
/**
|
|
43
|
+
* Update an existing product by ID.
|
|
44
|
+
*
|
|
45
|
+
* @param request - Express request with `id` param and body fields
|
|
46
|
+
* @param response - Express response
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* router.put("/products/:id", useExpressUpdateProduct);
|
|
51
|
+
* // PUT /products/1 { name: "Updated Widget" }
|
|
52
|
+
* // → { id: 1, name: "Updated Widget", price: 9.99 }
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare const useExpressUpdateProduct: (request: Request, response: Response) => void;
|
|
56
|
+
/**
|
|
57
|
+
* Delete a product by ID.
|
|
58
|
+
*
|
|
59
|
+
* @param request - Express request with `id` param
|
|
60
|
+
* @param response - Express response
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```ts
|
|
64
|
+
* router.delete("/products/:id", useExpressDeleteProduct);
|
|
65
|
+
* // DELETE /products/1 → 204 No Content
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare const useExpressDeleteProduct: (request: Request, response: Response) => void;
|
|
10
69
|
//# sourceMappingURL=products.controller.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"products.controller.d.ts","sourceRoot":"","sources":["../../../src/adapters/express/products.controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"products.controller.d.ts","sourceRoot":"","sources":["../../../src/adapters/express/products.controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOjD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB,aAAc,OAAO,YAAY,QAAQ,KAAG,IAEhF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB,YAAa,OAAO,YAAY,QAAQ,KAAG,IAU/E,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,uBAAuB,YAAa,OAAO,YAAY,QAAQ,KAAG,IAc9E,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,uBAAuB,YAAa,OAAO,YAAY,QAAQ,KAAG,IAiB9E,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,YAAa,OAAO,YAAY,QAAQ,KAAG,IAW9E,CAAC"}
|
|
@@ -1,53 +1,109 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
/** Module-level products storage. */
|
|
2
|
+
const products = [];
|
|
3
|
+
/**
|
|
4
|
+
* Get all products.
|
|
5
|
+
*
|
|
6
|
+
* @param _request - Express request (unused)
|
|
7
|
+
* @param response - Express response
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* router.get("/products", useExpressGetAllProducts);
|
|
12
|
+
* // GET /products → [{ id: 1, name: "Widget", price: 9.99 }]
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export const useExpressGetAllProducts = (_request, response) => {
|
|
16
|
+
response.json(products);
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Get a product by ID.
|
|
20
|
+
*
|
|
21
|
+
* @param request - Express request with `id` param
|
|
22
|
+
* @param response - Express response
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* router.get("/products/:id", useExpressGetProductById);
|
|
27
|
+
* // GET /products/1 → { productById: { id: 1, name: "Widget", price: 9.99 } }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export const useExpressGetProductById = (request, response) => {
|
|
31
|
+
const id = Number.parseInt(String(request.params.id), 10);
|
|
32
|
+
const product = products.find((item) => item.id === id);
|
|
33
|
+
if (!product) {
|
|
34
|
+
response.status(404).json({ error: "Product not found" });
|
|
35
|
+
return;
|
|
6
36
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
37
|
+
response.json({ productById: product });
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Create a new product.
|
|
41
|
+
*
|
|
42
|
+
* @param request - Express request with `name` and `price` in body
|
|
43
|
+
* @param response - Express response
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* router.post("/products", useExpressCreateProduct);
|
|
48
|
+
* // POST /products { name: "Gadget", price: 19.99 }
|
|
49
|
+
* // → { id: 1, name: "Gadget", price: 19.99 }
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export const useExpressCreateProduct = (request, response) => {
|
|
53
|
+
const { name = "", price = 0 } = (request.body ?? {});
|
|
54
|
+
const product = {
|
|
55
|
+
id: products.length + 1,
|
|
56
|
+
name,
|
|
57
|
+
price: Number(price),
|
|
58
|
+
};
|
|
59
|
+
products.push(product);
|
|
60
|
+
response.status(201).json(product);
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Update an existing product by ID.
|
|
64
|
+
*
|
|
65
|
+
* @param request - Express request with `id` param and body fields
|
|
66
|
+
* @param response - Express response
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* router.put("/products/:id", useExpressUpdateProduct);
|
|
71
|
+
* // PUT /products/1 { name: "Updated Widget" }
|
|
72
|
+
* // → { id: 1, name: "Updated Widget", price: 9.99 }
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export const useExpressUpdateProduct = (request, response) => {
|
|
76
|
+
const id = Number.parseInt(String(request.params.id), 10);
|
|
77
|
+
const product = products.find((item) => item.id === id);
|
|
78
|
+
if (!product) {
|
|
79
|
+
response.status(404).json({ error: "Product not found" });
|
|
80
|
+
return;
|
|
16
81
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
82
|
+
const { name, price } = (request.body ?? {});
|
|
83
|
+
product.name = name ?? product.name;
|
|
84
|
+
product.price = Number(price ?? product.price);
|
|
85
|
+
response.json(product);
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Delete a product by ID.
|
|
89
|
+
*
|
|
90
|
+
* @param request - Express request with `id` param
|
|
91
|
+
* @param response - Express response
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* router.delete("/products/:id", useExpressDeleteProduct);
|
|
96
|
+
* // DELETE /products/1 → 204 No Content
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
export const useExpressDeleteProduct = (request, response) => {
|
|
100
|
+
const id = Number.parseInt(String(request.params.id), 10);
|
|
101
|
+
const index = products.findIndex((item) => item.id === id);
|
|
102
|
+
if (index === -1) {
|
|
103
|
+
response.status(404).json({ error: "Product not found" });
|
|
104
|
+
return;
|
|
27
105
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const product = this.products.find((item) => item.id === id);
|
|
32
|
-
if (!product) {
|
|
33
|
-
response.status(404).json({ error: "Product not found" });
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const { name, price } = (request.body ?? {});
|
|
37
|
-
product.name = name ?? product.name;
|
|
38
|
-
product.price = Number(price ?? product.price);
|
|
39
|
-
response.json(product);
|
|
40
|
-
}
|
|
41
|
-
// DELETE /products/:id
|
|
42
|
-
useDeleteProductById(request, response) {
|
|
43
|
-
const id = Number.parseInt(String(request.params.id), 10);
|
|
44
|
-
const index = this.products.findIndex((item) => item.id === id);
|
|
45
|
-
if (index === -1) {
|
|
46
|
-
response.status(404).json({ error: "Product not found" });
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
this.products.splice(index, 1);
|
|
50
|
-
response.status(204).send();
|
|
51
|
-
}
|
|
52
|
-
}
|
|
106
|
+
products.splice(index, 1);
|
|
107
|
+
response.status(204).send();
|
|
108
|
+
};
|
|
53
109
|
//# sourceMappingURL=products.controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"products.controller.js","sourceRoot":"","sources":["../../../src/adapters/express/products.controller.ts"],"names":[],"mappings":"AAIA,MAAM,
|
|
1
|
+
{"version":3,"file":"products.controller.js","sourceRoot":"","sources":["../../../src/adapters/express/products.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,39 @@
|
|
|
1
1
|
import { type Application } from "express";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Create and configure the Express application.
|
|
4
|
+
*
|
|
5
|
+
* @returns Configured Express Application instance
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const expressApp = useExpressCreate();
|
|
10
|
+
* // App is ready with middleware, routes and error handling
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export declare const useExpressCreate: () => Application;
|
|
14
|
+
/**
|
|
15
|
+
* Start the Express HTTP server. Idempotent — subsequent calls are no-ops.
|
|
16
|
+
*
|
|
17
|
+
* @param port - Port to listen on (default: 3000)
|
|
18
|
+
* @param host - Host to bind to (default: "localhost")
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* useExpressStart(3000, "localhost");
|
|
23
|
+
* // Server running on http://localhost:3000
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare const useExpressStart: (port?: number, host?: string) => void;
|
|
27
|
+
/**
|
|
28
|
+
* Get the Express application instance. Creates it if it doesn't exist.
|
|
29
|
+
*
|
|
30
|
+
* @returns Express Application instance
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* const expressApp = useExpressGetApp();
|
|
35
|
+
* expressApp.get("/custom", (req, res) => res.json({ ok: true }));
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare const useExpressGetApp: () => Application;
|
|
15
39
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/adapters/express/server.ts"],"names":[],"mappings":"AACA,OAAgB,EAAE,KAAK,WAAW,EAAkD,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/adapters/express/server.ts"],"names":[],"mappings":"AACA,OAAgB,EAAE,KAAK,WAAW,EAAkD,MAAM,SAAS,CAAC;AAgFpG;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,QAAO,WASnC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,oCAAsC,IASjE,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,QAAO,WAAiC,CAAC"}
|
|
@@ -1,59 +1,124 @@
|
|
|
1
1
|
import cors from "cors";
|
|
2
2
|
import express from "express";
|
|
3
|
-
import {
|
|
3
|
+
import { useLogger } from "../../core/services/logger.service.js";
|
|
4
4
|
import router from "./router.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
this.app.use("/", router);
|
|
48
|
-
}
|
|
49
|
-
setupErrorHandling() {
|
|
50
|
-
this.app.use((err, _req, res, _next) => {
|
|
51
|
-
console.error("Unhandled error:", err);
|
|
52
|
-
res.status(500).json({ error: "Internal Server Error" });
|
|
53
|
-
});
|
|
54
|
-
this.app.use((_req, res) => {
|
|
55
|
-
res.status(404).json({ error: "Not Found" });
|
|
5
|
+
/** Module-level state for the Express server. */
|
|
6
|
+
let app = null;
|
|
7
|
+
let started = false;
|
|
8
|
+
/**
|
|
9
|
+
* Set up CORS, JSON body parser and URL-encoded middleware.
|
|
10
|
+
*
|
|
11
|
+
* @param expressApp - Express application instance
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const expressApp = express();
|
|
16
|
+
* useExpressSetupMiddlewares(expressApp);
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
function useExpressSetupMiddlewares(expressApp) {
|
|
20
|
+
const origins = (process.env.CORS_ORIGINS?.split(",") ?? ["http://localhost:3000"])
|
|
21
|
+
.map((origin) => origin.trim())
|
|
22
|
+
.filter(Boolean);
|
|
23
|
+
expressApp.use(cors({
|
|
24
|
+
origin: origins,
|
|
25
|
+
methods: ["GET", "POST", "PUT", "DELETE"],
|
|
26
|
+
}));
|
|
27
|
+
expressApp.disable("x-powered-by");
|
|
28
|
+
expressApp.use(express.json({ limit: "100kb" }));
|
|
29
|
+
expressApp.use(express.urlencoded({ extended: true, limit: "100kb" }));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Set up health check and application routes.
|
|
33
|
+
*
|
|
34
|
+
* @param expressApp - Express application instance
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* useExpressSetupRoutes(expressApp);
|
|
39
|
+
* // GET /health returns { status: "ok", timestamp: "..." }
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
function useExpressSetupRoutes(expressApp) {
|
|
43
|
+
expressApp.get("/health", (_request, response) => {
|
|
44
|
+
return response.json({
|
|
45
|
+
status: "ok",
|
|
46
|
+
timestamp: new Date().toISOString(),
|
|
56
47
|
});
|
|
57
|
-
}
|
|
48
|
+
});
|
|
49
|
+
expressApp.use("/", router);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Set up global error handling and 404 fallback.
|
|
53
|
+
*
|
|
54
|
+
* @param expressApp - Express application instance
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* useExpressSetupErrorHandling(expressApp);
|
|
59
|
+
* // Unhandled errors return 500, unknown routes return 404
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
function useExpressSetupErrorHandling(expressApp) {
|
|
63
|
+
expressApp.use((err, _req, res, _next) => {
|
|
64
|
+
console.error("Unhandled error:", err);
|
|
65
|
+
res.status(500).json({ error: "Internal Server Error" });
|
|
66
|
+
});
|
|
67
|
+
expressApp.use((_req, res) => {
|
|
68
|
+
res.status(404).json({ error: "Not Found" });
|
|
69
|
+
});
|
|
58
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Create and configure the Express application.
|
|
73
|
+
*
|
|
74
|
+
* @returns Configured Express Application instance
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* const expressApp = useExpressCreate();
|
|
79
|
+
* // App is ready with middleware, routes and error handling
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export const useExpressCreate = () => {
|
|
83
|
+
if (app)
|
|
84
|
+
return app;
|
|
85
|
+
app = express();
|
|
86
|
+
useExpressSetupMiddlewares(app);
|
|
87
|
+
useExpressSetupRoutes(app);
|
|
88
|
+
useExpressSetupErrorHandling(app);
|
|
89
|
+
return app;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Start the Express HTTP server. Idempotent — subsequent calls are no-ops.
|
|
93
|
+
*
|
|
94
|
+
* @param port - Port to listen on (default: 3000)
|
|
95
|
+
* @param host - Host to bind to (default: "localhost")
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```ts
|
|
99
|
+
* useExpressStart(3000, "localhost");
|
|
100
|
+
* // Server running on http://localhost:3000
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export const useExpressStart = (port = 3000, host = "localhost") => {
|
|
104
|
+
if (started)
|
|
105
|
+
return;
|
|
106
|
+
started = true;
|
|
107
|
+
const expressApp = useExpressCreate();
|
|
108
|
+
expressApp.listen(port, host, () => {
|
|
109
|
+
useLogger("info", `Server running on http://${host}:${port}`);
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Get the Express application instance. Creates it if it doesn't exist.
|
|
114
|
+
*
|
|
115
|
+
* @returns Express Application instance
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```ts
|
|
119
|
+
* const expressApp = useExpressGetApp();
|
|
120
|
+
* expressApp.get("/custom", (req, res) => res.json({ ok: true }));
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
export const useExpressGetApp = () => useExpressCreate();
|
|
59
124
|
//# sourceMappingURL=server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/adapters/express/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAA6E,MAAM,SAAS,CAAC;AAEpG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/adapters/express/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,8 @@ import type { FetchResult } from "../../types/index.js";
|
|
|
3
3
|
* Unwraps a KatanaKit Safe Result, throwing an H3-compatible error on failure.
|
|
4
4
|
* Returns the data directly on success.
|
|
5
5
|
*
|
|
6
|
+
* Prefers `h3.createError` when available so Nuxt/H3 status codes work correctly.
|
|
7
|
+
*
|
|
6
8
|
* @param result - The Safe Result from `useFetch`, `useGet`, `usePost`, etc.
|
|
7
9
|
* @param context - Optional context prefix for the error message.
|
|
8
10
|
* @returns The data from the result.
|
|
@@ -11,12 +13,12 @@ import type { FetchResult } from "../../types/index.js";
|
|
|
11
13
|
* @example
|
|
12
14
|
* ```ts
|
|
13
15
|
* // server/api/pokemon/[id].ts
|
|
14
|
-
* import {
|
|
16
|
+
* import { useGetApi } from "katanakit-js";
|
|
15
17
|
* import { useUnwrap } from "katanakit-js/adapters/nuxt";
|
|
16
18
|
*
|
|
17
19
|
* export default defineEventHandler(async (event) => {
|
|
18
20
|
* const id = getRouterParam(event, "id");
|
|
19
|
-
* const result = await
|
|
21
|
+
* const result = await useGetApi("pokeapi", "pokemonById", { params: { id } });
|
|
20
22
|
* return useUnwrap(result, `Pokemon ${id}`);
|
|
21
23
|
* });
|
|
22
24
|
* ```
|
|
@@ -33,11 +35,11 @@ export declare function useUnwrap<T>(result: FetchResult<T>, context?: string):
|
|
|
33
35
|
* @example
|
|
34
36
|
* ```ts
|
|
35
37
|
* // server/api/users.ts
|
|
36
|
-
* import {
|
|
38
|
+
* import { useGetApi } from "katanakit-js";
|
|
37
39
|
* import { useSafeResponse } from "katanakit-js/adapters/nuxt";
|
|
38
40
|
*
|
|
39
41
|
* export default defineEventHandler(async () => {
|
|
40
|
-
* const result = await
|
|
42
|
+
* const result = await useGetApi("api", "users");
|
|
41
43
|
* return useSafeResponse(result);
|
|
42
44
|
* });
|
|
43
45
|
* ```
|
|
@@ -61,11 +63,11 @@ export declare function useSafeResponse<T>(result: FetchResult<T>): {
|
|
|
61
63
|
* @example
|
|
62
64
|
* ```ts
|
|
63
65
|
* // server/api/products.ts
|
|
64
|
-
* import {
|
|
66
|
+
* import { useFetchApi } from "katanakit-js";
|
|
65
67
|
* import { useEventResponse } from "katanakit-js/adapters/nuxt";
|
|
66
68
|
*
|
|
67
69
|
* export default defineEventHandler(async (event) => {
|
|
68
|
-
* const result = await
|
|
70
|
+
* const result = await useFetchApi("shop", "products");
|
|
69
71
|
* return useEventResponse(event, result);
|
|
70
72
|
* });
|
|
71
73
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nuxt.service.d.ts","sourceRoot":"","sources":["../../../src/adapters/nuxt/nuxt.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nuxt.service.d.ts","sourceRoot":"","sources":["../../../src/adapters/nuxt/nuxt.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAsBxD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAUxE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG;IAC3D,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAClD,EAAE,EAAE,OAAO,CAAC;CACZ,CAaA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EACjC,KAAK,EAAE;IAAE,IAAI,EAAE;QAAE,GAAG,EAAE;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,EAChD,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GACpB,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAWvC"}
|