@modular-component/core 0.2.2 → 0.3.0
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 +16 -0
- package/README.md +21 -7
- package/dist/extend.d.ts +52 -0
- package/dist/extend.d.ts.map +1 -0
- package/dist/extend.js +22 -0
- package/dist/extend.js.map +1 -0
- package/dist/index.d.ts +49 -28
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -38
- package/dist/index.js.map +1 -1
- package/dist/render.d.ts +8 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +5 -0
- package/dist/render.js.map +1 -0
- package/extend.d.ts +1 -0
- package/extend.js +1 -0
- package/package.json +11 -4
- package/register.d.ts +7 -0
- package/register.js +3 -0
- package/src/extend.ts +111 -0
- package/src/index.ts +143 -141
- package/src/render.ts +23 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @modular-component/core
|
|
2
2
|
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 1784a2b: Add a clean way to extend the ModularComponent API with new dedicated stage functions
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- @modular-component/stages@0.3.0
|
|
12
|
+
|
|
13
|
+
## 0.2.3
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- 208e156: Fix displayName propagation
|
|
18
|
+
|
|
3
19
|
## 0.2.2
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @modular-component/core
|
|
2
2
|
|
|
3
|
-
Core system for creating
|
|
4
|
-
|
|
3
|
+
Core system for creating Modular components. Exports the `ModularComponent` factory function, as well as
|
|
4
|
+
helpers for creating stages.
|
|
5
5
|
|
|
6
6
|
## Installation and usage
|
|
7
7
|
|
|
@@ -19,14 +19,28 @@ const MyComponent = ModularComponent().with(
|
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
```tsx
|
|
22
|
-
//
|
|
23
|
-
import {
|
|
22
|
+
// Or by extending the factory
|
|
23
|
+
import { ModularComponent } from '@modular-component/core'
|
|
24
|
+
import '@modular-component/core/register'
|
|
25
|
+
|
|
26
|
+
const MyComponent = ModularComponent().withRender(() => (
|
|
27
|
+
<div>Hello Modular!</div>
|
|
28
|
+
))
|
|
29
|
+
```
|
|
24
30
|
|
|
25
|
-
|
|
26
|
-
|
|
31
|
+
```tsx
|
|
32
|
+
// Usage in extensions
|
|
33
|
+
import { ModularContext, addTo } from '@modular-component/core/extend'
|
|
34
|
+
|
|
35
|
+
export function extension<Context extends ModularContext>() {
|
|
36
|
+
return addTo<Context>()
|
|
37
|
+
.on('field')
|
|
38
|
+
.provide((args) => {
|
|
39
|
+
// Compute value for argument 'field' from previous stage arguments
|
|
40
|
+
})
|
|
27
41
|
}
|
|
28
42
|
```
|
|
29
43
|
|
|
30
44
|
## Learn more
|
|
31
45
|
|
|
32
|
-
Read the [`ModularComponent` ReadMe](https://github.com/
|
|
46
|
+
Read the [`ModularComponent` ReadMe](https://github.com/modular-component/modular-component/blob/master/README.md) for more information about the `ModularComponent` system.
|
package/dist/extend.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { FunctionComponent } from 'react';
|
|
2
|
+
import type { ModularContext } from '@modular-component/stages';
|
|
3
|
+
import type { ModularComponent } from './index';
|
|
4
|
+
export type { ModularContext } from '@modular-component/stages';
|
|
5
|
+
export type GetArgsFor<Context extends ModularContext, Field extends string> = Field extends keyof Context['stages'] ? Pick<Context['arguments'], Context['stages'][Field]> : Context['arguments'];
|
|
6
|
+
export type GetConstraintFor<Context extends ModularContext, Field extends string, Default = any> = Field extends 'render' ? ReturnType<FunctionComponent> : Field extends keyof Context['constraints'] ? Context['constraints'][Field] : Default;
|
|
7
|
+
export type GetValueGetterFor<Context extends ModularContext, Field extends string, Type> = Type | ((args: GetArgsFor<Context, Field>) => Type);
|
|
8
|
+
type AppendArguments<Arguments, Field extends string, Type> = {
|
|
9
|
+
[key in Exclude<keyof Arguments, Field>]: Arguments[key];
|
|
10
|
+
} & {
|
|
11
|
+
[key in Field]: Type;
|
|
12
|
+
} extends infer U ? {
|
|
13
|
+
[key in keyof U]: U[key];
|
|
14
|
+
} : never;
|
|
15
|
+
type AppendConstraints<Constraints, Backup, Field extends string, Type> = {
|
|
16
|
+
[key in Exclude<keyof Constraints, Field>]: Constraints[key];
|
|
17
|
+
} & {
|
|
18
|
+
[key in Exclude<keyof Backup, Field>]: Backup[key];
|
|
19
|
+
} & {
|
|
20
|
+
[key in Field]: Type;
|
|
21
|
+
} extends infer U ? {
|
|
22
|
+
[key in keyof U]: U[key];
|
|
23
|
+
} : never;
|
|
24
|
+
type AppendStages<Stages, Arguments, Field extends string, Type> = {
|
|
25
|
+
[key in Exclude<keyof Stages, Field>]: Stages[key];
|
|
26
|
+
} & {
|
|
27
|
+
[key in Field]: key extends keyof Stages ? Stages[key] : keyof Arguments;
|
|
28
|
+
} extends infer U ? {
|
|
29
|
+
[key in keyof U]: U[key];
|
|
30
|
+
} : never;
|
|
31
|
+
export type AppendStage<Context extends ModularContext, Field extends string, Type> = Pick<Context, 'props' | 'ref'> & {
|
|
32
|
+
arguments: AppendArguments<Context['arguments'], Field, Type>;
|
|
33
|
+
constraints: AppendConstraints<Context['constraints'], Context['_constraints'], Field, Type>;
|
|
34
|
+
stages: AppendStages<Context['stages'], Context['arguments'], Field, Type>;
|
|
35
|
+
} extends infer U ? {
|
|
36
|
+
[key in keyof U]: U[key];
|
|
37
|
+
} : never;
|
|
38
|
+
export type StageParams<Fn extends (...args: any[]) => any> = Parameters<Fn>;
|
|
39
|
+
export type StageReturn<Fn extends (...args: any[]) => (ctx?: any) => {
|
|
40
|
+
field: string;
|
|
41
|
+
provide: (args: any) => any;
|
|
42
|
+
}> = ModularComponent<AppendStage<NonNullable<Parameters<ReturnType<Fn>>[0]>, ReturnType<ReturnType<Fn>>['field'], ReturnType<ReturnType<ReturnType<Fn>>['provide']>>> extends ModularComponent<infer U> ? ModularComponent<U> : never;
|
|
43
|
+
export declare function addTo<Context extends ModularContext>(): {
|
|
44
|
+
on<Field extends string>(field: Field): {
|
|
45
|
+
provide<Stage extends (args: GetArgsFor<Context, Field>) => any>(stage: Stage): (_?: Context) => {
|
|
46
|
+
field: Field;
|
|
47
|
+
provide: Stage;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
export declare function wrap<Args, Type>(useFn: Type | ((args: Args) => Type)): (args: Args) => Type;
|
|
52
|
+
//# sourceMappingURL=extend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../src/extend.ts"],"names":[],"mappings":"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"}
|
package/dist/extend.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function addTo() {
|
|
2
|
+
return {
|
|
3
|
+
on(field) {
|
|
4
|
+
return {
|
|
5
|
+
provide(stage) {
|
|
6
|
+
return (_) => ({
|
|
7
|
+
field,
|
|
8
|
+
provide: stage,
|
|
9
|
+
});
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function wrap(useFn) {
|
|
16
|
+
return (args) => {
|
|
17
|
+
return typeof useFn === 'function'
|
|
18
|
+
? useFn(args)
|
|
19
|
+
: useFn;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=extend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extend.js","sourceRoot":"","sources":["../src/extend.ts"],"names":[],"mappings":"AAuFA,MAAM,UAAU,KAAK;IACnB,OAAO;QACL,EAAE,CAAuB,KAAY;YACnC,OAAO;gBACL,OAAO,CACL,KAAY;oBAEZ,OAAO,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;wBACvB,KAAK;wBACL,OAAO,EAAE,KAAK;qBACf,CAAC,CAAA;gBACJ,CAAC;aACF,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAa,KAAoC;IACnE,OAAO,CAAC,IAAU,EAAE,EAAE;QACpB,OAAO,OAAO,KAAK,KAAK,UAAU;YAChC,CAAC,CAAE,KAA8B,CAAC,IAAI,CAAC;YACvC,CAAC,CAAC,KAAK,CAAA;IACX,CAAC,CAAA;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,34 +1,55 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
never
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
|
|
1
|
+
import { ForwardRefRenderFunction, FunctionComponent, PropsWithChildren } from 'react';
|
|
2
|
+
import { ModularComponentStages, ModularContext } from '@modular-component/stages';
|
|
3
|
+
import { AppendStage, GetArgsFor, GetConstraintFor } from './extend';
|
|
4
|
+
type FunctionComponentOrRefRenderFunction<Props, Ref> = [Ref] extends [never] ? FunctionComponent<PropsWithChildren<Props>> : ForwardRefRenderFunction<Ref, PropsWithChildren<Props>>;
|
|
5
|
+
export type { ModularContext } from '@modular-component/stages';
|
|
6
|
+
type MapToForce<Stages> = {
|
|
7
|
+
[key in keyof Stages as key extends `with${infer K}` ? `force${K}` : never]: Stages[key];
|
|
8
|
+
};
|
|
9
|
+
type MapToStage<Stages> = Pick<Stages, {
|
|
10
|
+
[key in keyof Stages]: key extends `with${string}` ? key : never;
|
|
11
|
+
}[keyof Stages]>;
|
|
12
|
+
type MapToRaw<Stages> = {
|
|
13
|
+
[key in keyof Stages as key extends `with${infer K}` ? Uncapitalize<K> : never]: Stages[key];
|
|
14
|
+
};
|
|
15
|
+
type Force<Context extends ModularContext> = Omit<Context, 'constraints'> & {
|
|
16
|
+
constraints: {};
|
|
17
|
+
_constraints: Context['constraints'];
|
|
18
|
+
};
|
|
19
|
+
export type ModularComponent<Context extends ModularContext> = FunctionComponentOrRefRenderFunction<Context['props'], Context['ref']> & MapToStage<ModularComponentStages<Context>> & MapToForce<ModularComponentStages<Force<Context>>> & {
|
|
20
|
+
with<Field extends string, Type extends GetConstraintFor<Context, Field>>(stage: (context?: Context) => {
|
|
13
21
|
field: Field;
|
|
14
|
-
|
|
15
|
-
}): ModularComponent<
|
|
16
|
-
|
|
17
|
-
}>;
|
|
18
|
-
force<Field extends string, Type>(stage: {
|
|
22
|
+
provide: (args: GetArgsFor<Context, Field>) => Type;
|
|
23
|
+
}): ModularComponent<AppendStage<Context, Field, Type>>;
|
|
24
|
+
force<Field extends string, Type>(stage: (context?: Force<Context>) => {
|
|
19
25
|
field: Field;
|
|
20
|
-
|
|
21
|
-
}): ModularComponent<
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
stage<Field extends keyof Args>(key: Field): (args: Partial<Args>) => Args[Field];
|
|
27
|
-
setDisplayName(displayName: string): ModularComponent<Props, Ref, Args>;
|
|
26
|
+
provide: (args: GetArgsFor<Context, Field>) => Type;
|
|
27
|
+
}): ModularComponent<AppendStage<Context, Field, Type>>;
|
|
28
|
+
use<Field extends keyof Context['arguments']>(key: Field): {} extends Context['arguments']['props'] ? () => Context['arguments'][Field] : (props: PropsWithChildren<Context['arguments']['props']>) => Context['arguments'][Field];
|
|
29
|
+
use(): {} extends Context['props'] ? () => Context['arguments'] : (props: PropsWithChildren<Context['props']>) => Context['arguments'];
|
|
30
|
+
stage<Field extends keyof Context['arguments'] & string>(key: Field): (args: Partial<GetArgsFor<Context, Field>>) => Context['arguments'][Field];
|
|
31
|
+
withDisplayName(displayName: string): ModularComponent<Context>;
|
|
28
32
|
};
|
|
29
|
-
export declare function ModularComponent<Props extends {} = {}, Ref = never>(displayName?: string): ModularComponent<
|
|
33
|
+
export declare function ModularComponent<Props extends {} = {}, Ref = never>(displayName?: string): ModularComponent<{
|
|
30
34
|
props: Props;
|
|
31
|
-
|
|
35
|
+
ref: Ref;
|
|
36
|
+
stages: {};
|
|
37
|
+
arguments: {
|
|
38
|
+
props: Props;
|
|
39
|
+
ref: Ref;
|
|
40
|
+
render: ReturnType<FunctionComponent>;
|
|
41
|
+
};
|
|
42
|
+
constraints: {
|
|
43
|
+
props: Props;
|
|
44
|
+
ref: Ref;
|
|
45
|
+
render: ReturnType<FunctionComponent>;
|
|
46
|
+
};
|
|
32
47
|
}>;
|
|
33
|
-
export declare
|
|
48
|
+
export declare namespace ModularComponent {
|
|
49
|
+
var register: (functions: Partial<Record<keyof MapToRaw<ModularComponentStages<any>>, (...args: any[]) => (ctx?: ModularContext) => {
|
|
50
|
+
field: string;
|
|
51
|
+
provide: (args: any) => any;
|
|
52
|
+
}>>) => void;
|
|
53
|
+
}
|
|
54
|
+
export * from './render';
|
|
34
55
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,59 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
return useComponent.use('render')(props, ref);
|
|
1
|
+
let customFunctions = {};
|
|
2
|
+
function InternalFactory(stages, displayName) {
|
|
3
|
+
const UseComponent = function (props, ref) {
|
|
4
|
+
return UseComponent.use('render')(props, ref);
|
|
7
5
|
};
|
|
8
|
-
|
|
6
|
+
UseComponent.displayName = displayName;
|
|
7
|
+
UseComponent.with = (_stage) => {
|
|
8
|
+
const stage = _stage();
|
|
9
9
|
const index = stages.findIndex((s) => s.field === stage.field);
|
|
10
10
|
if (index !== -1) {
|
|
11
11
|
const next = [...stages];
|
|
12
12
|
next[index] = stage;
|
|
13
|
-
return InternalFactory(next);
|
|
13
|
+
return InternalFactory(next, displayName);
|
|
14
14
|
}
|
|
15
|
-
return InternalFactory([...stages, stage]);
|
|
15
|
+
return InternalFactory([...stages, stage], displayName);
|
|
16
16
|
};
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
for (let stage of stages) {
|
|
23
|
-
args[stage.field] = stage.useStage(args, ref);
|
|
24
|
-
}
|
|
25
|
-
return args;
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
const index = stages.findIndex((stage) => stage.field === field);
|
|
17
|
+
UseComponent.force = UseComponent.with;
|
|
18
|
+
UseComponent.use = (field) => {
|
|
19
|
+
const index = field
|
|
20
|
+
? stages.findIndex((stage) => stage.field === field)
|
|
21
|
+
: -1;
|
|
29
22
|
const argStages = index === -1 ? stages.slice(0) : stages.slice(0, index + 1);
|
|
30
23
|
return (props = {}, ref = null) => {
|
|
31
|
-
const args = { props };
|
|
24
|
+
const args = { props, ref };
|
|
25
|
+
if (field === 'render') {
|
|
26
|
+
args.render = null;
|
|
27
|
+
}
|
|
32
28
|
for (let stage of argStages) {
|
|
33
|
-
args[stage.field] = stage.
|
|
29
|
+
args[stage.field] = stage.provide(args);
|
|
34
30
|
}
|
|
35
|
-
return args[field];
|
|
31
|
+
return field ? args[field] : args;
|
|
36
32
|
};
|
|
37
33
|
};
|
|
38
|
-
|
|
34
|
+
UseComponent.stage = (field) => {
|
|
39
35
|
const stage = stages.find((stage) => stage.field === field);
|
|
40
|
-
return stage?.
|
|
36
|
+
return stage?.provide ?? (() => null);
|
|
41
37
|
};
|
|
42
|
-
|
|
38
|
+
Object.entries(customFunctions).forEach(([name, fn]) => {
|
|
43
39
|
;
|
|
44
|
-
|
|
40
|
+
UseComponent[`with${name[0].toUpperCase()}${name.slice(1)}`] = (...args) => UseComponent.with(fn(...args));
|
|
41
|
+
UseComponent[`force${name[0].toUpperCase()}${name.slice(1)}`] = (...args) => UseComponent.with(fn(...args));
|
|
42
|
+
});
|
|
43
|
+
UseComponent.withDisplayName = (displayName) => {
|
|
44
|
+
return InternalFactory([...stages], displayName);
|
|
45
45
|
};
|
|
46
|
-
return
|
|
46
|
+
return UseComponent;
|
|
47
47
|
}
|
|
48
48
|
export function ModularComponent(displayName) {
|
|
49
|
-
|
|
50
|
-
useComponent.displayName = displayName;
|
|
51
|
-
return useComponent;
|
|
52
|
-
}
|
|
53
|
-
export function render(render) {
|
|
54
|
-
return {
|
|
55
|
-
field: 'render',
|
|
56
|
-
useStage: render,
|
|
57
|
-
};
|
|
49
|
+
return InternalFactory([], displayName);
|
|
58
50
|
}
|
|
51
|
+
ModularComponent.register = (functions) => {
|
|
52
|
+
customFunctions = { ...customFunctions, ...functions };
|
|
53
|
+
};
|
|
54
|
+
export * from './render';
|
|
59
55
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/render.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { FunctionComponent } from 'react';
|
|
2
|
+
import { ModularContext, GetValueGetterFor, StageParams, StageReturn } from './extend';
|
|
3
|
+
export declare function render<Context extends ModularContext>(useRender: GetValueGetterFor<Context, 'render', ReturnType<FunctionComponent>>): (_?: Context | undefined) => {
|
|
4
|
+
field: "render";
|
|
5
|
+
provide: (args: import("./extend").GetArgsFor<Context, "render">) => import("react").ReactElement<any, any> | null;
|
|
6
|
+
};
|
|
7
|
+
export type WithRender<Context extends ModularContext> = (...args: StageParams<typeof render<Context>>) => StageReturn<typeof render<Context>>;
|
|
8
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAGL,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,WAAW,EACZ,MAAM,UAAU,CAAA;AAEjB,wBAAgB,MAAM,CAAC,OAAO,SAAS,cAAc,EACnD,SAAS,EAAE,iBAAiB,CAC1B,OAAO,EACP,QAAQ,EACR,UAAU,CAAC,iBAAiB,CAAC,CAC9B;;;EAGF;AAED,MAAM,MAAM,UAAU,CAAC,OAAO,SAAS,cAAc,IAAI,CACvD,GAAG,IAAI,EAAE,WAAW,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,KACzC,WAAW,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA"}
|
package/dist/render.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EACL,IAAI,GAKL,MAAM,UAAU,CAAA;AAEjB,MAAM,UAAU,MAAM,CACpB,SAIC;IAED,OAAO,KAAK,EAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;AAC/D,CAAC"}
|
package/extend.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/extend'
|
package/extend.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/extend.js'
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"Factory",
|
|
8
8
|
"Test"
|
|
9
9
|
],
|
|
10
|
-
"version": "0.
|
|
10
|
+
"version": "0.3.0",
|
|
11
11
|
"type": "module",
|
|
12
12
|
"license": "MIT",
|
|
13
13
|
"publishConfig": {
|
|
@@ -16,19 +16,26 @@
|
|
|
16
16
|
"files": [
|
|
17
17
|
"src",
|
|
18
18
|
"dist",
|
|
19
|
+
"extend.js",
|
|
20
|
+
"extend.d.ts",
|
|
21
|
+
"register.js",
|
|
22
|
+
"register.d.ts",
|
|
19
23
|
"CHANGELOG.md"
|
|
20
24
|
],
|
|
21
25
|
"scripts": {
|
|
22
26
|
"build": "yarn build:self",
|
|
23
|
-
"build:self": "tsc",
|
|
27
|
+
"build:self": "tsc && tsc --noEmit extend register",
|
|
24
28
|
"license": "cp ../../LICENSE ./LICENSE"
|
|
25
29
|
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@modular-component/stages": "0.3.0"
|
|
32
|
+
},
|
|
26
33
|
"peerDependencies": {
|
|
27
|
-
"react": ">=17
|
|
34
|
+
"react": ">=17"
|
|
28
35
|
},
|
|
29
36
|
"devDependencies": {
|
|
30
37
|
"@types/react": "^18.0.17",
|
|
31
|
-
"typescript": "^5.
|
|
38
|
+
"typescript": "^5.9.3"
|
|
32
39
|
},
|
|
33
40
|
"main": "dist/index.js",
|
|
34
41
|
"types": "dist/index.d.ts"
|
package/register.d.ts
ADDED
package/register.js
ADDED
package/src/extend.ts
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { FunctionComponent } from 'react'
|
|
2
|
+
import type { ModularContext } from '@modular-component/stages'
|
|
3
|
+
import type { ModularComponent } from './index'
|
|
4
|
+
|
|
5
|
+
export type { ModularContext } from '@modular-component/stages'
|
|
6
|
+
|
|
7
|
+
export type GetArgsFor<
|
|
8
|
+
Context extends ModularContext,
|
|
9
|
+
Field extends string,
|
|
10
|
+
> = Field extends keyof Context['stages']
|
|
11
|
+
? Pick<Context['arguments'], Context['stages'][Field]>
|
|
12
|
+
: Context['arguments']
|
|
13
|
+
|
|
14
|
+
export type GetConstraintFor<
|
|
15
|
+
Context extends ModularContext,
|
|
16
|
+
Field extends string,
|
|
17
|
+
Default = any,
|
|
18
|
+
> = Field extends 'render'
|
|
19
|
+
? ReturnType<FunctionComponent>
|
|
20
|
+
: Field extends keyof Context['constraints']
|
|
21
|
+
? Context['constraints'][Field]
|
|
22
|
+
: Default
|
|
23
|
+
|
|
24
|
+
export type GetValueGetterFor<
|
|
25
|
+
Context extends ModularContext,
|
|
26
|
+
Field extends string,
|
|
27
|
+
Type,
|
|
28
|
+
> = Type | ((args: GetArgsFor<Context, Field>) => Type)
|
|
29
|
+
|
|
30
|
+
type AppendArguments<Arguments, Field extends string, Type> = {
|
|
31
|
+
[key in Exclude<keyof Arguments, Field>]: Arguments[key]
|
|
32
|
+
} & {
|
|
33
|
+
[key in Field]: Type
|
|
34
|
+
} extends infer U
|
|
35
|
+
? { [key in keyof U]: U[key] }
|
|
36
|
+
: never
|
|
37
|
+
|
|
38
|
+
type AppendConstraints<Constraints, Backup, Field extends string, Type> = {
|
|
39
|
+
[key in Exclude<keyof Constraints, Field>]: Constraints[key]
|
|
40
|
+
} & {
|
|
41
|
+
[key in Exclude<keyof Backup, Field>]: Backup[key]
|
|
42
|
+
} & {
|
|
43
|
+
[key in Field]: Type
|
|
44
|
+
} extends infer U
|
|
45
|
+
? { [key in keyof U]: U[key] }
|
|
46
|
+
: never
|
|
47
|
+
|
|
48
|
+
type AppendStages<Stages, Arguments, Field extends string, Type> = {
|
|
49
|
+
[key in Exclude<keyof Stages, Field>]: Stages[key]
|
|
50
|
+
} & {
|
|
51
|
+
[key in Field]: key extends keyof Stages ? Stages[key] : keyof Arguments
|
|
52
|
+
} extends infer U
|
|
53
|
+
? { [key in keyof U]: U[key] }
|
|
54
|
+
: never
|
|
55
|
+
|
|
56
|
+
export type AppendStage<
|
|
57
|
+
Context extends ModularContext,
|
|
58
|
+
Field extends string,
|
|
59
|
+
Type,
|
|
60
|
+
> = Pick<Context, 'props' | 'ref'> & {
|
|
61
|
+
arguments: AppendArguments<Context['arguments'], Field, Type>
|
|
62
|
+
constraints: AppendConstraints<
|
|
63
|
+
Context['constraints'],
|
|
64
|
+
Context['_constraints'],
|
|
65
|
+
Field,
|
|
66
|
+
Type
|
|
67
|
+
>
|
|
68
|
+
stages: AppendStages<Context['stages'], Context['arguments'], Field, Type>
|
|
69
|
+
} extends infer U
|
|
70
|
+
? { [key in keyof U]: U[key] }
|
|
71
|
+
: never
|
|
72
|
+
|
|
73
|
+
export type StageParams<Fn extends (...args: any[]) => any> = Parameters<Fn>
|
|
74
|
+
export type StageReturn<
|
|
75
|
+
Fn extends (
|
|
76
|
+
...args: any[]
|
|
77
|
+
) => (ctx?: any) => { field: string; provide: (args: any) => any },
|
|
78
|
+
> = ModularComponent<
|
|
79
|
+
AppendStage<
|
|
80
|
+
NonNullable<Parameters<ReturnType<Fn>>[0]>,
|
|
81
|
+
ReturnType<ReturnType<Fn>>['field'],
|
|
82
|
+
ReturnType<ReturnType<ReturnType<Fn>>['provide']>
|
|
83
|
+
>
|
|
84
|
+
> extends ModularComponent<infer U>
|
|
85
|
+
? ModularComponent<U>
|
|
86
|
+
: never
|
|
87
|
+
|
|
88
|
+
export function addTo<Context extends ModularContext>() {
|
|
89
|
+
return {
|
|
90
|
+
on<Field extends string>(field: Field) {
|
|
91
|
+
return {
|
|
92
|
+
provide<Stage extends (args: GetArgsFor<Context, Field>) => any>(
|
|
93
|
+
stage: Stage,
|
|
94
|
+
) {
|
|
95
|
+
return (_?: Context) => ({
|
|
96
|
+
field,
|
|
97
|
+
provide: stage,
|
|
98
|
+
})
|
|
99
|
+
},
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function wrap<Args, Type>(useFn: Type | ((args: Args) => Type)) {
|
|
106
|
+
return (args: Args) => {
|
|
107
|
+
return typeof useFn === 'function'
|
|
108
|
+
? (useFn as (args: Args) => Type)(args)
|
|
109
|
+
: useFn
|
|
110
|
+
}
|
|
111
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,182 +1,184 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {
|
|
2
2
|
ForwardRefRenderFunction,
|
|
3
3
|
FunctionComponent,
|
|
4
4
|
PropsWithChildren,
|
|
5
5
|
} from 'react'
|
|
6
|
+
import {
|
|
7
|
+
ModularComponentStages,
|
|
8
|
+
ModularContext,
|
|
9
|
+
} from '@modular-component/stages'
|
|
10
|
+
import { AppendStage, GetArgsFor, GetConstraintFor } from './extend'
|
|
6
11
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
type FunctionComponentOrRefRenderFunction<Props, Ref> = [Ref] extends [never]
|
|
13
|
+
? FunctionComponent<PropsWithChildren<Props>>
|
|
14
|
+
: ForwardRefRenderFunction<Ref, PropsWithChildren<Props>>
|
|
15
|
+
|
|
16
|
+
export type { ModularContext } from '@modular-component/stages'
|
|
17
|
+
|
|
18
|
+
type MapToForce<Stages> = {
|
|
19
|
+
[key in keyof Stages as key extends `with${infer K}`
|
|
20
|
+
? `force${K}`
|
|
21
|
+
: never]: Stages[key]
|
|
13
22
|
}
|
|
14
23
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
) => Field extends keyof Args ? Args[Field] : Type
|
|
32
|
-
}): ModularComponent<
|
|
33
|
-
Props,
|
|
34
|
-
Ref,
|
|
35
|
-
{
|
|
36
|
-
[key in keyof Args | Field]: key extends 'render'
|
|
37
|
-
? ReturnType<FunctionComponent>
|
|
38
|
-
: key extends Field
|
|
39
|
-
? Type
|
|
40
|
-
: key extends keyof Args
|
|
41
|
-
? Args[key]
|
|
42
|
-
: never
|
|
43
|
-
}
|
|
44
|
-
>
|
|
45
|
-
force<Field extends string, Type>(stage: {
|
|
46
|
-
field: Field
|
|
47
|
-
useStage: (
|
|
48
|
-
args: Args,
|
|
49
|
-
ref: React.ForwardedRef<Ref>,
|
|
50
|
-
) => Field extends 'render' ? Args['render'] : Type
|
|
51
|
-
}): ModularComponent<
|
|
52
|
-
Props,
|
|
53
|
-
Ref,
|
|
54
|
-
{
|
|
55
|
-
[key in keyof Args | Field]: key extends 'render'
|
|
56
|
-
? ReturnType<FunctionComponent>
|
|
57
|
-
: key extends Field
|
|
58
|
-
? Type
|
|
59
|
-
: key extends keyof Args
|
|
60
|
-
? Args[key]
|
|
61
|
-
: never
|
|
62
|
-
}
|
|
63
|
-
>
|
|
64
|
-
use<Field extends keyof Args>(
|
|
65
|
-
key: Field,
|
|
66
|
-
): {} extends Props
|
|
67
|
-
? () => Args[Field]
|
|
68
|
-
: (props: PropsWithChildren<Props>) => Args[Field]
|
|
69
|
-
use(): {} extends Props
|
|
70
|
-
? () => Args
|
|
71
|
-
: (props: PropsWithChildren<Props>) => Args
|
|
72
|
-
stage<Field extends keyof Args>(
|
|
73
|
-
key: Field,
|
|
74
|
-
): (args: Partial<Args>) => Args[Field]
|
|
75
|
-
setDisplayName(displayName: string): ModularComponent<Props, Ref, Args>
|
|
24
|
+
type MapToStage<Stages> = Pick<
|
|
25
|
+
Stages,
|
|
26
|
+
{
|
|
27
|
+
[key in keyof Stages]: key extends `with${string}` ? key : never
|
|
28
|
+
}[keyof Stages]
|
|
29
|
+
>
|
|
30
|
+
|
|
31
|
+
type MapToRaw<Stages> = {
|
|
32
|
+
[key in keyof Stages as key extends `with${infer K}`
|
|
33
|
+
? Uncapitalize<K>
|
|
34
|
+
: never]: Stages[key]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
type Force<Context extends ModularContext> = Omit<Context, 'constraints'> & {
|
|
38
|
+
constraints: {}
|
|
39
|
+
_constraints: Context['constraints']
|
|
76
40
|
}
|
|
77
41
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
): ModularComponent<
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
42
|
+
export type ModularComponent<Context extends ModularContext> =
|
|
43
|
+
FunctionComponentOrRefRenderFunction<Context['props'], Context['ref']> &
|
|
44
|
+
MapToStage<ModularComponentStages<Context>> &
|
|
45
|
+
MapToForce<ModularComponentStages<Force<Context>>> & {
|
|
46
|
+
with<Field extends string, Type extends GetConstraintFor<Context, Field>>(
|
|
47
|
+
stage: (context?: Context) => {
|
|
48
|
+
field: Field
|
|
49
|
+
provide: (args: GetArgsFor<Context, Field>) => Type
|
|
50
|
+
},
|
|
51
|
+
): ModularComponent<AppendStage<Context, Field, Type>>
|
|
52
|
+
force<Field extends string, Type>(
|
|
53
|
+
stage: (context?: Force<Context>) => {
|
|
54
|
+
field: Field
|
|
55
|
+
provide: (args: GetArgsFor<Context, Field>) => Type
|
|
56
|
+
},
|
|
57
|
+
): ModularComponent<AppendStage<Context, Field, Type>>
|
|
58
|
+
|
|
59
|
+
use<Field extends keyof Context['arguments']>(
|
|
60
|
+
key: Field,
|
|
61
|
+
): {} extends Context['arguments']['props']
|
|
62
|
+
? () => Context['arguments'][Field]
|
|
63
|
+
: (
|
|
64
|
+
props: PropsWithChildren<Context['arguments']['props']>,
|
|
65
|
+
) => Context['arguments'][Field]
|
|
66
|
+
use(): {} extends Context['props']
|
|
67
|
+
? () => Context['arguments']
|
|
68
|
+
: (props: PropsWithChildren<Context['props']>) => Context['arguments']
|
|
69
|
+
stage<Field extends keyof Context['arguments'] & string>(
|
|
70
|
+
key: Field,
|
|
71
|
+
): (
|
|
72
|
+
args: Partial<GetArgsFor<Context, Field>>,
|
|
73
|
+
) => Context['arguments'][Field]
|
|
74
|
+
withDisplayName(displayName: string): ModularComponent<Context>
|
|
91
75
|
}
|
|
92
|
-
|
|
76
|
+
|
|
77
|
+
let customFunctions: Record<
|
|
78
|
+
string,
|
|
79
|
+
(...args: any[]) => (ctx?: ModularContext) => {
|
|
80
|
+
field: string
|
|
81
|
+
provide: (args: any) => any
|
|
93
82
|
}
|
|
83
|
+
> = {}
|
|
94
84
|
|
|
95
|
-
|
|
85
|
+
function InternalFactory<Context extends ModularContext>(
|
|
86
|
+
stages: { field: string; provide: (args: any) => any }[],
|
|
87
|
+
displayName: string | undefined,
|
|
88
|
+
): ModularComponent<Context> {
|
|
89
|
+
const UseComponent = function (props: Context['props'], ref: Context['ref']) {
|
|
90
|
+
return UseComponent.use('render')(props, ref)
|
|
91
|
+
}
|
|
92
|
+
UseComponent.displayName = displayName
|
|
93
|
+
|
|
94
|
+
UseComponent.with = (
|
|
95
|
+
_stage: (ctx?: Context) => { field: string; provide: (args: any) => any },
|
|
96
|
+
) => {
|
|
97
|
+
const stage = _stage()
|
|
96
98
|
const index = stages.findIndex((s) => s.field === stage.field)
|
|
97
99
|
|
|
98
100
|
if (index !== -1) {
|
|
99
101
|
const next = [...stages]
|
|
100
102
|
next[index] = stage
|
|
101
|
-
return InternalFactory<
|
|
103
|
+
return InternalFactory<Context>(next, displayName)
|
|
102
104
|
}
|
|
103
105
|
|
|
104
|
-
return InternalFactory<
|
|
106
|
+
return InternalFactory<Context>([...stages, stage], displayName)
|
|
105
107
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
useComponent.use = (field: keyof Args) => {
|
|
109
|
-
if (!field) {
|
|
110
|
-
return (
|
|
111
|
-
props: Props = {} as Props,
|
|
112
|
-
ref: React.ForwardedRef<Ref> = null,
|
|
113
|
-
) => {
|
|
114
|
-
const args: Record<string, any> = { props }
|
|
115
|
-
for (let stage of stages) {
|
|
116
|
-
args[stage.field] = stage.useStage(args as Args, ref)
|
|
117
|
-
}
|
|
118
|
-
return args
|
|
119
|
-
}
|
|
120
|
-
}
|
|
108
|
+
UseComponent.force = UseComponent.with
|
|
121
109
|
|
|
122
|
-
|
|
110
|
+
UseComponent.use = (field?: string) => {
|
|
111
|
+
const index = field
|
|
112
|
+
? stages.findIndex((stage) => stage.field === field)
|
|
113
|
+
: -1
|
|
123
114
|
const argStages =
|
|
124
115
|
index === -1 ? stages.slice(0) : stages.slice(0, index + 1)
|
|
125
116
|
|
|
126
|
-
return (
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
117
|
+
return (props = {}, ref = null) => {
|
|
118
|
+
const args: Record<string, any> = { props, ref }
|
|
119
|
+
if (field === 'render') {
|
|
120
|
+
args.render = null
|
|
121
|
+
}
|
|
131
122
|
for (let stage of argStages) {
|
|
132
|
-
args[stage.field] = stage.
|
|
123
|
+
args[stage.field] = stage.provide(args)
|
|
133
124
|
}
|
|
134
|
-
return args[field
|
|
125
|
+
return field ? args[field] : args
|
|
135
126
|
}
|
|
136
127
|
}
|
|
137
128
|
|
|
138
|
-
|
|
129
|
+
UseComponent.stage = (field: string) => {
|
|
139
130
|
const stage = stages.find((stage) => stage.field === field)
|
|
140
|
-
return stage?.
|
|
131
|
+
return stage?.provide ?? (() => null)
|
|
141
132
|
}
|
|
142
133
|
|
|
143
|
-
|
|
144
|
-
;(
|
|
134
|
+
Object.entries(customFunctions).forEach(([name, fn]) => {
|
|
135
|
+
;(UseComponent as any)[`with${name[0].toUpperCase()}${name.slice(1)}`] = (
|
|
136
|
+
...args: any
|
|
137
|
+
) => UseComponent.with(fn(...args))
|
|
138
|
+
;(UseComponent as any)[
|
|
139
|
+
`force${name[0].toUpperCase()}${name.slice(1)}`
|
|
140
|
+
] = (...args: any) => UseComponent.with(fn(...args))
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
UseComponent.withDisplayName = (displayName: string) => {
|
|
144
|
+
return InternalFactory<Context>([...stages], displayName)
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
return
|
|
147
|
+
return UseComponent as unknown as ModularComponent<Context>
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
export function ModularComponent<Props extends {} = {}, Ref = never>(
|
|
151
151
|
displayName?: string,
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
152
|
+
) {
|
|
153
|
+
return InternalFactory<{
|
|
154
|
+
props: Props
|
|
155
|
+
ref: Ref
|
|
156
|
+
stages: {}
|
|
157
|
+
arguments: {
|
|
158
|
+
props: Props
|
|
159
|
+
ref: Ref
|
|
160
|
+
render: ReturnType<FunctionComponent>
|
|
161
|
+
}
|
|
162
|
+
constraints: {
|
|
163
|
+
props: Props
|
|
164
|
+
ref: Ref
|
|
165
|
+
render: ReturnType<FunctionComponent>
|
|
166
|
+
}
|
|
167
|
+
}>([], displayName)
|
|
164
168
|
}
|
|
165
169
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
return {
|
|
179
|
-
field: 'render',
|
|
180
|
-
useStage: render,
|
|
181
|
-
}
|
|
170
|
+
ModularComponent.register = (
|
|
171
|
+
functions: Partial<
|
|
172
|
+
Record<
|
|
173
|
+
keyof MapToRaw<ModularComponentStages<any>>,
|
|
174
|
+
(...args: any[]) => (ctx?: ModularContext) => {
|
|
175
|
+
field: string
|
|
176
|
+
provide: (args: any) => any
|
|
177
|
+
}
|
|
178
|
+
>
|
|
179
|
+
>,
|
|
180
|
+
) => {
|
|
181
|
+
customFunctions = { ...customFunctions, ...functions }
|
|
182
182
|
}
|
|
183
|
+
|
|
184
|
+
export * from './render'
|
package/src/render.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { FunctionComponent } from 'react'
|
|
2
|
+
import {
|
|
3
|
+
addTo,
|
|
4
|
+
wrap,
|
|
5
|
+
ModularContext,
|
|
6
|
+
GetValueGetterFor,
|
|
7
|
+
StageParams,
|
|
8
|
+
StageReturn,
|
|
9
|
+
} from './extend'
|
|
10
|
+
|
|
11
|
+
export function render<Context extends ModularContext>(
|
|
12
|
+
useRender: GetValueGetterFor<
|
|
13
|
+
Context,
|
|
14
|
+
'render',
|
|
15
|
+
ReturnType<FunctionComponent>
|
|
16
|
+
>,
|
|
17
|
+
) {
|
|
18
|
+
return addTo<Context>().on('render').provide(wrap(useRender))
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type WithRender<Context extends ModularContext> = (
|
|
22
|
+
...args: StageParams<typeof render<Context>>
|
|
23
|
+
) => StageReturn<typeof render<Context>>
|