Skip to content

Commit

Permalink
create: skipTake
Browse files Browse the repository at this point in the history
  • Loading branch information
irychen committed Jan 23, 2024
1 parent 6a497bf commit 49f00bd
Show file tree
Hide file tree
Showing 9 changed files with 364 additions and 8 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ library.
<li>isInteger</li>
<li>isNil</li>
<li>isNumber</li>
<li>skipTake</li>
</ul>
</div>
<div style="width: 50%;display: inline-block">
Expand Down
28 changes: 27 additions & 1 deletion index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ declare function isNumber(value: any, skipFinite?: boolean): value is number;

declare function isString(value: any): value is string;

declare function toNumber(value: any): number;
declare function toNumber(value: any, skipFinite?: boolean): number;

/**
* @name map
Expand Down Expand Up @@ -107,6 +107,30 @@ declare function toBoolean(value: any): boolean;
*/
declare function toPercentage(value: number, fixed?: number): string;

interface skipTakeOptions {
defaultPage?: number
defaultPageSize?: number
maxPageSize?: number
maxPage?: number
minPageSize?: number
minPage?: number
allowAll?: boolean
}

interface skipTakePagination {
page?: number | string
pageSize?: number | string
}

interface skipTakeResult {
skip?: number
take?: number
page: number
pageSize: number
}

declare function skipTake(pagination?: skipTakePagination, options?: skipTakeOptions): skipTakeResult;

declare const fortea: {
base64: {
_keyStr: string;
Expand All @@ -131,6 +155,7 @@ declare const fortea: {
forString: typeof forString;
forBoolean: typeof forBoolean;
};
skipTake: typeof skipTake;
toBoolean: typeof toBoolean;
toNumber: typeof toNumber;
toPercentage: typeof toPercentage;
Expand All @@ -150,6 +175,7 @@ export {
map,
mergePath,
queryJsonStr,
skipTake,
toBoolean,
toNumber,
toPercentage,
Expand Down
69 changes: 65 additions & 4 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -245,19 +245,32 @@ function isString(value) {
return typeof value === "string";
}

function toNumber(value) {
/**
* Convert value to number
* @name toNumber
* @param value
* @param skipFinite if false, infinity will be converted to 0 ,default is false
* @return number
* @example
* toNumber(1) // => 1
* toNumber(Infinity) // => 0
* toNumber(NaN) // => 0
* toNumber(Infinity, true) // => Infinity
* toNumber(-0) // => 0
*/
function toNumber(value, skipFinite = false) {
if (value === null || value === undefined)
return 0;
if (typeof value === "string") {
const v = parseFloat(value);
if (isNegativeZero(v))
return 0;
return isNumber(v) ? v : 0;
return isNumber(v, skipFinite) ? v : 0;
}
if (typeof value === "number") {
if (isNegativeZero(value))
return 0;
return isNumber(value) ? value : 0;
return isNumber(value, skipFinite) ? value : 0;
}
return 0;
}
Expand Down Expand Up @@ -377,6 +390,53 @@ function toPercentage(value, fixed) {
}
}

/**
* @name skipTake
* @description skip take pagination function for prisma orm
* @example
* const { skip, take } = skipTake({ page: 2, pageSize: 10 }) // skip: 10, take: 10
*
* const { skip, take } = skipTake({ page: 2, pageSize: -1 }) // skip: undefined, take: undefined
*
* const { skip, take } = skipTake({ page: 1, pageSize: -1 }, { allowAll: false }) // skip: 0, take: 10 (pageSize = minPageSize || defaultPageSize)
*/
function skipTake(pagination, options) {
let { page, pageSize } = pagination || {};
const { defaultPage = 1, defaultPageSize = 10, maxPageSize, maxPage, minPageSize, minPage, allowAll = true, } = options || {};
page = isNil(page) ? defaultPage : toNumber(page, true);
pageSize = isNil(pageSize) ? defaultPageSize : toNumber(pageSize, true);
if (maxPageSize && pageSize > maxPageSize)
pageSize = maxPageSize;
if (maxPage && page > maxPage)
page = maxPage;
if (minPageSize && pageSize < minPageSize)
pageSize = minPageSize;
if (minPage && page < minPage)
page = minPage;
if (!Number.isFinite(page))
page = defaultPage;
if (!Number.isFinite(pageSize))
pageSize = defaultPageSize;
if (pageSize < 1 && allowAll) {
return {
skip: undefined,
take: undefined,
page,
pageSize,
};
}
else {
if (pageSize < 1)
pageSize = minPageSize || defaultPageSize;
return {
skip: (page - 1) * pageSize,
take: pageSize,
page,
pageSize,
};
}
}

const fortea = {
base64,
classNames,
Expand All @@ -391,9 +451,10 @@ const fortea = {
map,
mergePath,
queryJsonStr,
skipTake,
toBoolean,
toNumber,
toPercentage,
};

export { base64, classNames, fortea as default, delayAsync, isBoolean, isFunc, isInteger, isNil, isNumber, isObject, isString, map, mergePath, queryJsonStr, toBoolean, toNumber, toPercentage };
export { base64, classNames, fortea as default, delayAsync, isBoolean, isFunc, isInteger, isNil, isNumber, isObject, isString, map, mergePath, queryJsonStr, skipTake, toBoolean, toNumber, toPercentage };
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
"lint-staged": "^15.2.0",
"prettier": "3.2.4",
"rollup": "^4.9.6",
"tslib": "^2.6.2",
"typescript": "^5.3.3"
}
}
3 changes: 3 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import isBoolean from "./isBoolean"
import isObject from "./isObject"
import toBoolean from "./toBoolean"
import toPercentage from "./toPercentage"
import skipTake from "./skipTake"

const fortea = {
base64,
Expand All @@ -29,6 +30,7 @@ const fortea = {
map,
mergePath,
queryJsonStr,
skipTake,
toBoolean,
toNumber,
toPercentage,
Expand All @@ -49,6 +51,7 @@ export {
map,
mergePath,
queryJsonStr,
skipTake,
toBoolean,
toNumber,
toPercentage,
Expand Down
73 changes: 73 additions & 0 deletions src/skipTake/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import isNil from "../isNil"
import toNumber from "../toNumber"

interface skipTakeOptions {
defaultPage?: number
defaultPageSize?: number
maxPageSize?: number
maxPage?: number
minPageSize?: number
minPage?: number
allowAll?: boolean
}

interface skipTakePagination {
page?: number | string
pageSize?: number | string
}

interface skipTakeResult {
skip?: number
take?: number
page: number
pageSize: number
}

/**
* @name skipTake
* @description skip take pagination function for prisma orm
* @example
* const { skip, take } = skipTake({ page: 2, pageSize: 10 }) // skip: 10, take: 10
*
* const { skip, take } = skipTake({ page: 2, pageSize: -1 }) // skip: undefined, take: undefined
*
* const { skip, take } = skipTake({ page: 1, pageSize: -1 }, { allowAll: false }) // skip: 0, take: 10 (pageSize = minPageSize || defaultPageSize)
*/
function skipTake(pagination?: skipTakePagination, options?: skipTakeOptions): skipTakeResult {
let { page, pageSize } = pagination || {}
const {
defaultPage = 1,
defaultPageSize = 10,
maxPageSize,
maxPage,
minPageSize,
minPage,
allowAll = true,
} = options || {}
page = isNil(page) ? defaultPage : toNumber(page, true)
pageSize = isNil(pageSize) ? defaultPageSize : toNumber(pageSize, true)
if (maxPageSize && pageSize > maxPageSize) pageSize = maxPageSize
if (maxPage && page > maxPage) page = maxPage
if (minPageSize && pageSize < minPageSize) pageSize = minPageSize
if (minPage && page < minPage) page = minPage
if (!Number.isFinite(page)) page = defaultPage
if (!Number.isFinite(pageSize)) pageSize = defaultPageSize
if (pageSize < 1 && allowAll) {
return {
skip: undefined,
take: undefined,
page,
pageSize,
}
} else {
if (pageSize < 1) pageSize = minPageSize || defaultPageSize
return {
skip: (page - 1) * pageSize,
take: pageSize,
page,
pageSize,
}
}
}

export default skipTake
Loading

0 comments on commit 49f00bd

Please sign in to comment.