@visulima/pagination 3.0.2 → 3.0.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/CHANGELOG.md +8 -0
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +18 -14
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
## @visulima/pagination [3.0.3](https://github.com/visulima/visulima/compare/@visulima/pagination@3.0.2...@visulima/pagination@3.0.3) (2023-10-11)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* update all deps ([#215](https://github.com/visulima/visulima/issues/215)) ([c077ad8](https://github.com/visulima/visulima/commit/c077ad88a8a9427831b077bb729edd5b7e590ee8))
|
|
7
|
+
* updated deps ([b5a74f6](https://github.com/visulima/visulima/commit/b5a74f6bb8d7bf133e1df39cc67a80f93b287d1e))
|
|
8
|
+
|
|
1
9
|
## @visulima/pagination [3.0.2](https://github.com/visulima/visulima/compare/@visulima/pagination@3.0.1...@visulima/pagination@3.0.2) (2023-09-05)
|
|
2
10
|
|
|
3
11
|
|
package/dist/index.d.mts
CHANGED
|
@@ -49,11 +49,11 @@ declare class Paginator<T = unknown> extends Array<T> implements Paginator$1<T>
|
|
|
49
49
|
private readonly totalNumber;
|
|
50
50
|
readonly perPage: number;
|
|
51
51
|
currentPage: number;
|
|
52
|
+
readonly firstPage: number;
|
|
53
|
+
readonly isEmpty: boolean;
|
|
52
54
|
private qs;
|
|
53
55
|
private readonly rows;
|
|
54
56
|
private url;
|
|
55
|
-
readonly firstPage: number;
|
|
56
|
-
readonly isEmpty: boolean;
|
|
57
57
|
constructor(totalNumber: number, perPage: number, currentPage: number, ...rows: T[]);
|
|
58
58
|
all(): T[];
|
|
59
59
|
baseUrl(url: string): this;
|
|
@@ -62,12 +62,12 @@ declare class Paginator<T = unknown> extends Array<T> implements Paginator$1<T>
|
|
|
62
62
|
getPreviousPageUrl(): string | null;
|
|
63
63
|
getUrl(page: number): string;
|
|
64
64
|
getUrlsForRange(start: number, end: number): UrlsForRange;
|
|
65
|
+
queryString(values: Record<string, unknown>): this;
|
|
66
|
+
toJSON(): PaginationResult<T>;
|
|
65
67
|
get hasMorePages(): boolean;
|
|
66
68
|
get hasPages(): boolean;
|
|
67
69
|
get hasTotal(): boolean;
|
|
68
70
|
get lastPage(): number;
|
|
69
|
-
queryString(values: Record<string, unknown>): this;
|
|
70
|
-
toJSON(): PaginationResult<T>;
|
|
71
71
|
get total(): number;
|
|
72
72
|
}
|
|
73
73
|
|
package/dist/index.d.ts
CHANGED
|
@@ -49,11 +49,11 @@ declare class Paginator<T = unknown> extends Array<T> implements Paginator$1<T>
|
|
|
49
49
|
private readonly totalNumber;
|
|
50
50
|
readonly perPage: number;
|
|
51
51
|
currentPage: number;
|
|
52
|
+
readonly firstPage: number;
|
|
53
|
+
readonly isEmpty: boolean;
|
|
52
54
|
private qs;
|
|
53
55
|
private readonly rows;
|
|
54
56
|
private url;
|
|
55
|
-
readonly firstPage: number;
|
|
56
|
-
readonly isEmpty: boolean;
|
|
57
57
|
constructor(totalNumber: number, perPage: number, currentPage: number, ...rows: T[]);
|
|
58
58
|
all(): T[];
|
|
59
59
|
baseUrl(url: string): this;
|
|
@@ -62,12 +62,12 @@ declare class Paginator<T = unknown> extends Array<T> implements Paginator$1<T>
|
|
|
62
62
|
getPreviousPageUrl(): string | null;
|
|
63
63
|
getUrl(page: number): string;
|
|
64
64
|
getUrlsForRange(start: number, end: number): UrlsForRange;
|
|
65
|
+
queryString(values: Record<string, unknown>): this;
|
|
66
|
+
toJSON(): PaginationResult<T>;
|
|
65
67
|
get hasMorePages(): boolean;
|
|
66
68
|
get hasPages(): boolean;
|
|
67
69
|
get hasTotal(): boolean;
|
|
68
70
|
get lastPage(): number;
|
|
69
|
-
queryString(values: Record<string, unknown>): this;
|
|
70
|
-
toJSON(): PaginationResult<T>;
|
|
71
71
|
get total(): number;
|
|
72
72
|
}
|
|
73
73
|
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var qs = require('qs');
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var g__default = /*#__PURE__*/_interopDefault(g);
|
|
8
|
-
|
|
9
|
-
var i=class extends Array{constructor(e,a,s,...r){super(...r);this.totalNumber=e;this.perPage=a;this.currentPage=s;this.qs={};this.url="/";this.firstPage=1;this.totalNumber=Number(e),this.rows=r,this.isEmpty=this.rows.length===0;}all(){return this.rows}baseUrl(e){return this.url=e,this}getMeta(){return {firstPage:this.firstPage,firstPageUrl:this.getUrl(1),lastPage:this.lastPage,lastPageUrl:this.getUrl(this.lastPage),nextPageUrl:this.getNextPageUrl(),page:this.currentPage,perPage:this.perPage,previousPageUrl:this.getPreviousPageUrl(),total:this.total}}getNextPageUrl(){return this.hasMorePages?this.getUrl(this.currentPage+1):null}getPreviousPageUrl(){return this.currentPage>1?this.getUrl(this.currentPage-1):null}getUrl(e){let a=g__default.default.stringify({...this.qs,page:e<1?1:e});return `${this.url}?${a}`}getUrlsForRange(e,a){let s=[];for(let r=e;r<=a;r++)s.push({isActive:r===this.currentPage,page:r,url:this.getUrl(r)});return s}get hasMorePages(){return this.lastPage>this.currentPage}get hasPages(){return this.lastPage!==1}get hasTotal(){return this.total>0}get lastPage(){return Math.max(Math.ceil(this.total/this.perPage),1)}queryString(e){return this.qs=e,this}toJSON(){return {data:this.all(),meta:this.getMeta()}}get total(){return Number(this.totalNumber)}};var l=(t="PaginationData")=>({[t]:{properties:{firstPage:{description:"Returns the number for the first page. It is always 1",minimum:0,type:"integer"},firstPageUrl:{description:"The URL for the first page",type:"string"},lastPage:{description:"Returns the value for the last page by taking the total of rows into account",minimum:0,type:"integer"},lastPageUrl:{description:"The URL for the last page",type:"string"},nextPageUrl:{description:"The URL for the next page",type:"string"},page:{description:"Current page number",minimum:1,type:"integer"},perPage:{description:"Returns the value for the limit passed to the paginate method",minimum:0,type:"integer"},previousPageUrl:{description:"The URL for the previous page",type:"string"},total:{description:"Holds the value for the total number of rows in the database",minimum:0,type:"integer"}},type:"object",xml:{name:t}}}),u=(t,n,e="#/components/schemas/PaginationData")=>({[t]:{properties:{data:{items:n,type:"array",xml:{name:"data",wrapped:!0}},meta:{$ref:e}},type:"object",xml:{name:t}}});var f=(t,n,e,a)=>new i(e,Number(n),Number(t),...a);
|
|
5
|
+
var i=class extends Array{constructor(e,a,s,...r){super(...r);this.totalNumber=e;this.perPage=a;this.currentPage=s;this.firstPage=1;this.qs={};this.url="/";this.totalNumber=Number(e),this.rows=r,this.isEmpty=this.rows.length===0;}all(){return this.rows}baseUrl(e){return this.url=e,this}getMeta(){return {firstPage:this.firstPage,firstPageUrl:this.getUrl(1),lastPage:this.lastPage,lastPageUrl:this.getUrl(this.lastPage),nextPageUrl:this.getNextPageUrl(),page:this.currentPage,perPage:this.perPage,previousPageUrl:this.getPreviousPageUrl(),total:this.total}}getNextPageUrl(){return this.hasMorePages?this.getUrl(this.currentPage+1):null}getPreviousPageUrl(){return this.currentPage>1?this.getUrl(this.currentPage-1):null}getUrl(e){let a=qs.stringify({...this.qs,page:e<1?1:e});return `${this.url}?${a}`}getUrlsForRange(e,a){let s=[];for(let r=e;r<=a;r++)s.push({isActive:r===this.currentPage,page:r,url:this.getUrl(r)});return s}queryString(e){return this.qs=e,this}toJSON(){return {data:this.all(),meta:this.getMeta()}}get hasMorePages(){return this.lastPage>this.currentPage}get hasPages(){return this.lastPage!==1}get hasTotal(){return this.total>0}get lastPage(){return Math.max(Math.ceil(this.total/this.perPage),1)}get total(){return Number(this.totalNumber)}};var l=(t="PaginationData")=>({[t]:{properties:{firstPage:{description:"Returns the number for the first page. It is always 1",minimum:0,type:"integer"},firstPageUrl:{description:"The URL for the first page",type:"string"},lastPage:{description:"Returns the value for the last page by taking the total of rows into account",minimum:0,type:"integer"},lastPageUrl:{description:"The URL for the last page",type:"string"},nextPageUrl:{description:"The URL for the next page",type:"string"},page:{description:"Current page number",minimum:1,type:"integer"},perPage:{description:"Returns the value for the limit passed to the paginate method",minimum:0,type:"integer"},previousPageUrl:{description:"The URL for the previous page",type:"string"},total:{description:"Holds the value for the total number of rows in the database",minimum:0,type:"integer"}},type:"object",xml:{name:t}}}),u=(t,n,e="#/components/schemas/PaginationData")=>({[t]:{properties:{data:{items:n,type:"array",xml:{name:"data",wrapped:!0}},meta:{$ref:e}},type:"object",xml:{name:t}}});var f=(t,n,e,a)=>new i(e,Number(n),Number(t),...a);
|
|
10
6
|
|
|
11
7
|
exports.Paginator = i;
|
|
12
8
|
exports.createPaginationMetaSchemaObject = l;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/paginator.ts","../src/swagger.ts","../src/index.ts"],"names":["qs","Paginator","totalNumber","perPage","currentPage","rows","url","page","qstring","start","end","urls","index","values","createPaginationMetaSchemaObject","name","createPaginationSchemaObject","items","metaReference","paginate","total"],"mappings":"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","sourcesContent":["import qs from \"qs\";\n\nimport type { Paginator as IPaginator, PaginationMeta, PaginationResult } from \"./types\";\n\ntype UrlsForRange = { isActive: boolean; page: number; url: string }[];\n\n/**\n * Simple paginator works with the data set provided by the standard\n * `offset` and `limit` based pagination.\n */\nexport default class Paginator<T = unknown> extends Array<T> implements IPaginator<T> {\n private qs: Record<string, unknown> = {};\n\n private readonly rows: T[];\n\n private url = \"/\";\n\n /**\n * The first page is always 1\n */\n public readonly firstPage: number = 1;\n\n /**\n * Find if results set is empty or not\n */\n public readonly isEmpty: boolean;\n\n public constructor(\n private readonly totalNumber: number,\n public readonly perPage: number,\n public currentPage: number,\n ...rows: T[]\n ) {\n super(...rows);\n\n this.totalNumber = Number(totalNumber);\n\n this.rows = rows;\n this.isEmpty = this.rows.length === 0;\n }\n\n /**\n * A reference to the result rows\n */\n public all(): T[] {\n return this.rows;\n }\n\n /**\n * Define base url for making the pagination links\n */\n public baseUrl(url: string): this {\n this.url = url;\n\n return this;\n }\n\n /**\n * Returns JSON meta data\n */\n public getMeta(): PaginationMeta {\n return {\n firstPage: this.firstPage,\n firstPageUrl: this.getUrl(1),\n lastPage: this.lastPage,\n lastPageUrl: this.getUrl(this.lastPage),\n nextPageUrl: this.getNextPageUrl(),\n page: this.currentPage,\n perPage: this.perPage,\n previousPageUrl: this.getPreviousPageUrl(),\n total: this.total,\n };\n }\n\n /**\n * Returns url for the next page\n */\n public getNextPageUrl(): string | null {\n if (this.hasMorePages) {\n return this.getUrl(this.currentPage + 1);\n }\n\n return null;\n }\n\n /**\n * Returns URL for the previous page\n */\n public getPreviousPageUrl(): string | null {\n if (this.currentPage > 1) {\n return this.getUrl(this.currentPage - 1);\n }\n\n return null;\n }\n\n /**\n * Returns url for a given page. Doesn't validate the integrity of the\n * page\n */\n public getUrl(page: number): string {\n const qstring = qs.stringify({ ...this.qs, page: page < 1 ? 1 : page });\n\n return `${this.url}?${qstring}`;\n }\n\n /**\n * Returns an array of urls under a given range\n */\n public getUrlsForRange(start: number, end: number): UrlsForRange {\n const urls: UrlsForRange = [];\n\n // eslint-disable-next-line no-plusplus\n for (let index = start; index <= end; index++) {\n urls.push({ isActive: index === this.currentPage, page: index, url: this.getUrl(index) });\n }\n\n return urls;\n }\n\n /**\n * Find if there are more pages to come\n */\n public get hasMorePages(): boolean {\n return this.lastPage > this.currentPage;\n }\n\n /**\n * Find if there are enough results to be paginated or not\n */\n public get hasPages(): boolean {\n return this.lastPage !== 1;\n }\n\n /**\n * Find if there are total records or not. This is not same as\n * `isEmpty`.\n *\n * The `isEmpty` reports about the current set of results. However, `hasTotal`\n * reports about the total number of records, regardless of the current.\n */\n public get hasTotal(): boolean {\n return this.total > 0;\n }\n\n /**\n * The Last page number\n */\n public get lastPage(): number {\n return Math.max(Math.ceil(this.total / this.perPage), 1);\n }\n\n /**\n * Define query string to be appended to the pagination links\n */\n public queryString(values: Record<string, unknown>): this {\n this.qs = values;\n\n return this;\n }\n\n /**\n * Returns JSON representation of the paginated\n * data\n */\n public toJSON(): PaginationResult<T> {\n return {\n data: this.all(),\n meta: this.getMeta(),\n };\n }\n\n /**\n * Casting `total` to a number. Later, we can think of situations\n * to cast it to a bigint\n */\n public get total(): number {\n return Number(this.totalNumber);\n }\n}\n","import type { OpenAPIV3 } from \"openapi-types\";\n\nexport const createPaginationMetaSchemaObject = (name = \"PaginationData\"): Record<string, OpenAPIV3.SchemaObject> => {\n return {\n [name]: {\n properties: {\n firstPage: {\n description: \"Returns the number for the first page. It is always 1\",\n minimum: 0,\n type: \"integer\",\n },\n firstPageUrl: {\n description: \"The URL for the first page\",\n type: \"string\",\n },\n lastPage: {\n description: \"Returns the value for the last page by taking the total of rows into account\",\n minimum: 0,\n type: \"integer\",\n },\n lastPageUrl: {\n description: \"The URL for the last page\",\n type: \"string\",\n },\n nextPageUrl: {\n description: \"The URL for the next page\",\n type: \"string\",\n },\n page: {\n description: \"Current page number\",\n minimum: 1,\n type: \"integer\",\n },\n perPage: {\n description: \"Returns the value for the limit passed to the paginate method\",\n minimum: 0,\n type: \"integer\",\n },\n previousPageUrl: {\n description: \"The URL for the previous page\",\n type: \"string\",\n },\n total: {\n description: \"Holds the value for the total number of rows in the database\",\n minimum: 0,\n type: \"integer\",\n },\n },\n type: \"object\",\n xml: {\n name,\n },\n },\n };\n};\n\nexport const createPaginationSchemaObject = (\n name: string,\n items: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject,\n metaReference = \"#/components/schemas/PaginationData\",\n): Record<string, OpenAPIV3.SchemaObject> => {\n return {\n [name]: {\n properties: {\n data: {\n items,\n type: \"array\",\n xml: {\n name: \"data\",\n wrapped: true,\n },\n },\n meta: {\n $ref: metaReference,\n },\n },\n type: \"object\",\n xml: {\n name,\n },\n },\n };\n};\n","import Paginator from \"./paginator\";\nimport type { Paginator as PaginatorInterface } from \"./types\";\n\nexport { default as Paginator } from \"./paginator\";\nexport { createPaginationMetaSchemaObject, createPaginationSchemaObject } from \"./swagger\";\n\nexport const paginate = <Result>(page: number, perPage: number, total: number, rows: Result[]): PaginatorInterface<Result> =>\n new Paginator(total, Number(perPage), Number(page), ...rows);\n\nexport type { PaginationMeta, PaginationResult, Paginator as PaginatorInterface } from \"./types.d\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/paginator.ts","../src/swagger.ts","../src/index.ts"],"names":["stringify","Paginator","totalNumber","perPage","currentPage","rows","url","page","qstring","start","end","urls","index","values","createPaginationMetaSchemaObject","name","createPaginationSchemaObject","items","metaReference","paginate","total"],"mappings":"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","sourcesContent":["import { stringify } from \"qs\";\n\nimport type { PaginationMeta, PaginationResult, Paginator as IPaginator } from \"./types\";\n\ntype UrlsForRange = { isActive: boolean; page: number; url: string }[];\n\n/**\n * Simple paginator works with the data set provided by the standard\n * `offset` and `limit` based pagination.\n */\nexport default class Paginator<T = unknown> extends Array<T> implements IPaginator<T> {\n /**\n * The first page is always 1\n */\n public readonly firstPage: number = 1;\n\n /**\n * Find if results set is empty or not\n */\n public readonly isEmpty: boolean;\n\n private qs: Record<string, unknown> = {};\n\n private readonly rows: T[];\n\n private url = \"/\";\n\n public constructor(\n private readonly totalNumber: number,\n public readonly perPage: number,\n public currentPage: number,\n ...rows: T[]\n ) {\n super(...rows);\n\n this.totalNumber = Number(totalNumber);\n\n this.rows = rows;\n this.isEmpty = this.rows.length === 0;\n }\n\n /**\n * A reference to the result rows\n */\n public all(): T[] {\n return this.rows;\n }\n\n /**\n * Define base url for making the pagination links\n */\n public baseUrl(url: string): this {\n this.url = url;\n\n return this;\n }\n\n /**\n * Returns JSON meta data\n */\n public getMeta(): PaginationMeta {\n return {\n firstPage: this.firstPage,\n firstPageUrl: this.getUrl(1),\n lastPage: this.lastPage,\n lastPageUrl: this.getUrl(this.lastPage),\n nextPageUrl: this.getNextPageUrl(),\n page: this.currentPage,\n perPage: this.perPage,\n previousPageUrl: this.getPreviousPageUrl(),\n total: this.total,\n };\n }\n\n /**\n * Returns url for the next page\n */\n public getNextPageUrl(): string | null {\n if (this.hasMorePages) {\n return this.getUrl(this.currentPage + 1);\n }\n\n return null;\n }\n\n /**\n * Returns URL for the previous page\n */\n public getPreviousPageUrl(): string | null {\n if (this.currentPage > 1) {\n return this.getUrl(this.currentPage - 1);\n }\n\n return null;\n }\n\n /**\n * Returns url for a given page. Doesn't validate the integrity of the\n * page\n */\n public getUrl(page: number): string {\n const qstring = stringify({ ...this.qs, page: page < 1 ? 1 : page });\n\n return `${this.url}?${qstring}`;\n }\n\n /**\n * Returns an array of urls under a given range\n */\n public getUrlsForRange(start: number, end: number): UrlsForRange {\n const urls: UrlsForRange = [];\n\n // eslint-disable-next-line no-plusplus,no-loops/no-loops\n for (let index = start; index <= end; index++) {\n urls.push({ isActive: index === this.currentPage, page: index, url: this.getUrl(index) });\n }\n\n return urls;\n }\n\n /**\n * Define query string to be appended to the pagination links\n */\n public queryString(values: Record<string, unknown>): this {\n this.qs = values;\n\n return this;\n }\n\n /**\n * Returns JSON representation of the paginated\n * data\n */\n public toJSON(): PaginationResult<T> {\n return {\n data: this.all(),\n meta: this.getMeta(),\n };\n }\n\n /**\n * Find if there are more pages to come\n */\n public get hasMorePages(): boolean {\n return this.lastPage > this.currentPage;\n }\n\n /**\n * Find if there are enough results to be paginated or not\n */\n public get hasPages(): boolean {\n return this.lastPage !== 1;\n }\n\n /**\n * Find if there are total records or not. This is not same as\n * `isEmpty`.\n *\n * The `isEmpty` reports about the current set of results. However, `hasTotal`\n * reports about the total number of records, regardless of the current.\n */\n public get hasTotal(): boolean {\n return this.total > 0;\n }\n\n /**\n * The Last page number\n */\n public get lastPage(): number {\n return Math.max(Math.ceil(this.total / this.perPage), 1);\n }\n\n /**\n * Casting `total` to a number. Later, we can think of situations\n * to cast it to a bigint\n */\n public get total(): number {\n return Number(this.totalNumber);\n }\n}\n","import type { OpenAPIV3 } from \"openapi-types\";\n\nexport const createPaginationMetaSchemaObject = (name = \"PaginationData\"): Record<string, OpenAPIV3.SchemaObject> => {\n return {\n [name]: {\n properties: {\n firstPage: {\n description: \"Returns the number for the first page. It is always 1\",\n minimum: 0,\n type: \"integer\",\n },\n firstPageUrl: {\n description: \"The URL for the first page\",\n type: \"string\",\n },\n lastPage: {\n description: \"Returns the value for the last page by taking the total of rows into account\",\n minimum: 0,\n type: \"integer\",\n },\n lastPageUrl: {\n description: \"The URL for the last page\",\n type: \"string\",\n },\n nextPageUrl: {\n description: \"The URL for the next page\",\n type: \"string\",\n },\n page: {\n description: \"Current page number\",\n minimum: 1,\n type: \"integer\",\n },\n perPage: {\n description: \"Returns the value for the limit passed to the paginate method\",\n minimum: 0,\n type: \"integer\",\n },\n previousPageUrl: {\n description: \"The URL for the previous page\",\n type: \"string\",\n },\n total: {\n description: \"Holds the value for the total number of rows in the database\",\n minimum: 0,\n type: \"integer\",\n },\n },\n type: \"object\",\n xml: {\n name,\n },\n },\n };\n};\n\nexport const createPaginationSchemaObject = (\n name: string,\n items: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject,\n metaReference = \"#/components/schemas/PaginationData\",\n): Record<string, OpenAPIV3.SchemaObject> => {\n return {\n [name]: {\n properties: {\n data: {\n items,\n type: \"array\",\n xml: {\n name: \"data\",\n wrapped: true,\n },\n },\n meta: {\n $ref: metaReference,\n },\n },\n type: \"object\",\n xml: {\n name,\n },\n },\n };\n};\n","import Paginator from \"./paginator\";\nimport type { Paginator as PaginatorInterface } from \"./types\";\n\nexport { default as Paginator } from \"./paginator\";\nexport { createPaginationMetaSchemaObject, createPaginationSchemaObject } from \"./swagger\";\n\nexport const paginate = <Result>(page: number, perPage: number, total: number, rows: Result[]): PaginatorInterface<Result> =>\n new Paginator(total, Number(perPage), Number(page), ...rows);\n\nexport type { PaginationMeta, PaginationResult, Paginator as PaginatorInterface } from \"./types.d\";\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { stringify } from 'qs';
|
|
2
2
|
|
|
3
|
-
var i=class extends Array{constructor(e,a,s,...r){super(...r);this.totalNumber=e;this.perPage=a;this.currentPage=s;this.qs={};this.url="/";this.
|
|
3
|
+
var i=class extends Array{constructor(e,a,s,...r){super(...r);this.totalNumber=e;this.perPage=a;this.currentPage=s;this.firstPage=1;this.qs={};this.url="/";this.totalNumber=Number(e),this.rows=r,this.isEmpty=this.rows.length===0;}all(){return this.rows}baseUrl(e){return this.url=e,this}getMeta(){return {firstPage:this.firstPage,firstPageUrl:this.getUrl(1),lastPage:this.lastPage,lastPageUrl:this.getUrl(this.lastPage),nextPageUrl:this.getNextPageUrl(),page:this.currentPage,perPage:this.perPage,previousPageUrl:this.getPreviousPageUrl(),total:this.total}}getNextPageUrl(){return this.hasMorePages?this.getUrl(this.currentPage+1):null}getPreviousPageUrl(){return this.currentPage>1?this.getUrl(this.currentPage-1):null}getUrl(e){let a=stringify({...this.qs,page:e<1?1:e});return `${this.url}?${a}`}getUrlsForRange(e,a){let s=[];for(let r=e;r<=a;r++)s.push({isActive:r===this.currentPage,page:r,url:this.getUrl(r)});return s}queryString(e){return this.qs=e,this}toJSON(){return {data:this.all(),meta:this.getMeta()}}get hasMorePages(){return this.lastPage>this.currentPage}get hasPages(){return this.lastPage!==1}get hasTotal(){return this.total>0}get lastPage(){return Math.max(Math.ceil(this.total/this.perPage),1)}get total(){return Number(this.totalNumber)}};var u=(t="PaginationData")=>({[t]:{properties:{firstPage:{description:"Returns the number for the first page. It is always 1",minimum:0,type:"integer"},firstPageUrl:{description:"The URL for the first page",type:"string"},lastPage:{description:"Returns the value for the last page by taking the total of rows into account",minimum:0,type:"integer"},lastPageUrl:{description:"The URL for the last page",type:"string"},nextPageUrl:{description:"The URL for the next page",type:"string"},page:{description:"Current page number",minimum:1,type:"integer"},perPage:{description:"Returns the value for the limit passed to the paginate method",minimum:0,type:"integer"},previousPageUrl:{description:"The URL for the previous page",type:"string"},total:{description:"Holds the value for the total number of rows in the database",minimum:0,type:"integer"}},type:"object",xml:{name:t}}}),p=(t,n,e="#/components/schemas/PaginationData")=>({[t]:{properties:{data:{items:n,type:"array",xml:{name:"data",wrapped:!0}},meta:{$ref:e}},type:"object",xml:{name:t}}});var y=(t,n,e,a)=>new i(e,Number(n),Number(t),...a);
|
|
4
4
|
|
|
5
5
|
export { i as Paginator, u as createPaginationMetaSchemaObject, p as createPaginationSchemaObject, y as paginate };
|
|
6
6
|
//# sourceMappingURL=out.js.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/paginator.ts","../src/swagger.ts","../src/index.ts"],"names":["qs","Paginator","totalNumber","perPage","currentPage","rows","url","page","qstring","start","end","urls","index","values","createPaginationMetaSchemaObject","name","createPaginationSchemaObject","items","metaReference","paginate","total"],"mappings":"AAAA,OAAOA,MAAQ,KAUf,IAAqBC,EAArB,cAAoD,KAAkC,CAiB3E,YACcC,EACDC,EACTC,KACJC,EACL,CACE,MAAM,GAAGA,CAAI,EALI,iBAAAH,EACD,aAAAC,EACT,iBAAAC,EAnBX,KAAQ,GAA8B,CAAC,EAIvC,KAAQ,IAAM,IAKd,KAAgB,UAAoB,EAehC,KAAK,YAAc,OAAOF,CAAW,EAErC,KAAK,KAAOG,EACZ,KAAK,QAAU,KAAK,KAAK,SAAW,CACxC,CAKO,KAAW,CACd,OAAO,KAAK,IAChB,CAKO,QAAQC,EAAmB,CAC9B,YAAK,IAAMA,EAEJ,IACX,CAKO,SAA0B,CAC7B,MAAO,CACH,UAAW,KAAK,UAChB,aAAc,KAAK,OAAO,CAAC,EAC3B,SAAU,KAAK,SACf,YAAa,KAAK,OAAO,KAAK,QAAQ,EACtC,YAAa,KAAK,eAAe,EACjC,KAAM,KAAK,YACX,QAAS,KAAK,QACd,gBAAiB,KAAK,mBAAmB,EACzC,MAAO,KAAK,KAChB,CACJ,CAKO,gBAAgC,CACnC,OAAI,KAAK,aACE,KAAK,OAAO,KAAK,YAAc,CAAC,EAGpC,IACX,CAKO,oBAAoC,CACvC,OAAI,KAAK,YAAc,EACZ,KAAK,OAAO,KAAK,YAAc,CAAC,EAGpC,IACX,CAMO,OAAOC,EAAsB,CAChC,IAAMC,EAAUR,EAAG,UAAU,CAAE,GAAG,KAAK,GAAI,KAAMO,EAAO,EAAI,EAAIA,CAAK,CAAC,EAEtE,MAAO,GAAG,KAAK,GAAG,IAAIC,CAAO,EACjC,CAKO,gBAAgBC,EAAeC,EAA2B,CAC7D,IAAMC,EAAqB,CAAC,EAG5B,QAASC,EAAQH,EAAOG,GAASF,EAAKE,IAClCD,EAAK,KAAK,CAAE,SAAUC,IAAU,KAAK,YAAa,KAAMA,EAAO,IAAK,KAAK,OAAOA,CAAK,CAAE,CAAC,EAG5F,OAAOD,CACX,CAKA,IAAW,cAAwB,CAC/B,OAAO,KAAK,SAAW,KAAK,WAChC,CAKA,IAAW,UAAoB,CAC3B,OAAO,KAAK,WAAa,CAC7B,CASA,IAAW,UAAoB,CAC3B,OAAO,KAAK,MAAQ,CACxB,CAKA,IAAW,UAAmB,CAC1B,OAAO,KAAK,IAAI,KAAK,KAAK,KAAK,MAAQ,KAAK,OAAO,EAAG,CAAC,CAC3D,CAKO,YAAYE,EAAuC,CACtD,YAAK,GAAKA,EAEH,IACX,CAMO,QAA8B,CACjC,MAAO,CACH,KAAM,KAAK,IAAI,EACf,KAAM,KAAK,QAAQ,CACvB,CACJ,CAMA,IAAW,OAAgB,CACvB,OAAO,OAAO,KAAK,WAAW,CAClC,CACJ,ECjLO,IAAMC,EAAmC,CAACC,EAAO,oBAC7C,CACH,CAACA,CAAI,EAAG,CACJ,WAAY,CACR,UAAW,CACP,YAAa,wDACb,QAAS,EACT,KAAM,SACV,EACA,aAAc,CACV,YAAa,6BACb,KAAM,QACV,EACA,SAAU,CACN,YAAa,+EACb,QAAS,EACT,KAAM,SACV,EACA,YAAa,CACT,YAAa,4BACb,KAAM,QACV,EACA,YAAa,CACT,YAAa,4BACb,KAAM,QACV,EACA,KAAM,CACF,YAAa,sBACb,QAAS,EACT,KAAM,SACV,EACA,QAAS,CACL,YAAa,gEACb,QAAS,EACT,KAAM,SACV,EACA,gBAAiB,CACb,YAAa,gCACb,KAAM,QACV,EACA,MAAO,CACH,YAAa,+DACb,QAAS,EACT,KAAM,SACV,CACJ,EACA,KAAM,SACN,IAAK,CACD,KAAAA,CACJ,CACJ,CACJ,GAGSC,EAA+B,CACxCD,EACAE,EACAC,EAAgB,yCAET,CACH,CAACH,CAAI,EAAG,CACJ,WAAY,CACR,KAAM,CACF,MAAAE,EACA,KAAM,QACN,IAAK,CACD,KAAM,OACN,QAAS,EACb,CACJ,EACA,KAAM,CACF,KAAMC,CACV,CACJ,EACA,KAAM,SACN,IAAK,CACD,KAAAH,CACJ,CACJ,CACJ,GC3EG,IAAMI,EAAW,CAASZ,EAAcJ,EAAiBiB,EAAef,IAC3E,IAAIJ,EAAUmB,EAAO,OAAOjB,CAAO,EAAG,OAAOI,CAAI,EAAG,GAAGF,CAAI","sourcesContent":["import qs from \"qs\";\n\nimport type { Paginator as IPaginator, PaginationMeta, PaginationResult } from \"./types\";\n\ntype UrlsForRange = { isActive: boolean; page: number; url: string }[];\n\n/**\n * Simple paginator works with the data set provided by the standard\n * `offset` and `limit` based pagination.\n */\nexport default class Paginator<T = unknown> extends Array<T> implements IPaginator<T> {\n private qs: Record<string, unknown> = {};\n\n private readonly rows: T[];\n\n private url = \"/\";\n\n /**\n * The first page is always 1\n */\n public readonly firstPage: number = 1;\n\n /**\n * Find if results set is empty or not\n */\n public readonly isEmpty: boolean;\n\n public constructor(\n private readonly totalNumber: number,\n public readonly perPage: number,\n public currentPage: number,\n ...rows: T[]\n ) {\n super(...rows);\n\n this.totalNumber = Number(totalNumber);\n\n this.rows = rows;\n this.isEmpty = this.rows.length === 0;\n }\n\n /**\n * A reference to the result rows\n */\n public all(): T[] {\n return this.rows;\n }\n\n /**\n * Define base url for making the pagination links\n */\n public baseUrl(url: string): this {\n this.url = url;\n\n return this;\n }\n\n /**\n * Returns JSON meta data\n */\n public getMeta(): PaginationMeta {\n return {\n firstPage: this.firstPage,\n firstPageUrl: this.getUrl(1),\n lastPage: this.lastPage,\n lastPageUrl: this.getUrl(this.lastPage),\n nextPageUrl: this.getNextPageUrl(),\n page: this.currentPage,\n perPage: this.perPage,\n previousPageUrl: this.getPreviousPageUrl(),\n total: this.total,\n };\n }\n\n /**\n * Returns url for the next page\n */\n public getNextPageUrl(): string | null {\n if (this.hasMorePages) {\n return this.getUrl(this.currentPage + 1);\n }\n\n return null;\n }\n\n /**\n * Returns URL for the previous page\n */\n public getPreviousPageUrl(): string | null {\n if (this.currentPage > 1) {\n return this.getUrl(this.currentPage - 1);\n }\n\n return null;\n }\n\n /**\n * Returns url for a given page. Doesn't validate the integrity of the\n * page\n */\n public getUrl(page: number): string {\n const qstring = qs.stringify({ ...this.qs, page: page < 1 ? 1 : page });\n\n return `${this.url}?${qstring}`;\n }\n\n /**\n * Returns an array of urls under a given range\n */\n public getUrlsForRange(start: number, end: number): UrlsForRange {\n const urls: UrlsForRange = [];\n\n // eslint-disable-next-line no-plusplus\n for (let index = start; index <= end; index++) {\n urls.push({ isActive: index === this.currentPage, page: index, url: this.getUrl(index) });\n }\n\n return urls;\n }\n\n /**\n * Find if there are more pages to come\n */\n public get hasMorePages(): boolean {\n return this.lastPage > this.currentPage;\n }\n\n /**\n * Find if there are enough results to be paginated or not\n */\n public get hasPages(): boolean {\n return this.lastPage !== 1;\n }\n\n /**\n * Find if there are total records or not. This is not same as\n * `isEmpty`.\n *\n * The `isEmpty` reports about the current set of results. However, `hasTotal`\n * reports about the total number of records, regardless of the current.\n */\n public get hasTotal(): boolean {\n return this.total > 0;\n }\n\n /**\n * The Last page number\n */\n public get lastPage(): number {\n return Math.max(Math.ceil(this.total / this.perPage), 1);\n }\n\n /**\n * Define query string to be appended to the pagination links\n */\n public queryString(values: Record<string, unknown>): this {\n this.qs = values;\n\n return this;\n }\n\n /**\n * Returns JSON representation of the paginated\n * data\n */\n public toJSON(): PaginationResult<T> {\n return {\n data: this.all(),\n meta: this.getMeta(),\n };\n }\n\n /**\n * Casting `total` to a number. Later, we can think of situations\n * to cast it to a bigint\n */\n public get total(): number {\n return Number(this.totalNumber);\n }\n}\n","import type { OpenAPIV3 } from \"openapi-types\";\n\nexport const createPaginationMetaSchemaObject = (name = \"PaginationData\"): Record<string, OpenAPIV3.SchemaObject> => {\n return {\n [name]: {\n properties: {\n firstPage: {\n description: \"Returns the number for the first page. It is always 1\",\n minimum: 0,\n type: \"integer\",\n },\n firstPageUrl: {\n description: \"The URL for the first page\",\n type: \"string\",\n },\n lastPage: {\n description: \"Returns the value for the last page by taking the total of rows into account\",\n minimum: 0,\n type: \"integer\",\n },\n lastPageUrl: {\n description: \"The URL for the last page\",\n type: \"string\",\n },\n nextPageUrl: {\n description: \"The URL for the next page\",\n type: \"string\",\n },\n page: {\n description: \"Current page number\",\n minimum: 1,\n type: \"integer\",\n },\n perPage: {\n description: \"Returns the value for the limit passed to the paginate method\",\n minimum: 0,\n type: \"integer\",\n },\n previousPageUrl: {\n description: \"The URL for the previous page\",\n type: \"string\",\n },\n total: {\n description: \"Holds the value for the total number of rows in the database\",\n minimum: 0,\n type: \"integer\",\n },\n },\n type: \"object\",\n xml: {\n name,\n },\n },\n };\n};\n\nexport const createPaginationSchemaObject = (\n name: string,\n items: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject,\n metaReference = \"#/components/schemas/PaginationData\",\n): Record<string, OpenAPIV3.SchemaObject> => {\n return {\n [name]: {\n properties: {\n data: {\n items,\n type: \"array\",\n xml: {\n name: \"data\",\n wrapped: true,\n },\n },\n meta: {\n $ref: metaReference,\n },\n },\n type: \"object\",\n xml: {\n name,\n },\n },\n };\n};\n","import Paginator from \"./paginator\";\nimport type { Paginator as PaginatorInterface } from \"./types\";\n\nexport { default as Paginator } from \"./paginator\";\nexport { createPaginationMetaSchemaObject, createPaginationSchemaObject } from \"./swagger\";\n\nexport const paginate = <Result>(page: number, perPage: number, total: number, rows: Result[]): PaginatorInterface<Result> =>\n new Paginator(total, Number(perPage), Number(page), ...rows);\n\nexport type { PaginationMeta, PaginationResult, Paginator as PaginatorInterface } from \"./types.d\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/paginator.ts","../src/swagger.ts","../src/index.ts"],"names":["stringify","Paginator","totalNumber","perPage","currentPage","rows","url","page","qstring","start","end","urls","index","values","createPaginationMetaSchemaObject","name","createPaginationSchemaObject","items","metaReference","paginate","total"],"mappings":"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","sourcesContent":["import { stringify } from \"qs\";\n\nimport type { PaginationMeta, PaginationResult, Paginator as IPaginator } from \"./types\";\n\ntype UrlsForRange = { isActive: boolean; page: number; url: string }[];\n\n/**\n * Simple paginator works with the data set provided by the standard\n * `offset` and `limit` based pagination.\n */\nexport default class Paginator<T = unknown> extends Array<T> implements IPaginator<T> {\n /**\n * The first page is always 1\n */\n public readonly firstPage: number = 1;\n\n /**\n * Find if results set is empty or not\n */\n public readonly isEmpty: boolean;\n\n private qs: Record<string, unknown> = {};\n\n private readonly rows: T[];\n\n private url = \"/\";\n\n public constructor(\n private readonly totalNumber: number,\n public readonly perPage: number,\n public currentPage: number,\n ...rows: T[]\n ) {\n super(...rows);\n\n this.totalNumber = Number(totalNumber);\n\n this.rows = rows;\n this.isEmpty = this.rows.length === 0;\n }\n\n /**\n * A reference to the result rows\n */\n public all(): T[] {\n return this.rows;\n }\n\n /**\n * Define base url for making the pagination links\n */\n public baseUrl(url: string): this {\n this.url = url;\n\n return this;\n }\n\n /**\n * Returns JSON meta data\n */\n public getMeta(): PaginationMeta {\n return {\n firstPage: this.firstPage,\n firstPageUrl: this.getUrl(1),\n lastPage: this.lastPage,\n lastPageUrl: this.getUrl(this.lastPage),\n nextPageUrl: this.getNextPageUrl(),\n page: this.currentPage,\n perPage: this.perPage,\n previousPageUrl: this.getPreviousPageUrl(),\n total: this.total,\n };\n }\n\n /**\n * Returns url for the next page\n */\n public getNextPageUrl(): string | null {\n if (this.hasMorePages) {\n return this.getUrl(this.currentPage + 1);\n }\n\n return null;\n }\n\n /**\n * Returns URL for the previous page\n */\n public getPreviousPageUrl(): string | null {\n if (this.currentPage > 1) {\n return this.getUrl(this.currentPage - 1);\n }\n\n return null;\n }\n\n /**\n * Returns url for a given page. Doesn't validate the integrity of the\n * page\n */\n public getUrl(page: number): string {\n const qstring = stringify({ ...this.qs, page: page < 1 ? 1 : page });\n\n return `${this.url}?${qstring}`;\n }\n\n /**\n * Returns an array of urls under a given range\n */\n public getUrlsForRange(start: number, end: number): UrlsForRange {\n const urls: UrlsForRange = [];\n\n // eslint-disable-next-line no-plusplus,no-loops/no-loops\n for (let index = start; index <= end; index++) {\n urls.push({ isActive: index === this.currentPage, page: index, url: this.getUrl(index) });\n }\n\n return urls;\n }\n\n /**\n * Define query string to be appended to the pagination links\n */\n public queryString(values: Record<string, unknown>): this {\n this.qs = values;\n\n return this;\n }\n\n /**\n * Returns JSON representation of the paginated\n * data\n */\n public toJSON(): PaginationResult<T> {\n return {\n data: this.all(),\n meta: this.getMeta(),\n };\n }\n\n /**\n * Find if there are more pages to come\n */\n public get hasMorePages(): boolean {\n return this.lastPage > this.currentPage;\n }\n\n /**\n * Find if there are enough results to be paginated or not\n */\n public get hasPages(): boolean {\n return this.lastPage !== 1;\n }\n\n /**\n * Find if there are total records or not. This is not same as\n * `isEmpty`.\n *\n * The `isEmpty` reports about the current set of results. However, `hasTotal`\n * reports about the total number of records, regardless of the current.\n */\n public get hasTotal(): boolean {\n return this.total > 0;\n }\n\n /**\n * The Last page number\n */\n public get lastPage(): number {\n return Math.max(Math.ceil(this.total / this.perPage), 1);\n }\n\n /**\n * Casting `total` to a number. Later, we can think of situations\n * to cast it to a bigint\n */\n public get total(): number {\n return Number(this.totalNumber);\n }\n}\n","import type { OpenAPIV3 } from \"openapi-types\";\n\nexport const createPaginationMetaSchemaObject = (name = \"PaginationData\"): Record<string, OpenAPIV3.SchemaObject> => {\n return {\n [name]: {\n properties: {\n firstPage: {\n description: \"Returns the number for the first page. It is always 1\",\n minimum: 0,\n type: \"integer\",\n },\n firstPageUrl: {\n description: \"The URL for the first page\",\n type: \"string\",\n },\n lastPage: {\n description: \"Returns the value for the last page by taking the total of rows into account\",\n minimum: 0,\n type: \"integer\",\n },\n lastPageUrl: {\n description: \"The URL for the last page\",\n type: \"string\",\n },\n nextPageUrl: {\n description: \"The URL for the next page\",\n type: \"string\",\n },\n page: {\n description: \"Current page number\",\n minimum: 1,\n type: \"integer\",\n },\n perPage: {\n description: \"Returns the value for the limit passed to the paginate method\",\n minimum: 0,\n type: \"integer\",\n },\n previousPageUrl: {\n description: \"The URL for the previous page\",\n type: \"string\",\n },\n total: {\n description: \"Holds the value for the total number of rows in the database\",\n minimum: 0,\n type: \"integer\",\n },\n },\n type: \"object\",\n xml: {\n name,\n },\n },\n };\n};\n\nexport const createPaginationSchemaObject = (\n name: string,\n items: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject,\n metaReference = \"#/components/schemas/PaginationData\",\n): Record<string, OpenAPIV3.SchemaObject> => {\n return {\n [name]: {\n properties: {\n data: {\n items,\n type: \"array\",\n xml: {\n name: \"data\",\n wrapped: true,\n },\n },\n meta: {\n $ref: metaReference,\n },\n },\n type: \"object\",\n xml: {\n name,\n },\n },\n };\n};\n","import Paginator from \"./paginator\";\nimport type { Paginator as PaginatorInterface } from \"./types\";\n\nexport { default as Paginator } from \"./paginator\";\nexport { createPaginationMetaSchemaObject, createPaginationSchemaObject } from \"./swagger\";\n\nexport const paginate = <Result>(page: number, perPage: number, total: number, rows: Result[]): PaginatorInterface<Result> =>\n new Paginator(total, Number(perPage), Number(page), ...rows);\n\nexport type { PaginationMeta, PaginationResult, Paginator as PaginatorInterface } from \"./types.d\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@visulima/pagination",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.3",
|
|
4
4
|
"description": "Simple Pagination for Node.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"anolilab",
|
|
@@ -72,28 +72,31 @@
|
|
|
72
72
|
"qs": "^6.11.2"
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
|
-
"@anolilab/eslint-config": "^
|
|
76
|
-
"@anolilab/prettier-config": "^5.0.
|
|
77
|
-
"@anolilab/semantic-release-preset": "^
|
|
78
|
-
"@
|
|
79
|
-
"@
|
|
75
|
+
"@anolilab/eslint-config": "^14.0.24",
|
|
76
|
+
"@anolilab/prettier-config": "^5.0.11",
|
|
77
|
+
"@anolilab/semantic-release-preset": "^8.0.0",
|
|
78
|
+
"@babel/core": "^7.23.0",
|
|
79
|
+
"@rushstack/eslint-plugin-security": "^0.7.1",
|
|
80
|
+
"@types/micromatch": "^4.0.3",
|
|
80
81
|
"@types/node": "18.17.12",
|
|
81
82
|
"@types/qs": "^6.9.8",
|
|
82
|
-
"@vitest/coverage-v8": "^0.34.
|
|
83
|
+
"@vitest/coverage-v8": "^0.34.6",
|
|
83
84
|
"cross-env": "^7.0.3",
|
|
84
|
-
"eslint": "^8.
|
|
85
|
+
"eslint": "^8.51.0",
|
|
86
|
+
"eslint-plugin-deprecation": "^2.0.0",
|
|
85
87
|
"eslint-plugin-etc": "^2.0.3",
|
|
88
|
+
"eslint-plugin-import": "npm:eslint-plugin-i@^2.28.1",
|
|
86
89
|
"eslint-plugin-mdx": "^2.2.0",
|
|
87
|
-
"eslint-plugin-vitest": "^0.2
|
|
90
|
+
"eslint-plugin-vitest": "^0.3.2",
|
|
88
91
|
"eslint-plugin-vitest-globals": "^1.4.0",
|
|
89
92
|
"openapi-types": "^12.1.3",
|
|
90
93
|
"prettier": "^3.0.3",
|
|
91
|
-
"rimraf": "^5.0.
|
|
92
|
-
"semantic-release": "^
|
|
93
|
-
"sort-package-json": "^2.
|
|
94
|
+
"rimraf": "^5.0.5",
|
|
95
|
+
"semantic-release": "^22.0.5",
|
|
96
|
+
"sort-package-json": "^2.6.0",
|
|
94
97
|
"tsup": "^7.2.0",
|
|
95
98
|
"typescript": "^5.2.2",
|
|
96
|
-
"vitest": "^0.34.
|
|
99
|
+
"vitest": "^0.34.6"
|
|
97
100
|
},
|
|
98
101
|
"engines": {
|
|
99
102
|
"node": ">=18.* <=20.*"
|
|
@@ -110,7 +113,8 @@
|
|
|
110
113
|
"warn_on_unsupported_typescript_version": false,
|
|
111
114
|
"info_on_disabling_jsx_react_rule": false,
|
|
112
115
|
"info_on_disabling_prettier_conflict_rule": false,
|
|
113
|
-
"info_on_disabling_jsonc_sort_keys_rule": false
|
|
116
|
+
"info_on_disabling_jsonc_sort_keys_rule": false,
|
|
117
|
+
"info_on_disabling_etc_no_deprecated": false
|
|
114
118
|
}
|
|
115
119
|
}
|
|
116
120
|
}
|