glasswork 0.13.1 → 0.13.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/authorization/ability-middleware.d.ts +61 -0
- package/dist/authorization/ability-middleware.d.ts.map +1 -0
- package/dist/authorization/ability-middleware.js +74 -0
- package/dist/authorization/ability-middleware.js.map +1 -0
- package/dist/authorization/index.d.ts +46 -0
- package/dist/authorization/index.d.ts.map +1 -0
- package/dist/authorization/index.js +46 -0
- package/dist/authorization/index.js.map +1 -0
- package/dist/authorization/route-helpers.d.ts +106 -0
- package/dist/authorization/route-helpers.d.ts.map +1 -0
- package/dist/authorization/route-helpers.js +136 -0
- package/dist/authorization/route-helpers.js.map +1 -0
- package/dist/authorization/service-proxy.d.ts +59 -0
- package/dist/authorization/service-proxy.d.ts.map +1 -0
- package/dist/authorization/service-proxy.js +110 -0
- package/dist/authorization/service-proxy.js.map +1 -0
- package/dist/authorization/types.d.ts +58 -0
- package/dist/authorization/types.d.ts.map +1 -0
- package/dist/authorization/types.js +7 -0
- package/dist/authorization/types.js.map +1 -0
- package/dist/core/bootstrap.js.map +1 -1
- package/dist/hooks/authorization-hook.d.ts +100 -0
- package/dist/hooks/authorization-hook.d.ts.map +1 -0
- package/dist/hooks/authorization-hook.js +93 -0
- package/dist/hooks/authorization-hook.js.map +1 -0
- package/dist/hooks/index.d.ts +54 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +55 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/service-hooks.d.ts +82 -0
- package/dist/hooks/service-hooks.d.ts.map +1 -0
- package/dist/hooks/service-hooks.js +158 -0
- package/dist/hooks/service-hooks.js.map +1 -0
- package/dist/hooks/types.d.ts +151 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +2 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/http/route-helpers.d.ts.map +1 -1
- package/dist/http/route-helpers.js.map +1 -1
- package/dist/jobs/drivers/mock-driver.d.ts +7 -0
- package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
- package/dist/jobs/drivers/mock-driver.js +75 -16
- package/dist/jobs/drivers/mock-driver.js.map +1 -1
- package/dist/jobs/job-service.d.ts.map +1 -1
- package/dist/jobs/job-service.js +3 -0
- package/dist/jobs/job-service.js.map +1 -1
- package/dist/jobs/types.d.ts +2 -0
- package/dist/jobs/types.d.ts.map +1 -1
- package/dist/list-query/prisma-builder.d.ts.map +1 -1
- package/dist/list-query/prisma-builder.js +36 -8
- package/dist/list-query/prisma-builder.js.map +1 -1
- package/dist/openapi/hooks.d.ts +14 -0
- package/dist/openapi/hooks.d.ts.map +1 -0
- package/dist/openapi/hooks.js +83 -0
- package/dist/openapi/hooks.js.map +1 -0
- package/dist/openapi/openapi-transformer.d.ts +13 -0
- package/dist/openapi/openapi-transformer.d.ts.map +1 -0
- package/dist/openapi/openapi-transformer.js +87 -0
- package/dist/openapi/openapi-transformer.js.map +1 -0
- package/dist/utils/pagination.d.ts +48 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/pagination.js +42 -0
- package/dist/utils/pagination.js.map +1 -0
- package/dist/utils/serialize-dates.d.ts +27 -0
- package/dist/utils/serialize-dates.d.ts.map +1 -0
- package/dist/utils/serialize-dates.js +39 -0
- package/dist/utils/serialize-dates.js.map +1 -0
- package/package.json +30 -29
|
@@ -57,7 +57,7 @@ function buildStringCondition(operator, value, isCaseInsensitive) {
|
|
|
57
57
|
*/
|
|
58
58
|
function buildInCondition(operator, value, isCaseInsensitive) {
|
|
59
59
|
// Split by pipe and parse each value
|
|
60
|
-
const values = value.split('|').map((v) =>
|
|
60
|
+
const values = value.split('|').map((v) => parsePrimitiveValue(v.trim()));
|
|
61
61
|
// Check if all values are strings for case-insensitive mode
|
|
62
62
|
const allStrings = values.every((v) => typeof v === 'string');
|
|
63
63
|
if (operator === '@=|') {
|
|
@@ -105,10 +105,14 @@ function operatorToPrismaCondition(operator, value) {
|
|
|
105
105
|
throw new Error(`Unsupported operator: ${operator}`);
|
|
106
106
|
}
|
|
107
107
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
108
|
+
* Coerce a single literal string to the primitive types we support in filters when the operator
|
|
109
|
+
* does not require a raw string (equality, comparison, IN list tokens).
|
|
110
|
+
*
|
|
111
|
+
* - `true` / `false` → boolean (exact match, case-sensitive).
|
|
112
|
+
* - Numeric-looking strings → number (so `age==42` and `age>18` behave intuitively).
|
|
113
|
+
* - Everything else → unchanged string.
|
|
110
114
|
*/
|
|
111
|
-
function
|
|
115
|
+
function parsePrimitiveValue(value) {
|
|
112
116
|
if (value === 'true') {
|
|
113
117
|
return true;
|
|
114
118
|
}
|
|
@@ -121,6 +125,33 @@ function parseValue(value) {
|
|
|
121
125
|
}
|
|
122
126
|
return value;
|
|
123
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Coerce a filter value for `operator` before building Prisma conditions.
|
|
130
|
+
*
|
|
131
|
+
* - **Substring / IN**: return the string as-is. Text search must not turn `"432"` into a number;
|
|
132
|
+
* pipe-separated IN lists are split and parsed per segment in `buildInCondition`.
|
|
133
|
+
* - **Equality and comparisons**: delegate to `parsePrimitiveValue` so legacy string inputs like
|
|
134
|
+
* `"42"` or `"true"` still coerce.
|
|
135
|
+
*
|
|
136
|
+
* A trailing `*` on `operator` is stripped before branching; it only affects case-insensitive
|
|
137
|
+
* matching, not how the value is parsed.
|
|
138
|
+
*/
|
|
139
|
+
function parseValue(value, operator) {
|
|
140
|
+
const baseOperator = operator.replace(/\*$/, '');
|
|
141
|
+
// For IN operators, keep the value as string (pipe-separated).
|
|
142
|
+
if (baseOperator.includes('|')) {
|
|
143
|
+
return value;
|
|
144
|
+
}
|
|
145
|
+
if (baseOperator === '@=' ||
|
|
146
|
+
baseOperator === '_=' ||
|
|
147
|
+
baseOperator === '_-=' ||
|
|
148
|
+
baseOperator === '!@=' ||
|
|
149
|
+
baseOperator === '!_=' ||
|
|
150
|
+
baseOperator === '!_-=') {
|
|
151
|
+
return value;
|
|
152
|
+
}
|
|
153
|
+
return parsePrimitiveValue(value);
|
|
154
|
+
}
|
|
124
155
|
/**
|
|
125
156
|
* Build a nested Prisma where condition from a field path
|
|
126
157
|
* For nested paths (relations), wraps in Prisma's relation filter structure { is: { ... } }
|
|
@@ -189,10 +220,7 @@ export function buildWhereClause(filters) {
|
|
|
189
220
|
}
|
|
190
221
|
let where = {};
|
|
191
222
|
for (const filter of filters) {
|
|
192
|
-
|
|
193
|
-
// The buildInCondition function will split and parse individual values
|
|
194
|
-
const isInOperator = filter.operator.includes('|');
|
|
195
|
-
const parsedValue = isInOperator ? filter.value : parseValue(filter.value);
|
|
223
|
+
const parsedValue = parseValue(filter.value, filter.operator);
|
|
196
224
|
const condition = operatorToPrismaCondition(filter.operator, parsedValue);
|
|
197
225
|
const nestedCondition = buildNestedWhereCondition(filter.fieldPath, condition);
|
|
198
226
|
where = mergeWhereConditions(where, nestedCondition);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-builder.js","sourceRoot":"","sources":["../../src/list-query/prisma-builder.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,SAAS,sBAAsB,CAC7B,QAAqB,EACrB,KAAgC,EAChC,iBAA0B;IAE1B,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,IAAI,iBAAiB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QAChD,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IACD,IAAI,iBAAiB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACnD,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAC/B,QAAiC,EACjC,KAAgC;IAEhC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,GAAG;YACN,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACvB,KAAK,GAAG;YACN,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACvB,KAAK,IAAI;YACP,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QACxB,KAAK,IAAI;YACP,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,QAAsD,EACtD,KAAgC,EAChC,iBAA0B;IAE1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,wBAAwB,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,aAAa,GAA4B,iBAAiB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChG,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,CAAC;QAC/C,KAAK,IAAI;YACP,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,CAAC;QACjD,KAAK,KAAK;YACR,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,CAAC;QAC/C,KAAK,KAAK;YACR,OAAO,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,EAAE,CAAC;QACxD,KAAK,KAAK;YACR,OAAO,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,EAAE,CAAC;QAC1D,KAAK,MAAM;YACT,OAAO,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,EAAE,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CACvB,QAAwB,EACxB,KAAa,EACb,iBAA0B;IAE1B,qCAAqC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"prisma-builder.js","sourceRoot":"","sources":["../../src/list-query/prisma-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { OpenAPIResponseHook } from '../core/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a hook that adds CORS headers to responses
|
|
4
|
+
*/
|
|
5
|
+
export declare function createCorsHeadersHook(enabled: boolean): OpenAPIResponseHook;
|
|
6
|
+
/**
|
|
7
|
+
* Create a hook that adds rate limiting headers to responses
|
|
8
|
+
*/
|
|
9
|
+
export declare function createRateLimitHeadersHook(enabled: boolean): OpenAPIResponseHook;
|
|
10
|
+
/**
|
|
11
|
+
* Create a hook that adds pagination headers to 200 responses
|
|
12
|
+
*/
|
|
13
|
+
export declare function createPaginationHeadersHook(): OpenAPIResponseHook;
|
|
14
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/openapi/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAc3E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAgChF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,mBAAmB,CA4BjE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a hook that adds CORS headers to responses
|
|
3
|
+
*/
|
|
4
|
+
export function createCorsHeadersHook(enabled) {
|
|
5
|
+
return (response, _context) => {
|
|
6
|
+
if (!enabled)
|
|
7
|
+
return response;
|
|
8
|
+
return {
|
|
9
|
+
...response,
|
|
10
|
+
headers: {
|
|
11
|
+
...response.headers,
|
|
12
|
+
'Access-Control-Allow-Origin': {
|
|
13
|
+
$ref: '#/components/headers/Access-Control-Allow-Origin',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a hook that adds rate limiting headers to responses
|
|
21
|
+
*/
|
|
22
|
+
export function createRateLimitHeadersHook(enabled) {
|
|
23
|
+
return (response, context) => {
|
|
24
|
+
if (!enabled)
|
|
25
|
+
return response;
|
|
26
|
+
const { statusCode } = context;
|
|
27
|
+
const headers = {
|
|
28
|
+
'RateLimit-Limit': {
|
|
29
|
+
$ref: '#/components/headers/RateLimit-Limit',
|
|
30
|
+
},
|
|
31
|
+
'RateLimit-Remaining': {
|
|
32
|
+
$ref: '#/components/headers/RateLimit-Remaining',
|
|
33
|
+
},
|
|
34
|
+
'RateLimit-Reset': {
|
|
35
|
+
$ref: '#/components/headers/RateLimit-Reset',
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
// Add Retry-After header for 429 responses
|
|
39
|
+
if (statusCode === '429') {
|
|
40
|
+
headers['Retry-After'] = {
|
|
41
|
+
$ref: '#/components/headers/Retry-After',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
...response,
|
|
46
|
+
headers: {
|
|
47
|
+
...response.headers,
|
|
48
|
+
...headers,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Create a hook that adds pagination headers to 200 responses
|
|
55
|
+
*/
|
|
56
|
+
export function createPaginationHeadersHook() {
|
|
57
|
+
return (response, context) => {
|
|
58
|
+
const { statusCode, routeConfig } = context;
|
|
59
|
+
// Only add pagination headers to 200 responses with paginate flag
|
|
60
|
+
if (statusCode !== '200' || !routeConfig.paginate) {
|
|
61
|
+
return response;
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
...response,
|
|
65
|
+
headers: {
|
|
66
|
+
...response.headers,
|
|
67
|
+
'X-Total-Count': {
|
|
68
|
+
$ref: '#/components/headers/X-Total-Count',
|
|
69
|
+
},
|
|
70
|
+
'X-Total-Pages': {
|
|
71
|
+
$ref: '#/components/headers/X-Total-Pages',
|
|
72
|
+
},
|
|
73
|
+
'X-Current-Page': {
|
|
74
|
+
$ref: '#/components/headers/X-Current-Page',
|
|
75
|
+
},
|
|
76
|
+
'X-Page-Size': {
|
|
77
|
+
$ref: '#/components/headers/X-Page-Size',
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/openapi/hooks.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE;QAC5B,IAAI,CAAC,OAAO;YAAE,OAAO,QAAQ,CAAC;QAE9B,OAAO;YACL,GAAG,QAAQ;YACX,OAAO,EAAE;gBACP,GAAG,QAAQ,CAAC,OAAO;gBACnB,6BAA6B,EAAE;oBAC7B,IAAI,EAAE,kDAAkD;iBACzD;aACF;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IACzD,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;QAC3B,IAAI,CAAC,OAAO;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC/B,MAAM,OAAO,GAAqC;YAChD,iBAAiB,EAAE;gBACjB,IAAI,EAAE,sCAAsC;aAC7C;YACD,qBAAqB,EAAE;gBACrB,IAAI,EAAE,0CAA0C;aACjD;YACD,iBAAiB,EAAE;gBACjB,IAAI,EAAE,sCAAsC;aAC7C;SACF,CAAC;QAEF,2CAA2C;QAC3C,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,aAAa,CAAC,GAAG;gBACvB,IAAI,EAAE,kCAAkC;aACzC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,GAAG,QAAQ;YACX,OAAO,EAAE;gBACP,GAAG,QAAQ,CAAC,OAAO;gBACnB,GAAG,OAAO;aACX;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;QAC3B,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;QAE5C,kEAAkE;QAClE,IAAI,UAAU,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAClD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO;YACL,GAAG,QAAQ;YACX,OAAO,EAAE;gBACP,GAAG,QAAQ,CAAC,OAAO;gBACnB,eAAe,EAAE;oBACf,IAAI,EAAE,oCAAoC;iBAC3C;gBACD,eAAe,EAAE;oBACf,IAAI,EAAE,oCAAoC;iBAC3C;gBACD,gBAAgB,EAAE;oBAChB,IAAI,EAAE,qCAAqC;iBAC5C;gBACD,aAAa,EAAE;oBACb,IAAI,EAAE,kCAAkC;iBACzC;aACF;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { OpenAPIV3_1 } from 'openapi-types';
|
|
2
|
+
/**
|
|
3
|
+
* Transforms an OpenAPI document to ensure OpenAPI 3.1.0 compatibility
|
|
4
|
+
*
|
|
5
|
+
* This function:
|
|
6
|
+
* - Converts OpenAPI 3.0-style nullable syntax to OpenAPI 3.1.0 format
|
|
7
|
+
* - Recursively processes all schemas in components, paths, and responses
|
|
8
|
+
*
|
|
9
|
+
* @param doc - OpenAPI document to transform
|
|
10
|
+
* @returns Transformed OpenAPI document
|
|
11
|
+
*/
|
|
12
|
+
export declare function transformOpenAPIDocument(doc: OpenAPIV3_1.Document): OpenAPIV3_1.Document;
|
|
13
|
+
//# sourceMappingURL=openapi-transformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-transformer.d.ts","sourceRoot":"","sources":["../../src/openapi/openapi-transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAmFjD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAExF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks if an array of anyOf/oneOf items contains a schema with nullable: true
|
|
3
|
+
*/
|
|
4
|
+
function hasNullableSchema(items) {
|
|
5
|
+
return items.some((item) => typeof item === 'object' && item !== null && 'nullable' in item && item.nullable === true);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Removes the nullable property from a schema object
|
|
9
|
+
*/
|
|
10
|
+
function removeNullableProperty(item) {
|
|
11
|
+
if (typeof item !== 'object' || item === null) {
|
|
12
|
+
return item;
|
|
13
|
+
}
|
|
14
|
+
const { ...rest } = item;
|
|
15
|
+
delete rest.nullable;
|
|
16
|
+
return rest;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Transforms an anyOf array that contains nullable schemas to include explicit null type
|
|
20
|
+
*/
|
|
21
|
+
function transformAnyOfWithNullable(items) {
|
|
22
|
+
const transformed = items.map(removeNullableProperty).filter((item) => {
|
|
23
|
+
if (typeof item !== 'object' || item === null) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
return Object.keys(item).length > 0;
|
|
27
|
+
});
|
|
28
|
+
transformed.push({ type: 'null' });
|
|
29
|
+
return transformed;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Transforms a single key-value pair in a schema object
|
|
33
|
+
*/
|
|
34
|
+
function transformSchemaProperty(key, value) {
|
|
35
|
+
if (key === 'anyOf' && Array.isArray(value)) {
|
|
36
|
+
if (hasNullableSchema(value)) {
|
|
37
|
+
return transformAnyOfWithNullable(value).map(transformNullable);
|
|
38
|
+
}
|
|
39
|
+
return transformNullable(value);
|
|
40
|
+
}
|
|
41
|
+
if (key === 'allOf' || key === 'oneOf' || key === 'properties' || key === 'items') {
|
|
42
|
+
return transformNullable(value);
|
|
43
|
+
}
|
|
44
|
+
return transformNullable(value);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Transforms OpenAPI 3.0-style nullable syntax to OpenAPI 3.1.0-compatible format
|
|
48
|
+
*
|
|
49
|
+
* Converts patterns like:
|
|
50
|
+
* {"anyOf": [{"type": "string", "nullable": true}]}
|
|
51
|
+
* To:
|
|
52
|
+
* {"anyOf": [{"type": "string"}, {"type": "null"}]}
|
|
53
|
+
*
|
|
54
|
+
* @param schema - OpenAPI schema to transform
|
|
55
|
+
* @returns Transformed schema with OpenAPI 3.1.0-compatible nullable syntax
|
|
56
|
+
*/
|
|
57
|
+
function transformNullable(schema) {
|
|
58
|
+
if (schema === null || schema === undefined || typeof schema !== 'object') {
|
|
59
|
+
return schema;
|
|
60
|
+
}
|
|
61
|
+
if (Array.isArray(schema)) {
|
|
62
|
+
return schema.map(transformNullable);
|
|
63
|
+
}
|
|
64
|
+
const obj = schema;
|
|
65
|
+
const result = {};
|
|
66
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
67
|
+
if (key === 'nullable' && value === true) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
result[key] = transformSchemaProperty(key, value);
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Transforms an OpenAPI document to ensure OpenAPI 3.1.0 compatibility
|
|
76
|
+
*
|
|
77
|
+
* This function:
|
|
78
|
+
* - Converts OpenAPI 3.0-style nullable syntax to OpenAPI 3.1.0 format
|
|
79
|
+
* - Recursively processes all schemas in components, paths, and responses
|
|
80
|
+
*
|
|
81
|
+
* @param doc - OpenAPI document to transform
|
|
82
|
+
* @returns Transformed OpenAPI document
|
|
83
|
+
*/
|
|
84
|
+
export function transformOpenAPIDocument(doc) {
|
|
85
|
+
return transformNullable(doc);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=openapi-transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-transformer.js","sourceRoot":"","sources":["../../src/openapi/openapi-transformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Context } from 'hono';
|
|
2
|
+
/**
|
|
3
|
+
* Pagination input parameters
|
|
4
|
+
*/
|
|
5
|
+
export interface PaginationInput {
|
|
6
|
+
page: number;
|
|
7
|
+
limit: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Paginated output structure
|
|
11
|
+
*/
|
|
12
|
+
export interface PaginatedOutput<T> {
|
|
13
|
+
data: T[];
|
|
14
|
+
total: number;
|
|
15
|
+
page: number;
|
|
16
|
+
limit: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Execute a paginated query and set response headers.
|
|
20
|
+
*
|
|
21
|
+
* This helper extracts pagination parameters from the query string,
|
|
22
|
+
* executes the provided function, and sets the appropriate response headers.
|
|
23
|
+
*
|
|
24
|
+
* @template T - The type of items in the result
|
|
25
|
+
* @param c - Hono context
|
|
26
|
+
* @param fn - Function that executes the paginated query
|
|
27
|
+
* @returns Array of items (headers are set as side effect)
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* router.get('/users', route({
|
|
32
|
+
* paginate: true,
|
|
33
|
+
* handler: async ({ context }) => {
|
|
34
|
+
* return await paginate(context, (p) => userService.getUsers(p));
|
|
35
|
+
* }
|
|
36
|
+
* }));
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function paginate<T>(c: Context, fn: (p: PaginationInput) => Promise<PaginatedOutput<T>>): Promise<T[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Extract pagination parameters from Hono context.
|
|
42
|
+
*
|
|
43
|
+
* @param c - Hono context
|
|
44
|
+
* @param defaultLimit - Default limit if not provided (default: 100)
|
|
45
|
+
* @returns Pagination input with page and limit
|
|
46
|
+
*/
|
|
47
|
+
export declare function paginationInput(c: Context, defaultLimit?: number): PaginationInput;
|
|
48
|
+
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/utils/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,CAAC,EAAE,OAAO,EACV,EAAE,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GACtD,OAAO,CAAC,CAAC,EAAE,CAAC,CASd;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,SAAM,GAAG,eAAe,CAI/E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute a paginated query and set response headers.
|
|
3
|
+
*
|
|
4
|
+
* This helper extracts pagination parameters from the query string,
|
|
5
|
+
* executes the provided function, and sets the appropriate response headers.
|
|
6
|
+
*
|
|
7
|
+
* @template T - The type of items in the result
|
|
8
|
+
* @param c - Hono context
|
|
9
|
+
* @param fn - Function that executes the paginated query
|
|
10
|
+
* @returns Array of items (headers are set as side effect)
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* router.get('/users', route({
|
|
15
|
+
* paginate: true,
|
|
16
|
+
* handler: async ({ context }) => {
|
|
17
|
+
* return await paginate(context, (p) => userService.getUsers(p));
|
|
18
|
+
* }
|
|
19
|
+
* }));
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export async function paginate(c, fn) {
|
|
23
|
+
const pagination = paginationInput(c);
|
|
24
|
+
const result = await fn(pagination);
|
|
25
|
+
c.header('X-Total-Count', result.total.toString());
|
|
26
|
+
c.header('X-Page', result.page.toString());
|
|
27
|
+
c.header('X-Limit', result.limit.toString());
|
|
28
|
+
return result.data;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extract pagination parameters from Hono context.
|
|
32
|
+
*
|
|
33
|
+
* @param c - Hono context
|
|
34
|
+
* @param defaultLimit - Default limit if not provided (default: 100)
|
|
35
|
+
* @returns Pagination input with page and limit
|
|
36
|
+
*/
|
|
37
|
+
export function paginationInput(c, defaultLimit = 100) {
|
|
38
|
+
const page = Number.parseInt(c.req.query('page') ?? '1', 10);
|
|
39
|
+
const limit = Number.parseInt(c.req.query('limit') ?? defaultLimit.toString(), 10);
|
|
40
|
+
return { page, limit };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/utils/pagination.ts"],"names":[],"mappings":"AAoBA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,CAAU,EACV,EAAuD;IAEvD,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC;IAEpC,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE7C,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,CAAU,EAAE,YAAY,GAAG,GAAG;IAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IACnF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type helper to recursively convert Date fields to string in an object type
|
|
3
|
+
*/
|
|
4
|
+
export type SerializedDates<T> = T extends Date ? string : T extends Array<infer U> ? Array<SerializedDates<U>> : T extends object ? {
|
|
5
|
+
[K in keyof T]: SerializedDates<T[K]>;
|
|
6
|
+
} : T;
|
|
7
|
+
/**
|
|
8
|
+
* Recursively converts all Date objects to ISO 8601 strings in an entity or array of entities.
|
|
9
|
+
*
|
|
10
|
+
* This utility handles the mismatch between Prisma's Date types and API response DTOs
|
|
11
|
+
* that expect string timestamps. It preserves null values and handles nested objects and arrays.
|
|
12
|
+
*
|
|
13
|
+
* @template T - The type of data to transform
|
|
14
|
+
* @param data - The data to transform (object, array, or primitive)
|
|
15
|
+
* @returns The same structure with all Date objects converted to ISO strings
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const ranger = await prisma.ranger.findUnique({
|
|
20
|
+
* where: { id },
|
|
21
|
+
* include: { category: true }
|
|
22
|
+
* });
|
|
23
|
+
* return serializeDates(ranger); // All Date fields → ISO strings
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function serializeDates<T>(data: T): SerializedDates<T>;
|
|
27
|
+
//# sourceMappingURL=serialize-dates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize-dates.d.ts","sourceRoot":"","sources":["../../src/utils/serialize-dates.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,GAC3C,MAAM,GACN,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GACtB,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GACzB,CAAC,SAAS,MAAM,GACd;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACzC,CAAC,CAAC;AAEV;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAsB7D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recursively converts all Date objects to ISO 8601 strings in an entity or array of entities.
|
|
3
|
+
*
|
|
4
|
+
* This utility handles the mismatch between Prisma's Date types and API response DTOs
|
|
5
|
+
* that expect string timestamps. It preserves null values and handles nested objects and arrays.
|
|
6
|
+
*
|
|
7
|
+
* @template T - The type of data to transform
|
|
8
|
+
* @param data - The data to transform (object, array, or primitive)
|
|
9
|
+
* @returns The same structure with all Date objects converted to ISO strings
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const ranger = await prisma.ranger.findUnique({
|
|
14
|
+
* where: { id },
|
|
15
|
+
* include: { category: true }
|
|
16
|
+
* });
|
|
17
|
+
* return serializeDates(ranger); // All Date fields → ISO strings
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function serializeDates(data) {
|
|
21
|
+
if (data === null || data === undefined) {
|
|
22
|
+
return data;
|
|
23
|
+
}
|
|
24
|
+
if (data instanceof Date) {
|
|
25
|
+
return data.toISOString();
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(data)) {
|
|
28
|
+
return data.map((item) => serializeDates(item));
|
|
29
|
+
}
|
|
30
|
+
if (typeof data === 'object') {
|
|
31
|
+
const result = {};
|
|
32
|
+
for (const [key, value] of Object.entries(data)) {
|
|
33
|
+
result[key] = serializeDates(value);
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
return data;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=serialize-dates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize-dates.js","sourceRoot":"","sources":["../../src/utils/serialize-dates.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAAI,IAAO;IACvC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,IAA0B,CAAC;IACpC,CAAC;IAED,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,WAAW,EAAwB,CAAC;IAClD,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAuB,CAAC;IACxE,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,MAA4B,CAAC;IACtC,CAAC;IAED,OAAO,IAA0B,CAAC;AACpC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "glasswork",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.3",
|
|
4
4
|
"description": "A transparent, Lambda-optimized web framework for building OpenAPI-compliant REST APIs.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -130,46 +130,47 @@
|
|
|
130
130
|
}
|
|
131
131
|
},
|
|
132
132
|
"devDependencies": {
|
|
133
|
-
"@aws-sdk/client-cloudwatch": "^3.
|
|
134
|
-
"@aws-sdk/client-dynamodb": "^3.
|
|
135
|
-
"@aws-sdk/client-s3": "^3.
|
|
136
|
-
"@aws-sdk/client-scheduler": "^3.
|
|
137
|
-
"@aws-sdk/client-sesv2": "^3.
|
|
138
|
-
"@aws-sdk/client-sqs": "^3.
|
|
139
|
-
"@aws-sdk/client-ssm": "^3.
|
|
140
|
-
"@aws-sdk/lib-dynamodb": "^3.
|
|
141
|
-
"@aws-sdk/s3-request-presigner": "^3.
|
|
142
|
-
"@biomejs/biome": "^2.
|
|
143
|
-
"@casl/ability": "^6.
|
|
144
|
-
"@casl/prisma": "^1.6.
|
|
145
|
-
"@hono/swagger-ui": "^0.5.
|
|
146
|
-
"@prisma/client": "^7.
|
|
147
|
-
"@types/aws-lambda": "^8.10.
|
|
133
|
+
"@aws-sdk/client-cloudwatch": "^3.1001.0",
|
|
134
|
+
"@aws-sdk/client-dynamodb": "^3.1001.0",
|
|
135
|
+
"@aws-sdk/client-s3": "^3.1001.0",
|
|
136
|
+
"@aws-sdk/client-scheduler": "^3.1001.0",
|
|
137
|
+
"@aws-sdk/client-sesv2": "^3.1001.0",
|
|
138
|
+
"@aws-sdk/client-sqs": "^3.1001.0",
|
|
139
|
+
"@aws-sdk/client-ssm": "^3.1001.0",
|
|
140
|
+
"@aws-sdk/lib-dynamodb": "^3.1001.0",
|
|
141
|
+
"@aws-sdk/s3-request-presigner": "^3.1001.0",
|
|
142
|
+
"@biomejs/biome": "^2.4.5",
|
|
143
|
+
"@casl/ability": "^6.8.0",
|
|
144
|
+
"@casl/prisma": "^1.6.1",
|
|
145
|
+
"@hono/swagger-ui": "^0.5.3",
|
|
146
|
+
"@prisma/client": "^7.4.2",
|
|
147
|
+
"@types/aws-lambda": "^8.10.161",
|
|
148
148
|
"@types/html-to-text": "^9.0.4",
|
|
149
149
|
"@types/node": "^22.19.1",
|
|
150
|
-
"@vitest/coverage-v8": "^4.0.
|
|
151
|
-
"awilix": "^
|
|
152
|
-
"dotenv": "^17.
|
|
153
|
-
"hono": "^4.
|
|
154
|
-
"hono-openapi": "^1.
|
|
150
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
151
|
+
"awilix": "^13.0.3",
|
|
152
|
+
"dotenv": "^17.3.1",
|
|
153
|
+
"hono": "^4.12.5",
|
|
154
|
+
"hono-openapi": "^1.3.0",
|
|
155
155
|
"html-to-text": "^9.0.5",
|
|
156
|
-
"mermaid": "^11.12.
|
|
156
|
+
"mermaid": "^11.12.3",
|
|
157
157
|
"mjml": "^4.18.0",
|
|
158
158
|
"typescript": "^5.9.3",
|
|
159
159
|
"valibot": "^1.2.0",
|
|
160
160
|
"vitepress": "^1.6.4",
|
|
161
|
+
"vitepress-plugin-llms": "^1.11.0",
|
|
161
162
|
"vitepress-plugin-mermaid": "^2.0.17",
|
|
162
|
-
"vitest": "^4.0.
|
|
163
|
-
"vue": "^3.5.
|
|
163
|
+
"vitest": "^4.0.18",
|
|
164
|
+
"vue": "^3.5.29"
|
|
164
165
|
},
|
|
165
166
|
"dependencies": {
|
|
166
|
-
"@hono/standard-validator": "^0.2.
|
|
167
|
-
"@hono/valibot-validator": "^0.6.
|
|
167
|
+
"@hono/standard-validator": "^0.2.2",
|
|
168
|
+
"@hono/valibot-validator": "^0.6.1",
|
|
168
169
|
"@standard-community/standard-json": "^0.3.5",
|
|
169
170
|
"@standard-community/standard-openapi": "^0.2.9",
|
|
170
|
-
"@valibot/to-json-schema": "^1.
|
|
171
|
+
"@valibot/to-json-schema": "^1.5.0",
|
|
171
172
|
"deepmerge": "^4.3.1",
|
|
172
|
-
"nanoid": "^5.
|
|
173
|
+
"nanoid": "^5.1.6",
|
|
173
174
|
"openapi-types": "^12.1.3"
|
|
174
175
|
}
|
|
175
|
-
}
|
|
176
|
+
}
|