Skip to content

Commit

Permalink
Prerelease (#24)
Browse files Browse the repository at this point in the history
* prerelease

* new props for provider

* typed override name

* add test and docs

* merge provider props

* pump version

* remove redundant params

* found out type for abstract constructor

* pump version
  • Loading branch information
SilentCatD committed Dec 5, 2023
1 parent aee9687 commit 0cb0ff0
Show file tree
Hide file tree
Showing 9 changed files with 62 additions and 17 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 1.3.2

- Found out a way to use abstract constructor type.

# 1.3.1

- Remove `ctor` from `ProviderProps`, use `name` instead
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ class SubClass extends SuperClasss {}
<Provider name={SuperClass.name} source={new SubClass()}>
<Children />
</Provider>,

// hooks can then use the type `SuperClass` to retrieve value too
```

#### Scoped data overwrite
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "react-scoped-provider",
"version": "1.3.1",
"version": "1.3.2",
"description": "Library for DI in react without the need of self-creating context everytime.",
"type": "module",
"source": "src/index.ts",
Expand Down
5 changes: 3 additions & 2 deletions src/Consumer/index.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { useNamedProvider } from '../hooks'
import { Constructor } from '../types'
import { getObjectRuntimeName } from '../utils'

interface ConsumerProps<T> {
children: (data: T) => JSX.Element
name?: string
ctor?: new (...a: any) => any
ctor?: Constructor<any>
allowUndef?: boolean
}

Expand All @@ -22,7 +23,7 @@ interface NamedConsumerDisAllowUndefProps<T> extends NamedConsumerProps<T> {
}

interface CtorConsumerProps<T> extends ConsumerProps<T> {
ctor: new (...a: any) => T
ctor: Constructor<T>
}

interface CtorConsumerAllowUndefProps<T> extends CtorConsumerProps<T | undefined> {
Expand Down
11 changes: 6 additions & 5 deletions src/hooks/useProvider.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Constructor } from '../types'
import { getObjectRuntimeName } from '../utils'
import useNamedProvider from './useNamedProvider'

Expand All @@ -22,11 +23,11 @@ function useProvider(ctor: BooleanConstructor, name?: string): boolean
function useProvider(ctor: NumberConstructor, configs: UseProviderConfigsAllowUndef): number | undefined
function useProvider(ctor: NumberConstructor, configs: UseProviderConfigsDisAllowUndef): number
function useProvider(ctor: NumberConstructor, name?: string): number
function useProvider<T>(ctor: new (...a: any) => T, configs: UseProviderConfigsAllowUndef): T | undefined
function useProvider<T>(ctor: new (...a: any) => T, configs: UseProviderConfigsDisAllowUndef): T
function useProvider<T>(ctor: new (...a: any) => T, name?: string): T
function useProvider<T>(ctor: new (...a: any) => T, configs?: string | UseProviderConfigs): T | undefined
function useProvider<T>(ctor: new (...a: any) => T, configs?: string | UseProviderConfigs): T | undefined {
function useProvider<T>(ctor: Constructor<T>, configs: UseProviderConfigsAllowUndef): T | undefined
function useProvider<T>(ctor: Constructor<T>, configs: UseProviderConfigsDisAllowUndef): T
function useProvider<T>(ctor: Constructor<T>, name?: string): T
function useProvider<T>(ctor: Constructor<T>, configs?: string | UseProviderConfigs): T | undefined
function useProvider<T>(ctor: Constructor<T>, configs?: string | UseProviderConfigs): T | undefined {
const name = typeof configs === 'string' ? configs : configs?.name
const allowUndef = typeof configs === 'string' ? false : configs?.allowUndef ?? false
const key = name ?? getObjectRuntimeName(ctor)
Expand Down
4 changes: 2 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { ContextData, ProviderContext } from './ProviderContext'
import { ProviderScope, ProviderScopeProps } from './ProviderScope'
import { ResourcesNotProvidedError } from './errors'
import { getObjectRuntimeName, isCreate } from './utils'
import { Create } from './types'
import { Create, Constructor } from './types'
import {
Consumer,
NumberConsumerAllowUndefProps,
Expand All @@ -41,7 +41,7 @@ export type {
NamedConsumerDisAllowUndefProps,
NamedConsumerAllowUndefProps,
}
export { Create }
export { Create, Constructor }
export { ProviderProps, Provider, CreateProviderProps, ValueProviderProps }
export { ProviderScope, ProviderScopeProps }
export { ProviderContext, ContextData }
Expand Down
5 changes: 4 additions & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
type Create<T> = () => T

export type { Create }
// eslint-disable-next-line @typescript-eslint/ban-types
type Constructor<T> = Function & { prototype: T }

export type { Create, Constructor }
36 changes: 32 additions & 4 deletions test/Provider/typeNameRespected.test.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import { getByTestId, render } from '@testing-library/react'
import { Provider, useNamedProvider } from '../../src'
import { Constructor, Provider, useNamedProvider, useProvider } from '../../src'

const DisplayRendered = ({ name }: { name: string }) => {
useNamedProvider(name)
return <h1 data-testid='text'>Rendered</h1>
}

class SuperClass {
const DisplayRenderedConstructor = ({ ctor }: { ctor: Constructor<any> }) => {
useProvider(ctor)
return <h1 data-testid='text'>Rendered</h1>
}
abstract class SuperClass {
count: number
constructor(count: number) {
this.count = count
Expand All @@ -21,7 +25,7 @@ class SubClass extends SuperClass {
}
}

it('respect Subclass type', () => {
it('respect Subclass name', () => {
const { container } = render(
<Provider source={new SubClass(5)}>
<DisplayRendered name={SubClass.name} />
Expand All @@ -33,7 +37,7 @@ it('respect Subclass type', () => {
expect(renderedText).toBe(expectedText)
})

it('respect Superclass ctor type', () => {
it('respect Superclass ctor name', () => {
const { container } = render(
<Provider name={SuperClass.name} source={new SubClass(5)}>
<DisplayRendered name={SuperClass.name} />
Expand All @@ -44,3 +48,27 @@ it('respect Superclass ctor type', () => {
const expectedText = 'Rendered'
expect(renderedText).toBe(expectedText)
})

it('respect Subclass type', () => {
const { container } = render(
<Provider source={new SubClass(5)}>
<DisplayRenderedConstructor ctor={SubClass} />
</Provider>,
)
const rendered = getByTestId(container, 'text')
const renderedText = rendered.textContent
const expectedText = 'Rendered'
expect(renderedText).toBe(expectedText)
})

it('respect Superclass ctor type', () => {
const { container } = render(
<Provider name={SuperClass.name} source={new SubClass(5)}>
<DisplayRenderedConstructor ctor={SuperClass} />
</Provider>,
)
const rendered = getByTestId(container, 'text')
const renderedText = rendered.textContent
const expectedText = 'Rendered'
expect(renderedText).toBe(expectedText)
})
10 changes: 8 additions & 2 deletions test/hooks/useProvider.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,19 @@ import { PropsWithChildren, useState } from 'react'
import { MultiProvider, Provider, ResourcesNotProvidedError, useProvider } from '../../src'
import { fireEvent, getByTestId, render, waitFor } from '@testing-library/react'

class Counter {
abstract class Counter {
count: number
constructor(count: number) {
this.count = count
}
}

class CounterImpl extends Counter {
constructor() {
super(6)
}
}

class CustomData {
key: string
value: string
Expand All @@ -25,7 +31,7 @@ const ProviderComponent = ({ children }: PropsWithChildren) => {
<Provider key={1} source={5} />,
<Provider key={2} source={true} />,
<Provider key={3} source={'test-text'} />,
<Provider key={4} source={new Counter(6)} />,
<Provider name={Counter.name} key={4} source={new CounterImpl()} />,
<Provider key={5} source={new CustomData('test-key', 'test-val')} name='custom' />,
]}
>
Expand Down

0 comments on commit 0cb0ff0

Please sign in to comment.