@modular-component/core 0.2.3 → 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 CHANGED
@@ -1,5 +1,15 @@
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
+
3
13
  ## 0.2.3
4
14
 
5
15
  ### Patch Changes
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # @modular-component/core
2
2
 
3
- Core system for creating a `ModularComponent` factory. Exports the `modularFactory`
4
- builder, and necessary types for creating extensions.
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
- // Usage in extensions
23
- import { ModularStage } from '@modular-component/core'
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
- export function extension(): ModularStage<'field', () => void> {
26
- return { field: 'field', useStage: () => {} }
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/jvdsande/modular-component/blob/master/README.md) for more information about the `ModularComponent` system.
46
+ Read the [`ModularComponent` ReadMe](https://github.com/modular-component/modular-component/blob/master/README.md) for more information about the `ModularComponent` system.
@@ -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 React, { ForwardRefRenderFunction, FunctionComponent, PropsWithChildren } from 'react';
2
- export interface ModularStage<Field extends string, Stage extends (args: any, ref?: any) => any> {
3
- field: Field;
4
- useStage: Stage;
5
- }
6
- export type FunctionComponentOrRefRenderFunction<Props, Ref> = [Ref] extends [
7
- never
8
- ] ? FunctionComponent<PropsWithChildren<Props>> : ForwardRefRenderFunction<Ref, Props>;
9
- export type ModularComponent<Props extends {}, Ref, Args extends {
10
- render: ReturnType<FunctionComponent>;
11
- }> = FunctionComponentOrRefRenderFunction<Props, Ref> & {
12
- with<Field extends string, Type>(stage: {
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
- useStage: (args: Args, ref: React.ForwardedRef<Ref>) => Field extends keyof Args ? Args[Field] : Type;
15
- }): ModularComponent<Props, Ref, {
16
- [key in keyof Args | Field]: key extends 'render' ? ReturnType<FunctionComponent> : key extends Field ? Type : key extends keyof Args ? Args[key] : never;
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
- useStage: (args: Args, ref: React.ForwardedRef<Ref>) => Field extends 'render' ? Args['render'] : Type;
21
- }): ModularComponent<Props, Ref, {
22
- [key in keyof Args | Field]: key extends 'render' ? ReturnType<FunctionComponent> : key extends Field ? Type : key extends keyof Args ? Args[key] : never;
23
- }>;
24
- use<Field extends keyof Args>(key: Field): {} extends Props ? () => Args[Field] : (props: PropsWithChildren<Props>) => Args[Field];
25
- use(): {} extends Props ? () => Args : (props: PropsWithChildren<Props>) => Args;
26
- stage<Field extends keyof Args>(key: Field): (args: Partial<Args>) => Args[Field];
27
- withDisplayName(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<Props, Ref, {
33
+ export declare function ModularComponent<Props extends {} = {}, Ref = never>(displayName?: string): ModularComponent<{
30
34
  props: Props;
31
- render: ReturnType<FunctionComponent>;
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 function render<Args extends {}, Ref>(render: (args: Args, ref: React.ForwardedRef<Ref>) => React.ReactElement<any, any> | null): ModularStage<'render', (args: Args, ref: React.ForwardedRef<Ref>) => React.ReactElement<any, any> | null>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,12 +1,11 @@
1
+ let customFunctions = {};
1
2
  function InternalFactory(stages, displayName) {
2
3
  const UseComponent = function (props, ref) {
3
- if (!stages.some((stage) => stage.field === 'render')) {
4
- stages = [...stages, render(() => null)];
5
- }
6
4
  return UseComponent.use('render')(props, ref);
7
5
  };
8
6
  UseComponent.displayName = displayName;
9
- UseComponent.with = (stage) => {
7
+ UseComponent.with = (_stage) => {
8
+ const stage = _stage();
10
9
  const index = stages.findIndex((s) => s.field === stage.field);
11
10
  if (index !== -1) {
12
11
  const next = [...stages];
@@ -17,29 +16,30 @@ function InternalFactory(stages, displayName) {
17
16
  };
18
17
  UseComponent.force = UseComponent.with;
19
18
  UseComponent.use = (field) => {
20
- if (!field) {
21
- return (props = {}, ref = null) => {
22
- const args = { props };
23
- for (let stage of stages) {
24
- args[stage.field] = stage.useStage(args, ref);
25
- }
26
- return args;
27
- };
28
- }
29
- const index = stages.findIndex((stage) => stage.field === field);
19
+ const index = field
20
+ ? stages.findIndex((stage) => stage.field === field)
21
+ : -1;
30
22
  const argStages = index === -1 ? stages.slice(0) : stages.slice(0, index + 1);
31
23
  return (props = {}, ref = null) => {
32
- const args = { props };
24
+ const args = { props, ref };
25
+ if (field === 'render') {
26
+ args.render = null;
27
+ }
33
28
  for (let stage of argStages) {
34
- args[stage.field] = stage.useStage(args, ref);
29
+ args[stage.field] = stage.provide(args);
35
30
  }
36
- return args[field];
31
+ return field ? args[field] : args;
37
32
  };
38
33
  };
39
34
  UseComponent.stage = (field) => {
40
35
  const stage = stages.find((stage) => stage.field === field);
41
- return stage?.useStage ?? (() => null);
36
+ return stage?.provide ?? (() => null);
42
37
  };
38
+ Object.entries(customFunctions).forEach(([name, fn]) => {
39
+ ;
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
43
  UseComponent.withDisplayName = (displayName) => {
44
44
  return InternalFactory([...stages], displayName);
45
45
  };
@@ -48,10 +48,8 @@ function InternalFactory(stages, displayName) {
48
48
  export function ModularComponent(displayName) {
49
49
  return InternalFactory([], displayName);
50
50
  }
51
- export function render(render) {
52
- return {
53
- field: 'render',
54
- useStage: render,
55
- };
56
- }
51
+ ModularComponent.register = (functions) => {
52
+ customFunctions = { ...customFunctions, ...functions };
53
+ };
54
+ export * from './render';
57
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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -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,5 @@
1
+ import { addTo, wrap, } from './extend';
2
+ export function render(useRender) {
3
+ return addTo().on('render').provide(wrap(useRender));
4
+ }
5
+ //# sourceMappingURL=render.js.map
@@ -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.2.3",
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 <19"
34
+ "react": ">=17"
28
35
  },
29
36
  "devDependencies": {
30
37
  "@types/react": "^18.0.17",
31
- "typescript": "^5.2.2"
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
@@ -0,0 +1,7 @@
1
+ import { WithRender, ModularContext } from '@modular-component/core'
2
+
3
+ declare module '@modular-component/stages' {
4
+ export interface ModularComponentStages<Context extends ModularContext> {
5
+ withRender: WithRender<Context>
6
+ }
7
+ }
package/register.js ADDED
@@ -0,0 +1,3 @@
1
+ import { ModularComponent, render } from '@modular-component/core'
2
+
3
+ ModularComponent.register({ render })
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,178 +1,184 @@
1
- import React, { ForwardRefRenderFunction, FunctionComponent, PropsWithChildren } from 'react'
2
-
3
- export interface ModularStage<
4
- Field extends string,
5
- Stage extends (args: any, ref?: any) => any,
6
- > {
7
- field: Field
8
- useStage: Stage
9
- }
1
+ import {
2
+ ForwardRefRenderFunction,
3
+ FunctionComponent,
4
+ PropsWithChildren,
5
+ } from 'react'
6
+ import {
7
+ ModularComponentStages,
8
+ ModularContext,
9
+ } from '@modular-component/stages'
10
+ import { AppendStage, GetArgsFor, GetConstraintFor } from './extend'
10
11
 
11
- export type FunctionComponentOrRefRenderFunction<Props, Ref> = [Ref] extends [
12
- never,
13
- ]
12
+ type FunctionComponentOrRefRenderFunction<Props, Ref> = [Ref] extends [never]
14
13
  ? FunctionComponent<PropsWithChildren<Props>>
15
- : ForwardRefRenderFunction<Ref, Props>
16
-
17
- export type ModularComponent<
18
- Props extends {},
19
- Ref,
20
- Args extends { render: ReturnType<FunctionComponent> },
21
- > = FunctionComponentOrRefRenderFunction<Props, Ref> & {
22
- with<Field extends string, Type>(stage: {
23
- field: Field
24
- useStage: (
25
- args: Args,
26
- ref: React.ForwardedRef<Ref>,
27
- ) => Field extends keyof Args ? Args[Field] : Type
28
- }): ModularComponent<
29
- Props,
30
- Ref,
31
- {
32
- [key in keyof Args | Field]: key extends 'render'
33
- ? ReturnType<FunctionComponent>
34
- : key extends Field
35
- ? Type
36
- : key extends keyof Args
37
- ? Args[key]
38
- : never
39
- }
40
- >
41
- force<Field extends string, Type>(stage: {
42
- field: Field
43
- useStage: (
44
- args: Args,
45
- ref: React.ForwardedRef<Ref>,
46
- ) => Field extends 'render' ? Args['render'] : Type
47
- }): ModularComponent<
48
- Props,
49
- Ref,
50
- {
51
- [key in keyof Args | Field]: key extends 'render'
52
- ? ReturnType<FunctionComponent>
53
- : key extends Field
54
- ? Type
55
- : key extends keyof Args
56
- ? Args[key]
57
- : never
58
- }
59
- >
60
- use<Field extends keyof Args>(
61
- key: Field,
62
- ): {} extends Props
63
- ? () => Args[Field]
64
- : (props: PropsWithChildren<Props>) => Args[Field]
65
- use(): {} extends Props
66
- ? () => Args
67
- : (props: PropsWithChildren<Props>) => Args
68
- stage<Field extends keyof Args>(
69
- key: Field,
70
- ): (args: Partial<Args>) => Args[Field]
71
- withDisplayName(displayName: string): ModularComponent<Props, Ref, Args>
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]
22
+ }
23
+
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']
72
40
  }
73
41
 
74
- function InternalFactory<
75
- Props extends {},
76
- Ref,
77
- Args extends { render: ReturnType<FunctionComponent> },
78
- >(
79
- stages: ModularStage<
80
- string,
81
- (args: Args, ref: React.ForwardedRef<Ref>) => any
82
- >[],
83
- displayName: string | undefined
84
- ): ModularComponent<Props, Ref, Args> {
85
- const UseComponent = function (props: Props, ref: React.ForwardedRef<Ref>) {
86
- if (!stages.some((stage) => stage.field === 'render')) {
87
- stages = [...stages, render(() => null)]
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>
88
75
  }
76
+
77
+ let customFunctions: Record<
78
+ string,
79
+ (...args: any[]) => (ctx?: ModularContext) => {
80
+ field: string
81
+ provide: (args: any) => any
82
+ }
83
+ > = {}
84
+
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']) {
89
90
  return UseComponent.use('render')(props, ref)
90
91
  }
91
92
  UseComponent.displayName = displayName
92
93
 
93
- UseComponent.with = (stage: ModularStage<string, (args: Args) => any>) => {
94
+ UseComponent.with = (
95
+ _stage: (ctx?: Context) => { field: string; provide: (args: any) => any },
96
+ ) => {
97
+ const stage = _stage()
94
98
  const index = stages.findIndex((s) => s.field === stage.field)
95
99
 
96
100
  if (index !== -1) {
97
101
  const next = [...stages]
98
102
  next[index] = stage
99
- return InternalFactory<Props, Ref, Args>(next, displayName)
103
+ return InternalFactory<Context>(next, displayName)
100
104
  }
101
105
 
102
- return InternalFactory<Props, Ref, Args>([...stages, stage], displayName)
106
+ return InternalFactory<Context>([...stages, stage], displayName)
103
107
  }
104
108
  UseComponent.force = UseComponent.with
105
109
 
106
- UseComponent.use = (field: keyof Args) => {
107
- if (!field) {
108
- return (
109
- props: Props = {} as Props,
110
- ref: React.ForwardedRef<Ref> = null,
111
- ) => {
112
- const args: Record<string, any> = { props }
113
- for (let stage of stages) {
114
- args[stage.field] = stage.useStage(args as Args, ref)
115
- }
116
- return args
117
- }
118
- }
119
-
120
- const index = stages.findIndex((stage) => stage.field === field)
110
+ UseComponent.use = (field?: string) => {
111
+ const index = field
112
+ ? stages.findIndex((stage) => stage.field === field)
113
+ : -1
121
114
  const argStages =
122
115
  index === -1 ? stages.slice(0) : stages.slice(0, index + 1)
123
116
 
124
- return (
125
- props: Props = {} as Props,
126
- ref: React.ForwardedRef<Ref> = null,
127
- ) => {
128
- const args: Record<string, any> = { props }
117
+ return (props = {}, ref = null) => {
118
+ const args: Record<string, any> = { props, ref }
119
+ if (field === 'render') {
120
+ args.render = null
121
+ }
129
122
  for (let stage of argStages) {
130
- args[stage.field] = stage.useStage(args as Args, ref)
123
+ args[stage.field] = stage.provide(args)
131
124
  }
132
- return args[field as string]
125
+ return field ? args[field] : args
133
126
  }
134
127
  }
135
128
 
136
- UseComponent.stage = (field: keyof Args) => {
129
+ UseComponent.stage = (field: string) => {
137
130
  const stage = stages.find((stage) => stage.field === field)
138
- return stage?.useStage ?? (() => null)
131
+ return stage?.provide ?? (() => null)
139
132
  }
140
133
 
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
+
141
143
  UseComponent.withDisplayName = (displayName: string) => {
142
- return InternalFactory<Props, Ref, Args>([...stages], displayName)
144
+ return InternalFactory<Context>([...stages], displayName)
143
145
  }
144
146
 
145
- return UseComponent as unknown as ModularComponent<Props, Ref, Args>
147
+ return UseComponent as unknown as ModularComponent<Context>
146
148
  }
147
149
 
148
150
  export function ModularComponent<Props extends {} = {}, Ref = never>(
149
151
  displayName?: string,
150
- ): ModularComponent<
151
- Props,
152
- Ref,
153
- { props: Props; render: ReturnType<FunctionComponent> }
154
- > {
155
- return InternalFactory<
156
- Props,
157
- Ref,
158
- { props: Props; render: ReturnType<FunctionComponent> }
159
- >([], displayName)
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)
160
168
  }
161
169
 
162
- export function render<Args extends {}, Ref>(
163
- render: (
164
- args: Args,
165
- ref: React.ForwardedRef<Ref>,
166
- ) => React.ReactElement<any, any> | null,
167
- ): ModularStage<
168
- 'render',
169
- (
170
- args: Args,
171
- ref: React.ForwardedRef<Ref>,
172
- ) => React.ReactElement<any, any> | null
173
- > {
174
- return {
175
- field: 'render',
176
- useStage: render,
177
- }
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 }
178
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>>