@visulima/pagination 2.0.1 → 2.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 CHANGED
@@ -1,3 +1,19 @@
1
+ ## @visulima/pagination [2.0.3](https://github.com/visulima/visulima/compare/@visulima/pagination@2.0.2...@visulima/pagination@2.0.3) (2023-05-25)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * chore updated the deps and changed the engine to allow node v20 ([c479f37](https://github.com/visulima/visulima/commit/c479f373550886c6c79c7d525a3aead82daf078b))
7
+ * fixed all calls to radar with sonarjs, removed radar eslint package ([001aecf](https://github.com/visulima/visulima/commit/001aecf78dde134bade44f382698d52eedbd3bbe))
8
+ * updated package deps ([5f605aa](https://github.com/visulima/visulima/commit/5f605aab74a7c1f4cbdfe4502363e36d57716921))
9
+
10
+ ## @visulima/pagination [2.0.2](https://github.com/visulima/visulima/compare/@visulima/pagination@2.0.1...@visulima/pagination@2.0.2) (2023-01-25)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * updated tsconfig to use module esnext and target es2021 ([#107](https://github.com/visulima/visulima/issues/107)) ([e888fe8](https://github.com/visulima/visulima/commit/e888fe8d15c99453a3c04f2cf9d2f6c69c158648))
16
+
1
17
  ## @visulima/pagination [2.0.1](https://github.com/visulima/visulima/compare/@visulima/pagination@2.0.0...@visulima/pagination@2.0.1) (2023-01-08)
2
18
 
3
19
 
package/dist/index.d.ts CHANGED
@@ -7,14 +7,14 @@ type PaginationMeta = {
7
7
  page: number;
8
8
  lastPage: number;
9
9
  firstPage: number;
10
- firstPageUrl: null | string;
11
- lastPageUrl: null | string;
12
- nextPageUrl: null | string;
13
- previousPageUrl: null | string;
10
+ firstPageUrl: string | null;
11
+ lastPageUrl: string | null;
12
+ nextPageUrl: string | null;
13
+ previousPageUrl: string | null;
14
14
  };
15
15
 
16
16
  interface Paginator$1<Result> extends Array<Result> {
17
- all(): Result[];
17
+ all: () => Result[];
18
18
 
19
19
  readonly firstPage: number;
20
20
  readonly perPage: number;
@@ -26,16 +26,21 @@ interface Paginator$1<Result> extends Array<Result> {
26
26
  readonly total: number;
27
27
  readonly hasTotal: boolean;
28
28
 
29
- baseUrl(url: string): this;
30
- queryString(values: { [key: string]: any }): this;
31
- getUrl(page: number): string;
32
- getMeta(): PaginationMeta;
33
- getNextPageUrl(): string | null;
34
- getPreviousPageUrl(): string | null;
35
- getUrlsForRange(start: number, end: number): { url: string; page: number; isActive: boolean }[];
36
- toJSON(): PaginationResult<Result>;
29
+ baseUrl: (url: string) => this;
30
+ queryString: (values: { [key: string]: any }) => this;
31
+ getUrl: (page: number) => string;
32
+ getMeta: () => PaginationMeta;
33
+ getNextPageUrl: () => string | null;
34
+ getPreviousPageUrl: () => string | null;
35
+ getUrlsForRange: (start: number, end: number) => { url: string; page: number; isActive: boolean }[];
36
+ toJSON: () => PaginationResult<Result>;
37
37
  }
38
38
 
39
+ type UrlsForRange = {
40
+ url: string;
41
+ page: number;
42
+ isActive: boolean;
43
+ }[];
39
44
  declare class Paginator<T = any> extends Array implements Paginator$1<T> {
40
45
  private readonly totalNumber;
41
46
  readonly perPage: number;
@@ -51,32 +56,9 @@ declare class Paginator<T = any> extends Array implements Paginator$1<T> {
51
56
  get hasPages(): boolean;
52
57
  get lastPage(): number;
53
58
  get total(): number;
54
- all(): any[];
55
- getMeta(): {
56
- total: number;
57
- perPage: number;
58
- page: number;
59
- lastPage: number;
60
- firstPage: number;
61
- firstPageUrl: string;
62
- lastPageUrl: string;
63
- nextPageUrl: string | null;
64
- previousPageUrl: string | null;
65
- };
66
- toJSON(): {
67
- meta: {
68
- total: number;
69
- perPage: number;
70
- page: number;
71
- lastPage: number;
72
- firstPage: number;
73
- firstPageUrl: string;
74
- lastPageUrl: string;
75
- nextPageUrl: string | null;
76
- previousPageUrl: string | null;
77
- };
78
- data: any[];
79
- };
59
+ all(): T[];
60
+ getMeta(): PaginationMeta;
61
+ toJSON(): PaginationResult<T>;
80
62
  queryString(values: {
81
63
  [key: string]: any;
82
64
  }): this;
@@ -84,11 +66,7 @@ declare class Paginator<T = any> extends Array implements Paginator$1<T> {
84
66
  getUrl(page: number): string;
85
67
  getNextPageUrl(): string | null;
86
68
  getPreviousPageUrl(): string | null;
87
- getUrlsForRange(start: number, end: number): {
88
- url: string;
89
- page: number;
90
- isActive: boolean;
91
- }[];
69
+ getUrlsForRange(start: number, end: number): UrlsForRange;
92
70
  }
93
71
 
94
72
  declare const createPaginationMetaSchemaObject: (name?: string) => {
package/dist/index.js CHANGED
@@ -1,2 +1,16 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _class;var _qs = require('qs'); var _qs2 = _interopRequireDefault(_qs);var i= (_class =class extends Array{constructor(e,a,s,...r){super(...r);_class.prototype.__init.call(this);_class.prototype.__init2.call(this);_class.prototype.__init3.call(this);;this.totalNumber=e;this.perPage=a;this.currentPage=s;this.totalNumber=Number(e),this.rows=r,this.isEmpty=this.rows.length===0}__init() {this.qs={}}__init2() {this.url="/"}__init3() {this.firstPage=1}get hasTotal(){return this.total>0}get hasMorePages(){return this.lastPage>this.currentPage}get hasPages(){return this.lastPage!==1}get lastPage(){return Math.max(Math.ceil(this.total/this.perPage),1)}get total(){return Number(this.totalNumber)}all(){return this.rows}getMeta(){return{total:this.total,perPage:this.perPage,page:this.currentPage,lastPage:this.lastPage,firstPage:this.firstPage,firstPageUrl:this.getUrl(1),lastPageUrl:this.getUrl(this.lastPage),nextPageUrl:this.getNextPageUrl(),previousPageUrl:this.getPreviousPageUrl()}}toJSON(){return{meta:this.getMeta(),data:this.all()}}queryString(e){return this.qs=e,this}baseUrl(e){return this.url=e,this}getUrl(e){let a=_qs2.default.stringify({...this.qs,page:e<1?1:e});return`${this.url}?${a}`}getNextPageUrl(){return this.hasMorePages?this.getUrl(this.currentPage+1):null}getPreviousPageUrl(){return this.currentPage>1?this.getUrl(this.currentPage-1):null}getUrlsForRange(e,a){let s=[];for(let r=e;r<=a;r++)s.push({url:this.getUrl(r),page:r,isActive:r===this.currentPage});return s}}, _class);var g=(t="PaginationData")=>({[t]:{type:"object",xml:{name:t},properties:{total:{type:"integer",minimum:0,description:"Holds the value for the total number of rows in the database"},perPage:{type:"integer",minimum:0,description:"Returns the value for the limit passed to the paginate method"},page:{type:"integer",minimum:1,description:"Current page number"},lastPage:{type:"integer",minimum:0,description:"Returns the value for the last page by taking the total of rows into account"},firstPage:{type:"integer",minimum:0,description:"Returns the number for the first page. It is always 1"},firstPageUrl:{type:"string",description:"The URL for the first page"},lastPageUrl:{type:"string",description:"The URL for the last page"},nextPageUrl:{type:"string",description:"The URL for the next page"},previousPageUrl:{type:"string",description:"The URL for the previous page"}}}}),l= exports.createPaginationSchemaObject =(t,n,e="#/components/schemas/PaginationData")=>({[t]:{type:"object",xml:{name:t},properties:{data:{type:"array",xml:{name:"data",wrapped:!0},items:n},meta:{$ref:e}}}});var c=(t,n,e,a)=>new i(e,Number(n),Number(t),...a);exports.Paginator = i; exports.createPaginationMetaSchemaObject = g; exports.createPaginationSchemaObject = l; exports.paginate = c;
1
+ 'use strict';
2
+
3
+ var u = require('qs');
4
+
5
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
+
7
+ var u__default = /*#__PURE__*/_interopDefault(u);
8
+
9
+ var g=Object.defineProperty;var l=(t,r,e)=>r in t?g(t,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[r]=e;var n=(t,r,e)=>(l(t,typeof r!="symbol"?r+"":r,e),e);var s=class extends Array{constructor(e,i,o,...a){super(...a);this.totalNumber=e;this.perPage=i;this.currentPage=o;n(this,"qs",{});n(this,"url","/");n(this,"rows");n(this,"firstPage",1);n(this,"isEmpty");this.totalNumber=Number(e),this.rows=a,this.isEmpty=this.rows.length===0;}get hasTotal(){return this.total>0}get hasMorePages(){return this.lastPage>this.currentPage}get hasPages(){return this.lastPage!==1}get lastPage(){return Math.max(Math.ceil(this.total/this.perPage),1)}get total(){return Number(this.totalNumber)}all(){return this.rows}getMeta(){return {total:this.total,perPage:this.perPage,page:this.currentPage,lastPage:this.lastPage,firstPage:this.firstPage,firstPageUrl:this.getUrl(1),lastPageUrl:this.getUrl(this.lastPage),nextPageUrl:this.getNextPageUrl(),previousPageUrl:this.getPreviousPageUrl()}}toJSON(){return {meta:this.getMeta(),data:this.all()}}queryString(e){return this.qs=e,this}baseUrl(e){return this.url=e,this}getUrl(e){let i=u__default.default.stringify({...this.qs,page:e<1?1:e});return `${this.url}?${i}`}getNextPageUrl(){return this.hasMorePages?this.getUrl(this.currentPage+1):null}getPreviousPageUrl(){return this.currentPage>1?this.getUrl(this.currentPage-1):null}getUrlsForRange(e,i){let o=[];for(let a=e;a<=i;a++)o.push({url:this.getUrl(a),page:a,isActive:a===this.currentPage});return o}};var p=(t="PaginationData")=>({[t]:{type:"object",xml:{name:t},properties:{total:{type:"integer",minimum:0,description:"Holds the value for the total number of rows in the database"},perPage:{type:"integer",minimum:0,description:"Returns the value for the limit passed to the paginate method"},page:{type:"integer",minimum:1,description:"Current page number"},lastPage:{type:"integer",minimum:0,description:"Returns the value for the last page by taking the total of rows into account"},firstPage:{type:"integer",minimum:0,description:"Returns the number for the first page. It is always 1"},firstPageUrl:{type:"string",description:"The URL for the first page"},lastPageUrl:{type:"string",description:"The URL for the last page"},nextPageUrl:{type:"string",description:"The URL for the next page"},previousPageUrl:{type:"string",description:"The URL for the previous page"}}}}),h=(t,r,e="#/components/schemas/PaginationData")=>({[t]:{type:"object",xml:{name:t},properties:{data:{type:"array",xml:{name:"data",wrapped:!0},items:r},meta:{$ref:e}}}});var d=(t,r,e,i)=>new s(e,Number(r),Number(t),...i);
10
+
11
+ exports.Paginator = s;
12
+ exports.createPaginationMetaSchemaObject = p;
13
+ exports.createPaginationSchemaObject = h;
14
+ exports.paginate = d;
15
+ //# sourceMappingURL=out.js.map
2
16
  //# sourceMappingURL=index.js.map
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","values","url","page","qstring","start","end","urls","index","createPaginationMetaSchemaObject","name","createPaginationSchemaObject","items","metaReference","paginate","total"],"mappings":"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","sourcesContent":["import qs from \"qs\";\n\nimport type { Paginator as IPaginator } from \"./types\";\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 = any> extends Array implements IPaginator<T> {\n private qs: { [key: string]: any } = {};\n\n private url: string = \"/\";\n\n private readonly rows: any[];\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 constructor(private readonly totalNumber: number, public readonly perPage: number, public currentPage: number, ...rows: any[]) {\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 * 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 get hasTotal(): boolean {\n return this.total > 0;\n }\n\n /**\n * Find if there are more pages to come\n */\n 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 get hasPages(): boolean {\n return this.lastPage !== 1;\n }\n\n /**\n * The Last page number\n */\n 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 get total(): number {\n return Number(this.totalNumber);\n }\n\n /**\n * A reference to the result rows\n */\n public all() {\n return this.rows;\n }\n\n /**\n * Returns JSON meta data\n */\n public getMeta() {\n return {\n total: this.total,\n perPage: this.perPage,\n page: this.currentPage,\n lastPage: this.lastPage,\n firstPage: this.firstPage,\n firstPageUrl: this.getUrl(1),\n lastPageUrl: this.getUrl(this.lastPage),\n nextPageUrl: this.getNextPageUrl(),\n previousPageUrl: this.getPreviousPageUrl(),\n };\n }\n\n /**\n * Returns JSON representation of the paginated\n * data\n */\n public toJSON() {\n return {\n meta: this.getMeta(),\n data: this.all(),\n };\n }\n\n /**\n * Define query string to be appended to the pagination links\n */\n public queryString(values: { [key: string]: any }): this {\n this.qs = values;\n\n return this;\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 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 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 an array of urls under a given range\n */\n public getUrlsForRange(start: number, end: number) {\n const urls: { url: string; page: number; isActive: boolean }[] = [];\n\n // eslint-disable-next-line no-plusplus\n for (let index = start; index <= end; index++) {\n urls.push({ url: this.getUrl(index), page: index, isActive: index === this.currentPage });\n }\n\n return urls;\n }\n}\n","import type { OpenAPIV3 } from \"openapi-types\";\n\nexport const createPaginationMetaSchemaObject = (name: string = \"PaginationData\"): { [key: string]: OpenAPIV3.SchemaObject } => {\n return {\n [name]: {\n type: \"object\",\n xml: {\n name,\n },\n properties: {\n total: {\n type: \"integer\",\n minimum: 0,\n description: \"Holds the value for the total number of rows in the database\",\n },\n perPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the value for the limit passed to the paginate method\",\n },\n page: {\n type: \"integer\",\n minimum: 1,\n description: \"Current page number\",\n },\n lastPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the value for the last page by taking the total of rows into account\",\n },\n firstPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the number for the first page. It is always 1\",\n },\n firstPageUrl: {\n type: \"string\",\n description: \"The URL for the first page\",\n },\n lastPageUrl: {\n type: \"string\",\n description: \"The URL for the last page\",\n },\n nextPageUrl: {\n type: \"string\",\n description: \"The URL for the next page\",\n },\n previousPageUrl: {\n type: \"string\",\n description: \"The URL for the previous page\",\n },\n },\n },\n };\n};\n\nexport const createPaginationSchemaObject = (\n name: string,\n items: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject,\n metaReference: string = \"#/components/schemas/PaginationData\",\n): { [key: string]: OpenAPIV3.SchemaObject } => {\n return {\n [name]: {\n type: \"object\",\n xml: {\n name,\n },\n properties: {\n data: {\n type: \"array\",\n xml: {\n name: \"data\",\n wrapped: true,\n },\n items,\n },\n meta: {\n $ref: metaReference,\n },\n },\n },\n };\n};\n","import Paginator from \"./paginator\";\nimport type { Paginator as PaginatorInterface } from \"./types\";\n\nexport type { Paginator as PaginatorInterface, PaginationResult, PaginationMeta } from \"./types.d\";\nexport { default as Paginator } from \"./paginator\";\n\n// eslint-disable-next-line max-len\nexport const paginate = <Result>(page: number, perPage: number, total: number, rows: Result[]): PaginatorInterface<Result> => new Paginator(total, Number(perPage), Number(page), ...rows);\n\nexport { createPaginationSchemaObject, createPaginationMetaSchemaObject } from \"./swagger\";\n"]}
1
+ {"version":3,"sources":["../src/paginator.ts","../src/swagger.ts","../src/index.ts"],"names":["qs","Paginator","totalNumber","perPage","currentPage","rows","__publicField","values","url","page","qstring","start","end","urls","index","createPaginationMetaSchemaObject","name","createPaginationSchemaObject","items","metaReference","paginate","total"],"mappings":"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","sourcesContent":["import qs from \"qs\";\n\nimport type { PaginationMeta, PaginationResult, Paginator as IPaginator } from \"./types\";\n\ntype UrlsForRange = {url: string; page: number; isActive: boolean}[];\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 = any> extends Array implements IPaginator<T> {\n private qs: { [key: string]: any } = {};\n\n private url: string = \"/\";\n\n private readonly rows: T[];\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(private readonly totalNumber: number, public readonly perPage: number, public currentPage: number, ...rows: any[]) {\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 * 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 * 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 * 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 /**\n * A reference to the result rows\n */\n public all(): T[] {\n return this.rows;\n }\n\n /**\n * Returns JSON meta data\n */\n public getMeta(): PaginationMeta {\n return {\n total: this.total,\n perPage: this.perPage,\n page: this.currentPage,\n lastPage: this.lastPage,\n firstPage: this.firstPage,\n firstPageUrl: this.getUrl(1),\n lastPageUrl: this.getUrl(this.lastPage),\n nextPageUrl: this.getNextPageUrl(),\n previousPageUrl: this.getPreviousPageUrl(),\n };\n }\n\n /**\n * Returns JSON representation of the paginated\n * data\n */\n public toJSON(): PaginationResult<T> {\n return {\n meta: this.getMeta(),\n data: this.all(),\n };\n }\n\n /**\n * Define query string to be appended to the pagination links\n */\n public queryString(values: { [key: string]: any }): this {\n this.qs = values;\n\n return this;\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 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 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 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({ url: this.getUrl(index), page: index, isActive: index === this.currentPage });\n }\n\n return urls;\n }\n}\n","import type { OpenAPIV3 } from \"openapi-types\";\n\nexport const createPaginationMetaSchemaObject = (name: string = \"PaginationData\"): { [key: string]: OpenAPIV3.SchemaObject } => {\n return {\n [name]: {\n type: \"object\",\n xml: {\n name,\n },\n properties: {\n total: {\n type: \"integer\",\n minimum: 0,\n description: \"Holds the value for the total number of rows in the database\",\n },\n perPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the value for the limit passed to the paginate method\",\n },\n page: {\n type: \"integer\",\n minimum: 1,\n description: \"Current page number\",\n },\n lastPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the value for the last page by taking the total of rows into account\",\n },\n firstPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the number for the first page. It is always 1\",\n },\n firstPageUrl: {\n type: \"string\",\n description: \"The URL for the first page\",\n },\n lastPageUrl: {\n type: \"string\",\n description: \"The URL for the last page\",\n },\n nextPageUrl: {\n type: \"string\",\n description: \"The URL for the next page\",\n },\n previousPageUrl: {\n type: \"string\",\n description: \"The URL for the previous page\",\n },\n },\n },\n };\n};\n\nexport const createPaginationSchemaObject = (\n name: string,\n items: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject,\n metaReference: string = \"#/components/schemas/PaginationData\",\n): { [key: string]: OpenAPIV3.SchemaObject } => {\n return {\n [name]: {\n type: \"object\",\n xml: {\n name,\n },\n properties: {\n data: {\n type: \"array\",\n xml: {\n name: \"data\",\n wrapped: true,\n },\n items,\n },\n meta: {\n $ref: metaReference,\n },\n },\n },\n };\n};\n","import Paginator from \"./paginator\";\nimport type { Paginator as PaginatorInterface } from \"./types\";\n\nexport type { Paginator as PaginatorInterface, PaginationResult, PaginationMeta } from \"./types.d\";\nexport { default as Paginator } from \"./paginator\";\n\n// eslint-disable-next-line max-len\nexport const paginate = <Result>(page: number, perPage: number, total: number, rows: Result[]): PaginatorInterface<Result> => new Paginator(total, Number(perPage), Number(page), ...rows);\n\nexport { createPaginationSchemaObject, createPaginationMetaSchemaObject } from \"./swagger\";\n"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,7 @@
1
- import o from"qs";var i=class extends Array{constructor(e,a,s,...r){super(...r);this.totalNumber=e;this.perPage=a;this.currentPage=s;this.totalNumber=Number(e),this.rows=r,this.isEmpty=this.rows.length===0}qs={};url="/";rows;firstPage=1;isEmpty;get hasTotal(){return this.total>0}get hasMorePages(){return this.lastPage>this.currentPage}get hasPages(){return this.lastPage!==1}get lastPage(){return Math.max(Math.ceil(this.total/this.perPage),1)}get total(){return Number(this.totalNumber)}all(){return this.rows}getMeta(){return{total:this.total,perPage:this.perPage,page:this.currentPage,lastPage:this.lastPage,firstPage:this.firstPage,firstPageUrl:this.getUrl(1),lastPageUrl:this.getUrl(this.lastPage),nextPageUrl:this.getNextPageUrl(),previousPageUrl:this.getPreviousPageUrl()}}toJSON(){return{meta:this.getMeta(),data:this.all()}}queryString(e){return this.qs=e,this}baseUrl(e){return this.url=e,this}getUrl(e){let a=o.stringify({...this.qs,page:e<1?1:e});return`${this.url}?${a}`}getNextPageUrl(){return this.hasMorePages?this.getUrl(this.currentPage+1):null}getPreviousPageUrl(){return this.currentPage>1?this.getUrl(this.currentPage-1):null}getUrlsForRange(e,a){let s=[];for(let r=e;r<=a;r++)s.push({url:this.getUrl(r),page:r,isActive:r===this.currentPage});return s}};var g=(t="PaginationData")=>({[t]:{type:"object",xml:{name:t},properties:{total:{type:"integer",minimum:0,description:"Holds the value for the total number of rows in the database"},perPage:{type:"integer",minimum:0,description:"Returns the value for the limit passed to the paginate method"},page:{type:"integer",minimum:1,description:"Current page number"},lastPage:{type:"integer",minimum:0,description:"Returns the value for the last page by taking the total of rows into account"},firstPage:{type:"integer",minimum:0,description:"Returns the number for the first page. It is always 1"},firstPageUrl:{type:"string",description:"The URL for the first page"},lastPageUrl:{type:"string",description:"The URL for the last page"},nextPageUrl:{type:"string",description:"The URL for the next page"},previousPageUrl:{type:"string",description:"The URL for the previous page"}}}}),l=(t,n,e="#/components/schemas/PaginationData")=>({[t]:{type:"object",xml:{name:t},properties:{data:{type:"array",xml:{name:"data",wrapped:!0},items:n},meta:{$ref:e}}}});var c=(t,n,e,a)=>new i(e,Number(n),Number(t),...a);export{i as Paginator,g as createPaginationMetaSchemaObject,l as createPaginationSchemaObject,c as paginate};
1
+ import u from 'qs';
2
+
3
+ var g=Object.defineProperty;var l=(t,r,e)=>r in t?g(t,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[r]=e;var n=(t,r,e)=>(l(t,typeof r!="symbol"?r+"":r,e),e);var s=class extends Array{constructor(e,i,o,...a){super(...a);this.totalNumber=e;this.perPage=i;this.currentPage=o;n(this,"qs",{});n(this,"url","/");n(this,"rows");n(this,"firstPage",1);n(this,"isEmpty");this.totalNumber=Number(e),this.rows=a,this.isEmpty=this.rows.length===0;}get hasTotal(){return this.total>0}get hasMorePages(){return this.lastPage>this.currentPage}get hasPages(){return this.lastPage!==1}get lastPage(){return Math.max(Math.ceil(this.total/this.perPage),1)}get total(){return Number(this.totalNumber)}all(){return this.rows}getMeta(){return {total:this.total,perPage:this.perPage,page:this.currentPage,lastPage:this.lastPage,firstPage:this.firstPage,firstPageUrl:this.getUrl(1),lastPageUrl:this.getUrl(this.lastPage),nextPageUrl:this.getNextPageUrl(),previousPageUrl:this.getPreviousPageUrl()}}toJSON(){return {meta:this.getMeta(),data:this.all()}}queryString(e){return this.qs=e,this}baseUrl(e){return this.url=e,this}getUrl(e){let i=u.stringify({...this.qs,page:e<1?1:e});return `${this.url}?${i}`}getNextPageUrl(){return this.hasMorePages?this.getUrl(this.currentPage+1):null}getPreviousPageUrl(){return this.currentPage>1?this.getUrl(this.currentPage-1):null}getUrlsForRange(e,i){let o=[];for(let a=e;a<=i;a++)o.push({url:this.getUrl(a),page:a,isActive:a===this.currentPage});return o}};var p=(t="PaginationData")=>({[t]:{type:"object",xml:{name:t},properties:{total:{type:"integer",minimum:0,description:"Holds the value for the total number of rows in the database"},perPage:{type:"integer",minimum:0,description:"Returns the value for the limit passed to the paginate method"},page:{type:"integer",minimum:1,description:"Current page number"},lastPage:{type:"integer",minimum:0,description:"Returns the value for the last page by taking the total of rows into account"},firstPage:{type:"integer",minimum:0,description:"Returns the number for the first page. It is always 1"},firstPageUrl:{type:"string",description:"The URL for the first page"},lastPageUrl:{type:"string",description:"The URL for the last page"},nextPageUrl:{type:"string",description:"The URL for the next page"},previousPageUrl:{type:"string",description:"The URL for the previous page"}}}}),h=(t,r,e="#/components/schemas/PaginationData")=>({[t]:{type:"object",xml:{name:t},properties:{data:{type:"array",xml:{name:"data",wrapped:!0},items:r},meta:{$ref:e}}}});var d=(t,r,e,i)=>new s(e,Number(r),Number(t),...i);
4
+
5
+ export { s as Paginator, p as createPaginationMetaSchemaObject, h as createPaginationSchemaObject, d as paginate };
6
+ //# sourceMappingURL=out.js.map
2
7
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/paginator.ts","../src/swagger.ts","../src/index.ts"],"sourcesContent":["import qs from \"qs\";\n\nimport type { Paginator as IPaginator } from \"./types\";\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 = any> extends Array implements IPaginator<T> {\n private qs: { [key: string]: any } = {};\n\n private url: string = \"/\";\n\n private readonly rows: any[];\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 constructor(private readonly totalNumber: number, public readonly perPage: number, public currentPage: number, ...rows: any[]) {\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 * 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 get hasTotal(): boolean {\n return this.total > 0;\n }\n\n /**\n * Find if there are more pages to come\n */\n 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 get hasPages(): boolean {\n return this.lastPage !== 1;\n }\n\n /**\n * The Last page number\n */\n 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 get total(): number {\n return Number(this.totalNumber);\n }\n\n /**\n * A reference to the result rows\n */\n public all() {\n return this.rows;\n }\n\n /**\n * Returns JSON meta data\n */\n public getMeta() {\n return {\n total: this.total,\n perPage: this.perPage,\n page: this.currentPage,\n lastPage: this.lastPage,\n firstPage: this.firstPage,\n firstPageUrl: this.getUrl(1),\n lastPageUrl: this.getUrl(this.lastPage),\n nextPageUrl: this.getNextPageUrl(),\n previousPageUrl: this.getPreviousPageUrl(),\n };\n }\n\n /**\n * Returns JSON representation of the paginated\n * data\n */\n public toJSON() {\n return {\n meta: this.getMeta(),\n data: this.all(),\n };\n }\n\n /**\n * Define query string to be appended to the pagination links\n */\n public queryString(values: { [key: string]: any }): this {\n this.qs = values;\n\n return this;\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 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 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 an array of urls under a given range\n */\n public getUrlsForRange(start: number, end: number) {\n const urls: { url: string; page: number; isActive: boolean }[] = [];\n\n // eslint-disable-next-line no-plusplus\n for (let index = start; index <= end; index++) {\n urls.push({ url: this.getUrl(index), page: index, isActive: index === this.currentPage });\n }\n\n return urls;\n }\n}\n","import type { OpenAPIV3 } from \"openapi-types\";\n\nexport const createPaginationMetaSchemaObject = (name: string = \"PaginationData\"): { [key: string]: OpenAPIV3.SchemaObject } => {\n return {\n [name]: {\n type: \"object\",\n xml: {\n name,\n },\n properties: {\n total: {\n type: \"integer\",\n minimum: 0,\n description: \"Holds the value for the total number of rows in the database\",\n },\n perPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the value for the limit passed to the paginate method\",\n },\n page: {\n type: \"integer\",\n minimum: 1,\n description: \"Current page number\",\n },\n lastPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the value for the last page by taking the total of rows into account\",\n },\n firstPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the number for the first page. It is always 1\",\n },\n firstPageUrl: {\n type: \"string\",\n description: \"The URL for the first page\",\n },\n lastPageUrl: {\n type: \"string\",\n description: \"The URL for the last page\",\n },\n nextPageUrl: {\n type: \"string\",\n description: \"The URL for the next page\",\n },\n previousPageUrl: {\n type: \"string\",\n description: \"The URL for the previous page\",\n },\n },\n },\n };\n};\n\nexport const createPaginationSchemaObject = (\n name: string,\n items: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject,\n metaReference: string = \"#/components/schemas/PaginationData\",\n): { [key: string]: OpenAPIV3.SchemaObject } => {\n return {\n [name]: {\n type: \"object\",\n xml: {\n name,\n },\n properties: {\n data: {\n type: \"array\",\n xml: {\n name: \"data\",\n wrapped: true,\n },\n items,\n },\n meta: {\n $ref: metaReference,\n },\n },\n },\n };\n};\n","import Paginator from \"./paginator\";\nimport type { Paginator as PaginatorInterface } from \"./types\";\n\nexport type { Paginator as PaginatorInterface, PaginationResult, PaginationMeta } from \"./types.d\";\nexport { default as Paginator } from \"./paginator\";\n\n// eslint-disable-next-line max-len\nexport const paginate = <Result>(page: number, perPage: number, total: number, rows: Result[]): PaginatorInterface<Result> => new Paginator(total, Number(perPage), Number(page), ...rows);\n\nexport { createPaginationSchemaObject, createPaginationMetaSchemaObject } from \"./swagger\";\n"],"mappings":"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","names":["qs","Paginator","totalNumber","perPage","currentPage","rows","values","url","page","qstring","start","end","urls","index","createPaginationMetaSchemaObject","name","createPaginationSchemaObject","items","metaReference","paginate","page","perPage","total","rows","Paginator"]}
1
+ {"version":3,"sources":["../src/paginator.ts","../src/swagger.ts","../src/index.ts"],"names":["qs","Paginator","totalNumber","perPage","currentPage","rows","__publicField","values","url","page","qstring","start","end","urls","index","createPaginationMetaSchemaObject","name","createPaginationSchemaObject","items","metaReference","paginate","total"],"mappings":"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","sourcesContent":["import qs from \"qs\";\n\nimport type { PaginationMeta, PaginationResult, Paginator as IPaginator } from \"./types\";\n\ntype UrlsForRange = {url: string; page: number; isActive: boolean}[];\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 = any> extends Array implements IPaginator<T> {\n private qs: { [key: string]: any } = {};\n\n private url: string = \"/\";\n\n private readonly rows: T[];\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(private readonly totalNumber: number, public readonly perPage: number, public currentPage: number, ...rows: any[]) {\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 * 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 * 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 * 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 /**\n * A reference to the result rows\n */\n public all(): T[] {\n return this.rows;\n }\n\n /**\n * Returns JSON meta data\n */\n public getMeta(): PaginationMeta {\n return {\n total: this.total,\n perPage: this.perPage,\n page: this.currentPage,\n lastPage: this.lastPage,\n firstPage: this.firstPage,\n firstPageUrl: this.getUrl(1),\n lastPageUrl: this.getUrl(this.lastPage),\n nextPageUrl: this.getNextPageUrl(),\n previousPageUrl: this.getPreviousPageUrl(),\n };\n }\n\n /**\n * Returns JSON representation of the paginated\n * data\n */\n public toJSON(): PaginationResult<T> {\n return {\n meta: this.getMeta(),\n data: this.all(),\n };\n }\n\n /**\n * Define query string to be appended to the pagination links\n */\n public queryString(values: { [key: string]: any }): this {\n this.qs = values;\n\n return this;\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 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 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 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({ url: this.getUrl(index), page: index, isActive: index === this.currentPage });\n }\n\n return urls;\n }\n}\n","import type { OpenAPIV3 } from \"openapi-types\";\n\nexport const createPaginationMetaSchemaObject = (name: string = \"PaginationData\"): { [key: string]: OpenAPIV3.SchemaObject } => {\n return {\n [name]: {\n type: \"object\",\n xml: {\n name,\n },\n properties: {\n total: {\n type: \"integer\",\n minimum: 0,\n description: \"Holds the value for the total number of rows in the database\",\n },\n perPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the value for the limit passed to the paginate method\",\n },\n page: {\n type: \"integer\",\n minimum: 1,\n description: \"Current page number\",\n },\n lastPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the value for the last page by taking the total of rows into account\",\n },\n firstPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the number for the first page. It is always 1\",\n },\n firstPageUrl: {\n type: \"string\",\n description: \"The URL for the first page\",\n },\n lastPageUrl: {\n type: \"string\",\n description: \"The URL for the last page\",\n },\n nextPageUrl: {\n type: \"string\",\n description: \"The URL for the next page\",\n },\n previousPageUrl: {\n type: \"string\",\n description: \"The URL for the previous page\",\n },\n },\n },\n };\n};\n\nexport const createPaginationSchemaObject = (\n name: string,\n items: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject,\n metaReference: string = \"#/components/schemas/PaginationData\",\n): { [key: string]: OpenAPIV3.SchemaObject } => {\n return {\n [name]: {\n type: \"object\",\n xml: {\n name,\n },\n properties: {\n data: {\n type: \"array\",\n xml: {\n name: \"data\",\n wrapped: true,\n },\n items,\n },\n meta: {\n $ref: metaReference,\n },\n },\n },\n };\n};\n","import Paginator from \"./paginator\";\nimport type { Paginator as PaginatorInterface } from \"./types\";\n\nexport type { Paginator as PaginatorInterface, PaginationResult, PaginationMeta } from \"./types.d\";\nexport { default as Paginator } from \"./paginator\";\n\n// eslint-disable-next-line max-len\nexport const paginate = <Result>(page: number, perPage: number, total: number, rows: Result[]): PaginatorInterface<Result> => new Paginator(total, Number(perPage), Number(page), ...rows);\n\nexport { createPaginationSchemaObject, createPaginationMetaSchemaObject } from \"./swagger\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/pagination",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "description": "Simple Pagination for Node.",
5
5
  "keywords": [
6
6
  "anolilab",
@@ -51,60 +51,61 @@
51
51
  "scripts": {
52
52
  "build": "cross-env NODE_ENV=development tsup",
53
53
  "build:prod": "cross-env NODE_ENV=production tsup",
54
- "clean": "rimraf node_modules dist",
54
+ "clean": "rimraf node_modules dist .eslintcache",
55
55
  "coverage": "vitest run --coverage",
56
56
  "dev": "pnpm predev && pnpm run build --watch",
57
57
  "lint:eslint": "cross-env NO_LOGS=true eslint . --ext js,jsx,ts,tsx --max-warnings=0 --config .eslintrc.cjs --cache --cache-strategy content .",
58
58
  "lint:eslint:fix": "pnpm run lint:eslint --fix",
59
- "test": "vitest"
59
+ "test": "vitest run",
60
+ "test:watch": "vitest"
60
61
  },
61
62
  "dependencies": {
62
- "qs": "^6.11.0"
63
+ "qs": "^6.11.2"
63
64
  },
64
65
  "devDependencies": {
65
- "@anolilab/eslint-config": "^4.0.9",
66
- "@anolilab/semantic-release-preset": "^2.0.7",
67
- "@rushstack/eslint-plugin-security": "^0.5.0",
66
+ "@anolilab/eslint-config": "^5.0.5",
67
+ "@anolilab/semantic-release-preset": "^2.2.1",
68
+ "@rushstack/eslint-plugin-security": "^0.6.0",
68
69
  "@types/micromatch": "^4.0.2",
69
- "@types/node": "^18.8.4",
70
+ "@types/node": "18.16.14",
70
71
  "@types/qs": "^6.9.7",
71
- "@typescript-eslint/eslint-plugin": "^5.40.0",
72
- "@typescript-eslint/parser": "^5.40.0",
72
+ "@typescript-eslint/eslint-plugin": "^5.59.7",
73
+ "@typescript-eslint/parser": "^5.59.7",
74
+ "@vitest/coverage-c8": "^0.31.1",
73
75
  "cross-env": "^7.0.3",
74
- "eslint": "^8.25.0",
75
- "eslint-plugin-compat": "^4.0.2",
76
+ "eslint": "^8.41.0",
77
+ "eslint-plugin-compat": "^4.1.4",
76
78
  "eslint-plugin-eslint-comments": "^3.2.0",
77
- "eslint-plugin-import": "^2.26.0",
79
+ "eslint-plugin-import": "^2.27.5",
78
80
  "eslint-plugin-json": "^3.1.0",
79
- "eslint-plugin-jsonc": "^2.5.0",
80
- "eslint-plugin-jsx-a11y": "^6.6.1",
81
+ "eslint-plugin-jsonc": "^2.8.0",
82
+ "eslint-plugin-jsx-a11y": "^6.7.1",
81
83
  "eslint-plugin-markdown": "^3.0.0",
82
84
  "eslint-plugin-material-ui": "^1.0.1",
83
85
  "eslint-plugin-no-loops": "^0.3.0",
84
86
  "eslint-plugin-no-secrets": "^0.8.9",
85
87
  "eslint-plugin-node": "^11.1.0",
86
88
  "eslint-plugin-optimize-regex": "^1.2.1",
87
- "eslint-plugin-promise": "^6.0.1",
88
- "eslint-plugin-radar": "^0.2.1",
89
- "eslint-plugin-react": "7.31.11",
89
+ "eslint-plugin-promise": "^6.1.1",
90
+ "eslint-plugin-react": "7.32.2",
90
91
  "eslint-plugin-react-hooks": "4.6.0",
91
- "eslint-plugin-simple-import-sort": "^8.0.0",
92
+ "eslint-plugin-simple-import-sort": "^10.0.0",
92
93
  "eslint-plugin-sort-keys-fix": "^1.1.2",
93
- "eslint-plugin-testing-library": "^5.7.2",
94
- "eslint-plugin-unicorn": "^45.0.0",
94
+ "eslint-plugin-testing-library": "^5.11.0",
95
+ "eslint-plugin-unicorn": "^47.0.0",
95
96
  "eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0",
96
97
  "eslint-plugin-you-dont-need-momentjs": "^1.6.0",
97
- "openapi-types": "^12.0.2",
98
- "prettier": "^2.7.1",
99
- "read-pkg": "^7.1.0",
100
- "rimraf": "^3.0.2",
101
- "semantic-release": "^20.0.0",
102
- "tsup": "^6.2.3",
103
- "typescript": "^4.8.4",
104
- "vitest": "^0.26.1"
98
+ "openapi-types": "^12.1.3",
99
+ "prettier": "^2.8.8",
100
+ "read-pkg": "^8.0.0",
101
+ "rimraf": "^5.0.1",
102
+ "semantic-release": "^21.0.2",
103
+ "tsup": "^6.7.0",
104
+ "typescript": "^5.0.4",
105
+ "vitest": "^0.31.1"
105
106
  },
106
107
  "engines": {
107
- "node": ">=16.18.0 <=19.0"
108
+ "node": ">=16.18.0 <=20.*"
108
109
  },
109
110
  "publishConfig": {
110
111
  "access": "public"