Skip to content

Commit

Permalink
feat!: createMeta now support custom meta key. It now return { set,…
Browse files Browse the repository at this point in the history
… get } instead of { setMeta, getMeta }. Now `set` and `get` supports generic type.
  • Loading branch information
s3xysteak committed Jul 14, 2024
1 parent c24c648 commit 86e96b8
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 11 deletions.
18 changes: 14 additions & 4 deletions src/core/base.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,21 @@ describe('base:createMeta', () => {
one: number
}
const [s, g] = createMeta<Options>()
expectTypeOf(s).parameter(1).toEqualTypeOf<Options>()
expectTypeOf(s<Options>).parameter(1).toEqualTypeOf<Options>()

const returnsOfSetter = s(obj, { one: 1 })
expectTypeOf(returnsOfSetter).toEqualTypeOf<typeof obj>()
expectTypeOf(g(obj)).toEqualTypeOf<Options | undefined>()
expectTypeOf(g<string>(obj)).toEqualTypeOf<string | undefined>()
})

it('object destruct', () => {
const obj = { one: 1 }

const { setMeta, getMeta } = createMeta()
const { set, get } = createMeta()

setMeta(obj, { two: 2 })
expect(getMeta(obj)).toEqual({ two: 2 })
set(obj, { two: 2 })
expect(get(obj)).toEqual({ two: 2 })
})

it('handle error', () => {
Expand All @@ -57,4 +58,13 @@ describe('base:createMeta', () => {

expect(() => s(undefined, 1)).toThrowError()
})

it('custom meta key', () => {
const [s] = createMeta('__foo_bar')

const obj = {}
s(obj, 1)

expect((obj as any).__foo_bar).toBe(1)
})
})
12 changes: 5 additions & 7 deletions src/core/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,28 +11,26 @@ export function toLF(content: string) {
/**
* Create Setter and Getter for property without conflict (based on Symbol)
* @example
* // const { setMeta, getMeta } = createMeta()
* // const { set, get } = createMeta()
* const [s, g] = createMeta<{one: number}>()
*
* const obj = {}
* s(obj, { one: 1 })
* g(obj) // = { one: 1 }
*/
export function createMeta<T = any>(_temp?: T) {
const metaSymbol = Symbol('createMeta')

const set = <Target = any>(target: Target, meta: T) =>
export function createMeta<T = any>(metaSymbol: PropertyKey = Symbol('createMeta'), _temp?: T) {
const set = <Meta = T, Target = any>(target: Target, meta: Meta) =>
Object.defineProperty(target, metaSymbol, {
value: meta,
writable: true,
enumerable: true,
configurable: true,
})

const get = (target: any) => target?.[metaSymbol] as T | undefined
const get = <Meta = T>(target: any) => target?.[metaSymbol] as Meta | undefined

return makeDestructurable(
{ setMeta: set, getMeta: get } as const,
{ set, get } as const,
[set, get] as const,
)
}

0 comments on commit 86e96b8

Please sign in to comment.