@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 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 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
- 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<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,59 +1,55 @@
1
- function InternalFactory(stages) {
2
- const useComponent = function (props, ref) {
3
- if (!stages.some((stage) => stage.field === 'render')) {
4
- stages = [...stages, render(() => null)];
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
- useComponent.with = (stage) => {
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
- useComponent.force = useComponent.with;
18
- useComponent.use = (field) => {
19
- if (!field) {
20
- return (props = {}, ref = null) => {
21
- const args = { props };
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.useStage(args, ref);
29
+ args[stage.field] = stage.provide(args);
34
30
  }
35
- return args[field];
31
+ return field ? args[field] : args;
36
32
  };
37
33
  };
38
- useComponent.stage = (field) => {
34
+ UseComponent.stage = (field) => {
39
35
  const stage = stages.find((stage) => stage.field === field);
40
- return stage?.useStage ?? (() => null);
36
+ return stage?.provide ?? (() => null);
41
37
  };
42
- useComponent.setDisplayName = (displayName) => {
38
+ Object.entries(customFunctions).forEach(([name, fn]) => {
43
39
  ;
44
- useComponent.displayName = displayName;
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 useComponent;
46
+ return UseComponent;
47
47
  }
48
48
  export function ModularComponent(displayName) {
49
- const useComponent = InternalFactory([]);
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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA4EA,IAAI,eAAe,GAMf,EAAE,CAAA;AAEN,SAAS,eAAe,CACtB,MAAwD,EACxD,WAA+B;IAE/B,MAAM,YAAY,GAAG,UAAU,KAAuB,EAAE,GAAmB;QACzE,OAAO,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC/C,CAAC,CAAA;IACD,YAAY,CAAC,WAAW,GAAG,WAAW,CAAA;IAEtC,YAAY,CAAC,IAAI,GAAG,CAClB,MAAyE,EACzE,EAAE;QACF,MAAM,KAAK,GAAG,MAAM,EAAE,CAAA;QACtB,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAA;QAE9D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;YACxB,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;YACnB,OAAO,eAAe,CAAU,IAAI,EAAE,WAAW,CAAC,CAAA;QACpD,CAAC;QAED,OAAO,eAAe,CAAU,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,CAAC,CAAA;IAClE,CAAC,CAAA;IACD,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAA;IAEtC,YAAY,CAAC,GAAG,GAAG,CAAC,KAAc,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,KAAK;YACjB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC;YACpD,CAAC,CAAC,CAAC,CAAC,CAAA;QACN,MAAM,SAAS,GACb,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;QAE7D,OAAO,CAAC,KAAK,GAAG,EAAE,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE;YAChC,MAAM,IAAI,GAAwB,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;YAChD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;YACpB,CAAC;YACD,KAAK,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACzC,CAAC;YACD,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACnC,CAAC,CAAA;IACH,CAAC,CAAA;IAED,YAAY,CAAC,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAA;QAC3D,OAAO,KAAK,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC,CAAA;IAED,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACrD,CAAC;QAAC,YAAoB,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CACvE,GAAG,IAAS,EACZ,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAClC;QAAC,YAAoB,CACpB,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAChD,GAAG,CAAC,GAAG,IAAS,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,YAAY,CAAC,eAAe,GAAG,CAAC,WAAmB,EAAE,EAAE;QACrD,OAAO,eAAe,CAAU,CAAC,GAAG,MAAM,CAAC,EAAE,WAAW,CAAC,CAAA;IAC3D,CAAC,CAAA;IAED,OAAO,YAAoD,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,WAAoB;IAEpB,OAAO,eAAe,CAcnB,EAAE,EAAE,WAAW,CAAC,CAAA;AACrB,CAAC;AAED,gBAAgB,CAAC,QAAQ,GAAG,CAC1B,SAQC,EACD,EAAE;IACF,eAAe,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,SAAS,EAAE,CAAA;AACxD,CAAC,CAAA;AAED,cAAc,UAAU,CAAA"}
@@ -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.2",
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,182 +1,184 @@
1
- import React, {
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
- export interface ModularStage<
8
- Field extends string,
9
- Stage extends (args: any, ref?: any) => any,
10
- > {
11
- field: Field
12
- useStage: Stage
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
- export type FunctionComponentOrRefRenderFunction<Props, Ref> = [Ref] extends [
16
- never,
17
- ]
18
- ? FunctionComponent<PropsWithChildren<Props>>
19
- : ForwardRefRenderFunction<Ref, Props>
20
-
21
- export type ModularComponent<
22
- Props extends {},
23
- Ref,
24
- Args extends { render: ReturnType<FunctionComponent> },
25
- > = FunctionComponentOrRefRenderFunction<Props, Ref> & {
26
- with<Field extends string, Type>(stage: {
27
- field: Field
28
- useStage: (
29
- args: Args,
30
- ref: React.ForwardedRef<Ref>,
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
- function InternalFactory<
79
- Props extends {},
80
- Ref,
81
- Args extends { render: ReturnType<FunctionComponent> },
82
- >(
83
- stages: ModularStage<
84
- string,
85
- (args: Args, ref: React.ForwardedRef<Ref>) => any
86
- >[],
87
- ): ModularComponent<Props, Ref, Args> {
88
- const useComponent = function (props: Props, ref: React.ForwardedRef<Ref>) {
89
- if (!stages.some((stage) => stage.field === 'render')) {
90
- 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>
91
75
  }
92
- return useComponent.use('render')(props, ref)
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
- useComponent.with = (stage: ModularStage<string, (args: Args) => any>) => {
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<Props, Ref, Args>(next)
103
+ return InternalFactory<Context>(next, displayName)
102
104
  }
103
105
 
104
- return InternalFactory<Props, Ref, Args>([...stages, stage])
106
+ return InternalFactory<Context>([...stages, stage], displayName)
105
107
  }
106
- useComponent.force = useComponent.with
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
- 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
123
114
  const argStages =
124
115
  index === -1 ? stages.slice(0) : stages.slice(0, index + 1)
125
116
 
126
- return (
127
- props: Props = {} as Props,
128
- ref: React.ForwardedRef<Ref> = null,
129
- ) => {
130
- 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
+ }
131
122
  for (let stage of argStages) {
132
- args[stage.field] = stage.useStage(args as Args, ref)
123
+ args[stage.field] = stage.provide(args)
133
124
  }
134
- return args[field as string]
125
+ return field ? args[field] : args
135
126
  }
136
127
  }
137
128
 
138
- useComponent.stage = (field: keyof Args) => {
129
+ UseComponent.stage = (field: string) => {
139
130
  const stage = stages.find((stage) => stage.field === field)
140
- return stage?.useStage ?? (() => null)
131
+ return stage?.provide ?? (() => null)
141
132
  }
142
133
 
143
- useComponent.setDisplayName = (displayName: string) => {
144
- ;(useComponent as any).displayName = displayName
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 useComponent as unknown as ModularComponent<Props, Ref, Args>
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
- ): ModularComponent<
153
- Props,
154
- Ref,
155
- { props: Props; render: ReturnType<FunctionComponent> }
156
- > {
157
- const useComponent = InternalFactory<
158
- Props,
159
- Ref,
160
- { props: Props; render: ReturnType<FunctionComponent> }
161
- >([])
162
- useComponent.displayName = displayName
163
- return useComponent
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
- export function render<Args extends {}, Ref>(
167
- render: (
168
- args: Args,
169
- ref: React.ForwardedRef<Ref>,
170
- ) => React.ReactElement<any, any> | null,
171
- ): ModularStage<
172
- 'render',
173
- (
174
- args: Args,
175
- ref: React.ForwardedRef<Ref>,
176
- ) => React.ReactElement<any, any> | null
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>>