@schmock/query 2.4.0 → 2.5.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 +11 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +1 -1
- package/package.json +4 -4
- package/dist/index.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -18,19 +18,29 @@ import { queryPlugin } from "@schmock/query";
|
|
|
18
18
|
|
|
19
19
|
const mock = schmock();
|
|
20
20
|
|
|
21
|
-
mock
|
|
21
|
+
// Plugins apply to every route on the mock, not only to one route.
|
|
22
|
+
mock.pipe(
|
|
22
23
|
queryPlugin({
|
|
23
24
|
pagination: { defaultLimit: 10, maxLimit: 100 },
|
|
24
25
|
sorting: { allowed: ["name"] },
|
|
25
26
|
}),
|
|
26
27
|
);
|
|
27
28
|
|
|
29
|
+
mock("GET /users", users);
|
|
30
|
+
|
|
28
31
|
// Through an adapter: GET /users?page=2&limit=10&sort=name
|
|
29
32
|
const response = await mock.handle("GET", "/users", {
|
|
30
33
|
query: { page: "2", limit: "10", sort: "name" },
|
|
31
34
|
});
|
|
32
35
|
```
|
|
33
36
|
|
|
37
|
+
- Responses with a status of 400 or above are never paginated, sorted or filtered.
|
|
38
|
+
- `sorting.default` must be one of `sorting.allowed`, and `sorting.defaultOrder`
|
|
39
|
+
must be `"asc"` or `"desc"`. Both are checked when the plugin is created.
|
|
40
|
+
- The order parameter is case-insensitive: `order=DESC` sorts descending.
|
|
41
|
+
- Pipe `queryPlugin` after the plugin that produces the body (faker, openapi).
|
|
42
|
+
Give faker a `seed` so every request pages through the same data.
|
|
43
|
+
|
|
34
44
|
## Documentation
|
|
35
45
|
|
|
36
46
|
- [API reference](https://github.com/khalic-lab/schmock/blob/main/docs/api.md)
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{getResponseParts as x,replaceResponseBody as _,SchmockError as N}from"@schmock/core";var D="2.5.0";var L=new Set(["__proto__","constructor","prototype"]);function c(h){return typeof h==="object"&&h!==null}function W(h,j){try{return Object.hasOwn(h,j)?h[j]:void 0}catch{return}}function R(h){try{return typeof h==="string"?JSON.stringify(h):String(h)}catch{return"<unprintable>"}}function X(h,j,M){return new N(`queryPlugin: ${h} (received ${R(M)})`,"QUERY_CONFIG_INVALID",{option:j,received:M})}function I(h,j){if(h===void 0)return;if(typeof h!=="number"||!Number.isSafeInteger(h)||h<1)throw X(`${j} must be a positive integer`,j,h)}function Y(h,j){if(h===void 0)return;if(typeof h!=="string"||h.length===0)throw X(`${j} must be a non-empty string`,j,h)}function K(h,j){if(!Array.isArray(h))throw X(`${j} must be an array of field names`,j,h);for(let M of h){if(typeof M!=="string"||M.length===0)throw X(`${j} must contain only non-empty field names`,j,M);if(L.has(M))throw X(`${j} must not contain the reserved field name`,j,M)}}function V(h){let{allowed:j,default:M,defaultOrder:T}=h;if(Y(M,"sorting.default"),M!==void 0&&!j.includes(M))throw X("sorting.default must be one of sorting.allowed","sorting.default",M);if(T!==void 0&&T!=="asc"&&T!=="desc")throw X('sorting.defaultOrder must be "asc" or "desc"',"sorting.defaultOrder",T)}function q(h){let{pagination:j,sorting:M,filtering:T}=h;if(j)I(j.defaultLimit,"pagination.defaultLimit"),I(j.maxLimit,"pagination.maxLimit"),Y(j.pageParam,"pagination.pageParam"),Y(j.limitParam,"pagination.limitParam");if(M)K(M.allowed,"sorting.allowed"),V(M),Y(M.sortParam,"sorting.sortParam"),Y(M.orderParam,"sorting.orderParam");if(T)K(T.allowed,"filtering.allowed"),Y(T.filterPrefix,"filtering.filterPrefix")}function F(h){let{pagination:j,sorting:M,filtering:T}=h,G,Q,J;if(j){let{defaultLimit:H,maxLimit:z,pageParam:U,limitParam:Z}=j;G={defaultLimit:H,maxLimit:z,pageParam:U,limitParam:Z}}if(M){let{allowed:H,default:z,defaultOrder:U,sortParam:Z,orderParam:$}=M;Q={allowed:Array.isArray(H)?[...H]:H,default:z,defaultOrder:U,sortParam:Z,orderParam:$}}if(T){let{allowed:H,filterPrefix:z}=T;J={allowed:Array.isArray(H)?[...H]:H,filterPrefix:z}}return{pagination:G,sorting:Q,filtering:J}}function P(h){return h.kind!=="plain"&&h.status>=400}function v(h={}){let j=F(h);return q(j),{name:"query",version:D,process(M,T){let G=x(T),Q=G.body;if(!Array.isArray(Q)||P(G))return{context:M,response:T};let J=[...Q],H=M.query||{};if(j.filtering)J=E(J,H,j.filtering);if(j.sorting)J=w(J,H,j.sorting);if(j.pagination){let z=y(J,H,j.pagination);return{context:M,response:_(T,z)}}return{context:M,response:_(T,J)}}}}function E(h,j,M){let T=M.filterPrefix??"filter",G=h;for(let Q of M.allowed){let J=W(j,`${T}[${Q}]`)??W(j,`${T}.${Q}`);if(J!==void 0)G=G.filter((H)=>{if(!c(H))return!1;let z=W(H,Q);if(z===void 0)return!1;try{return String(z)===J}catch{return!1}})}return G}function O(h,j){if(h<j)return-1;return h>j?1:0}function S(h){if(h===void 0)return{kind:"missing"};if(h===null)return{kind:"null"};if(typeof h==="number")return Number.isFinite(h)?{kind:"number",value:h}:{kind:"non-finite-number",value:h};if(typeof h==="string")return{kind:"string",value:h};if(typeof h==="boolean")return{kind:"boolean",value:h};if(typeof h==="bigint")return{kind:"bigint",value:h};return{kind:"unsupported"}}function A(h){switch(h.kind){case"number":return 0;case"non-finite-number":return 1;case"string":return 2;case"boolean":return 3;case"bigint":return 4;case"null":return 5;case"unsupported":return 6;case"missing":return 7}}function C(h){if(h===Number.NEGATIVE_INFINITY)return 0;if(h===Number.POSITIVE_INFINITY)return 1;return 2}function b(h,j,M){if(h.kind==="missing"||j.kind==="missing"){if(h.kind===j.kind)return 0;return h.kind==="missing"?1:-1}if(h.kind==="unsupported"||j.kind==="unsupported"){if(h.kind===j.kind)return 0;return h.kind==="unsupported"?1:-1}let T=A(h)-A(j),G=T;if(T===0){if(h.kind==="number"&&j.kind==="number")G=h.value<j.value?-1:h.value>j.value?1:0;else if(h.kind==="non-finite-number"&&j.kind==="non-finite-number")G=C(h.value)-C(j.value);else if(h.kind==="string"&&j.kind==="string")G=O(h.value,j.value);else if(h.kind==="boolean"&&j.kind==="boolean")G=Number(h.value)-Number(j.value);else if(h.kind==="bigint"&&j.kind==="bigint")G=h.value<j.value?-1:h.value>j.value?1:0}return M==="desc"?-G:G}function w(h,j,M){let T=M.sortParam??"sort",G=M.orderParam??"order",Q=W(j,T)??M.default,J=W(j,G)??M.defaultOrder??"asc",H=typeof J==="string"&&J.toLowerCase()==="desc"?"desc":"asc";if(!Q)return h;if(!M.allowed.includes(Q))return h;return h.map((z)=>({item:z,key:S(c(z)?W(z,Q):void 0)})).sort((z,U)=>b(z.key,U.key,H)).map(({item:z})=>z)}function B(h,j){if(typeof h!=="string"||!/^[0-9]+$/.test(h))return j;let M=Number(h);return Number.isSafeInteger(M)&&M>=1?M:j}function y(h,j,M){let T=M.pageParam??"page",G=M.limitParam??"limit",Q=M.defaultLimit??10,J=M.maxLimit??100,H=B(W(j,T),1),z=Math.min(J,B(W(j,G),Q)),U=h.length,Z=Math.ceil(U/z),$=(H-1)*z;return{data:h.slice($,$+z),pagination:{page:H,limit:z,total:U,totalPages:Z}}}export{v as queryPlugin};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@schmock/query",
|
|
3
3
|
"description": "Pagination, filtering, and sorting plugin for Schmock",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.5.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -37,13 +37,13 @@
|
|
|
37
37
|
"test": "vitest run",
|
|
38
38
|
"test:watch": "vitest --watch",
|
|
39
39
|
"test:bdd": "vitest run --config vitest.config.bdd.ts",
|
|
40
|
-
"lint": "biome check src
|
|
41
|
-
"lint:fix": "biome check --write --unsafe src
|
|
40
|
+
"lint": "biome check src/",
|
|
41
|
+
"lint:fix": "biome check --write --unsafe src/",
|
|
42
42
|
"check:publish": "publint && attw --pack --ignore-rules cjs-resolves-to-esm"
|
|
43
43
|
},
|
|
44
44
|
"license": "MIT",
|
|
45
45
|
"peerDependencies": {
|
|
46
|
-
"@schmock/core": "^2.
|
|
46
|
+
"@schmock/core": "^2.5.0"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@amiceli/vitest-cucumber": "^7.0.0",
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,eAAe,CAAC;AAI9C,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC9B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,SAAS,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AA6LD,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CA2C5E;AA4JD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH"}
|