@clipboard-health/json-api-nestjs 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -0
- package/package.json +4 -1
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/index.js.map +1 -1
- package/src/lib/query/createInclude.d.ts +12 -0
- package/src/lib/query/createInclude.js +36 -0
- package/src/lib/query/createInclude.js.map +1 -0
- package/src/lib/query/createSort.d.ts +0 -1
- package/src/lib/query/createSort.js +1 -0
- package/src/lib/query/createSort.js.map +1 -1
package/README.md
CHANGED
|
@@ -24,6 +24,40 @@ Create Zod schemas for your API's queries:
|
|
|
24
24
|
<!-- prettier-ignore -->
|
|
25
25
|
```ts
|
|
26
26
|
// ./examples/query.ts
|
|
27
|
+
|
|
28
|
+
import {
|
|
29
|
+
booleanString,
|
|
30
|
+
createCursorPagination,
|
|
31
|
+
createFields,
|
|
32
|
+
createFilter,
|
|
33
|
+
createInclude,
|
|
34
|
+
createSort,
|
|
35
|
+
} from "@clipboard-health/json-api-nestjs";
|
|
36
|
+
import { z } from "zod";
|
|
37
|
+
|
|
38
|
+
export const query = z
|
|
39
|
+
.object({
|
|
40
|
+
...createCursorPagination(),
|
|
41
|
+
...createFields({ user: ["age", "name"], article: ["title"] }),
|
|
42
|
+
...createFilter({
|
|
43
|
+
age: {
|
|
44
|
+
filters: ["eq", "gt"],
|
|
45
|
+
schema: z.coerce.number().int().positive().max(125),
|
|
46
|
+
},
|
|
47
|
+
isActive: {
|
|
48
|
+
filters: ["eq"],
|
|
49
|
+
schema: booleanString,
|
|
50
|
+
},
|
|
51
|
+
dateOfBirth: {
|
|
52
|
+
filters: ["gte"],
|
|
53
|
+
schema: z.coerce.date().min(new Date("1900-01-01")),
|
|
54
|
+
},
|
|
55
|
+
}),
|
|
56
|
+
...createSort(["age", "name"]),
|
|
57
|
+
...createInclude(["articles", "articles.comments"]),
|
|
58
|
+
})
|
|
59
|
+
.strict();
|
|
60
|
+
|
|
27
61
|
```
|
|
28
62
|
|
|
29
63
|
## Local development commands
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clipboard-health/json-api-nestjs",
|
|
3
3
|
"description": "Utilities for adhering to the JSON:API specification with NestJS.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"tslib": "2.7.0",
|
|
7
7
|
"zod": "3.23.8"
|
|
@@ -12,6 +12,9 @@
|
|
|
12
12
|
"publishConfig": {
|
|
13
13
|
"access": "restricted"
|
|
14
14
|
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"embed": "embedme README.md"
|
|
17
|
+
},
|
|
15
18
|
"type": "commonjs",
|
|
16
19
|
"typings": "./src/index.d.ts",
|
|
17
20
|
"types": "./src/index.d.ts"
|
package/src/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from "./lib/query/createCursorPagination";
|
|
2
2
|
export * from "./lib/query/createFields";
|
|
3
3
|
export * from "./lib/query/createFilter";
|
|
4
|
+
export * from "./lib/query/createInclude";
|
|
4
5
|
export * from "./lib/query/createSort";
|
|
5
6
|
export * from "./lib/schemas";
|
|
6
7
|
export * from "./lib/types";
|
package/src/index.js
CHANGED
|
@@ -4,6 +4,7 @@ const tslib_1 = require("tslib");
|
|
|
4
4
|
tslib_1.__exportStar(require("./lib/query/createCursorPagination"), exports);
|
|
5
5
|
tslib_1.__exportStar(require("./lib/query/createFields"), exports);
|
|
6
6
|
tslib_1.__exportStar(require("./lib/query/createFilter"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./lib/query/createInclude"), exports);
|
|
7
8
|
tslib_1.__exportStar(require("./lib/query/createSort"), exports);
|
|
8
9
|
tslib_1.__exportStar(require("./lib/schemas"), exports);
|
|
9
10
|
tslib_1.__exportStar(require("./lib/types"), exports);
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/json-api-nestjs/src/index.ts"],"names":[],"mappings":";;;AAAA,6EAAmD;AACnD,mEAAyC;AACzC,mEAAyC;AACzC,iEAAuC;AACvC,wDAA8B;AAC9B,sDAA4B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/json-api-nestjs/src/index.ts"],"names":[],"mappings":";;;AAAA,6EAAmD;AACnD,mEAAyC;AACzC,mEAAyC;AACzC,oEAA0C;AAC1C,iEAAuC;AACvC,wDAA8B;AAC9B,sDAA4B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a Zod schema for JSON:API include parameters.
|
|
4
|
+
*
|
|
5
|
+
* @param fields An array of valid include fields.
|
|
6
|
+
* @returns A Zod schema for the include parameter.
|
|
7
|
+
*
|
|
8
|
+
* @see {@link https://jsonapi.org/format/#fetching-includes JSON:API includes}
|
|
9
|
+
*/
|
|
10
|
+
export declare function createInclude<const FieldT extends readonly string[]>(fields: FieldT): {
|
|
11
|
+
include: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodOptional<z.ZodArray<z.ZodString, "many">>, string[] | undefined, unknown>, string[] | undefined, unknown>, FieldT[number][] | undefined, unknown>;
|
|
12
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createInclude = createInclude;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const splitString_1 = require("../internal/splitString");
|
|
6
|
+
/**
|
|
7
|
+
* Creates a Zod schema for JSON:API include parameters.
|
|
8
|
+
*
|
|
9
|
+
* @param fields An array of valid include fields.
|
|
10
|
+
* @returns A Zod schema for the include parameter.
|
|
11
|
+
*
|
|
12
|
+
* @see {@link https://jsonapi.org/format/#fetching-includes JSON:API includes}
|
|
13
|
+
*/
|
|
14
|
+
function createInclude(fields) {
|
|
15
|
+
const fieldSet = new Set(fields);
|
|
16
|
+
return {
|
|
17
|
+
include: zod_1.z
|
|
18
|
+
.preprocess(splitString_1.splitString, zod_1.z.array(zod_1.z.string()).optional())
|
|
19
|
+
.superRefine((value, context) => {
|
|
20
|
+
if (!value) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
for (const field of value) {
|
|
24
|
+
if (!fieldSet.has(field)) {
|
|
25
|
+
context.addIssue({
|
|
26
|
+
code: zod_1.z.ZodIssueCode.custom,
|
|
27
|
+
message: `Invalid include field: '${field}'`,
|
|
28
|
+
path: ["include", field],
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
})
|
|
33
|
+
.transform((value) => value),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=createInclude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createInclude.js","sourceRoot":"","sources":["../../../../../../packages/json-api-nestjs/src/lib/query/createInclude.ts"],"names":[],"mappings":";;AAYA,sCAuBC;AAnCD,6BAAwB;AAExB,yDAAsD;AAEtD;;;;;;;GAOG;AACH,SAAgB,aAAa,CAAyC,MAAc;IAClF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAEjC,OAAO;QACL,OAAO,EAAE,OAAC;aACP,UAAU,CAAC,yBAAW,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;aACvD,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,QAAQ,CAAC;wBACf,IAAI,EAAE,OAAC,CAAC,YAAY,CAAC,MAAM;wBAC3B,OAAO,EAAE,2BAA2B,KAAK,GAAG;wBAC5C,IAAI,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC;qBACzB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC;aACD,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAA0C,CAAC;KACpE,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { type Field } from "../types";
|
|
3
|
-
export type SortSchema<T extends readonly Field[]> = z.ZodEffects<z.ZodEffects<z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString>>>, Array<`-${T[number]}` | T[number]> | undefined, unknown>>;
|
|
4
3
|
/**
|
|
5
4
|
* Creates a Zod schema for JSON:API sort parameters.
|
|
6
5
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSort.js","sourceRoot":"","sources":["../../../../../../packages/json-api-nestjs/src/lib/query/createSort.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"createSort.js","sourceRoot":"","sources":["../../../../../../packages/json-api-nestjs/src/lib/query/createSort.ts"],"names":[],"mappings":";;AAaA,gCAsBC;AAnCD,6BAAwB;AAExB,yDAAsD;AAGtD;;;;;;;GAOG;AACH,SAAgB,UAAU,CAAoD,MAAc;IAC1F,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO;QACL,IAAI,EAAE,OAAC;aACJ,UAAU,CAAC,yBAAW,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;aACvD,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClE,OAAO,CAAC,QAAQ,CAAC;wBACf,IAAI,EAAE,OAAC,CAAC,YAAY,CAAC,MAAM;wBAC3B,OAAO,EAAE,wBAAwB,KAAK,GAAG;wBACzC,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;qBACtB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC;aACD,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAiE,CAAC;KAC3F,CAAC;AACJ,CAAC"}
|