From 7ca5edcee1a6068f5203f7d6f4de60a23eab9706 Mon Sep 17 00:00:00 2001 From: akashi Date: Mon, 22 May 2023 11:21:46 +0800 Subject: [PATCH 1/7] :sparkles: feat: isPercent && toNumber --- packages/core/sumPercent/index.md | 6 ++++-- packages/core/sumPercent/index.ts | 24 +++++++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/core/sumPercent/index.md b/packages/core/sumPercent/index.md index ac8e48a..e69ce81 100644 --- a/packages/core/sumPercent/index.md +++ b/packages/core/sumPercent/index.md @@ -9,8 +9,10 @@ Sum percentage. ## Usage ```ts -import { percentToNumber, sumPercent } from '@use-kit/functions' +import { isPercent, sumPercent, toNumber } from '@use-kit/functions' -const { x, y } = percentToNumber('20%', '30%') // { x: 20, y: 30 } +isPercent('15%') // true +toNumber('15%') // 0.15 +toNumber('15%', false) // 15 const ret = sumPercent('20%', '13%') // 33% ``` diff --git a/packages/core/sumPercent/index.ts b/packages/core/sumPercent/index.ts index a88b2da..7c5115c 100644 --- a/packages/core/sumPercent/index.ts +++ b/packages/core/sumPercent/index.ts @@ -1,10 +1,32 @@ -export const percentToNumber = (target: string, source: string) => { +import { isNumber, isString } from '..' + +const percentToNumber = (target: string, source: string) => { const x = target.split('%')[0] const y = source.split('%')[0] return { x: Number(x), y: Number(y) } } +export const isPercent = (target: string | number) => { + if (isNumber(target)) + return false + + return target.toString().includes('%') +} + +export const toNumber = (target: string | number, keepSize = true) => { + if (isString(target)) { + if (isPercent(target)) { + const num = Number((target as string).split('%')[0]) + return keepSize ? num / 100 : num + } + + return Number(target) + } + + return target +} + export const sumPercent = (target: string, source: string) => { const { x, y } = percentToNumber(target, source) From d50332c55e2e9baa2071f141fa5d0e2c6724f5d3 Mon Sep 17 00:00:00 2001 From: akashi Date: Mon, 22 May 2023 17:51:33 +0800 Subject: [PATCH 2/7] :sparkles: feat: withPercentCalculate --- packages/core/sumPercent/index.md | 11 ++++++++++- packages/core/sumPercent/index.ts | 20 +++++++++++++++++++- packages/docs/core/sumPercent/index.md | 15 +++++++++++++-- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/packages/core/sumPercent/index.md b/packages/core/sumPercent/index.md index e69ce81..2db46ff 100644 --- a/packages/core/sumPercent/index.md +++ b/packages/core/sumPercent/index.md @@ -9,10 +9,19 @@ Sum percentage. ## Usage ```ts -import { isPercent, sumPercent, toNumber } from '@use-kit/functions' +import { + isPercent, + sumPercent, + toNumber, + withPercentCalculate, +} from '@use-kit/functions' isPercent('15%') // true toNumber('15%') // 0.15 toNumber('15%', false) // 15 + const ret = sumPercent('20%', '13%') // 33% +const ret = withPercentCalculate(20, '50%') // 10 +const ret = withPercentCalculate('30', '50%') // 15 +const ret = withPercentCalculate('20%', '50%') // 70% ``` diff --git a/packages/core/sumPercent/index.ts b/packages/core/sumPercent/index.ts index 7c5115c..165117a 100644 --- a/packages/core/sumPercent/index.ts +++ b/packages/core/sumPercent/index.ts @@ -24,7 +24,25 @@ export const toNumber = (target: string | number, keepSize = true) => { return Number(target) } - return target + return target as number +} + +export const withPercentCalculate = ( + target: string | number, + source: string | number, +) => { + if (isString(target) || isString(source)) { + const x = isNaN(Number(target)) ? toNumber(target) : Number(target) + const y = isNaN(Number(source)) ? toNumber(source) : Number(source) + + // with percent + if (isNaN(Number(target)) || isNaN(Number(source))) + return x * y + + return x + y + } + + return Number(target) + Number(source) } export const sumPercent = (target: string, source: string) => { diff --git a/packages/docs/core/sumPercent/index.md b/packages/docs/core/sumPercent/index.md index ac8e48a..2db46ff 100644 --- a/packages/docs/core/sumPercent/index.md +++ b/packages/docs/core/sumPercent/index.md @@ -9,8 +9,19 @@ Sum percentage. ## Usage ```ts -import { percentToNumber, sumPercent } from '@use-kit/functions' +import { + isPercent, + sumPercent, + toNumber, + withPercentCalculate, +} from '@use-kit/functions' + +isPercent('15%') // true +toNumber('15%') // 0.15 +toNumber('15%', false) // 15 -const { x, y } = percentToNumber('20%', '30%') // { x: 20, y: 30 } const ret = sumPercent('20%', '13%') // 33% +const ret = withPercentCalculate(20, '50%') // 10 +const ret = withPercentCalculate('30', '50%') // 15 +const ret = withPercentCalculate('20%', '50%') // 70% ``` From 3d18b29c24364ee72763e978a5395849b66b7d5a Mon Sep 17 00:00:00 2001 From: akashi Date: Tue, 23 May 2023 18:21:06 +0800 Subject: [PATCH 3/7] :art: feat: withDefaultObject --- packages/core/mergeField/index.ts | 10 +++++++++- packages/core/withDefaultObject/index.ts | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 packages/core/withDefaultObject/index.ts diff --git a/packages/core/mergeField/index.ts b/packages/core/mergeField/index.ts index 6c8ea4d..3df188b 100644 --- a/packages/core/mergeField/index.ts +++ b/packages/core/mergeField/index.ts @@ -1 +1,9 @@ -// TODO: +interface objParams { + [key: string]: any +} + +export const mergeField = (target: objParams, source: objParams) => { + Object.keys(source).forEach((sKey) => { + target[sKey] = source[sKey] + }) +} diff --git a/packages/core/withDefaultObject/index.ts b/packages/core/withDefaultObject/index.ts new file mode 100644 index 0000000..c390a33 --- /dev/null +++ b/packages/core/withDefaultObject/index.ts @@ -0,0 +1,20 @@ +import { isUndefined } from '..' + +interface objParams { + [key: string]: any +} + +export const withDefaultObject = ( + target: objParams | undefined, + source: objParams, +): objParams => { + if (isUndefined(target)) + target = {} + + Object.keys(source).forEach((sKey) => { + if (!Object.keys(target as objParams).includes(sKey)) + (target as objParams)[sKey] = source[sKey] + }) + + return target as objParams +} From 585a2c8e251c784f4dddd0c14d54731af9156a6e Mon Sep 17 00:00:00 2001 From: Akashi Date: Wed, 24 May 2023 08:14:51 +0800 Subject: [PATCH 4/7] chore: release v0.1.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 85f2a6a..1b64632 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@use-kit/functions", "type": "module", - "version": "0.1.0", + "version": "0.1.1", "packageManager": "pnpm@8.4.0", "description": "", "author": "Akashi Sai ", From b7a39fece22b0be7963ebced308a250496c5a7e3 Mon Sep 17 00:00:00 2001 From: akashi Date: Wed, 24 May 2023 11:05:06 +0800 Subject: [PATCH 5/7] chore: release v0.1.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1b64632..361eb7a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@use-kit/functions", "type": "module", - "version": "0.1.1", + "version": "0.1.2", "packageManager": "pnpm@8.4.0", "description": "", "author": "Akashi Sai ", From 77f039f0c54030fd7d34a97f6d5df676b376d127 Mon Sep 17 00:00:00 2001 From: akashi Date: Wed, 24 May 2023 15:07:56 +0800 Subject: [PATCH 6/7] :white_check_mark: chore: add test && complete docs --- packages/core/index.ts | 4 ++++ packages/core/mergeField/index.md | 16 ++++++++++++++++ packages/core/mergeField/index.test.ts | 15 ++++++++++++++- packages/core/mergeField/index.ts | 2 ++ packages/core/withDefaultObject/index.md | 16 ++++++++++++++++ packages/core/withDefaultObject/index.test.ts | 15 +++++++++++++++ packages/docs/core/mergeField/index.md | 16 ++++++++++++++++ packages/docs/core/withDefaultObject/index.md | 16 ++++++++++++++++ 8 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 packages/core/withDefaultObject/index.md create mode 100644 packages/core/withDefaultObject/index.test.ts create mode 100644 packages/docs/core/withDefaultObject/index.md diff --git a/packages/core/index.ts b/packages/core/index.ts index fec8b1d..a1703ec 100644 --- a/packages/core/index.ts +++ b/packages/core/index.ts @@ -20,9 +20,13 @@ export * from './isBase64' export * from './isEmpty' export * from './isType' +export * from './mergeField' + export * from './sum' export * from './sumPercent' export * from './throttle' export * from './uniqueList' + +export * from './withDefaultObject' diff --git a/packages/core/mergeField/index.md b/packages/core/mergeField/index.md index e69de29..61c9816 100644 --- a/packages/core/mergeField/index.md +++ b/packages/core/mergeField/index.md @@ -0,0 +1,16 @@ +--- +category: '@Core' +--- + +# mergeField + +Merge object field. It returns the modified target object. + +## Usage + +```ts{4} +import { mergeField } from '@use-kit/functions' + +const ret = mergeField({ a: 'a', d: 'd' }, { a: 'b', b: 'b', c: 'c' }) +// ret: { a: 'b', d: 'd', b: 'b', c: 'c' } +``` diff --git a/packages/core/mergeField/index.test.ts b/packages/core/mergeField/index.test.ts index 9577dcb..d7bc25a 100644 --- a/packages/core/mergeField/index.test.ts +++ b/packages/core/mergeField/index.test.ts @@ -1,5 +1,18 @@ import { describe, expect, it } from 'vitest' +import { mergeField } from '.' describe('merge field', () => { - it('should', () => expect(true).toBeTruthy()) + it('should', () => { + const target = { a: 'a', d: 'd' } + const source = { a: 'b', b: 'b', c: 'c' } + const ret = mergeField(target, source) + expect(target).toMatchInlineSnapshot(` + { + "a": "b", + "b": "b", + "c": "c", + "d": "d", + } + `) + }) }) diff --git a/packages/core/mergeField/index.ts b/packages/core/mergeField/index.ts index 3df188b..7ed4522 100644 --- a/packages/core/mergeField/index.ts +++ b/packages/core/mergeField/index.ts @@ -6,4 +6,6 @@ export const mergeField = (target: objParams, source: objParams) => { Object.keys(source).forEach((sKey) => { target[sKey] = source[sKey] }) + + return target } diff --git a/packages/core/withDefaultObject/index.md b/packages/core/withDefaultObject/index.md new file mode 100644 index 0000000..2395cae --- /dev/null +++ b/packages/core/withDefaultObject/index.md @@ -0,0 +1,16 @@ +--- +category: '@Core' +--- + +# withDefaultObject + +Assignment with default object value. + +## Usage + +```ts{4} +import { withDefaultObject } from '@use-kit/functions' + +const ret = withDefaultObject({ x: 1 }, { x: 0, y: 0 }) +// ret: { x: 1, y: 0 } +``` diff --git a/packages/core/withDefaultObject/index.test.ts b/packages/core/withDefaultObject/index.test.ts new file mode 100644 index 0000000..fd6348a --- /dev/null +++ b/packages/core/withDefaultObject/index.test.ts @@ -0,0 +1,15 @@ +import { describe, expect, it } from 'vitest' +import { withDefaultObject } from '.' + +describe('default object', () => { + it('should', () => { + expect( + withDefaultObject({ x: 1 }, { x: 0, y: 0 }), + ).toMatchInlineSnapshot(` + { + "x": 1, + "y": 0, + } + `) + }) +}) diff --git a/packages/docs/core/mergeField/index.md b/packages/docs/core/mergeField/index.md index e69de29..61c9816 100644 --- a/packages/docs/core/mergeField/index.md +++ b/packages/docs/core/mergeField/index.md @@ -0,0 +1,16 @@ +--- +category: '@Core' +--- + +# mergeField + +Merge object field. It returns the modified target object. + +## Usage + +```ts{4} +import { mergeField } from '@use-kit/functions' + +const ret = mergeField({ a: 'a', d: 'd' }, { a: 'b', b: 'b', c: 'c' }) +// ret: { a: 'b', d: 'd', b: 'b', c: 'c' } +``` diff --git a/packages/docs/core/withDefaultObject/index.md b/packages/docs/core/withDefaultObject/index.md new file mode 100644 index 0000000..2395cae --- /dev/null +++ b/packages/docs/core/withDefaultObject/index.md @@ -0,0 +1,16 @@ +--- +category: '@Core' +--- + +# withDefaultObject + +Assignment with default object value. + +## Usage + +```ts{4} +import { withDefaultObject } from '@use-kit/functions' + +const ret = withDefaultObject({ x: 1 }, { x: 0, y: 0 }) +// ret: { x: 1, y: 0 } +``` From 8357ef534a2e7fc340d01d1a096d13fe89dc8c6d Mon Sep 17 00:00:00 2001 From: akashi Date: Thu, 25 May 2023 15:12:58 +0800 Subject: [PATCH 7/7] :white_check_mark: test: with-default-object --- packages/core/withDefaultObject/index.test.ts | 55 ++++++++++++++++++- packages/core/withDefaultObject/test.use.ts | 8 +++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 packages/core/withDefaultObject/test.use.ts diff --git a/packages/core/withDefaultObject/index.test.ts b/packages/core/withDefaultObject/index.test.ts index fd6348a..f1d8253 100644 --- a/packages/core/withDefaultObject/index.test.ts +++ b/packages/core/withDefaultObject/index.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest' import { withDefaultObject } from '.' describe('default object', () => { - it('should', () => { + it('default return', () => { expect( withDefaultObject({ x: 1 }, { x: 0, y: 0 }), ).toMatchInlineSnapshot(` @@ -12,4 +12,57 @@ describe('default object', () => { } `) }) + + it('with not return', () => { + const target = { x: 1 } + const source = { x: 0, y: 0 } + withDefaultObject(target, source) + expect(target).toMatchInlineSnapshot(` + { + "x": 1, + "y": 0, + } + `) + }) + + it('with {}', () => { + const target = {} + const source = { x: 0, y: 0 } + withDefaultObject(target, source) + expect(target).toMatchInlineSnapshot(` + { + "x": 0, + "y": 0, + } + `) + }) + + it('with undefined', () => { + let target + const source = { x: 0, y: 0 } + withDefaultObject((target || (target = {})), source) + + expect(target).toMatchInlineSnapshot(` + { + "x": 0, + "y": 0, + } + `) + + expect(withDefaultObject(target, source)).toMatchInlineSnapshot(` + { + "x": 0, + "y": 0, + } + `) + }) + + it('with default undefined', () => { + const target = undefined + const source = { x: 0, y: 0 } + withDefaultObject(target, source) + + // TODO: + expect(target).toMatchInlineSnapshot('undefined') + }) }) diff --git a/packages/core/withDefaultObject/test.use.ts b/packages/core/withDefaultObject/test.use.ts new file mode 100644 index 0000000..f55ba0e --- /dev/null +++ b/packages/core/withDefaultObject/test.use.ts @@ -0,0 +1,8 @@ +import { withDefaultObject } from '.' + +const target = undefined +const source = { x: 0, y: 0 } +const ret = withDefaultObject(target, source) + +console.log('target', target) +console.log('ret', ret)