@jfdevelops/react-layout 0.1.1 → 0.2.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.
Files changed (127) hide show
  1. package/dist/composable.cjs.map +1 -1
  2. package/dist/composable.d.cts +3 -1
  3. package/dist/composable.d.cts.map +1 -1
  4. package/dist/composable.d.mts +3 -1
  5. package/dist/composable.d.mts.map +1 -1
  6. package/dist/composable.mjs.map +1 -1
  7. package/dist/create-config.cjs +9 -6
  8. package/dist/create-config.cjs.map +1 -1
  9. package/dist/create-config.d.cts +1 -1
  10. package/dist/create-config.d.cts.map +1 -1
  11. package/dist/create-config.d.mts +1 -1
  12. package/dist/create-config.d.mts.map +1 -1
  13. package/dist/create-config.mjs +5 -2
  14. package/dist/create-config.mjs.map +1 -1
  15. package/dist/index.cjs +5 -4
  16. package/dist/index.d.cts +3 -1
  17. package/dist/index.d.mts +3 -1
  18. package/dist/index.mjs +2 -1
  19. package/dist/props.d.cts +2 -1
  20. package/dist/props.d.cts.map +1 -1
  21. package/dist/props.d.mts +2 -1
  22. package/dist/props.d.mts.map +1 -1
  23. package/dist/resource.cjs.map +1 -1
  24. package/dist/resource.d.cts +1 -1
  25. package/dist/resource.d.cts.map +1 -1
  26. package/dist/resource.d.mts +1 -1
  27. package/dist/resource.d.mts.map +1 -1
  28. package/dist/resource.mjs.map +1 -1
  29. package/dist/utils/capitalize.cjs +9 -0
  30. package/dist/utils/capitalize.cjs.map +1 -0
  31. package/dist/utils/capitalize.d.cts +7 -0
  32. package/dist/utils/capitalize.d.cts.map +1 -0
  33. package/dist/utils/capitalize.d.mts +7 -0
  34. package/dist/utils/capitalize.d.mts.map +1 -0
  35. package/dist/utils/capitalize.mjs +8 -0
  36. package/dist/utils/capitalize.mjs.map +1 -0
  37. package/dist/utils.cjs.map +1 -1
  38. package/dist/utils.d.cts.map +1 -1
  39. package/dist/utils.d.mts.map +1 -1
  40. package/dist/utils.mjs.map +1 -1
  41. package/dist/validators/base.cjs +41 -0
  42. package/dist/validators/base.cjs.map +1 -0
  43. package/dist/validators/base.d.cts +18 -0
  44. package/dist/validators/base.d.cts.map +1 -0
  45. package/dist/validators/base.d.mts +18 -0
  46. package/dist/validators/base.d.mts.map +1 -0
  47. package/dist/validators/base.mjs +39 -0
  48. package/dist/validators/base.mjs.map +1 -0
  49. package/dist/validators/builders.cjs +137 -0
  50. package/dist/validators/builders.cjs.map +1 -0
  51. package/dist/validators/builders.d.cts +156 -0
  52. package/dist/validators/builders.d.cts.map +1 -0
  53. package/dist/validators/builders.d.mts +156 -0
  54. package/dist/validators/builders.d.mts.map +1 -0
  55. package/dist/validators/builders.mjs +136 -0
  56. package/dist/validators/builders.mjs.map +1 -0
  57. package/dist/validators/component.cjs +73 -0
  58. package/dist/validators/component.cjs.map +1 -0
  59. package/dist/validators/component.d.cts +28 -0
  60. package/dist/validators/component.d.cts.map +1 -0
  61. package/dist/validators/component.d.mts +28 -0
  62. package/dist/validators/component.d.mts.map +1 -0
  63. package/dist/validators/component.mjs +71 -0
  64. package/dist/validators/component.mjs.map +1 -0
  65. package/dist/validators/enum.cjs +27 -0
  66. package/dist/validators/enum.cjs.map +1 -0
  67. package/dist/validators/enum.d.cts +14 -0
  68. package/dist/validators/enum.d.cts.map +1 -0
  69. package/dist/validators/enum.d.mts +14 -0
  70. package/dist/validators/enum.d.mts.map +1 -0
  71. package/dist/validators/enum.mjs +27 -0
  72. package/dist/validators/enum.mjs.map +1 -0
  73. package/dist/validators/index.d.cts +10 -0
  74. package/dist/validators/index.d.mts +10 -0
  75. package/dist/validators/literal.cjs +25 -0
  76. package/dist/validators/literal.cjs.map +1 -0
  77. package/dist/validators/literal.d.cts +14 -0
  78. package/dist/validators/literal.d.cts.map +1 -0
  79. package/dist/validators/literal.d.mts +14 -0
  80. package/dist/validators/literal.d.mts.map +1 -0
  81. package/dist/validators/literal.mjs +25 -0
  82. package/dist/validators/literal.mjs.map +1 -0
  83. package/dist/validators/object.cjs +53 -0
  84. package/dist/validators/object.cjs.map +1 -0
  85. package/dist/validators/object.d.cts +14 -0
  86. package/dist/validators/object.d.cts.map +1 -0
  87. package/dist/validators/object.d.mts +14 -0
  88. package/dist/validators/object.d.mts.map +1 -0
  89. package/dist/validators/object.mjs +53 -0
  90. package/dist/validators/object.mjs.map +1 -0
  91. package/dist/validators/primitive.cjs +80 -0
  92. package/dist/validators/primitive.cjs.map +1 -0
  93. package/dist/validators/primitive.d.cts +33 -0
  94. package/dist/validators/primitive.d.cts.map +1 -0
  95. package/dist/validators/primitive.d.mts +33 -0
  96. package/dist/validators/primitive.d.mts.map +1 -0
  97. package/dist/validators/primitive.mjs +78 -0
  98. package/dist/validators/primitive.mjs.map +1 -0
  99. package/dist/validators/types.d.cts +71 -0
  100. package/dist/validators/types.d.cts.map +1 -0
  101. package/dist/validators/types.d.mts +71 -0
  102. package/dist/validators/types.d.mts.map +1 -0
  103. package/dist/validators/union.cjs +27 -0
  104. package/dist/validators/union.cjs.map +1 -0
  105. package/dist/validators/union.d.cts +14 -0
  106. package/dist/validators/union.d.cts.map +1 -0
  107. package/dist/validators/union.d.mts +14 -0
  108. package/dist/validators/union.d.mts.map +1 -0
  109. package/dist/validators/union.mjs +27 -0
  110. package/dist/validators/union.mjs.map +1 -0
  111. package/dist/validators/validate-props.cjs +20 -0
  112. package/dist/validators/validate-props.cjs.map +1 -0
  113. package/dist/validators/validate-props.d.cts +7 -0
  114. package/dist/validators/validate-props.d.cts.map +1 -0
  115. package/dist/validators/validate-props.d.mts +7 -0
  116. package/dist/validators/validate-props.d.mts.map +1 -0
  117. package/dist/validators/validate-props.mjs +19 -0
  118. package/dist/validators/validate-props.mjs.map +1 -0
  119. package/package.json +63 -59
  120. package/dist/create-value.cjs +0 -417
  121. package/dist/create-value.cjs.map +0 -1
  122. package/dist/create-value.d.cts +0 -348
  123. package/dist/create-value.d.cts.map +0 -1
  124. package/dist/create-value.d.mts +0 -348
  125. package/dist/create-value.d.mts.map +0 -1
  126. package/dist/create-value.mjs +0 -414
  127. package/dist/create-value.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"composable.cjs","names":["resolvePropDefinitionValues","Comp"],"sources":["../src/composable.tsx"],"sourcesContent":["import { ComponentType, ReactNode } from 'react';\nimport { AnyBuiltPropDefinition, ResolveProps } from './create-value';\nimport { InPropsObject } from './props';\nimport { BaseComponent, resolvePropDefinitionValues, Show } from './utils';\n\r\nexport type ComposableNameContext<\r\n Resource extends string,\r\n LayoutName extends string = string,\r\n> = {\r\n resource: Resource;\r\n name: LayoutName;\r\n};\r\n\r\ntype ComposableComponentName<\r\n Name extends string,\r\n Resource extends string,\r\n LayoutName extends string = string,\r\n> = Name | ((ctx: ComposableNameContext<Resource, LayoutName>) => Name);\r\n\r\ntype CreateComposableComponentOptions<\r\n Name extends string,\r\n Wrapper,\r\n Resource extends string,\r\n LayoutName extends string = string,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n> = {\r\n name: ComposableComponentName<Name, Resource, LayoutName>;\r\n inProps?: InProps;\r\n outProps?: (props: Show<ResolveProps<InProps>>) => OutProps;\r\n wrapWith?: Wrapper;\r\n};\r\n\r\ntype ResolvedCreateComposableComponentOptions<\r\n Name extends string,\r\n Wrapper,\r\n Resource extends string,\r\n LayoutName extends string = string,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n> = Omit<\r\n CreateComposableComponentOptions<\r\n Name,\r\n Wrapper,\r\n Resource,\r\n LayoutName,\r\n InProps,\r\n OutProps\r\n >,\r\n 'name'\r\n> & {\r\n name: Name;\r\n};\r\n\r\nexport type CreateLayoutComposable<\r\n Resources extends string,\r\n LayoutName extends string = string,\r\n> = <\r\n const Name extends string,\r\n Wrapper,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n>(\r\n options: CreateComposableComponentOptions<\r\n Name,\r\n Wrapper,\r\n Resources,\r\n LayoutName,\r\n InProps,\r\n OutProps\r\n >,\r\n) => ComposableComponent<Name, Wrapper, InProps, OutProps>;\r\n\r\nexport type LayoutComposablesFactory<\r\n Resources extends string,\r\n LayoutName extends string = string,\r\n> = (\r\n create: CreateLayoutComposable<Resources, LayoutName>,\r\n) => ComposableComponents;\r\n\r\nexport type ResolveLayoutComposables<\r\n Factory extends LayoutComposablesFactory<string> | undefined,\r\n> = Factory extends LayoutComposablesFactory<string> ? ReturnType<Factory> : {};\r\ntype ComposableComponentWrapperProps<Wrapper> =\r\n Wrapper extends ComponentType<infer Props> ? Omit<Props, 'children'> : {};\r\ntype ComposableComponentProps<\r\n Wrapper,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n> = ComposableComponentWrapperProps<Wrapper> &\r\n (keyof InProps extends never ? {} : ResolveProps<InProps>) & {\r\n children?: [keyof InProps] extends [never]\r\n ? ReactNode\r\n : ((props: OutProps) => JSX.Element) | ReactNode;\r\n };\r\nexport type ComposableComponent<\r\n Name extends string,\r\n Wrapper,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n> = BaseComponent<Name, ResolveProps<InProps>> & {\r\n (props: ComposableComponentProps<Wrapper, InProps, OutProps>): ReactNode;\r\n};\r\nexport type ComposableResourceLayout<\r\n Composables extends ComposableComponents,\r\n Name extends string,\r\n Wrapper,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n> = Composables & ComposableComponent<Name, Wrapper, InProps, OutProps>;\r\n\r\nexport type AnyComposableComponent = ComposableComponent<string, any, {}, {}>;\r\nexport type ComposableComponents = Record<string, AnyComposableComponent>;\r\nexport type ResolvedComposableComponents<\r\n Components extends ComposableComponents,\r\n> = [keyof Components] extends [never]\r\n ? never\r\n : Components extends { Layout: infer _ }\r\n ? Components\r\n : 'The Layout composable is required';\r\n\r\nfunction resolveComponent<Props>(\n component: ((props: Props) => JSX.Element | ReactNode) | ReactNode,\n props: Props,\n) {\r\n const hasProps = Object.keys(props as object).length > 0;\r\n\r\n if (hasProps) {\r\n return typeof component === 'function' ? component(props) : component;\r\n }\r\n\r\n return component as ReactNode;\r\n}\r\n\r\nfunction reactNodeFromSingleFieldOutProps(resolved: unknown): ReactNode {\r\n if (resolved === null || typeof resolved !== 'object') {\r\n return null;\r\n }\r\n const values = Object.values(resolved);\r\n if (values.length !== 1) {\r\n return null;\r\n }\r\n return values[0] as ReactNode;\r\n}\r\n\r\nfunction resolveComposableComponentName<\r\n Name extends string,\r\n Resource extends string,\r\n LayoutName extends string,\r\n>(\r\n name: ComposableComponentName<Name, Resource, LayoutName>,\r\n ctx: ComposableNameContext<Resource, LayoutName>,\r\n): Name {\r\n return typeof name === 'function' ? name(ctx) : name;\r\n}\r\n\r\nexport function createLayoutComposableFactory<\r\n Resources extends string,\r\n LayoutName extends string,\r\n>(ctx: ComposableNameContext<Resources, LayoutName>) {\r\n const create: CreateLayoutComposable<Resources, LayoutName> = <\r\n const Name extends string,\r\n Wrapper,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n >(\r\n options: CreateComposableComponentOptions<\r\n Name,\r\n Wrapper,\r\n Resources,\r\n LayoutName,\r\n InProps,\r\n OutProps\r\n >,\r\n ) =>\r\n createComposableComponent({\r\n ...options,\r\n name: resolveComposableComponentName(options.name, ctx),\r\n } as ResolvedCreateComposableComponentOptions<\r\n Name,\r\n Wrapper,\r\n Resources,\r\n LayoutName,\r\n InProps,\r\n OutProps\r\n >);\r\n\r\n return create;\r\n}\r\n\r\nexport function resolveLayoutComposables<\r\n Resources extends string,\r\n LayoutName extends string,\r\n Composables extends ComposableComponents,\r\n>(\r\n factory: (\r\n create: CreateLayoutComposable<Resources, LayoutName>,\r\n ) => Composables,\r\n ctx: ComposableNameContext<Resources, LayoutName>,\r\n): Composables {\r\n return factory(createLayoutComposableFactory(ctx));\r\n}\r\n\r\nexport function createComposableComponent<\r\n const Name extends string,\r\n Wrapper,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n>(\r\n options: ResolvedCreateComposableComponentOptions<\r\n Name,\r\n Wrapper,\r\n string,\r\n string,\r\n InProps,\r\n OutProps\r\n >,\r\n) {\r\n const { name, inProps = {} as InProps, outProps, wrapWith } = options;\r\n\r\n function Composable({\r\n children,\r\n ...props\r\n }: ComposableComponentProps<Wrapper, InProps, OutProps>) {\r\n const inPropsKeys = Object.keys(inProps as object) as (keyof InProps &\r\n string)[];\r\n const mergedInProps = { ...inProps };\r\n const propsRecord = props as Record<string, unknown>;\r\n for (const key of inPropsKeys) {\r\n if (key in propsRecord) {\r\n (mergedInProps as Record<string, unknown>)[key] = propsRecord[key];\r\n }\r\n }\r\n\r\n const wrapperProps = {\r\n ...propsRecord,\r\n } as ComposableComponentWrapperProps<Wrapper>;\r\n for (const key of inPropsKeys) {\r\n delete (wrapperProps as Record<string, unknown>)[key];\r\n }\r\n\r\n const mergedResolved = resolvePropDefinitionValues(\n mergedInProps as Record<string, unknown>,\n ) as Show<ResolveProps<InProps>>;\n\r\n const resolvedProps = outProps\r\n ? outProps(mergedResolved)\r\n : ({} as OutProps);\r\n const resolvedChildren =\r\n children == null\r\n ? reactNodeFromSingleFieldOutProps(resolvedProps)\r\n : resolveComponent(children, resolvedProps);\r\n\r\n if (wrapWith) {\r\n const Comp = wrapWith as ComponentType<\r\n ComposableComponentWrapperProps<Wrapper>\r\n >;\r\n\r\n return <Comp {...wrapperProps}>{resolvedChildren}</Comp>;\r\n }\r\n\r\n return resolvedChildren;\r\n }\r\n\r\n Composable.displayName = name;\r\n\r\n return Object.assign(Composable, {\r\n props: undefined as unknown as ResolveProps<InProps>,\r\n }) as unknown as ComposableComponent<Name, Wrapper, InProps, OutProps>;\r\n}\r\n\r\nexport type MakeComposableOptions<\r\n Composables extends ComposableComponents,\r\n Name extends string,\r\n> = { components: Composables | undefined; name: Name };\r\nexport type MakeComposable<\r\n Composables extends ComposableComponents,\r\n Name extends string,\r\n> = <OverrideName extends string = Name>(\r\n options?: Partial<\r\n Pick<MakeComposableOptions<Composables, OverrideName>, 'name'>\r\n >,\r\n) => ComposableResourceLayout<Composables, Name, any, any, any>;\r\n\r\nexport function makeComposable<Props>() {\r\n return function <\r\n Composables extends ComposableComponents,\r\n Name extends string,\r\n >(options: MakeComposableOptions<Composables, Name>) {\r\n const { components, name: layoutName } = options;\r\n\r\n if (!components || typeof components !== 'object') {\r\n throw new Error('components must be an object');\r\n }\r\n\r\n const componentNames = Object.keys(components);\r\n\r\n if (componentNames.length === 0) {\r\n throw new Error('components must have at least one component');\r\n }\r\n\r\n if (!('Layout' in components)) {\r\n throw new Error('The Layout composable is required');\r\n }\r\n\r\n const create: MakeComposable<Composables, Name> = (overrideOptions) => {\r\n const resolvedName = overrideOptions?.name ?? layoutName;\r\n const { Layout, ...rest } = components;\r\n\r\n return Object.assign(Layout, {\r\n displayName: resolvedName,\r\n props: undefined as unknown as Props,\r\n ...rest,\r\n }) as unknown as ComposableResourceLayout<\r\n Composables,\r\n Name,\r\n any,\r\n any,\r\n any\r\n >;\r\n };\r\n\r\n return create;\r\n };\r\n}\r\n"],"mappings":";;;;AAyHA,SAAS,iBACP,WACA,OACA;CAGA,IAFiB,OAAO,KAAK,KAAe,EAAE,SAAS,GAGrD,OAAO,OAAO,cAAc,aAAa,UAAU,KAAK,IAAI;CAG9D,OAAO;AACT;AAEA,SAAS,iCAAiC,UAA8B;CACtE,IAAI,aAAa,QAAQ,OAAO,aAAa,UAC3C,OAAO;CAET,MAAM,SAAS,OAAO,OAAO,QAAQ;CACrC,IAAI,OAAO,WAAW,GACpB,OAAO;CAET,OAAO,OAAO;AAChB;AAEA,SAAS,+BAKP,MACA,KACM;CACN,OAAO,OAAO,SAAS,aAAa,KAAK,GAAG,IAAI;AAClD;AAEA,SAAgB,8BAGd,KAAmD;CACnD,MAAM,UAMJ,YASA,0BAA0B;EACxB,GAAG;EACH,MAAM,+BAA+B,QAAQ,MAAM,GAAG;CACxD,CAOC;CAEH,OAAO;AACT;AAEA,SAAgB,yBAKd,SAGA,KACa;CACb,OAAO,QAAQ,8BAA8B,GAAG,CAAC;AACnD;AAEA,SAAgB,0BAMd,SAQA;CACA,MAAM,EAAE,MAAM,UAAU,CAAC,GAAc,UAAU,aAAa;CAE9D,SAAS,WAAW,EAClB,UACA,GAAG,SACoD;EACvD,MAAM,cAAc,OAAO,KAAK,OAAiB;EAEjD,MAAM,gBAAgB,EAAE,GAAG,QAAQ;EACnC,MAAM,cAAc;EACpB,KAAK,MAAM,OAAO,aAChB,IAAI,OAAO,aACT,AAAC,cAA0C,OAAO,YAAY;EAIlE,MAAM,eAAe,EACnB,GAAG,YACL;EACA,KAAK,MAAM,OAAO,aAChB,OAAQ,aAAyC;EAGnD,MAAM,iBAAiBA,0CACrB,aACF;EAEA,MAAM,gBAAgB,WAClB,SAAS,cAAc,IACtB,CAAC;EACN,MAAM,mBACJ,YAAY,OACR,iCAAiC,aAAa,IAC9C,iBAAiB,UAAU,aAAa;EAE9C,IAAI,UAKF,OAAO,2CAACC,UAAD;GAAM,GAAI;aAAe;EAAuB;EAGzD,OAAO;CACT;CAEA,WAAW,cAAc;CAEzB,OAAO,OAAO,OAAO,YAAY,EAC/B,OAAO,OACT,CAAC;AACH;AAeA,SAAgB,iBAAwB;CACtC,OAAO,SAGL,SAAmD;EACnD,MAAM,EAAE,YAAY,MAAM,eAAe;EAEzC,IAAI,CAAC,cAAc,OAAO,eAAe,UACvC,MAAM,IAAI,MAAM,8BAA8B;EAKhD,IAFuB,OAAO,KAAK,UAElB,EAAE,WAAW,GAC5B,MAAM,IAAI,MAAM,6CAA6C;EAG/D,IAAI,EAAE,YAAY,aAChB,MAAM,IAAI,MAAM,mCAAmC;EAGrD,MAAM,UAA6C,oBAAoB;GACrE,MAAM,eAAe,iBAAiB,QAAQ;GAC9C,MAAM,EAAE,QAAQ,GAAG,SAAS;GAE5B,OAAO,OAAO,OAAO,QAAQ;IAC3B,aAAa;IACb,OAAO;IACP,GAAG;GACL,CAAC;EAOH;EAEA,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"composable.cjs","names":["resolvePropDefinitionValues","Comp"],"sources":["../src/composable.tsx"],"sourcesContent":["import { ComponentType, ReactNode } from 'react';\nimport { AnyBuiltPropDefinition, ResolveProps } from './validators';\nimport { InPropsObject } from './props';\nimport { BaseComponent, resolvePropDefinitionValues, Show } from './utils';\nimport { CapitalizeFn } from './utils/capitalize';\n\nexport type ComposableNameContext<\n Resource extends string,\n LayoutName extends string = string,\n> = {\n resource: Resource;\n name: LayoutName;\n capitalize: CapitalizeFn;\n};\n\ntype ComposableComponentName<\n Name extends string,\n Resource extends string,\n LayoutName extends string = string,\n> = Name | ((ctx: ComposableNameContext<Resource, LayoutName>) => Name);\n\ntype CreateComposableComponentOptions<\n Name extends string,\n Wrapper,\n Resource extends string,\n LayoutName extends string = string,\n InProps extends InPropsObject = {},\n OutProps = {},\n> = {\n name: ComposableComponentName<Name, Resource, LayoutName>;\n inProps?: InProps;\n outProps?: (props: Show<ResolveProps<InProps>>) => OutProps;\n wrapWith?: Wrapper;\n};\n\ntype ResolvedCreateComposableComponentOptions<\n Name extends string,\n Wrapper,\n Resource extends string,\n LayoutName extends string = string,\n InProps extends InPropsObject = {},\n OutProps = {},\n> = Omit<\n CreateComposableComponentOptions<\n Name,\n Wrapper,\n Resource,\n LayoutName,\n InProps,\n OutProps\n >,\n 'name'\n> & {\n name: Name;\n};\n\nexport type CreateLayoutComposable<\n Resources extends string,\n LayoutName extends string = string,\n> = <\n const Name extends string,\n Wrapper,\n InProps extends InPropsObject = {},\n OutProps = {},\n>(\n options: CreateComposableComponentOptions<\n Name,\n Wrapper,\n Resources,\n LayoutName,\n InProps,\n OutProps\n >,\n) => ComposableComponent<Name, Wrapper, InProps, OutProps>;\n\nexport type LayoutComposablesFactory<\n Resources extends string,\n LayoutName extends string = string,\n> = (\n create: CreateLayoutComposable<Resources, LayoutName>,\n) => ComposableComponents;\n\nexport type ResolveLayoutComposables<\n Factory extends LayoutComposablesFactory<string> | undefined,\n> = Factory extends LayoutComposablesFactory<string> ? ReturnType<Factory> : {};\ntype ComposableComponentWrapperProps<Wrapper> =\n Wrapper extends ComponentType<infer Props> ? Omit<Props, 'children'> : {};\ntype ComposableComponentProps<\n Wrapper,\n InProps extends InPropsObject = {},\n OutProps = {},\n> = ComposableComponentWrapperProps<Wrapper> &\n (keyof InProps extends never ? {} : ResolveProps<InProps>) & {\n children?: [keyof InProps] extends [never]\n ? ReactNode\n : ((props: OutProps) => JSX.Element) | ReactNode;\n };\nexport type ComposableComponent<\n Name extends string,\n Wrapper,\n InProps extends InPropsObject = {},\n OutProps = {},\n> = BaseComponent<Name, ResolveProps<InProps>> & {\n (props: ComposableComponentProps<Wrapper, InProps, OutProps>): ReactNode;\n};\nexport type ComposableResourceLayout<\n Composables extends ComposableComponents,\n Name extends string,\n Wrapper,\n InProps extends InPropsObject = {},\n OutProps = {},\n> = Composables & ComposableComponent<Name, Wrapper, InProps, OutProps>;\n\nexport type AnyComposableComponent = ComposableComponent<string, any, {}, {}>;\nexport type ComposableComponents = Record<string, AnyComposableComponent>;\nexport type ResolvedComposableComponents<\n Components extends ComposableComponents,\n> = [keyof Components] extends [never]\n ? never\n : Components extends { Layout: infer _ }\n ? Components\n : 'The Layout composable is required';\n\nfunction resolveComponent<Props>(\n component: ((props: Props) => JSX.Element | ReactNode) | ReactNode,\n props: Props,\n) {\n const hasProps = Object.keys(props as object).length > 0;\n\n if (hasProps) {\n return typeof component === 'function' ? component(props) : component;\n }\n\n return component as ReactNode;\n}\n\nfunction reactNodeFromSingleFieldOutProps(resolved: unknown): ReactNode {\n if (resolved === null || typeof resolved !== 'object') {\n return null;\n }\n const values = Object.values(resolved);\n if (values.length !== 1) {\n return null;\n }\n return values[0] as ReactNode;\n}\n\nfunction resolveComposableComponentName<\n Name extends string,\n Resource extends string,\n LayoutName extends string,\n>(\n name: ComposableComponentName<Name, Resource, LayoutName>,\n ctx: ComposableNameContext<Resource, LayoutName>,\n): Name {\n return typeof name === 'function' ? name(ctx) : name;\n}\n\nexport function createLayoutComposableFactory<\n Resources extends string,\n LayoutName extends string,\n>(ctx: ComposableNameContext<Resources, LayoutName>) {\n const create: CreateLayoutComposable<Resources, LayoutName> = <\n const Name extends string,\n Wrapper,\n InProps extends InPropsObject = {},\n OutProps = {},\n >(\n options: CreateComposableComponentOptions<\n Name,\n Wrapper,\n Resources,\n LayoutName,\n InProps,\n OutProps\n >,\n ) =>\n createComposableComponent({\n ...options,\n name: resolveComposableComponentName(options.name, ctx),\n } as ResolvedCreateComposableComponentOptions<\n Name,\n Wrapper,\n Resources,\n LayoutName,\n InProps,\n OutProps\n >);\n\n return create;\n}\n\nexport function resolveLayoutComposables<\n Resources extends string,\n LayoutName extends string,\n Composables extends ComposableComponents,\n>(\n factory: (\n create: CreateLayoutComposable<Resources, LayoutName>,\n ) => Composables,\n ctx: ComposableNameContext<Resources, LayoutName>,\n): Composables {\n return factory(createLayoutComposableFactory(ctx));\n}\n\nexport function createComposableComponent<\n const Name extends string,\n Wrapper,\n InProps extends InPropsObject = {},\n OutProps = {},\n>(\n options: ResolvedCreateComposableComponentOptions<\n Name,\n Wrapper,\n string,\n string,\n InProps,\n OutProps\n >,\n) {\n const { name, inProps = {} as InProps, outProps, wrapWith } = options;\n\n function Composable({\n children,\n ...props\n }: ComposableComponentProps<Wrapper, InProps, OutProps>) {\n const inPropsKeys = Object.keys(inProps as object) as (keyof InProps &\n string)[];\n const mergedInProps = { ...inProps };\n const propsRecord = props as Record<string, unknown>;\n for (const key of inPropsKeys) {\n if (key in propsRecord) {\n (mergedInProps as Record<string, unknown>)[key] = propsRecord[key];\n }\n }\n\n const wrapperProps = {\n ...propsRecord,\n } as ComposableComponentWrapperProps<Wrapper>;\n for (const key of inPropsKeys) {\n delete (wrapperProps as Record<string, unknown>)[key];\n }\n\n const mergedResolved = resolvePropDefinitionValues(\n mergedInProps as Record<string, unknown>,\n ) as Show<ResolveProps<InProps>>;\n\n const resolvedProps = outProps\n ? outProps(mergedResolved)\n : ({} as OutProps);\n const resolvedChildren =\n children == null\n ? reactNodeFromSingleFieldOutProps(resolvedProps)\n : resolveComponent(children, resolvedProps);\n\n if (wrapWith) {\n const Comp = wrapWith as ComponentType<\n ComposableComponentWrapperProps<Wrapper>\n >;\n\n return <Comp {...wrapperProps}>{resolvedChildren}</Comp>;\n }\n\n return resolvedChildren;\n }\n\n Composable.displayName = name;\n\n return Object.assign(Composable, {\n props: undefined as unknown as ResolveProps<InProps>,\n }) as unknown as ComposableComponent<Name, Wrapper, InProps, OutProps>;\n}\n\nexport type MakeComposableOptions<\n Composables extends ComposableComponents,\n Name extends string,\n> = { components: Composables | undefined; name: Name };\nexport type MakeComposable<\n Composables extends ComposableComponents,\n Name extends string,\n> = <OverrideName extends string = Name>(\n options?: Partial<\n Pick<MakeComposableOptions<Composables, OverrideName>, 'name'>\n >,\n) => ComposableResourceLayout<Composables, Name, any, any, any>;\n\nexport function makeComposable<Props>() {\n return function <\n Composables extends ComposableComponents,\n Name extends string,\n >(options: MakeComposableOptions<Composables, Name>) {\n const { components, name: layoutName } = options;\n\n if (!components || typeof components !== 'object') {\n throw new Error('components must be an object');\n }\n\n const componentNames = Object.keys(components);\n\n if (componentNames.length === 0) {\n throw new Error('components must have at least one component');\n }\n\n if (!('Layout' in components)) {\n throw new Error('The Layout composable is required');\n }\n\n const create: MakeComposable<Composables, Name> = (overrideOptions) => {\n const resolvedName = overrideOptions?.name ?? layoutName;\n const { Layout, ...rest } = components;\n\n return Object.assign(Layout, {\n displayName: resolvedName,\n props: undefined as unknown as Props,\n ...rest,\n }) as unknown as ComposableResourceLayout<\n Composables,\n Name,\n any,\n any,\n any\n >;\n };\n\n return create;\n };\n}\n"],"mappings":";;;;AA2HA,SAAS,iBACP,WACA,OACA;CAGA,IAFiB,OAAO,KAAK,KAAe,EAAE,SAAS,GAGrD,OAAO,OAAO,cAAc,aAAa,UAAU,KAAK,IAAI;CAG9D,OAAO;AACT;AAEA,SAAS,iCAAiC,UAA8B;CACtE,IAAI,aAAa,QAAQ,OAAO,aAAa,UAC3C,OAAO;CAET,MAAM,SAAS,OAAO,OAAO,QAAQ;CACrC,IAAI,OAAO,WAAW,GACpB,OAAO;CAET,OAAO,OAAO;AAChB;AAEA,SAAS,+BAKP,MACA,KACM;CACN,OAAO,OAAO,SAAS,aAAa,KAAK,GAAG,IAAI;AAClD;AAEA,SAAgB,8BAGd,KAAmD;CACnD,MAAM,UAMJ,YASA,0BAA0B;EACxB,GAAG;EACH,MAAM,+BAA+B,QAAQ,MAAM,GAAG;CACxD,CAOC;CAEH,OAAO;AACT;AAEA,SAAgB,yBAKd,SAGA,KACa;CACb,OAAO,QAAQ,8BAA8B,GAAG,CAAC;AACnD;AAEA,SAAgB,0BAMd,SAQA;CACA,MAAM,EAAE,MAAM,UAAU,CAAC,GAAc,UAAU,aAAa;CAE9D,SAAS,WAAW,EAClB,UACA,GAAG,SACoD;EACvD,MAAM,cAAc,OAAO,KAAK,OAAiB;EAEjD,MAAM,gBAAgB,EAAE,GAAG,QAAQ;EACnC,MAAM,cAAc;EACpB,KAAK,MAAM,OAAO,aAChB,IAAI,OAAO,aACT,AAAC,cAA0C,OAAO,YAAY;EAIlE,MAAM,eAAe,EACnB,GAAG,YACL;EACA,KAAK,MAAM,OAAO,aAChB,OAAQ,aAAyC;EAGnD,MAAM,iBAAiBA,0CACrB,aACF;EAEA,MAAM,gBAAgB,WAClB,SAAS,cAAc,IACtB,CAAC;EACN,MAAM,mBACJ,YAAY,OACR,iCAAiC,aAAa,IAC9C,iBAAiB,UAAU,aAAa;EAE9C,IAAI,UAKF,OAAO,2CAACC,UAAD;GAAM,GAAI;aAAe;EAAuB;EAGzD,OAAO;CACT;CAEA,WAAW,cAAc;CAEzB,OAAO,OAAO,OAAO,YAAY,EAC/B,OAAO,OACT,CAAC;AACH;AAeA,SAAgB,iBAAwB;CACtC,OAAO,SAGL,SAAmD;EACnD,MAAM,EAAE,YAAY,MAAM,eAAe;EAEzC,IAAI,CAAC,cAAc,OAAO,eAAe,UACvC,MAAM,IAAI,MAAM,8BAA8B;EAKhD,IAFuB,OAAO,KAAK,UAElB,EAAE,WAAW,GAC5B,MAAM,IAAI,MAAM,6CAA6C;EAG/D,IAAI,EAAE,YAAY,aAChB,MAAM,IAAI,MAAM,mCAAmC;EAGrD,MAAM,UAA6C,oBAAoB;GACrE,MAAM,eAAe,iBAAiB,QAAQ;GAC9C,MAAM,EAAE,QAAQ,GAAG,SAAS;GAE5B,OAAO,OAAO,OAAO,QAAQ;IAC3B,aAAa;IACb,OAAO;IACP,GAAG;GACL,CAAC;EAOH;EAEA,OAAO;CACT;AACF"}
@@ -1,12 +1,14 @@
1
- import { ResolveProps } from "./create-value.cjs";
1
+ import { ResolveProps } from "./validators/types.cjs";
2
2
  import { BaseComponent, Show } from "./utils.cjs";
3
3
  import { InPropsObject } from "./props.cjs";
4
+ import { CapitalizeFn } from "./utils/capitalize.cjs";
4
5
  import { ComponentType, ReactNode } from "react";
5
6
 
6
7
  //#region src/composable.d.ts
7
8
  type ComposableNameContext<Resource extends string, LayoutName extends string = string> = {
8
9
  resource: Resource;
9
10
  name: LayoutName;
11
+ capitalize: CapitalizeFn;
10
12
  };
11
13
  type ComposableComponentName<Name extends string, Resource extends string, LayoutName extends string = string> = Name | ((ctx: ComposableNameContext<Resource, LayoutName>) => Name);
12
14
  type CreateComposableComponentOptions<Name extends string, Wrapper, Resource extends string, LayoutName extends string = string, InProps extends InPropsObject = {}, OutProps = {}> = {
@@ -1 +1 @@
1
- {"version":3,"file":"composable.d.cts","names":[],"sources":["../src/composable.tsx"],"mappings":";;;;;;KAKY,qBAAA;EAIV,QAAA,EAAU,QAAA;EACV,IAAA,EAAM,UAAU;AAAA;AAAA,KAGb,uBAAA,qFAID,IAAA,KAAS,GAAA,EAAK,qBAAA,CAAsB,QAAA,EAAU,UAAA,MAAgB,IAAA;AAAA,KAE7D,gCAAA,4GAKa,aAAA;EAGhB,IAAA,EAAM,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,UAAA;EAC9C,OAAA,GAAU,OAAA;EACV,QAAA,IAAY,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,OAAA,OAAc,QAAA;EACnD,QAAA,GAAW,OAAA;AAAA;AAAA,KAGR,wCAAA,4GAKa,aAAA,wBAEd,IAAA,CACF,gCAAA,CACE,IAAA,EACA,OAAA,EACA,QAAA,EACA,UAAA,EACA,OAAA,EACA,QAAA;EAIF,IAAA,EAAM,IAAA;AAAA;AAAA,KAGI,sBAAA,sHAMM,aAAA,sBAGhB,OAAA,EAAS,gCAAA,CACP,IAAA,EACA,OAAA,EACA,SAAA,EACA,UAAA,EACA,OAAA,EACA,QAAA,MAEC,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAA;AAAA,KAErC,wBAAA,kEAIV,MAAA,EAAQ,sBAAA,CAAuB,SAAA,EAAW,UAAA,MACvC,oBAAA;AAAA,KAKA,+BAAA,YACH,OAAA,SAAgB,aAAA,gBAA6B,IAAA,CAAK,KAAA;AAAA,KAC/C,wBAAA,0BAEa,aAAA,wBAEd,+BAAA,CAAgC,OAAA,WAC3B,OAAA,sBAA6B,YAAA,CAAa,OAAA;EAC/C,QAAA,UAAkB,OAAA,oBACd,SAAA,KACE,KAAA,EAAO,QAAA,KAAa,GAAA,CAAI,OAAA,IAAW,SAAA;AAAA;AAAA,KAEjC,mBAAA,+CAGM,aAAA,wBAEd,aAAA,CAAc,IAAA,EAAM,YAAA,CAAa,OAAA;EAAA,CAClC,KAAA,EAAO,wBAAA,CAAyB,OAAA,EAAS,OAAA,EAAS,QAAA,IAAY,SAAA;AAAA;AAAA,KAErD,wBAAA,qBACU,oBAAA,gDAGJ,aAAA,wBAEd,WAAA,GAAc,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAA;AAAA,KAElD,sBAAA,GAAyB,mBAAmB;AAAA,KAC5C,oBAAA,GAAuB,MAAM,SAAS,sBAAA;AAAA,iBA2FlC,yBAAA,qDAGE,aAAA,sBAGhB,OAAA,EAAS,wCAAA,CACP,IAAA,EACA,OAAA,kBAGA,OAAA,EACA,QAAA,IAqDe,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAA;AAAA,KAGnD,qBAAA,qBACU,oBAAA;EAEhB,UAAA,EAAY,WAAA;EAAyB,IAAA,EAAM,IAAA;AAAA;AAAA,KACrC,cAAA,qBACU,oBAAA,wDAEa,IAAA,EACjC,OAAA,GAAU,OAAA,CACR,IAAA,CAAK,qBAAA,CAAsB,WAAA,EAAa,YAAA,gBAEvC,wBAAA,CAAyB,WAAA,EAAa,IAAA;AAAA,iBAE3B,cAAA,gCAEQ,oBAAA,uBAEpB,OAAA,EAAS,qBAAA,CAAsB,WAAA,EAAa,IAAA,MAAK,cAAA,CAAA,WAAA,EAAA,IAAA"}
1
+ {"version":3,"file":"composable.d.cts","names":[],"sources":["../src/composable.tsx"],"mappings":";;;;;;;KAMY,qBAAA;EAIV,QAAA,EAAU,QAAA;EACV,IAAA,EAAM,UAAA;EACN,UAAA,EAAY,YAAA;AAAA;AAAA,KAGT,uBAAA,qFAID,IAAA,KAAS,GAAA,EAAK,qBAAA,CAAsB,QAAA,EAAU,UAAA,MAAgB,IAAA;AAAA,KAE7D,gCAAA,4GAKa,aAAA;EAGhB,IAAA,EAAM,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,UAAA;EAC9C,OAAA,GAAU,OAAA;EACV,QAAA,IAAY,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,OAAA,OAAc,QAAA;EACnD,QAAA,GAAW,OAAA;AAAA;AAAA,KAGR,wCAAA,4GAKa,aAAA,wBAEd,IAAA,CACF,gCAAA,CACE,IAAA,EACA,OAAA,EACA,QAAA,EACA,UAAA,EACA,OAAA,EACA,QAAA;EAIF,IAAA,EAAM,IAAA;AAAA;AAAA,KAGI,sBAAA,sHAMM,aAAA,sBAGhB,OAAA,EAAS,gCAAA,CACP,IAAA,EACA,OAAA,EACA,SAAA,EACA,UAAA,EACA,OAAA,EACA,QAAA,MAEC,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAA;AAAA,KAErC,wBAAA,kEAIV,MAAA,EAAQ,sBAAA,CAAuB,SAAA,EAAW,UAAA,MACvC,oBAAA;AAAA,KAKA,+BAAA,YACH,OAAA,SAAgB,aAAA,gBAA6B,IAAA,CAAK,KAAA;AAAA,KAC/C,wBAAA,0BAEa,aAAA,wBAEd,+BAAA,CAAgC,OAAA,WAC3B,OAAA,sBAA6B,YAAA,CAAa,OAAA;EAC/C,QAAA,UAAkB,OAAA,oBACd,SAAA,KACE,KAAA,EAAO,QAAA,KAAa,GAAA,CAAI,OAAA,IAAW,SAAA;AAAA;AAAA,KAEjC,mBAAA,+CAGM,aAAA,wBAEd,aAAA,CAAc,IAAA,EAAM,YAAA,CAAa,OAAA;EAAA,CAClC,KAAA,EAAO,wBAAA,CAAyB,OAAA,EAAS,OAAA,EAAS,QAAA,IAAY,SAAA;AAAA;AAAA,KAErD,wBAAA,qBACU,oBAAA,gDAGJ,aAAA,wBAEd,WAAA,GAAc,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAA;AAAA,KAElD,sBAAA,GAAyB,mBAAmB;AAAA,KAC5C,oBAAA,GAAuB,MAAM,SAAS,sBAAA;AAAA,iBA2FlC,yBAAA,qDAGE,aAAA,sBAGhB,OAAA,EAAS,wCAAA,CACP,IAAA,EACA,OAAA,kBAGA,OAAA,EACA,QAAA,IAqDe,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAA;AAAA,KAGnD,qBAAA,qBACU,oBAAA;EAEhB,UAAA,EAAY,WAAA;EAAyB,IAAA,EAAM,IAAA;AAAA;AAAA,KACrC,cAAA,qBACU,oBAAA,wDAEa,IAAA,EACjC,OAAA,GAAU,OAAA,CACR,IAAA,CAAK,qBAAA,CAAsB,WAAA,EAAa,YAAA,gBAEvC,wBAAA,CAAyB,WAAA,EAAa,IAAA;AAAA,iBAE3B,cAAA,gCAEQ,oBAAA,uBAEpB,OAAA,EAAS,qBAAA,CAAsB,WAAA,EAAa,IAAA,MAAK,cAAA,CAAA,WAAA,EAAA,IAAA"}
@@ -1,12 +1,14 @@
1
- import { ResolveProps } from "./create-value.mjs";
1
+ import { ResolveProps } from "./validators/types.mjs";
2
2
  import { BaseComponent, Show } from "./utils.mjs";
3
3
  import { InPropsObject } from "./props.mjs";
4
+ import { CapitalizeFn } from "./utils/capitalize.mjs";
4
5
  import { ComponentType, ReactNode } from "react";
5
6
 
6
7
  //#region src/composable.d.ts
7
8
  type ComposableNameContext<Resource extends string, LayoutName extends string = string> = {
8
9
  resource: Resource;
9
10
  name: LayoutName;
11
+ capitalize: CapitalizeFn;
10
12
  };
11
13
  type ComposableComponentName<Name extends string, Resource extends string, LayoutName extends string = string> = Name | ((ctx: ComposableNameContext<Resource, LayoutName>) => Name);
12
14
  type CreateComposableComponentOptions<Name extends string, Wrapper, Resource extends string, LayoutName extends string = string, InProps extends InPropsObject = {}, OutProps = {}> = {
@@ -1 +1 @@
1
- {"version":3,"file":"composable.d.mts","names":[],"sources":["../src/composable.tsx"],"mappings":";;;;;;KAKY,qBAAA;EAIV,QAAA,EAAU,QAAA;EACV,IAAA,EAAM,UAAU;AAAA;AAAA,KAGb,uBAAA,qFAID,IAAA,KAAS,GAAA,EAAK,qBAAA,CAAsB,QAAA,EAAU,UAAA,MAAgB,IAAA;AAAA,KAE7D,gCAAA,4GAKa,aAAA;EAGhB,IAAA,EAAM,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,UAAA;EAC9C,OAAA,GAAU,OAAA;EACV,QAAA,IAAY,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,OAAA,OAAc,QAAA;EACnD,QAAA,GAAW,OAAA;AAAA;AAAA,KAGR,wCAAA,4GAKa,aAAA,wBAEd,IAAA,CACF,gCAAA,CACE,IAAA,EACA,OAAA,EACA,QAAA,EACA,UAAA,EACA,OAAA,EACA,QAAA;EAIF,IAAA,EAAM,IAAA;AAAA;AAAA,KAGI,sBAAA,sHAMM,aAAA,sBAGhB,OAAA,EAAS,gCAAA,CACP,IAAA,EACA,OAAA,EACA,SAAA,EACA,UAAA,EACA,OAAA,EACA,QAAA,MAEC,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAA;AAAA,KAErC,wBAAA,kEAIV,MAAA,EAAQ,sBAAA,CAAuB,SAAA,EAAW,UAAA,MACvC,oBAAA;AAAA,KAKA,+BAAA,YACH,OAAA,SAAgB,aAAA,gBAA6B,IAAA,CAAK,KAAA;AAAA,KAC/C,wBAAA,0BAEa,aAAA,wBAEd,+BAAA,CAAgC,OAAA,WAC3B,OAAA,sBAA6B,YAAA,CAAa,OAAA;EAC/C,QAAA,UAAkB,OAAA,oBACd,SAAA,KACE,KAAA,EAAO,QAAA,KAAa,GAAA,CAAI,OAAA,IAAW,SAAA;AAAA;AAAA,KAEjC,mBAAA,+CAGM,aAAA,wBAEd,aAAA,CAAc,IAAA,EAAM,YAAA,CAAa,OAAA;EAAA,CAClC,KAAA,EAAO,wBAAA,CAAyB,OAAA,EAAS,OAAA,EAAS,QAAA,IAAY,SAAA;AAAA;AAAA,KAErD,wBAAA,qBACU,oBAAA,gDAGJ,aAAA,wBAEd,WAAA,GAAc,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAA;AAAA,KAElD,sBAAA,GAAyB,mBAAmB;AAAA,KAC5C,oBAAA,GAAuB,MAAM,SAAS,sBAAA;AAAA,iBA2FlC,yBAAA,qDAGE,aAAA,sBAGhB,OAAA,EAAS,wCAAA,CACP,IAAA,EACA,OAAA,kBAGA,OAAA,EACA,QAAA,IAqDe,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAA;AAAA,KAGnD,qBAAA,qBACU,oBAAA;EAEhB,UAAA,EAAY,WAAA;EAAyB,IAAA,EAAM,IAAA;AAAA;AAAA,KACrC,cAAA,qBACU,oBAAA,wDAEa,IAAA,EACjC,OAAA,GAAU,OAAA,CACR,IAAA,CAAK,qBAAA,CAAsB,WAAA,EAAa,YAAA,gBAEvC,wBAAA,CAAyB,WAAA,EAAa,IAAA;AAAA,iBAE3B,cAAA,gCAEQ,oBAAA,uBAEpB,OAAA,EAAS,qBAAA,CAAsB,WAAA,EAAa,IAAA,MAAK,cAAA,CAAA,WAAA,EAAA,IAAA"}
1
+ {"version":3,"file":"composable.d.mts","names":[],"sources":["../src/composable.tsx"],"mappings":";;;;;;;KAMY,qBAAA;EAIV,QAAA,EAAU,QAAA;EACV,IAAA,EAAM,UAAA;EACN,UAAA,EAAY,YAAA;AAAA;AAAA,KAGT,uBAAA,qFAID,IAAA,KAAS,GAAA,EAAK,qBAAA,CAAsB,QAAA,EAAU,UAAA,MAAgB,IAAA;AAAA,KAE7D,gCAAA,4GAKa,aAAA;EAGhB,IAAA,EAAM,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,UAAA;EAC9C,OAAA,GAAU,OAAA;EACV,QAAA,IAAY,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,OAAA,OAAc,QAAA;EACnD,QAAA,GAAW,OAAA;AAAA;AAAA,KAGR,wCAAA,4GAKa,aAAA,wBAEd,IAAA,CACF,gCAAA,CACE,IAAA,EACA,OAAA,EACA,QAAA,EACA,UAAA,EACA,OAAA,EACA,QAAA;EAIF,IAAA,EAAM,IAAA;AAAA;AAAA,KAGI,sBAAA,sHAMM,aAAA,sBAGhB,OAAA,EAAS,gCAAA,CACP,IAAA,EACA,OAAA,EACA,SAAA,EACA,UAAA,EACA,OAAA,EACA,QAAA,MAEC,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAA;AAAA,KAErC,wBAAA,kEAIV,MAAA,EAAQ,sBAAA,CAAuB,SAAA,EAAW,UAAA,MACvC,oBAAA;AAAA,KAKA,+BAAA,YACH,OAAA,SAAgB,aAAA,gBAA6B,IAAA,CAAK,KAAA;AAAA,KAC/C,wBAAA,0BAEa,aAAA,wBAEd,+BAAA,CAAgC,OAAA,WAC3B,OAAA,sBAA6B,YAAA,CAAa,OAAA;EAC/C,QAAA,UAAkB,OAAA,oBACd,SAAA,KACE,KAAA,EAAO,QAAA,KAAa,GAAA,CAAI,OAAA,IAAW,SAAA;AAAA;AAAA,KAEjC,mBAAA,+CAGM,aAAA,wBAEd,aAAA,CAAc,IAAA,EAAM,YAAA,CAAa,OAAA;EAAA,CAClC,KAAA,EAAO,wBAAA,CAAyB,OAAA,EAAS,OAAA,EAAS,QAAA,IAAY,SAAA;AAAA;AAAA,KAErD,wBAAA,qBACU,oBAAA,gDAGJ,aAAA,wBAEd,WAAA,GAAc,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAA;AAAA,KAElD,sBAAA,GAAyB,mBAAmB;AAAA,KAC5C,oBAAA,GAAuB,MAAM,SAAS,sBAAA;AAAA,iBA2FlC,yBAAA,qDAGE,aAAA,sBAGhB,OAAA,EAAS,wCAAA,CACP,IAAA,EACA,OAAA,kBAGA,OAAA,EACA,QAAA,IAqDe,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAA;AAAA,KAGnD,qBAAA,qBACU,oBAAA;EAEhB,UAAA,EAAY,WAAA;EAAyB,IAAA,EAAM,IAAA;AAAA;AAAA,KACrC,cAAA,qBACU,oBAAA,wDAEa,IAAA,EACjC,OAAA,GAAU,OAAA,CACR,IAAA,CAAK,qBAAA,CAAsB,WAAA,EAAa,YAAA,gBAEvC,wBAAA,CAAyB,WAAA,EAAa,IAAA;AAAA,iBAE3B,cAAA,gCAEQ,oBAAA,uBAEpB,OAAA,EAAS,qBAAA,CAAsB,WAAA,EAAa,IAAA,MAAK,cAAA,CAAA,WAAA,EAAA,IAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"composable.mjs","names":["Comp"],"sources":["../src/composable.tsx"],"sourcesContent":["import { ComponentType, ReactNode } from 'react';\nimport { AnyBuiltPropDefinition, ResolveProps } from './create-value';\nimport { InPropsObject } from './props';\nimport { BaseComponent, resolvePropDefinitionValues, Show } from './utils';\n\r\nexport type ComposableNameContext<\r\n Resource extends string,\r\n LayoutName extends string = string,\r\n> = {\r\n resource: Resource;\r\n name: LayoutName;\r\n};\r\n\r\ntype ComposableComponentName<\r\n Name extends string,\r\n Resource extends string,\r\n LayoutName extends string = string,\r\n> = Name | ((ctx: ComposableNameContext<Resource, LayoutName>) => Name);\r\n\r\ntype CreateComposableComponentOptions<\r\n Name extends string,\r\n Wrapper,\r\n Resource extends string,\r\n LayoutName extends string = string,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n> = {\r\n name: ComposableComponentName<Name, Resource, LayoutName>;\r\n inProps?: InProps;\r\n outProps?: (props: Show<ResolveProps<InProps>>) => OutProps;\r\n wrapWith?: Wrapper;\r\n};\r\n\r\ntype ResolvedCreateComposableComponentOptions<\r\n Name extends string,\r\n Wrapper,\r\n Resource extends string,\r\n LayoutName extends string = string,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n> = Omit<\r\n CreateComposableComponentOptions<\r\n Name,\r\n Wrapper,\r\n Resource,\r\n LayoutName,\r\n InProps,\r\n OutProps\r\n >,\r\n 'name'\r\n> & {\r\n name: Name;\r\n};\r\n\r\nexport type CreateLayoutComposable<\r\n Resources extends string,\r\n LayoutName extends string = string,\r\n> = <\r\n const Name extends string,\r\n Wrapper,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n>(\r\n options: CreateComposableComponentOptions<\r\n Name,\r\n Wrapper,\r\n Resources,\r\n LayoutName,\r\n InProps,\r\n OutProps\r\n >,\r\n) => ComposableComponent<Name, Wrapper, InProps, OutProps>;\r\n\r\nexport type LayoutComposablesFactory<\r\n Resources extends string,\r\n LayoutName extends string = string,\r\n> = (\r\n create: CreateLayoutComposable<Resources, LayoutName>,\r\n) => ComposableComponents;\r\n\r\nexport type ResolveLayoutComposables<\r\n Factory extends LayoutComposablesFactory<string> | undefined,\r\n> = Factory extends LayoutComposablesFactory<string> ? ReturnType<Factory> : {};\r\ntype ComposableComponentWrapperProps<Wrapper> =\r\n Wrapper extends ComponentType<infer Props> ? Omit<Props, 'children'> : {};\r\ntype ComposableComponentProps<\r\n Wrapper,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n> = ComposableComponentWrapperProps<Wrapper> &\r\n (keyof InProps extends never ? {} : ResolveProps<InProps>) & {\r\n children?: [keyof InProps] extends [never]\r\n ? ReactNode\r\n : ((props: OutProps) => JSX.Element) | ReactNode;\r\n };\r\nexport type ComposableComponent<\r\n Name extends string,\r\n Wrapper,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n> = BaseComponent<Name, ResolveProps<InProps>> & {\r\n (props: ComposableComponentProps<Wrapper, InProps, OutProps>): ReactNode;\r\n};\r\nexport type ComposableResourceLayout<\r\n Composables extends ComposableComponents,\r\n Name extends string,\r\n Wrapper,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n> = Composables & ComposableComponent<Name, Wrapper, InProps, OutProps>;\r\n\r\nexport type AnyComposableComponent = ComposableComponent<string, any, {}, {}>;\r\nexport type ComposableComponents = Record<string, AnyComposableComponent>;\r\nexport type ResolvedComposableComponents<\r\n Components extends ComposableComponents,\r\n> = [keyof Components] extends [never]\r\n ? never\r\n : Components extends { Layout: infer _ }\r\n ? Components\r\n : 'The Layout composable is required';\r\n\r\nfunction resolveComponent<Props>(\n component: ((props: Props) => JSX.Element | ReactNode) | ReactNode,\n props: Props,\n) {\r\n const hasProps = Object.keys(props as object).length > 0;\r\n\r\n if (hasProps) {\r\n return typeof component === 'function' ? component(props) : component;\r\n }\r\n\r\n return component as ReactNode;\r\n}\r\n\r\nfunction reactNodeFromSingleFieldOutProps(resolved: unknown): ReactNode {\r\n if (resolved === null || typeof resolved !== 'object') {\r\n return null;\r\n }\r\n const values = Object.values(resolved);\r\n if (values.length !== 1) {\r\n return null;\r\n }\r\n return values[0] as ReactNode;\r\n}\r\n\r\nfunction resolveComposableComponentName<\r\n Name extends string,\r\n Resource extends string,\r\n LayoutName extends string,\r\n>(\r\n name: ComposableComponentName<Name, Resource, LayoutName>,\r\n ctx: ComposableNameContext<Resource, LayoutName>,\r\n): Name {\r\n return typeof name === 'function' ? name(ctx) : name;\r\n}\r\n\r\nexport function createLayoutComposableFactory<\r\n Resources extends string,\r\n LayoutName extends string,\r\n>(ctx: ComposableNameContext<Resources, LayoutName>) {\r\n const create: CreateLayoutComposable<Resources, LayoutName> = <\r\n const Name extends string,\r\n Wrapper,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n >(\r\n options: CreateComposableComponentOptions<\r\n Name,\r\n Wrapper,\r\n Resources,\r\n LayoutName,\r\n InProps,\r\n OutProps\r\n >,\r\n ) =>\r\n createComposableComponent({\r\n ...options,\r\n name: resolveComposableComponentName(options.name, ctx),\r\n } as ResolvedCreateComposableComponentOptions<\r\n Name,\r\n Wrapper,\r\n Resources,\r\n LayoutName,\r\n InProps,\r\n OutProps\r\n >);\r\n\r\n return create;\r\n}\r\n\r\nexport function resolveLayoutComposables<\r\n Resources extends string,\r\n LayoutName extends string,\r\n Composables extends ComposableComponents,\r\n>(\r\n factory: (\r\n create: CreateLayoutComposable<Resources, LayoutName>,\r\n ) => Composables,\r\n ctx: ComposableNameContext<Resources, LayoutName>,\r\n): Composables {\r\n return factory(createLayoutComposableFactory(ctx));\r\n}\r\n\r\nexport function createComposableComponent<\r\n const Name extends string,\r\n Wrapper,\r\n InProps extends InPropsObject = {},\r\n OutProps = {},\r\n>(\r\n options: ResolvedCreateComposableComponentOptions<\r\n Name,\r\n Wrapper,\r\n string,\r\n string,\r\n InProps,\r\n OutProps\r\n >,\r\n) {\r\n const { name, inProps = {} as InProps, outProps, wrapWith } = options;\r\n\r\n function Composable({\r\n children,\r\n ...props\r\n }: ComposableComponentProps<Wrapper, InProps, OutProps>) {\r\n const inPropsKeys = Object.keys(inProps as object) as (keyof InProps &\r\n string)[];\r\n const mergedInProps = { ...inProps };\r\n const propsRecord = props as Record<string, unknown>;\r\n for (const key of inPropsKeys) {\r\n if (key in propsRecord) {\r\n (mergedInProps as Record<string, unknown>)[key] = propsRecord[key];\r\n }\r\n }\r\n\r\n const wrapperProps = {\r\n ...propsRecord,\r\n } as ComposableComponentWrapperProps<Wrapper>;\r\n for (const key of inPropsKeys) {\r\n delete (wrapperProps as Record<string, unknown>)[key];\r\n }\r\n\r\n const mergedResolved = resolvePropDefinitionValues(\n mergedInProps as Record<string, unknown>,\n ) as Show<ResolveProps<InProps>>;\n\r\n const resolvedProps = outProps\r\n ? outProps(mergedResolved)\r\n : ({} as OutProps);\r\n const resolvedChildren =\r\n children == null\r\n ? reactNodeFromSingleFieldOutProps(resolvedProps)\r\n : resolveComponent(children, resolvedProps);\r\n\r\n if (wrapWith) {\r\n const Comp = wrapWith as ComponentType<\r\n ComposableComponentWrapperProps<Wrapper>\r\n >;\r\n\r\n return <Comp {...wrapperProps}>{resolvedChildren}</Comp>;\r\n }\r\n\r\n return resolvedChildren;\r\n }\r\n\r\n Composable.displayName = name;\r\n\r\n return Object.assign(Composable, {\r\n props: undefined as unknown as ResolveProps<InProps>,\r\n }) as unknown as ComposableComponent<Name, Wrapper, InProps, OutProps>;\r\n}\r\n\r\nexport type MakeComposableOptions<\r\n Composables extends ComposableComponents,\r\n Name extends string,\r\n> = { components: Composables | undefined; name: Name };\r\nexport type MakeComposable<\r\n Composables extends ComposableComponents,\r\n Name extends string,\r\n> = <OverrideName extends string = Name>(\r\n options?: Partial<\r\n Pick<MakeComposableOptions<Composables, OverrideName>, 'name'>\r\n >,\r\n) => ComposableResourceLayout<Composables, Name, any, any, any>;\r\n\r\nexport function makeComposable<Props>() {\r\n return function <\r\n Composables extends ComposableComponents,\r\n Name extends string,\r\n >(options: MakeComposableOptions<Composables, Name>) {\r\n const { components, name: layoutName } = options;\r\n\r\n if (!components || typeof components !== 'object') {\r\n throw new Error('components must be an object');\r\n }\r\n\r\n const componentNames = Object.keys(components);\r\n\r\n if (componentNames.length === 0) {\r\n throw new Error('components must have at least one component');\r\n }\r\n\r\n if (!('Layout' in components)) {\r\n throw new Error('The Layout composable is required');\r\n }\r\n\r\n const create: MakeComposable<Composables, Name> = (overrideOptions) => {\r\n const resolvedName = overrideOptions?.name ?? layoutName;\r\n const { Layout, ...rest } = components;\r\n\r\n return Object.assign(Layout, {\r\n displayName: resolvedName,\r\n props: undefined as unknown as Props,\r\n ...rest,\r\n }) as unknown as ComposableResourceLayout<\r\n Composables,\r\n Name,\r\n any,\r\n any,\r\n any\r\n >;\r\n };\r\n\r\n return create;\r\n };\r\n}\r\n"],"mappings":";;;;AAyHA,SAAS,iBACP,WACA,OACA;CAGA,IAFiB,OAAO,KAAK,KAAe,EAAE,SAAS,GAGrD,OAAO,OAAO,cAAc,aAAa,UAAU,KAAK,IAAI;CAG9D,OAAO;AACT;AAEA,SAAS,iCAAiC,UAA8B;CACtE,IAAI,aAAa,QAAQ,OAAO,aAAa,UAC3C,OAAO;CAET,MAAM,SAAS,OAAO,OAAO,QAAQ;CACrC,IAAI,OAAO,WAAW,GACpB,OAAO;CAET,OAAO,OAAO;AAChB;AAEA,SAAS,+BAKP,MACA,KACM;CACN,OAAO,OAAO,SAAS,aAAa,KAAK,GAAG,IAAI;AAClD;AAEA,SAAgB,8BAGd,KAAmD;CACnD,MAAM,UAMJ,YASA,0BAA0B;EACxB,GAAG;EACH,MAAM,+BAA+B,QAAQ,MAAM,GAAG;CACxD,CAOC;CAEH,OAAO;AACT;AAEA,SAAgB,yBAKd,SAGA,KACa;CACb,OAAO,QAAQ,8BAA8B,GAAG,CAAC;AACnD;AAEA,SAAgB,0BAMd,SAQA;CACA,MAAM,EAAE,MAAM,UAAU,CAAC,GAAc,UAAU,aAAa;CAE9D,SAAS,WAAW,EAClB,UACA,GAAG,SACoD;EACvD,MAAM,cAAc,OAAO,KAAK,OAAiB;EAEjD,MAAM,gBAAgB,EAAE,GAAG,QAAQ;EACnC,MAAM,cAAc;EACpB,KAAK,MAAM,OAAO,aAChB,IAAI,OAAO,aACT,AAAC,cAA0C,OAAO,YAAY;EAIlE,MAAM,eAAe,EACnB,GAAG,YACL;EACA,KAAK,MAAM,OAAO,aAChB,OAAQ,aAAyC;EAGnD,MAAM,iBAAiB,4BACrB,aACF;EAEA,MAAM,gBAAgB,WAClB,SAAS,cAAc,IACtB,CAAC;EACN,MAAM,mBACJ,YAAY,OACR,iCAAiC,aAAa,IAC9C,iBAAiB,UAAU,aAAa;EAE9C,IAAI,UAKF,OAAO,oBAACA,UAAD;GAAM,GAAI;aAAe;EAAuB;EAGzD,OAAO;CACT;CAEA,WAAW,cAAc;CAEzB,OAAO,OAAO,OAAO,YAAY,EAC/B,OAAO,OACT,CAAC;AACH;AAeA,SAAgB,iBAAwB;CACtC,OAAO,SAGL,SAAmD;EACnD,MAAM,EAAE,YAAY,MAAM,eAAe;EAEzC,IAAI,CAAC,cAAc,OAAO,eAAe,UACvC,MAAM,IAAI,MAAM,8BAA8B;EAKhD,IAFuB,OAAO,KAAK,UAElB,EAAE,WAAW,GAC5B,MAAM,IAAI,MAAM,6CAA6C;EAG/D,IAAI,EAAE,YAAY,aAChB,MAAM,IAAI,MAAM,mCAAmC;EAGrD,MAAM,UAA6C,oBAAoB;GACrE,MAAM,eAAe,iBAAiB,QAAQ;GAC9C,MAAM,EAAE,QAAQ,GAAG,SAAS;GAE5B,OAAO,OAAO,OAAO,QAAQ;IAC3B,aAAa;IACb,OAAO;IACP,GAAG;GACL,CAAC;EAOH;EAEA,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"composable.mjs","names":["Comp"],"sources":["../src/composable.tsx"],"sourcesContent":["import { ComponentType, ReactNode } from 'react';\nimport { AnyBuiltPropDefinition, ResolveProps } from './validators';\nimport { InPropsObject } from './props';\nimport { BaseComponent, resolvePropDefinitionValues, Show } from './utils';\nimport { CapitalizeFn } from './utils/capitalize';\n\nexport type ComposableNameContext<\n Resource extends string,\n LayoutName extends string = string,\n> = {\n resource: Resource;\n name: LayoutName;\n capitalize: CapitalizeFn;\n};\n\ntype ComposableComponentName<\n Name extends string,\n Resource extends string,\n LayoutName extends string = string,\n> = Name | ((ctx: ComposableNameContext<Resource, LayoutName>) => Name);\n\ntype CreateComposableComponentOptions<\n Name extends string,\n Wrapper,\n Resource extends string,\n LayoutName extends string = string,\n InProps extends InPropsObject = {},\n OutProps = {},\n> = {\n name: ComposableComponentName<Name, Resource, LayoutName>;\n inProps?: InProps;\n outProps?: (props: Show<ResolveProps<InProps>>) => OutProps;\n wrapWith?: Wrapper;\n};\n\ntype ResolvedCreateComposableComponentOptions<\n Name extends string,\n Wrapper,\n Resource extends string,\n LayoutName extends string = string,\n InProps extends InPropsObject = {},\n OutProps = {},\n> = Omit<\n CreateComposableComponentOptions<\n Name,\n Wrapper,\n Resource,\n LayoutName,\n InProps,\n OutProps\n >,\n 'name'\n> & {\n name: Name;\n};\n\nexport type CreateLayoutComposable<\n Resources extends string,\n LayoutName extends string = string,\n> = <\n const Name extends string,\n Wrapper,\n InProps extends InPropsObject = {},\n OutProps = {},\n>(\n options: CreateComposableComponentOptions<\n Name,\n Wrapper,\n Resources,\n LayoutName,\n InProps,\n OutProps\n >,\n) => ComposableComponent<Name, Wrapper, InProps, OutProps>;\n\nexport type LayoutComposablesFactory<\n Resources extends string,\n LayoutName extends string = string,\n> = (\n create: CreateLayoutComposable<Resources, LayoutName>,\n) => ComposableComponents;\n\nexport type ResolveLayoutComposables<\n Factory extends LayoutComposablesFactory<string> | undefined,\n> = Factory extends LayoutComposablesFactory<string> ? ReturnType<Factory> : {};\ntype ComposableComponentWrapperProps<Wrapper> =\n Wrapper extends ComponentType<infer Props> ? Omit<Props, 'children'> : {};\ntype ComposableComponentProps<\n Wrapper,\n InProps extends InPropsObject = {},\n OutProps = {},\n> = ComposableComponentWrapperProps<Wrapper> &\n (keyof InProps extends never ? {} : ResolveProps<InProps>) & {\n children?: [keyof InProps] extends [never]\n ? ReactNode\n : ((props: OutProps) => JSX.Element) | ReactNode;\n };\nexport type ComposableComponent<\n Name extends string,\n Wrapper,\n InProps extends InPropsObject = {},\n OutProps = {},\n> = BaseComponent<Name, ResolveProps<InProps>> & {\n (props: ComposableComponentProps<Wrapper, InProps, OutProps>): ReactNode;\n};\nexport type ComposableResourceLayout<\n Composables extends ComposableComponents,\n Name extends string,\n Wrapper,\n InProps extends InPropsObject = {},\n OutProps = {},\n> = Composables & ComposableComponent<Name, Wrapper, InProps, OutProps>;\n\nexport type AnyComposableComponent = ComposableComponent<string, any, {}, {}>;\nexport type ComposableComponents = Record<string, AnyComposableComponent>;\nexport type ResolvedComposableComponents<\n Components extends ComposableComponents,\n> = [keyof Components] extends [never]\n ? never\n : Components extends { Layout: infer _ }\n ? Components\n : 'The Layout composable is required';\n\nfunction resolveComponent<Props>(\n component: ((props: Props) => JSX.Element | ReactNode) | ReactNode,\n props: Props,\n) {\n const hasProps = Object.keys(props as object).length > 0;\n\n if (hasProps) {\n return typeof component === 'function' ? component(props) : component;\n }\n\n return component as ReactNode;\n}\n\nfunction reactNodeFromSingleFieldOutProps(resolved: unknown): ReactNode {\n if (resolved === null || typeof resolved !== 'object') {\n return null;\n }\n const values = Object.values(resolved);\n if (values.length !== 1) {\n return null;\n }\n return values[0] as ReactNode;\n}\n\nfunction resolveComposableComponentName<\n Name extends string,\n Resource extends string,\n LayoutName extends string,\n>(\n name: ComposableComponentName<Name, Resource, LayoutName>,\n ctx: ComposableNameContext<Resource, LayoutName>,\n): Name {\n return typeof name === 'function' ? name(ctx) : name;\n}\n\nexport function createLayoutComposableFactory<\n Resources extends string,\n LayoutName extends string,\n>(ctx: ComposableNameContext<Resources, LayoutName>) {\n const create: CreateLayoutComposable<Resources, LayoutName> = <\n const Name extends string,\n Wrapper,\n InProps extends InPropsObject = {},\n OutProps = {},\n >(\n options: CreateComposableComponentOptions<\n Name,\n Wrapper,\n Resources,\n LayoutName,\n InProps,\n OutProps\n >,\n ) =>\n createComposableComponent({\n ...options,\n name: resolveComposableComponentName(options.name, ctx),\n } as ResolvedCreateComposableComponentOptions<\n Name,\n Wrapper,\n Resources,\n LayoutName,\n InProps,\n OutProps\n >);\n\n return create;\n}\n\nexport function resolveLayoutComposables<\n Resources extends string,\n LayoutName extends string,\n Composables extends ComposableComponents,\n>(\n factory: (\n create: CreateLayoutComposable<Resources, LayoutName>,\n ) => Composables,\n ctx: ComposableNameContext<Resources, LayoutName>,\n): Composables {\n return factory(createLayoutComposableFactory(ctx));\n}\n\nexport function createComposableComponent<\n const Name extends string,\n Wrapper,\n InProps extends InPropsObject = {},\n OutProps = {},\n>(\n options: ResolvedCreateComposableComponentOptions<\n Name,\n Wrapper,\n string,\n string,\n InProps,\n OutProps\n >,\n) {\n const { name, inProps = {} as InProps, outProps, wrapWith } = options;\n\n function Composable({\n children,\n ...props\n }: ComposableComponentProps<Wrapper, InProps, OutProps>) {\n const inPropsKeys = Object.keys(inProps as object) as (keyof InProps &\n string)[];\n const mergedInProps = { ...inProps };\n const propsRecord = props as Record<string, unknown>;\n for (const key of inPropsKeys) {\n if (key in propsRecord) {\n (mergedInProps as Record<string, unknown>)[key] = propsRecord[key];\n }\n }\n\n const wrapperProps = {\n ...propsRecord,\n } as ComposableComponentWrapperProps<Wrapper>;\n for (const key of inPropsKeys) {\n delete (wrapperProps as Record<string, unknown>)[key];\n }\n\n const mergedResolved = resolvePropDefinitionValues(\n mergedInProps as Record<string, unknown>,\n ) as Show<ResolveProps<InProps>>;\n\n const resolvedProps = outProps\n ? outProps(mergedResolved)\n : ({} as OutProps);\n const resolvedChildren =\n children == null\n ? reactNodeFromSingleFieldOutProps(resolvedProps)\n : resolveComponent(children, resolvedProps);\n\n if (wrapWith) {\n const Comp = wrapWith as ComponentType<\n ComposableComponentWrapperProps<Wrapper>\n >;\n\n return <Comp {...wrapperProps}>{resolvedChildren}</Comp>;\n }\n\n return resolvedChildren;\n }\n\n Composable.displayName = name;\n\n return Object.assign(Composable, {\n props: undefined as unknown as ResolveProps<InProps>,\n }) as unknown as ComposableComponent<Name, Wrapper, InProps, OutProps>;\n}\n\nexport type MakeComposableOptions<\n Composables extends ComposableComponents,\n Name extends string,\n> = { components: Composables | undefined; name: Name };\nexport type MakeComposable<\n Composables extends ComposableComponents,\n Name extends string,\n> = <OverrideName extends string = Name>(\n options?: Partial<\n Pick<MakeComposableOptions<Composables, OverrideName>, 'name'>\n >,\n) => ComposableResourceLayout<Composables, Name, any, any, any>;\n\nexport function makeComposable<Props>() {\n return function <\n Composables extends ComposableComponents,\n Name extends string,\n >(options: MakeComposableOptions<Composables, Name>) {\n const { components, name: layoutName } = options;\n\n if (!components || typeof components !== 'object') {\n throw new Error('components must be an object');\n }\n\n const componentNames = Object.keys(components);\n\n if (componentNames.length === 0) {\n throw new Error('components must have at least one component');\n }\n\n if (!('Layout' in components)) {\n throw new Error('The Layout composable is required');\n }\n\n const create: MakeComposable<Composables, Name> = (overrideOptions) => {\n const resolvedName = overrideOptions?.name ?? layoutName;\n const { Layout, ...rest } = components;\n\n return Object.assign(Layout, {\n displayName: resolvedName,\n props: undefined as unknown as Props,\n ...rest,\n }) as unknown as ComposableResourceLayout<\n Composables,\n Name,\n any,\n any,\n any\n >;\n };\n\n return create;\n };\n}\n"],"mappings":";;;;AA2HA,SAAS,iBACP,WACA,OACA;CAGA,IAFiB,OAAO,KAAK,KAAe,EAAE,SAAS,GAGrD,OAAO,OAAO,cAAc,aAAa,UAAU,KAAK,IAAI;CAG9D,OAAO;AACT;AAEA,SAAS,iCAAiC,UAA8B;CACtE,IAAI,aAAa,QAAQ,OAAO,aAAa,UAC3C,OAAO;CAET,MAAM,SAAS,OAAO,OAAO,QAAQ;CACrC,IAAI,OAAO,WAAW,GACpB,OAAO;CAET,OAAO,OAAO;AAChB;AAEA,SAAS,+BAKP,MACA,KACM;CACN,OAAO,OAAO,SAAS,aAAa,KAAK,GAAG,IAAI;AAClD;AAEA,SAAgB,8BAGd,KAAmD;CACnD,MAAM,UAMJ,YASA,0BAA0B;EACxB,GAAG;EACH,MAAM,+BAA+B,QAAQ,MAAM,GAAG;CACxD,CAOC;CAEH,OAAO;AACT;AAEA,SAAgB,yBAKd,SAGA,KACa;CACb,OAAO,QAAQ,8BAA8B,GAAG,CAAC;AACnD;AAEA,SAAgB,0BAMd,SAQA;CACA,MAAM,EAAE,MAAM,UAAU,CAAC,GAAc,UAAU,aAAa;CAE9D,SAAS,WAAW,EAClB,UACA,GAAG,SACoD;EACvD,MAAM,cAAc,OAAO,KAAK,OAAiB;EAEjD,MAAM,gBAAgB,EAAE,GAAG,QAAQ;EACnC,MAAM,cAAc;EACpB,KAAK,MAAM,OAAO,aAChB,IAAI,OAAO,aACT,AAAC,cAA0C,OAAO,YAAY;EAIlE,MAAM,eAAe,EACnB,GAAG,YACL;EACA,KAAK,MAAM,OAAO,aAChB,OAAQ,aAAyC;EAGnD,MAAM,iBAAiB,4BACrB,aACF;EAEA,MAAM,gBAAgB,WAClB,SAAS,cAAc,IACtB,CAAC;EACN,MAAM,mBACJ,YAAY,OACR,iCAAiC,aAAa,IAC9C,iBAAiB,UAAU,aAAa;EAE9C,IAAI,UAKF,OAAO,oBAACA,UAAD;GAAM,GAAI;aAAe;EAAuB;EAGzD,OAAO;CACT;CAEA,WAAW,cAAc;CAEzB,OAAO,OAAO,OAAO,YAAY,EAC/B,OAAO,OACT,CAAC;AACH;AAeA,SAAgB,iBAAwB;CACtC,OAAO,SAGL,SAAmD;EACnD,MAAM,EAAE,YAAY,MAAM,eAAe;EAEzC,IAAI,CAAC,cAAc,OAAO,eAAe,UACvC,MAAM,IAAI,MAAM,8BAA8B;EAKhD,IAFuB,OAAO,KAAK,UAElB,EAAE,WAAW,GAC5B,MAAM,IAAI,MAAM,6CAA6C;EAG/D,IAAI,EAAE,YAAY,aAChB,MAAM,IAAI,MAAM,mCAAmC;EAGrD,MAAM,UAA6C,oBAAoB;GACrE,MAAM,eAAe,iBAAiB,QAAQ;GAC9C,MAAM,EAAE,QAAQ,GAAG,SAAS;GAE5B,OAAO,OAAO,OAAO,QAAQ;IAC3B,aAAa;IACb,OAAO;IACP,GAAG;GACL,CAAC;EAOH;EAEA,OAAO;CACT;AACF"}
@@ -1,7 +1,9 @@
1
1
  const require_utils = require('./utils.cjs');
2
2
  const require_composable = require('./composable.cjs');
3
- const require_create_value = require('./create-value.cjs');
3
+ const require_builders = require('./validators/builders.cjs');
4
+ const require_validate_props = require('./validators/validate-props.cjs');
4
5
  const require_resource = require('./resource.cjs');
6
+ const require_capitalize = require('./utils/capitalize.cjs');
5
7
  let react_jsx_runtime = require("react/jsx-runtime");
6
8
 
7
9
  //#region src/create-config.tsx
@@ -32,11 +34,11 @@ function splitLayoutInProps(inProps) {
32
34
  function defineResourceLayout(options) {
33
35
  const { options: inProps, resources, layout } = options;
34
36
  const normalizedResources = require_resource.normalizeResources(resources);
35
- const resourcesEnum = require_create_value.createPrimitivePropBuilder("string").enum(require_resource.toResourceEnum(normalizedResources));
37
+ const resourcesEnum = require_builders.createPrimitivePropBuilder("string").enum(require_resource.toResourceEnum(normalizedResources));
36
38
  const definedResourceLayout = (layoutOptions) => {
37
39
  const { name, props: instancePropDefinitions, ...layoutOptionProps } = layoutOptions;
38
40
  const createComposableLayout = require_composable.makeComposable();
39
- const nameProp = require_create_value.createProp.string().literal(name);
41
+ const nameProp = require_builders.createProp.string().literal(name);
40
42
  const { resolvedInProps, splitInProps } = splitLayoutInProps({
41
43
  ...typeof inProps === "function" ? inProps({
42
44
  resource: resourcesEnum,
@@ -54,7 +56,8 @@ function defineResourceLayout(options) {
54
56
  };
55
57
  const layoutContext = {
56
58
  resource: layoutOptions.resource,
57
- name
59
+ name,
60
+ capitalize: require_capitalize.capitalize
58
61
  };
59
62
  const resolvedComposables = composables ? require_composable.resolveLayoutComposables(composables, layoutContext) : void 0;
60
63
  const mergedRenderContext = {
@@ -64,10 +67,10 @@ function defineResourceLayout(options) {
64
67
  inProps: splitInProps
65
68
  };
66
69
  function Component(props) {
67
- const validatedProps = require_create_value.validateProps(resolvedLayoutProps, props);
70
+ const validatedProps = require_validate_props.validateProps(resolvedLayoutProps, props);
68
71
  const includedPropKeys = Object.keys(includeLayoutProps ?? {});
69
72
  const includedPropDefinitions = require_utils.pick(resolvedInProps, includedPropKeys);
70
- const validatedIncludedProps = require_create_value.validateProps(includedPropDefinitions, {
73
+ const validatedIncludedProps = require_validate_props.validateProps(includedPropDefinitions, {
71
74
  ...require_utils.resolvePropDefinitionValues(includedPropDefinitions),
72
75
  ...require_utils.pick(splitInProps, includedPropKeys),
73
76
  ...require_utils.pick(layoutOptionProps, includedPropKeys)
@@ -1 +1 @@
1
- {"version":3,"file":"create-config.cjs","names":["normalizeResources","createPrimitivePropBuilder","toResourceEnum","makeComposable","createProp","pick","resolveLayoutComposables","validateProps","resolvePropDefinitionValues"],"sources":["../src/create-config.tsx"],"sourcesContent":["import type { JSX } from 'react';\r\nimport {\r\n type ComposableComponents,\r\n type ComposableNameContext,\r\n type CreateLayoutComposable,\r\n MakeComposable,\r\n makeComposable,\r\n MakeComposableOptions,\r\n resolveLayoutComposables,\r\n} from './composable';\r\nimport {\r\n type AnyBuiltPropDefinition,\r\n createPrimitivePropBuilder,\r\n createProp,\r\n type ResolveLayoutProps,\r\n type ResolveProps,\r\n validateProps,\r\n} from './create-value';\r\nimport {\r\n IncludedProps,\r\n InferredInProps,\r\n InPropsDefinition,\r\n InPropsObject,\r\n LayoutRenderProps,\r\n} from './props';\r\nimport {\n normalizeResources,\n toResourceEnum,\n type LayoutResourceKey,\r\n type NormalizeResources,\r\n type ResourceDefinition,\n} from './resource';\nimport { BaseComponent, pick, resolvePropDefinitionValues, Show } from './utils';\n\r\ntype LayoutProps<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n Options extends InPropsDefinition<Resources>,\r\n IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {},\r\n CustomProps extends InPropsObject = {},\r\n> = {\r\n /**\r\n * Props to include in the layout.\r\n */\r\n include?: IncludeProps;\r\n /**\r\n * Custom props that the layout will receive.\r\n */\r\n custom?: CustomProps;\r\n};\r\n\r\ntype LayoutRenderContext<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n Composables extends ComposableComponents,\r\n> = {\r\n composables: LayoutRenderComposables<Composables>;\r\n inProps: Record<string, unknown>;\r\n resource: LayoutResourceKey<Resources>;\r\n name: string;\r\n};\r\ntype LayoutRenderComposables<Composables extends ComposableComponents> =\r\n [keyof Composables] extends [never] ? undefined : Composables;\r\n\r\ntype SplitLayoutInPropDefinition<\r\n Props extends InPropsObject = {},\r\n Content = unknown,\r\n> = {\r\n props?: Props;\r\n render: ((props: ResolveProps<Props>) => Content) | Content;\r\n};\r\n\r\nfunction isBuiltPropDefinition(\r\n value: unknown,\r\n): value is AnyBuiltPropDefinition {\r\n return typeof value === 'function' && value !== null && 'visibility' in value;\r\n}\r\n\r\nfunction isSplitLayoutInPropDefinition(\r\n value: unknown,\r\n): value is SplitLayoutInPropDefinition {\r\n return (\r\n value !== null &&\r\n typeof value === 'object' &&\r\n 'render' in value &&\r\n (value as { render?: unknown }).render !== undefined\r\n );\r\n}\r\n\r\nfunction splitLayoutInProps(inProps: Record<string, unknown>) {\r\n const resolvedInProps: Record<string, AnyBuiltPropDefinition> = {};\r\n const splitInProps: Record<string, unknown> = {};\r\n\r\n for (const [key, value] of Object.entries(inProps)) {\r\n if (isBuiltPropDefinition(value)) {\r\n resolvedInProps[key] = value;\r\n continue;\r\n }\r\n\r\n if (isSplitLayoutInPropDefinition(value)) {\r\n splitInProps[key] = value.render;\r\n\r\n if (value.props && typeof value.props === 'object') {\r\n Object.assign(resolvedInProps, value.props);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n resolvedInProps,\r\n splitInProps,\r\n };\r\n}\r\n\r\ntype CreateViewMapOptions<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n Options extends InPropsDefinition<Resources>,\r\n IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {},\r\n CustomProps extends InPropsObject = {},\r\n Composables extends ComposableComponents = {},\r\n> = {\r\n /**\r\n * An array of valid resource names to support.\r\n */\r\n resources: Resources;\r\n /**\r\n * The options that are passed into the created resource layout.\r\n */\r\n options: Options;\r\n layout: {\r\n /**\r\n * The props to pass to the layout.\r\n */\r\n props?: LayoutProps<Resources, Options, IncludeProps, CustomProps>;\r\n /**\r\n * Components used to compose the layout. Invoked per layout instance with\r\n * a scoped `create` that resolves composable `name` callbacks using the\r\n * layout's `resource` and `name`.\r\n */\r\n composables?: (create: CreateLayoutComposable<LayoutResourceKey<Resources>>) => Composables;\r\n /**\r\n * The render function for the layout.\r\n */\r\n render: (\r\n props: LayoutRenderProps<Resources, Options, IncludeProps, CustomProps>,\r\n context: LayoutRenderContext<Resources, Composables>,\r\n ) => JSX.Element;\r\n };\r\n};\r\n\r\ntype ResourceLayoutComposition<\r\n Name extends string,\r\n Composables extends ComposableComponents,\r\n> = [keyof Composables] extends [never]\r\n ? {}\r\n : {\r\n makeComposable: MakeComposable<Composables, Name>;\r\n };\r\ntype ResourceLayoutComponent<\r\n Name extends string,\r\n Props extends InPropsObject = {},\r\n Composables extends ComposableComponents = {},\r\n> = ResourceLayoutComposition<Name, Composables> &\r\n BaseComponent<Name, ResolveProps<Props>> & {\r\n (props: Show<ResolveProps<Props>>): JSX.Element;\r\n };\r\n\r\ntype DefinedResourceLayoutOptions<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n InProps extends InPropsDefinition<Resources>,\r\n Name extends string,\r\n Resource extends LayoutResourceKey<Resources>,\r\n Props extends InPropsObject = {},\r\n> = ResolveLayoutProps<InferredInProps<Resources, InProps>> & {\r\n name: Name;\r\n resource: Resource;\r\n props?: Props;\r\n};\r\ntype DefinedResourceLayout<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n InProps extends InPropsDefinition<Resources>,\r\n IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {},\r\n CustomProps extends InPropsObject = {},\r\n Composables extends ComposableComponents = {},\r\n> = <\r\n Name extends string,\r\n Resource extends LayoutResourceKey<Resources>,\r\n Props extends InPropsObject = {},\r\n>(\r\n options: DefinedResourceLayoutOptions<\r\n Resources,\r\n InProps,\r\n Name,\r\n Resource,\r\n Props\r\n >,\r\n) => ResourceLayoutComponent<Name, CustomProps, Composables>;\r\n\r\nexport function defineResourceLayout<\r\n const Resources extends ReadonlyArray<ResourceDefinition>,\r\n InProps extends InPropsDefinition<Resources>,\r\n IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {},\r\n CustomProps extends InPropsObject = {},\r\n Composables extends ComposableComponents = {},\r\n>(\r\n options: CreateViewMapOptions<\r\n Resources,\r\n InProps,\r\n IncludeProps,\r\n CustomProps,\r\n Composables\r\n >,\r\n) {\r\n const { options: inProps, resources, layout } = options;\r\n const normalizedResources = normalizeResources(resources);\r\n const resourcesEnum = createPrimitivePropBuilder('string').enum(\r\n toResourceEnum(normalizedResources),\r\n );\r\n const definedResourceLayout: DefinedResourceLayout<\r\n Resources,\r\n InProps,\r\n IncludeProps,\r\n CustomProps,\r\n Composables\r\n > = (layoutOptions) => {\r\n const {\r\n name,\r\n props: instancePropDefinitions,\r\n ...layoutOptionProps\r\n } = layoutOptions;\r\n const createComposableLayout =\r\n makeComposable<\r\n LayoutRenderProps<Resources, InProps, IncludeProps, CustomProps>\r\n >();\r\n const nameProp = createProp.string().literal(name);\r\n const rawResolvedOptions =\r\n typeof inProps === 'function'\r\n ? inProps({\r\n resource: resourcesEnum,\r\n name: nameProp,\r\n })\r\n : inProps;\r\n const { resolvedInProps, splitInProps } = splitLayoutInProps({\r\n ...(rawResolvedOptions as Record<string, unknown>),\r\n ...(instancePropDefinitions as Record<string, unknown> | undefined),\r\n ...layoutOptionProps,\r\n });\r\n const { composables, render, props: layoutProps } = layout;\r\n const customLayoutProps = layoutProps?.custom;\r\n const includeLayoutProps = layoutProps?.include;\r\n const resolvedIncludedProps = pick(\r\n resolvedInProps,\r\n Object.keys(includeLayoutProps ?? {}),\r\n );\r\n const resolvedLayoutProps = {\r\n ...resolvedIncludedProps,\r\n ...customLayoutProps,\r\n };\r\n const layoutContext: ComposableNameContext<\r\n LayoutResourceKey<Resources>,\r\n typeof name\r\n > = {\r\n resource: layoutOptions.resource,\r\n name,\r\n };\r\n const resolvedComposables = composables\r\n ? resolveLayoutComposables(composables, layoutContext)\r\n : undefined;\r\n const mergedRenderContext = {\r\n composables: resolvedComposables as LayoutRenderComposables<Composables>,\r\n resource: layoutContext.resource,\r\n name: layoutContext.name,\r\n inProps: splitInProps,\r\n } as LayoutRenderContext<Resources, Composables>;\r\n\r\n function Component(props: Show<ResolveProps<CustomProps>>) {\n const validatedProps = validateProps(resolvedLayoutProps, props);\n const includedPropKeys = Object.keys(includeLayoutProps ?? {});\n const includedPropDefinitions = pick(\n resolvedInProps,\n includedPropKeys,\n ) as Record<string, unknown>;\n const includedPropValues = {\n ...resolvePropDefinitionValues(\n includedPropDefinitions,\n ),\n ...pick(\n splitInProps,\n includedPropKeys as (keyof typeof splitInProps)[],\n ),\n ...pick(\n layoutOptionProps,\n includedPropKeys as (keyof typeof layoutOptionProps)[],\n ),\n };\n const validatedIncludedProps = validateProps(\n includedPropDefinitions as Record<string, AnyBuiltPropDefinition>,\n includedPropValues,\n );\n const layoutRenderProps = {\n ...validatedProps,\n ...validatedIncludedProps,\n } as unknown as LayoutRenderProps<\n Resources,\n InProps,\n IncludeProps,\r\n CustomProps\r\n >;\r\n\r\n return <>{render(layoutRenderProps, mergedRenderContext)}</>;\r\n }\r\n\r\n function createComposition<LayoutName extends string>(\r\n compositionOptions: MakeComposableOptions<Composables, LayoutName>,\r\n ) {\r\n if (!compositionOptions.components) {\r\n return {} as ResourceLayoutComposition<LayoutName, Composables>;\r\n }\r\n\r\n return {\r\n makeComposable: createComposableLayout(compositionOptions),\r\n };\r\n }\r\n\r\n return Object.assign(Component, {\r\n displayName: name,\r\n props: undefined as unknown as ResolveProps<CustomProps>,\r\n ...createComposition({\r\n components: resolvedComposables as Composables | undefined,\r\n name,\r\n }),\r\n });\r\n };\r\n\r\n return definedResourceLayout;\r\n}\r\n"],"mappings":";;;;;;;AAsEA,SAAS,sBACP,OACiC;CACjC,OAAO,OAAO,UAAU,cAAc,UAAU,QAAQ,gBAAgB;AAC1E;AAEA,SAAS,8BACP,OACsC;CACtC,OACE,UAAU,QACV,OAAO,UAAU,YACjB,YAAY,SACX,MAA+B,WAAW;AAE/C;AAEA,SAAS,mBAAmB,SAAkC;CAC5D,MAAM,kBAA0D,CAAC;CACjE,MAAM,eAAwC,CAAC;CAE/C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAAG;EAClD,IAAI,sBAAsB,KAAK,GAAG;GAChC,gBAAgB,OAAO;GACvB;EACF;EAEA,IAAI,8BAA8B,KAAK,GAAG;GACxC,aAAa,OAAO,MAAM;GAE1B,IAAI,MAAM,SAAS,OAAO,MAAM,UAAU,UACxC,OAAO,OAAO,iBAAiB,MAAM,KAAK;EAE9C;CACF;CAEA,OAAO;EACL;EACA;CACF;AACF;AAsFA,SAAgB,qBAOd,SAOA;CACA,MAAM,EAAE,SAAS,SAAS,WAAW,WAAW;CAChD,MAAM,sBAAsBA,oCAAmB,SAAS;CACxD,MAAM,gBAAgBC,gDAA2B,QAAQ,EAAE,KACzDC,gCAAe,mBAAmB,CACpC;CACA,MAAM,yBAMD,kBAAkB;EACrB,MAAM,EACJ,MACA,OAAO,yBACP,GAAG,sBACD;EACJ,MAAM,yBACJC,kCAEE;EACJ,MAAM,WAAWC,gCAAW,OAAO,EAAE,QAAQ,IAAI;EAQjD,MAAM,EAAE,iBAAiB,iBAAiB,mBAAmB;GAC3D,GAPA,OAAO,YAAY,aACf,QAAQ;IACN,UAAU;IACV,MAAM;GACR,CAAC,IACD;GAGJ,GAAI;GACJ,GAAG;EACL,CAAC;EACD,MAAM,EAAE,aAAa,QAAQ,OAAO,gBAAgB;EACpD,MAAM,oBAAoB,aAAa;EACvC,MAAM,qBAAqB,aAAa;EAKxC,MAAM,sBAAsB;GAC1B,GAL4BC,mBAC5B,iBACA,OAAO,KAAK,sBAAsB,CAAC,CAAC,CAGb;GACvB,GAAG;EACL;EACA,MAAM,gBAGF;GACF,UAAU,cAAc;GACxB;EACF;EACA,MAAM,sBAAsB,cACxBC,4CAAyB,aAAa,aAAa,IACnD;EACJ,MAAM,sBAAsB;GAC1B,aAAa;GACb,UAAU,cAAc;GACxB,MAAM,cAAc;GACpB,SAAS;EACX;EAEA,SAAS,UAAU,OAAwC;GACzD,MAAM,iBAAiBC,mCAAc,qBAAqB,KAAK;GAC/D,MAAM,mBAAmB,OAAO,KAAK,sBAAsB,CAAC,CAAC;GAC7D,MAAM,0BAA0BF,mBAC9B,iBACA,gBACF;GAcA,MAAM,yBAAyBE,mCAC7B,yBACA;IAdA,GAAGC,0CACD,uBACF;IACA,GAAGH,mBACD,cACA,gBACF;IACA,GAAGA,mBACD,mBACA,gBACF;GAIiB,CACnB;GAWA,OAAO,mFAAG,OAAO;IATf,GAAG;IACH,GAAG;GAQ4B,GAAG,mBAAmB,EAAI;EAC7D;EAEA,SAAS,kBACP,oBACA;GACA,IAAI,CAAC,mBAAmB,YACtB,OAAO,CAAC;GAGV,OAAO,EACL,gBAAgB,uBAAuB,kBAAkB,EAC3D;EACF;EAEA,OAAO,OAAO,OAAO,WAAW;GAC9B,aAAa;GACb,OAAO;GACP,GAAG,kBAAkB;IACnB,YAAY;IACZ;GACF,CAAC;EACH,CAAC;CACH;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"create-config.cjs","names":["normalizeResources","createPrimitivePropBuilder","toResourceEnum","makeComposable","createProp","pick","resolveLayoutComposables","validateProps","resolvePropDefinitionValues"],"sources":["../src/create-config.tsx"],"sourcesContent":["import type { JSX } from 'react';\nimport {\n type ComposableComponents,\n type ComposableNameContext,\n type CreateLayoutComposable,\n MakeComposable,\n makeComposable,\n MakeComposableOptions,\n resolveLayoutComposables,\n} from './composable';\nimport {\n type AnyBuiltPropDefinition,\n createPrimitivePropBuilder,\n createProp,\n type ResolveLayoutProps,\n type ResolveProps,\n validateProps,\n} from './validators';\nimport {\n IncludedProps,\n InferredInProps,\n InPropsDefinition,\n InPropsObject,\n LayoutRenderProps,\n} from './props';\nimport {\n normalizeResources,\n toResourceEnum,\n type LayoutResourceKey,\n type NormalizeResources,\n type ResourceDefinition,\n} from './resource';\nimport {\n BaseComponent,\n pick,\n resolvePropDefinitionValues,\n Show,\n} from './utils';\nimport { capitalize } from './utils/capitalize';\n\ntype LayoutProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Options extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {},\n CustomProps extends InPropsObject = {},\n> = {\n /**\n * Props to include in the layout.\n */\n include?: IncludeProps;\n /**\n * Custom props that the layout will receive.\n */\n custom?: CustomProps;\n};\n\ntype LayoutRenderContext<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Composables extends ComposableComponents,\n> = {\n composables: LayoutRenderComposables<Composables>;\n inProps: Record<string, unknown>;\n resource: LayoutResourceKey<Resources>;\n name: string;\n};\ntype LayoutRenderComposables<Composables extends ComposableComponents> = [\n keyof Composables,\n] extends [never]\n ? undefined\n : Composables;\n\ntype SplitLayoutInPropDefinition<\n Props extends InPropsObject = {},\n Content = unknown,\n> = {\n props?: Props;\n render: ((props: ResolveProps<Props>) => Content) | Content;\n};\n\nfunction isBuiltPropDefinition(\n value: unknown,\n): value is AnyBuiltPropDefinition {\n return typeof value === 'function' && value !== null && 'visibility' in value;\n}\n\nfunction isSplitLayoutInPropDefinition(\n value: unknown,\n): value is SplitLayoutInPropDefinition {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'render' in value &&\n (value as { render?: unknown }).render !== undefined\n );\n}\n\nfunction splitLayoutInProps(inProps: Record<string, unknown>) {\n const resolvedInProps: Record<string, AnyBuiltPropDefinition> = {};\n const splitInProps: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(inProps)) {\n if (isBuiltPropDefinition(value)) {\n resolvedInProps[key] = value;\n continue;\n }\n\n if (isSplitLayoutInPropDefinition(value)) {\n splitInProps[key] = value.render;\n\n if (value.props && typeof value.props === 'object') {\n Object.assign(resolvedInProps, value.props);\n }\n }\n }\n\n return {\n resolvedInProps,\n splitInProps,\n };\n}\n\ntype CreateViewMapOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Options extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {},\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n> = {\n /**\n * An array of valid resource names to support.\n */\n resources: Resources;\n /**\n * The options that are passed into the created resource layout.\n */\n options: Options;\n layout: {\n /**\n * The props to pass to the layout.\n */\n props?: LayoutProps<Resources, Options, IncludeProps, CustomProps>;\n /**\n * Components used to compose the layout. Invoked per layout instance with\n * a scoped `create` that resolves composable `name` callbacks using the\n * layout's `resource` and `name`.\n */\n composables?: (\n create: CreateLayoutComposable<LayoutResourceKey<Resources>>,\n ) => Composables;\n /**\n * The render function for the layout.\n */\n render: (\n props: LayoutRenderProps<Resources, Options, IncludeProps, CustomProps>,\n context: LayoutRenderContext<Resources, Composables>,\n ) => JSX.Element;\n };\n};\n\ntype ResourceLayoutComposition<\n Name extends string,\n Composables extends ComposableComponents,\n> = [keyof Composables] extends [never]\n ? {}\n : {\n makeComposable: MakeComposable<Composables, Name>;\n };\ntype ResourceLayoutComponent<\n Name extends string,\n Props extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n> = ResourceLayoutComposition<Name, Composables> &\n BaseComponent<Name, ResolveProps<Props>> & {\n (props: Show<ResolveProps<Props>>): JSX.Element;\n };\n\ntype DefinedResourceLayoutOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = ResolveLayoutProps<InferredInProps<Resources, InProps>> & {\n name: Name;\n resource: Resource;\n props?: Props;\n};\ntype DefinedResourceLayout<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {},\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n> = <\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n>(\n options: DefinedResourceLayoutOptions<\n Resources,\n InProps,\n Name,\n Resource,\n Props\n >,\n) => ResourceLayoutComponent<Name, CustomProps, Composables>;\n\nexport function defineResourceLayout<\n const Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {},\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n>(\n options: CreateViewMapOptions<\n Resources,\n InProps,\n IncludeProps,\n CustomProps,\n Composables\n >,\n) {\n const { options: inProps, resources, layout } = options;\n const normalizedResources = normalizeResources(resources);\n const resourcesEnum = createPrimitivePropBuilder('string').enum(\n toResourceEnum(normalizedResources),\n );\n const definedResourceLayout: DefinedResourceLayout<\n Resources,\n InProps,\n IncludeProps,\n CustomProps,\n Composables\n > = (layoutOptions) => {\n const {\n name,\n props: instancePropDefinitions,\n ...layoutOptionProps\n } = layoutOptions;\n const createComposableLayout =\n makeComposable<\n LayoutRenderProps<Resources, InProps, IncludeProps, CustomProps>\n >();\n const nameProp = createProp.string().literal(name);\n const rawResolvedOptions =\n typeof inProps === 'function'\n ? inProps({\n resource: resourcesEnum,\n name: nameProp,\n })\n : inProps;\n const { resolvedInProps, splitInProps } = splitLayoutInProps({\n ...(rawResolvedOptions as Record<string, unknown>),\n ...(instancePropDefinitions as Record<string, unknown> | undefined),\n ...layoutOptionProps,\n });\n const { composables, render, props: layoutProps } = layout;\n const customLayoutProps = layoutProps?.custom;\n const includeLayoutProps = layoutProps?.include;\n const resolvedIncludedProps = pick(\n resolvedInProps,\n Object.keys(includeLayoutProps ?? {}),\n );\n const resolvedLayoutProps = {\n ...resolvedIncludedProps,\n ...customLayoutProps,\n };\n const layoutContext: ComposableNameContext<\n LayoutResourceKey<Resources>,\n typeof name\n > = {\n resource: layoutOptions.resource,\n name,\n capitalize,\n };\n const resolvedComposables = composables\n ? resolveLayoutComposables(composables, layoutContext)\n : undefined;\n const mergedRenderContext = {\n composables: resolvedComposables as LayoutRenderComposables<Composables>,\n resource: layoutContext.resource,\n name: layoutContext.name,\n inProps: splitInProps,\n } as LayoutRenderContext<Resources, Composables>;\n\n function Component(props: Show<ResolveProps<CustomProps>>) {\n const validatedProps = validateProps(resolvedLayoutProps, props);\n const includedPropKeys = Object.keys(includeLayoutProps ?? {});\n const includedPropDefinitions = pick(\n resolvedInProps,\n includedPropKeys,\n ) as Record<string, unknown>;\n const includedPropValues = {\n ...resolvePropDefinitionValues(includedPropDefinitions),\n ...pick(\n splitInProps,\n includedPropKeys as (keyof typeof splitInProps)[],\n ),\n ...pick(\n layoutOptionProps,\n includedPropKeys as (keyof typeof layoutOptionProps)[],\n ),\n };\n const validatedIncludedProps = validateProps(\n includedPropDefinitions as Record<string, AnyBuiltPropDefinition>,\n includedPropValues,\n );\n const layoutRenderProps = {\n ...validatedProps,\n ...validatedIncludedProps,\n } as unknown as LayoutRenderProps<\n Resources,\n InProps,\n IncludeProps,\n CustomProps\n >;\n\n return <>{render(layoutRenderProps, mergedRenderContext)}</>;\n }\n\n function createComposition<LayoutName extends string>(\n compositionOptions: MakeComposableOptions<Composables, LayoutName>,\n ) {\n if (!compositionOptions.components) {\n return {} as ResourceLayoutComposition<LayoutName, Composables>;\n }\n\n return {\n makeComposable: createComposableLayout(compositionOptions),\n };\n }\n\n return Object.assign(Component, {\n displayName: name,\n props: undefined as unknown as ResolveProps<CustomProps>,\n ...createComposition({\n components: resolvedComposables as Composables | undefined,\n name,\n }),\n });\n };\n\n return definedResourceLayout;\n}\n"],"mappings":";;;;;;;;;AA+EA,SAAS,sBACP,OACiC;CACjC,OAAO,OAAO,UAAU,cAAc,UAAU,QAAQ,gBAAgB;AAC1E;AAEA,SAAS,8BACP,OACsC;CACtC,OACE,UAAU,QACV,OAAO,UAAU,YACjB,YAAY,SACX,MAA+B,WAAW;AAE/C;AAEA,SAAS,mBAAmB,SAAkC;CAC5D,MAAM,kBAA0D,CAAC;CACjE,MAAM,eAAwC,CAAC;CAE/C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAAG;EAClD,IAAI,sBAAsB,KAAK,GAAG;GAChC,gBAAgB,OAAO;GACvB;EACF;EAEA,IAAI,8BAA8B,KAAK,GAAG;GACxC,aAAa,OAAO,MAAM;GAE1B,IAAI,MAAM,SAAS,OAAO,MAAM,UAAU,UACxC,OAAO,OAAO,iBAAiB,MAAM,KAAK;EAE9C;CACF;CAEA,OAAO;EACL;EACA;CACF;AACF;AAwFA,SAAgB,qBAOd,SAOA;CACA,MAAM,EAAE,SAAS,SAAS,WAAW,WAAW;CAChD,MAAM,sBAAsBA,oCAAmB,SAAS;CACxD,MAAM,gBAAgBC,4CAA2B,QAAQ,EAAE,KACzDC,gCAAe,mBAAmB,CACpC;CACA,MAAM,yBAMD,kBAAkB;EACrB,MAAM,EACJ,MACA,OAAO,yBACP,GAAG,sBACD;EACJ,MAAM,yBACJC,kCAEE;EACJ,MAAM,WAAWC,4BAAW,OAAO,EAAE,QAAQ,IAAI;EAQjD,MAAM,EAAE,iBAAiB,iBAAiB,mBAAmB;GAC3D,GAPA,OAAO,YAAY,aACf,QAAQ;IACN,UAAU;IACV,MAAM;GACR,CAAC,IACD;GAGJ,GAAI;GACJ,GAAG;EACL,CAAC;EACD,MAAM,EAAE,aAAa,QAAQ,OAAO,gBAAgB;EACpD,MAAM,oBAAoB,aAAa;EACvC,MAAM,qBAAqB,aAAa;EAKxC,MAAM,sBAAsB;GAC1B,GAL4BC,mBAC5B,iBACA,OAAO,KAAK,sBAAsB,CAAC,CAAC,CAGb;GACvB,GAAG;EACL;EACA,MAAM,gBAGF;GACF,UAAU,cAAc;GACxB;GACA;EACF;EACA,MAAM,sBAAsB,cACxBC,4CAAyB,aAAa,aAAa,IACnD;EACJ,MAAM,sBAAsB;GAC1B,aAAa;GACb,UAAU,cAAc;GACxB,MAAM,cAAc;GACpB,SAAS;EACX;EAEA,SAAS,UAAU,OAAwC;GACzD,MAAM,iBAAiBC,qCAAc,qBAAqB,KAAK;GAC/D,MAAM,mBAAmB,OAAO,KAAK,sBAAsB,CAAC,CAAC;GAC7D,MAAM,0BAA0BF,mBAC9B,iBACA,gBACF;GAYA,MAAM,yBAAyBE,qCAC7B,yBACA;IAZA,GAAGC,0CAA4B,uBAAuB;IACtD,GAAGH,mBACD,cACA,gBACF;IACA,GAAGA,mBACD,mBACA,gBACF;GAIiB,CACnB;GAWA,OAAO,mFAAG,OAAO;IATf,GAAG;IACH,GAAG;GAQ4B,GAAG,mBAAmB,EAAI;EAC7D;EAEA,SAAS,kBACP,oBACA;GACA,IAAI,CAAC,mBAAmB,YACtB,OAAO,CAAC;GAGV,OAAO,EACL,gBAAgB,uBAAuB,kBAAkB,EAC3D;EACF;EAEA,OAAO,OAAO,OAAO,WAAW;GAC9B,aAAa;GACb,OAAO;GACP,GAAG,kBAAkB;IACnB,YAAY;IACZ;GACF,CAAC;EACH,CAAC;CACH;CAEA,OAAO;AACT"}
@@ -1,4 +1,4 @@
1
- import { ResolveLayoutProps, ResolveProps } from "./create-value.cjs";
1
+ import { ResolveLayoutProps, ResolveProps } from "./validators/types.cjs";
2
2
  import { BaseComponent, Show } from "./utils.cjs";
3
3
  import { LayoutResourceKey, ResourceDefinition } from "./resource.cjs";
4
4
  import { InPropsDefinition, InPropsObject, IncludedProps, InferredInProps, LayoutRenderProps } from "./props.cjs";
@@ -1 +1 @@
1
- {"version":3,"file":"create-config.d.cts","names":[],"sources":["../src/create-config.tsx"],"mappings":";;;;;;;;KAkCK,WAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA;;AAN2D;;EAW/E,OAAA,GAAU,YAAA;EARsB;;;EAYhC,MAAA,GAAS,WAAA;AAAA;AAAA,KAGN,mBAAA,mBACe,aAAA,CAAc,kBAAA,uBACZ,oBAAA;EAEpB,WAAA,EAAa,uBAAA,CAAwB,WAAA;EACrC,OAAA,EAAS,MAAA;EACT,QAAA,EAAU,iBAAA,CAAkB,SAAA;EAC5B,IAAA;AAAA;AAAA,KAEG,uBAAA,qBAA4C,oBAAA,WACxC,WAAA,gCAA2C,WAAA;AAAA,KAoD/C,oBAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,2BACA,oBAAA;EAlFY;;;EAuFhC,SAAA,EAAW,SAAA;EArFX;;;EAyFA,OAAA,EAAS,OAAA;EACT,MAAA;IAzFA;;;IA6FE,KAAA,GAAQ,WAAA,CAAY,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,WAAA;IApFxD;;;AAAoB;AAAA;IA0FlB,WAAA,IAAe,MAAA,EAAQ,sBAAA,CAAuB,iBAAA,CAAkB,SAAA,OAAgB,WAAA;IAvF5D;;;IA2FpB,MAAA,GACE,KAAA,EAAO,iBAAA,CAAkB,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,WAAA,GAC3D,OAAA,EAAS,mBAAA,CAAoB,SAAA,EAAW,WAAA,MACrC,GAAA,CAAI,OAAA;EAAA;AAAA;AAAA,KAIR,yBAAA,0CAEiB,oBAAA,WACX,WAAA;EAGL,cAAA,EAAgB,cAAA,CAAe,WAAA,EAAa,IAAA;AAAA;AAAA,KAE7C,uBAAA,oCAEW,aAAA,2BACM,oBAAA,SAClB,yBAAA,CAA0B,IAAA,EAAM,WAAA,IAClC,aAAA,CAAc,IAAA,EAAM,YAAA,CAAa,KAAA;EAAA,CAC9B,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,KAAA,KAAU,GAAA,CAAI,OAAA;AAAA;AAAA,KAGvC,4BAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,yCAEjB,iBAAA,CAAkB,SAAA,iBACrB,aAAA,SACZ,kBAAA,CAAmB,eAAA,CAAgB,SAAA,EAAW,OAAA;EAChD,IAAA,EAAM,IAAA;EACN,QAAA,EAAU,QAAA;EACV,KAAA,GAAQ,KAAA;AAAA;AAAA,KAEL,qBAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,2BACA,oBAAA,gDAGH,iBAAA,CAAkB,SAAA,iBACrB,aAAA,OAEd,OAAA,EAAS,4BAAA,CACP,SAAA,EACA,OAAA,EACA,IAAA,EACA,QAAA,EACA,KAAA,MAEC,uBAAA,CAAwB,IAAA,EAAM,WAAA,EAAa,WAAA;AAAA,iBAEhC,oBAAA,yBACU,aAAA,CAAc,kBAAA,mBACtB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,2BACA,oBAAA,OAEpB,OAAA,EAAS,oBAAA,CACP,SAAA,EACA,OAAA,EACA,YAAA,EACA,WAAA,EACA,WAAA,IACD,qBAAA,CAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,WAAA"}
1
+ {"version":3,"file":"create-config.d.cts","names":[],"sources":["../src/create-config.tsx"],"mappings":";;;;;;;;KAwCK,WAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA;;;AAPL;EAYf,OAAA,GAAU,YAAA;EATI;;;EAad,MAAA,GAAS,WAAA;AAAA;AAAA,KAGN,mBAAA,mBACe,aAAA,CAAc,kBAAA,uBACZ,oBAAA;EAEpB,WAAA,EAAa,uBAAA,CAAwB,WAAA;EACrC,OAAA,EAAS,MAAA;EACT,QAAA,EAAU,iBAAA,CAAkB,SAAA;EAC5B,IAAA;AAAA;AAAA,KAEG,uBAAA,qBAA4C,oBAAA,WACzC,WAAA,gCAGJ,WAAA;AAAA,KAoDC,oBAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,2BACA,oBAAA;EArFF;;;EA0FlB,SAAA,EAAW,SAAA;EAzFuB;;;EA6FlC,OAAA,EAAS,OAAA;EACT,MAAA;IA7F8D;;;IAiG5D,KAAA,GAAQ,WAAA,CAAY,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,WAAA;IA3F9C;;;;AAIU;IA6FlB,WAAA,IACE,MAAA,EAAQ,sBAAA,CAAuB,iBAAA,CAAkB,SAAA,OAC9C,WAAA;IA5Fe;;;IAgGpB,MAAA,GACE,KAAA,EAAO,iBAAA,CAAkB,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,WAAA,GAC3D,OAAA,EAAS,mBAAA,CAAoB,SAAA,EAAW,WAAA,MACrC,GAAA,CAAI,OAAA;EAAA;AAAA;AAAA,KAIR,yBAAA,0CAEiB,oBAAA,WACX,WAAA;EAGL,cAAA,EAAgB,cAAA,CAAe,WAAA,EAAa,IAAA;AAAA;AAAA,KAE7C,uBAAA,oCAEW,aAAA,2BACM,oBAAA,SAClB,yBAAA,CAA0B,IAAA,EAAM,WAAA,IAClC,aAAA,CAAc,IAAA,EAAM,YAAA,CAAa,KAAA;EAAA,CAC9B,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,KAAA,KAAU,GAAA,CAAI,OAAA;AAAA;AAAA,KAGvC,4BAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,yCAEjB,iBAAA,CAAkB,SAAA,iBACrB,aAAA,SACZ,kBAAA,CAAmB,eAAA,CAAgB,SAAA,EAAW,OAAA;EAChD,IAAA,EAAM,IAAA;EACN,QAAA,EAAU,QAAA;EACV,KAAA,GAAQ,KAAA;AAAA;AAAA,KAEL,qBAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,2BACA,oBAAA,gDAGH,iBAAA,CAAkB,SAAA,iBACrB,aAAA,OAEd,OAAA,EAAS,4BAAA,CACP,SAAA,EACA,OAAA,EACA,IAAA,EACA,QAAA,EACA,KAAA,MAEC,uBAAA,CAAwB,IAAA,EAAM,WAAA,EAAa,WAAA;AAAA,iBAEhC,oBAAA,yBACU,aAAA,CAAc,kBAAA,mBACtB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,2BACA,oBAAA,OAEpB,OAAA,EAAS,oBAAA,CACP,SAAA,EACA,OAAA,EACA,YAAA,EACA,WAAA,EACA,WAAA,IACD,qBAAA,CAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,WAAA"}
@@ -1,4 +1,4 @@
1
- import { ResolveLayoutProps, ResolveProps } from "./create-value.mjs";
1
+ import { ResolveLayoutProps, ResolveProps } from "./validators/types.mjs";
2
2
  import { BaseComponent, Show } from "./utils.mjs";
3
3
  import { LayoutResourceKey, ResourceDefinition } from "./resource.mjs";
4
4
  import { InPropsDefinition, InPropsObject, IncludedProps, InferredInProps, LayoutRenderProps } from "./props.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"create-config.d.mts","names":[],"sources":["../src/create-config.tsx"],"mappings":";;;;;;;;KAkCK,WAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA;;AAN2D;;EAW/E,OAAA,GAAU,YAAA;EARsB;;;EAYhC,MAAA,GAAS,WAAA;AAAA;AAAA,KAGN,mBAAA,mBACe,aAAA,CAAc,kBAAA,uBACZ,oBAAA;EAEpB,WAAA,EAAa,uBAAA,CAAwB,WAAA;EACrC,OAAA,EAAS,MAAA;EACT,QAAA,EAAU,iBAAA,CAAkB,SAAA;EAC5B,IAAA;AAAA;AAAA,KAEG,uBAAA,qBAA4C,oBAAA,WACxC,WAAA,gCAA2C,WAAA;AAAA,KAoD/C,oBAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,2BACA,oBAAA;EAlFY;;;EAuFhC,SAAA,EAAW,SAAA;EArFX;;;EAyFA,OAAA,EAAS,OAAA;EACT,MAAA;IAzFA;;;IA6FE,KAAA,GAAQ,WAAA,CAAY,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,WAAA;IApFxD;;;AAAoB;AAAA;IA0FlB,WAAA,IAAe,MAAA,EAAQ,sBAAA,CAAuB,iBAAA,CAAkB,SAAA,OAAgB,WAAA;IAvF5D;;;IA2FpB,MAAA,GACE,KAAA,EAAO,iBAAA,CAAkB,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,WAAA,GAC3D,OAAA,EAAS,mBAAA,CAAoB,SAAA,EAAW,WAAA,MACrC,GAAA,CAAI,OAAA;EAAA;AAAA;AAAA,KAIR,yBAAA,0CAEiB,oBAAA,WACX,WAAA;EAGL,cAAA,EAAgB,cAAA,CAAe,WAAA,EAAa,IAAA;AAAA;AAAA,KAE7C,uBAAA,oCAEW,aAAA,2BACM,oBAAA,SAClB,yBAAA,CAA0B,IAAA,EAAM,WAAA,IAClC,aAAA,CAAc,IAAA,EAAM,YAAA,CAAa,KAAA;EAAA,CAC9B,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,KAAA,KAAU,GAAA,CAAI,OAAA;AAAA;AAAA,KAGvC,4BAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,yCAEjB,iBAAA,CAAkB,SAAA,iBACrB,aAAA,SACZ,kBAAA,CAAmB,eAAA,CAAgB,SAAA,EAAW,OAAA;EAChD,IAAA,EAAM,IAAA;EACN,QAAA,EAAU,QAAA;EACV,KAAA,GAAQ,KAAA;AAAA;AAAA,KAEL,qBAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,2BACA,oBAAA,gDAGH,iBAAA,CAAkB,SAAA,iBACrB,aAAA,OAEd,OAAA,EAAS,4BAAA,CACP,SAAA,EACA,OAAA,EACA,IAAA,EACA,QAAA,EACA,KAAA,MAEC,uBAAA,CAAwB,IAAA,EAAM,WAAA,EAAa,WAAA;AAAA,iBAEhC,oBAAA,yBACU,aAAA,CAAc,kBAAA,mBACtB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,2BACA,oBAAA,OAEpB,OAAA,EAAS,oBAAA,CACP,SAAA,EACA,OAAA,EACA,YAAA,EACA,WAAA,EACA,WAAA,IACD,qBAAA,CAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,WAAA"}
1
+ {"version":3,"file":"create-config.d.mts","names":[],"sources":["../src/create-config.tsx"],"mappings":";;;;;;;;KAwCK,WAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA;;;AAPL;EAYf,OAAA,GAAU,YAAA;EATI;;;EAad,MAAA,GAAS,WAAA;AAAA;AAAA,KAGN,mBAAA,mBACe,aAAA,CAAc,kBAAA,uBACZ,oBAAA;EAEpB,WAAA,EAAa,uBAAA,CAAwB,WAAA;EACrC,OAAA,EAAS,MAAA;EACT,QAAA,EAAU,iBAAA,CAAkB,SAAA;EAC5B,IAAA;AAAA;AAAA,KAEG,uBAAA,qBAA4C,oBAAA,WACzC,WAAA,gCAGJ,WAAA;AAAA,KAoDC,oBAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,2BACA,oBAAA;EArFF;;;EA0FlB,SAAA,EAAW,SAAA;EAzFuB;;;EA6FlC,OAAA,EAAS,OAAA;EACT,MAAA;IA7F8D;;;IAiG5D,KAAA,GAAQ,WAAA,CAAY,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,WAAA;IA3F9C;;;;AAIU;IA6FlB,WAAA,IACE,MAAA,EAAQ,sBAAA,CAAuB,iBAAA,CAAkB,SAAA,OAC9C,WAAA;IA5Fe;;;IAgGpB,MAAA,GACE,KAAA,EAAO,iBAAA,CAAkB,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,WAAA,GAC3D,OAAA,EAAS,mBAAA,CAAoB,SAAA,EAAW,WAAA,MACrC,GAAA,CAAI,OAAA;EAAA;AAAA;AAAA,KAIR,yBAAA,0CAEiB,oBAAA,WACX,WAAA;EAGL,cAAA,EAAgB,cAAA,CAAe,WAAA,EAAa,IAAA;AAAA;AAAA,KAE7C,uBAAA,oCAEW,aAAA,2BACM,oBAAA,SAClB,yBAAA,CAA0B,IAAA,EAAM,WAAA,IAClC,aAAA,CAAc,IAAA,EAAM,YAAA,CAAa,KAAA;EAAA,CAC9B,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,KAAA,KAAU,GAAA,CAAI,OAAA;AAAA;AAAA,KAGvC,4BAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,yCAEjB,iBAAA,CAAkB,SAAA,iBACrB,aAAA,SACZ,kBAAA,CAAmB,eAAA,CAAgB,SAAA,EAAW,OAAA;EAChD,IAAA,EAAM,IAAA;EACN,QAAA,EAAU,QAAA;EACV,KAAA,GAAQ,KAAA;AAAA;AAAA,KAEL,qBAAA,mBACe,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,2BACA,oBAAA,gDAGH,iBAAA,CAAkB,SAAA,iBACrB,aAAA,OAEd,OAAA,EAAS,4BAAA,CACP,SAAA,EACA,OAAA,EACA,IAAA,EACA,QAAA,EACA,KAAA,MAEC,uBAAA,CAAwB,IAAA,EAAM,WAAA,EAAa,WAAA;AAAA,iBAEhC,oBAAA,yBACU,aAAA,CAAc,kBAAA,mBACtB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,2BACA,oBAAA,OAEpB,OAAA,EAAS,oBAAA,CACP,SAAA,EACA,OAAA,EACA,YAAA,EACA,WAAA,EACA,WAAA,IACD,qBAAA,CAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,WAAA"}
@@ -1,7 +1,9 @@
1
1
  import { pick, resolvePropDefinitionValues } from "./utils.mjs";
2
2
  import { makeComposable, resolveLayoutComposables } from "./composable.mjs";
3
- import { createPrimitivePropBuilder, createProp, validateProps } from "./create-value.mjs";
3
+ import { createPrimitivePropBuilder, createProp } from "./validators/builders.mjs";
4
+ import { validateProps } from "./validators/validate-props.mjs";
4
5
  import { normalizeResources, toResourceEnum } from "./resource.mjs";
6
+ import { capitalize } from "./utils/capitalize.mjs";
5
7
  import { Fragment, jsx } from "react/jsx-runtime";
6
8
 
7
9
  //#region src/create-config.tsx
@@ -54,7 +56,8 @@ function defineResourceLayout(options) {
54
56
  };
55
57
  const layoutContext = {
56
58
  resource: layoutOptions.resource,
57
- name
59
+ name,
60
+ capitalize
58
61
  };
59
62
  const resolvedComposables = composables ? resolveLayoutComposables(composables, layoutContext) : void 0;
60
63
  const mergedRenderContext = {
@@ -1 +1 @@
1
- {"version":3,"file":"create-config.mjs","names":[],"sources":["../src/create-config.tsx"],"sourcesContent":["import type { JSX } from 'react';\r\nimport {\r\n type ComposableComponents,\r\n type ComposableNameContext,\r\n type CreateLayoutComposable,\r\n MakeComposable,\r\n makeComposable,\r\n MakeComposableOptions,\r\n resolveLayoutComposables,\r\n} from './composable';\r\nimport {\r\n type AnyBuiltPropDefinition,\r\n createPrimitivePropBuilder,\r\n createProp,\r\n type ResolveLayoutProps,\r\n type ResolveProps,\r\n validateProps,\r\n} from './create-value';\r\nimport {\r\n IncludedProps,\r\n InferredInProps,\r\n InPropsDefinition,\r\n InPropsObject,\r\n LayoutRenderProps,\r\n} from './props';\r\nimport {\n normalizeResources,\n toResourceEnum,\n type LayoutResourceKey,\r\n type NormalizeResources,\r\n type ResourceDefinition,\n} from './resource';\nimport { BaseComponent, pick, resolvePropDefinitionValues, Show } from './utils';\n\r\ntype LayoutProps<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n Options extends InPropsDefinition<Resources>,\r\n IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {},\r\n CustomProps extends InPropsObject = {},\r\n> = {\r\n /**\r\n * Props to include in the layout.\r\n */\r\n include?: IncludeProps;\r\n /**\r\n * Custom props that the layout will receive.\r\n */\r\n custom?: CustomProps;\r\n};\r\n\r\ntype LayoutRenderContext<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n Composables extends ComposableComponents,\r\n> = {\r\n composables: LayoutRenderComposables<Composables>;\r\n inProps: Record<string, unknown>;\r\n resource: LayoutResourceKey<Resources>;\r\n name: string;\r\n};\r\ntype LayoutRenderComposables<Composables extends ComposableComponents> =\r\n [keyof Composables] extends [never] ? undefined : Composables;\r\n\r\ntype SplitLayoutInPropDefinition<\r\n Props extends InPropsObject = {},\r\n Content = unknown,\r\n> = {\r\n props?: Props;\r\n render: ((props: ResolveProps<Props>) => Content) | Content;\r\n};\r\n\r\nfunction isBuiltPropDefinition(\r\n value: unknown,\r\n): value is AnyBuiltPropDefinition {\r\n return typeof value === 'function' && value !== null && 'visibility' in value;\r\n}\r\n\r\nfunction isSplitLayoutInPropDefinition(\r\n value: unknown,\r\n): value is SplitLayoutInPropDefinition {\r\n return (\r\n value !== null &&\r\n typeof value === 'object' &&\r\n 'render' in value &&\r\n (value as { render?: unknown }).render !== undefined\r\n );\r\n}\r\n\r\nfunction splitLayoutInProps(inProps: Record<string, unknown>) {\r\n const resolvedInProps: Record<string, AnyBuiltPropDefinition> = {};\r\n const splitInProps: Record<string, unknown> = {};\r\n\r\n for (const [key, value] of Object.entries(inProps)) {\r\n if (isBuiltPropDefinition(value)) {\r\n resolvedInProps[key] = value;\r\n continue;\r\n }\r\n\r\n if (isSplitLayoutInPropDefinition(value)) {\r\n splitInProps[key] = value.render;\r\n\r\n if (value.props && typeof value.props === 'object') {\r\n Object.assign(resolvedInProps, value.props);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n resolvedInProps,\r\n splitInProps,\r\n };\r\n}\r\n\r\ntype CreateViewMapOptions<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n Options extends InPropsDefinition<Resources>,\r\n IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {},\r\n CustomProps extends InPropsObject = {},\r\n Composables extends ComposableComponents = {},\r\n> = {\r\n /**\r\n * An array of valid resource names to support.\r\n */\r\n resources: Resources;\r\n /**\r\n * The options that are passed into the created resource layout.\r\n */\r\n options: Options;\r\n layout: {\r\n /**\r\n * The props to pass to the layout.\r\n */\r\n props?: LayoutProps<Resources, Options, IncludeProps, CustomProps>;\r\n /**\r\n * Components used to compose the layout. Invoked per layout instance with\r\n * a scoped `create` that resolves composable `name` callbacks using the\r\n * layout's `resource` and `name`.\r\n */\r\n composables?: (create: CreateLayoutComposable<LayoutResourceKey<Resources>>) => Composables;\r\n /**\r\n * The render function for the layout.\r\n */\r\n render: (\r\n props: LayoutRenderProps<Resources, Options, IncludeProps, CustomProps>,\r\n context: LayoutRenderContext<Resources, Composables>,\r\n ) => JSX.Element;\r\n };\r\n};\r\n\r\ntype ResourceLayoutComposition<\r\n Name extends string,\r\n Composables extends ComposableComponents,\r\n> = [keyof Composables] extends [never]\r\n ? {}\r\n : {\r\n makeComposable: MakeComposable<Composables, Name>;\r\n };\r\ntype ResourceLayoutComponent<\r\n Name extends string,\r\n Props extends InPropsObject = {},\r\n Composables extends ComposableComponents = {},\r\n> = ResourceLayoutComposition<Name, Composables> &\r\n BaseComponent<Name, ResolveProps<Props>> & {\r\n (props: Show<ResolveProps<Props>>): JSX.Element;\r\n };\r\n\r\ntype DefinedResourceLayoutOptions<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n InProps extends InPropsDefinition<Resources>,\r\n Name extends string,\r\n Resource extends LayoutResourceKey<Resources>,\r\n Props extends InPropsObject = {},\r\n> = ResolveLayoutProps<InferredInProps<Resources, InProps>> & {\r\n name: Name;\r\n resource: Resource;\r\n props?: Props;\r\n};\r\ntype DefinedResourceLayout<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n InProps extends InPropsDefinition<Resources>,\r\n IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {},\r\n CustomProps extends InPropsObject = {},\r\n Composables extends ComposableComponents = {},\r\n> = <\r\n Name extends string,\r\n Resource extends LayoutResourceKey<Resources>,\r\n Props extends InPropsObject = {},\r\n>(\r\n options: DefinedResourceLayoutOptions<\r\n Resources,\r\n InProps,\r\n Name,\r\n Resource,\r\n Props\r\n >,\r\n) => ResourceLayoutComponent<Name, CustomProps, Composables>;\r\n\r\nexport function defineResourceLayout<\r\n const Resources extends ReadonlyArray<ResourceDefinition>,\r\n InProps extends InPropsDefinition<Resources>,\r\n IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {},\r\n CustomProps extends InPropsObject = {},\r\n Composables extends ComposableComponents = {},\r\n>(\r\n options: CreateViewMapOptions<\r\n Resources,\r\n InProps,\r\n IncludeProps,\r\n CustomProps,\r\n Composables\r\n >,\r\n) {\r\n const { options: inProps, resources, layout } = options;\r\n const normalizedResources = normalizeResources(resources);\r\n const resourcesEnum = createPrimitivePropBuilder('string').enum(\r\n toResourceEnum(normalizedResources),\r\n );\r\n const definedResourceLayout: DefinedResourceLayout<\r\n Resources,\r\n InProps,\r\n IncludeProps,\r\n CustomProps,\r\n Composables\r\n > = (layoutOptions) => {\r\n const {\r\n name,\r\n props: instancePropDefinitions,\r\n ...layoutOptionProps\r\n } = layoutOptions;\r\n const createComposableLayout =\r\n makeComposable<\r\n LayoutRenderProps<Resources, InProps, IncludeProps, CustomProps>\r\n >();\r\n const nameProp = createProp.string().literal(name);\r\n const rawResolvedOptions =\r\n typeof inProps === 'function'\r\n ? inProps({\r\n resource: resourcesEnum,\r\n name: nameProp,\r\n })\r\n : inProps;\r\n const { resolvedInProps, splitInProps } = splitLayoutInProps({\r\n ...(rawResolvedOptions as Record<string, unknown>),\r\n ...(instancePropDefinitions as Record<string, unknown> | undefined),\r\n ...layoutOptionProps,\r\n });\r\n const { composables, render, props: layoutProps } = layout;\r\n const customLayoutProps = layoutProps?.custom;\r\n const includeLayoutProps = layoutProps?.include;\r\n const resolvedIncludedProps = pick(\r\n resolvedInProps,\r\n Object.keys(includeLayoutProps ?? {}),\r\n );\r\n const resolvedLayoutProps = {\r\n ...resolvedIncludedProps,\r\n ...customLayoutProps,\r\n };\r\n const layoutContext: ComposableNameContext<\r\n LayoutResourceKey<Resources>,\r\n typeof name\r\n > = {\r\n resource: layoutOptions.resource,\r\n name,\r\n };\r\n const resolvedComposables = composables\r\n ? resolveLayoutComposables(composables, layoutContext)\r\n : undefined;\r\n const mergedRenderContext = {\r\n composables: resolvedComposables as LayoutRenderComposables<Composables>,\r\n resource: layoutContext.resource,\r\n name: layoutContext.name,\r\n inProps: splitInProps,\r\n } as LayoutRenderContext<Resources, Composables>;\r\n\r\n function Component(props: Show<ResolveProps<CustomProps>>) {\n const validatedProps = validateProps(resolvedLayoutProps, props);\n const includedPropKeys = Object.keys(includeLayoutProps ?? {});\n const includedPropDefinitions = pick(\n resolvedInProps,\n includedPropKeys,\n ) as Record<string, unknown>;\n const includedPropValues = {\n ...resolvePropDefinitionValues(\n includedPropDefinitions,\n ),\n ...pick(\n splitInProps,\n includedPropKeys as (keyof typeof splitInProps)[],\n ),\n ...pick(\n layoutOptionProps,\n includedPropKeys as (keyof typeof layoutOptionProps)[],\n ),\n };\n const validatedIncludedProps = validateProps(\n includedPropDefinitions as Record<string, AnyBuiltPropDefinition>,\n includedPropValues,\n );\n const layoutRenderProps = {\n ...validatedProps,\n ...validatedIncludedProps,\n } as unknown as LayoutRenderProps<\n Resources,\n InProps,\n IncludeProps,\r\n CustomProps\r\n >;\r\n\r\n return <>{render(layoutRenderProps, mergedRenderContext)}</>;\r\n }\r\n\r\n function createComposition<LayoutName extends string>(\r\n compositionOptions: MakeComposableOptions<Composables, LayoutName>,\r\n ) {\r\n if (!compositionOptions.components) {\r\n return {} as ResourceLayoutComposition<LayoutName, Composables>;\r\n }\r\n\r\n return {\r\n makeComposable: createComposableLayout(compositionOptions),\r\n };\r\n }\r\n\r\n return Object.assign(Component, {\r\n displayName: name,\r\n props: undefined as unknown as ResolveProps<CustomProps>,\r\n ...createComposition({\r\n components: resolvedComposables as Composables | undefined,\r\n name,\r\n }),\r\n });\r\n };\r\n\r\n return definedResourceLayout;\r\n}\r\n"],"mappings":";;;;;;;AAsEA,SAAS,sBACP,OACiC;CACjC,OAAO,OAAO,UAAU,cAAc,UAAU,QAAQ,gBAAgB;AAC1E;AAEA,SAAS,8BACP,OACsC;CACtC,OACE,UAAU,QACV,OAAO,UAAU,YACjB,YAAY,SACX,MAA+B,WAAW;AAE/C;AAEA,SAAS,mBAAmB,SAAkC;CAC5D,MAAM,kBAA0D,CAAC;CACjE,MAAM,eAAwC,CAAC;CAE/C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAAG;EAClD,IAAI,sBAAsB,KAAK,GAAG;GAChC,gBAAgB,OAAO;GACvB;EACF;EAEA,IAAI,8BAA8B,KAAK,GAAG;GACxC,aAAa,OAAO,MAAM;GAE1B,IAAI,MAAM,SAAS,OAAO,MAAM,UAAU,UACxC,OAAO,OAAO,iBAAiB,MAAM,KAAK;EAE9C;CACF;CAEA,OAAO;EACL;EACA;CACF;AACF;AAsFA,SAAgB,qBAOd,SAOA;CACA,MAAM,EAAE,SAAS,SAAS,WAAW,WAAW;CAChD,MAAM,sBAAsB,mBAAmB,SAAS;CACxD,MAAM,gBAAgB,2BAA2B,QAAQ,EAAE,KACzD,eAAe,mBAAmB,CACpC;CACA,MAAM,yBAMD,kBAAkB;EACrB,MAAM,EACJ,MACA,OAAO,yBACP,GAAG,sBACD;EACJ,MAAM,yBACJ,eAEE;EACJ,MAAM,WAAW,WAAW,OAAO,EAAE,QAAQ,IAAI;EAQjD,MAAM,EAAE,iBAAiB,iBAAiB,mBAAmB;GAC3D,GAPA,OAAO,YAAY,aACf,QAAQ;IACN,UAAU;IACV,MAAM;GACR,CAAC,IACD;GAGJ,GAAI;GACJ,GAAG;EACL,CAAC;EACD,MAAM,EAAE,aAAa,QAAQ,OAAO,gBAAgB;EACpD,MAAM,oBAAoB,aAAa;EACvC,MAAM,qBAAqB,aAAa;EAKxC,MAAM,sBAAsB;GAC1B,GAL4B,KAC5B,iBACA,OAAO,KAAK,sBAAsB,CAAC,CAAC,CAGb;GACvB,GAAG;EACL;EACA,MAAM,gBAGF;GACF,UAAU,cAAc;GACxB;EACF;EACA,MAAM,sBAAsB,cACxB,yBAAyB,aAAa,aAAa,IACnD;EACJ,MAAM,sBAAsB;GAC1B,aAAa;GACb,UAAU,cAAc;GACxB,MAAM,cAAc;GACpB,SAAS;EACX;EAEA,SAAS,UAAU,OAAwC;GACzD,MAAM,iBAAiB,cAAc,qBAAqB,KAAK;GAC/D,MAAM,mBAAmB,OAAO,KAAK,sBAAsB,CAAC,CAAC;GAC7D,MAAM,0BAA0B,KAC9B,iBACA,gBACF;GAcA,MAAM,yBAAyB,cAC7B,yBACA;IAdA,GAAG,4BACD,uBACF;IACA,GAAG,KACD,cACA,gBACF;IACA,GAAG,KACD,mBACA,gBACF;GAIiB,CACnB;GAWA,OAAO,0CAAG,OAAO;IATf,GAAG;IACH,GAAG;GAQ4B,GAAG,mBAAmB,EAAI;EAC7D;EAEA,SAAS,kBACP,oBACA;GACA,IAAI,CAAC,mBAAmB,YACtB,OAAO,CAAC;GAGV,OAAO,EACL,gBAAgB,uBAAuB,kBAAkB,EAC3D;EACF;EAEA,OAAO,OAAO,OAAO,WAAW;GAC9B,aAAa;GACb,OAAO;GACP,GAAG,kBAAkB;IACnB,YAAY;IACZ;GACF,CAAC;EACH,CAAC;CACH;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"create-config.mjs","names":[],"sources":["../src/create-config.tsx"],"sourcesContent":["import type { JSX } from 'react';\nimport {\n type ComposableComponents,\n type ComposableNameContext,\n type CreateLayoutComposable,\n MakeComposable,\n makeComposable,\n MakeComposableOptions,\n resolveLayoutComposables,\n} from './composable';\nimport {\n type AnyBuiltPropDefinition,\n createPrimitivePropBuilder,\n createProp,\n type ResolveLayoutProps,\n type ResolveProps,\n validateProps,\n} from './validators';\nimport {\n IncludedProps,\n InferredInProps,\n InPropsDefinition,\n InPropsObject,\n LayoutRenderProps,\n} from './props';\nimport {\n normalizeResources,\n toResourceEnum,\n type LayoutResourceKey,\n type NormalizeResources,\n type ResourceDefinition,\n} from './resource';\nimport {\n BaseComponent,\n pick,\n resolvePropDefinitionValues,\n Show,\n} from './utils';\nimport { capitalize } from './utils/capitalize';\n\ntype LayoutProps<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Options extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {},\n CustomProps extends InPropsObject = {},\n> = {\n /**\n * Props to include in the layout.\n */\n include?: IncludeProps;\n /**\n * Custom props that the layout will receive.\n */\n custom?: CustomProps;\n};\n\ntype LayoutRenderContext<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Composables extends ComposableComponents,\n> = {\n composables: LayoutRenderComposables<Composables>;\n inProps: Record<string, unknown>;\n resource: LayoutResourceKey<Resources>;\n name: string;\n};\ntype LayoutRenderComposables<Composables extends ComposableComponents> = [\n keyof Composables,\n] extends [never]\n ? undefined\n : Composables;\n\ntype SplitLayoutInPropDefinition<\n Props extends InPropsObject = {},\n Content = unknown,\n> = {\n props?: Props;\n render: ((props: ResolveProps<Props>) => Content) | Content;\n};\n\nfunction isBuiltPropDefinition(\n value: unknown,\n): value is AnyBuiltPropDefinition {\n return typeof value === 'function' && value !== null && 'visibility' in value;\n}\n\nfunction isSplitLayoutInPropDefinition(\n value: unknown,\n): value is SplitLayoutInPropDefinition {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'render' in value &&\n (value as { render?: unknown }).render !== undefined\n );\n}\n\nfunction splitLayoutInProps(inProps: Record<string, unknown>) {\n const resolvedInProps: Record<string, AnyBuiltPropDefinition> = {};\n const splitInProps: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(inProps)) {\n if (isBuiltPropDefinition(value)) {\n resolvedInProps[key] = value;\n continue;\n }\n\n if (isSplitLayoutInPropDefinition(value)) {\n splitInProps[key] = value.render;\n\n if (value.props && typeof value.props === 'object') {\n Object.assign(resolvedInProps, value.props);\n }\n }\n }\n\n return {\n resolvedInProps,\n splitInProps,\n };\n}\n\ntype CreateViewMapOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n Options extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, Options>> = {},\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n> = {\n /**\n * An array of valid resource names to support.\n */\n resources: Resources;\n /**\n * The options that are passed into the created resource layout.\n */\n options: Options;\n layout: {\n /**\n * The props to pass to the layout.\n */\n props?: LayoutProps<Resources, Options, IncludeProps, CustomProps>;\n /**\n * Components used to compose the layout. Invoked per layout instance with\n * a scoped `create` that resolves composable `name` callbacks using the\n * layout's `resource` and `name`.\n */\n composables?: (\n create: CreateLayoutComposable<LayoutResourceKey<Resources>>,\n ) => Composables;\n /**\n * The render function for the layout.\n */\n render: (\n props: LayoutRenderProps<Resources, Options, IncludeProps, CustomProps>,\n context: LayoutRenderContext<Resources, Composables>,\n ) => JSX.Element;\n };\n};\n\ntype ResourceLayoutComposition<\n Name extends string,\n Composables extends ComposableComponents,\n> = [keyof Composables] extends [never]\n ? {}\n : {\n makeComposable: MakeComposable<Composables, Name>;\n };\ntype ResourceLayoutComponent<\n Name extends string,\n Props extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n> = ResourceLayoutComposition<Name, Composables> &\n BaseComponent<Name, ResolveProps<Props>> & {\n (props: Show<ResolveProps<Props>>): JSX.Element;\n };\n\ntype DefinedResourceLayoutOptions<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n> = ResolveLayoutProps<InferredInProps<Resources, InProps>> & {\n name: Name;\n resource: Resource;\n props?: Props;\n};\ntype DefinedResourceLayout<\n Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {},\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n> = <\n Name extends string,\n Resource extends LayoutResourceKey<Resources>,\n Props extends InPropsObject = {},\n>(\n options: DefinedResourceLayoutOptions<\n Resources,\n InProps,\n Name,\n Resource,\n Props\n >,\n) => ResourceLayoutComponent<Name, CustomProps, Composables>;\n\nexport function defineResourceLayout<\n const Resources extends ReadonlyArray<ResourceDefinition>,\n InProps extends InPropsDefinition<Resources>,\n IncludeProps extends IncludedProps<InferredInProps<Resources, InProps>> = {},\n CustomProps extends InPropsObject = {},\n Composables extends ComposableComponents = {},\n>(\n options: CreateViewMapOptions<\n Resources,\n InProps,\n IncludeProps,\n CustomProps,\n Composables\n >,\n) {\n const { options: inProps, resources, layout } = options;\n const normalizedResources = normalizeResources(resources);\n const resourcesEnum = createPrimitivePropBuilder('string').enum(\n toResourceEnum(normalizedResources),\n );\n const definedResourceLayout: DefinedResourceLayout<\n Resources,\n InProps,\n IncludeProps,\n CustomProps,\n Composables\n > = (layoutOptions) => {\n const {\n name,\n props: instancePropDefinitions,\n ...layoutOptionProps\n } = layoutOptions;\n const createComposableLayout =\n makeComposable<\n LayoutRenderProps<Resources, InProps, IncludeProps, CustomProps>\n >();\n const nameProp = createProp.string().literal(name);\n const rawResolvedOptions =\n typeof inProps === 'function'\n ? inProps({\n resource: resourcesEnum,\n name: nameProp,\n })\n : inProps;\n const { resolvedInProps, splitInProps } = splitLayoutInProps({\n ...(rawResolvedOptions as Record<string, unknown>),\n ...(instancePropDefinitions as Record<string, unknown> | undefined),\n ...layoutOptionProps,\n });\n const { composables, render, props: layoutProps } = layout;\n const customLayoutProps = layoutProps?.custom;\n const includeLayoutProps = layoutProps?.include;\n const resolvedIncludedProps = pick(\n resolvedInProps,\n Object.keys(includeLayoutProps ?? {}),\n );\n const resolvedLayoutProps = {\n ...resolvedIncludedProps,\n ...customLayoutProps,\n };\n const layoutContext: ComposableNameContext<\n LayoutResourceKey<Resources>,\n typeof name\n > = {\n resource: layoutOptions.resource,\n name,\n capitalize,\n };\n const resolvedComposables = composables\n ? resolveLayoutComposables(composables, layoutContext)\n : undefined;\n const mergedRenderContext = {\n composables: resolvedComposables as LayoutRenderComposables<Composables>,\n resource: layoutContext.resource,\n name: layoutContext.name,\n inProps: splitInProps,\n } as LayoutRenderContext<Resources, Composables>;\n\n function Component(props: Show<ResolveProps<CustomProps>>) {\n const validatedProps = validateProps(resolvedLayoutProps, props);\n const includedPropKeys = Object.keys(includeLayoutProps ?? {});\n const includedPropDefinitions = pick(\n resolvedInProps,\n includedPropKeys,\n ) as Record<string, unknown>;\n const includedPropValues = {\n ...resolvePropDefinitionValues(includedPropDefinitions),\n ...pick(\n splitInProps,\n includedPropKeys as (keyof typeof splitInProps)[],\n ),\n ...pick(\n layoutOptionProps,\n includedPropKeys as (keyof typeof layoutOptionProps)[],\n ),\n };\n const validatedIncludedProps = validateProps(\n includedPropDefinitions as Record<string, AnyBuiltPropDefinition>,\n includedPropValues,\n );\n const layoutRenderProps = {\n ...validatedProps,\n ...validatedIncludedProps,\n } as unknown as LayoutRenderProps<\n Resources,\n InProps,\n IncludeProps,\n CustomProps\n >;\n\n return <>{render(layoutRenderProps, mergedRenderContext)}</>;\n }\n\n function createComposition<LayoutName extends string>(\n compositionOptions: MakeComposableOptions<Composables, LayoutName>,\n ) {\n if (!compositionOptions.components) {\n return {} as ResourceLayoutComposition<LayoutName, Composables>;\n }\n\n return {\n makeComposable: createComposableLayout(compositionOptions),\n };\n }\n\n return Object.assign(Component, {\n displayName: name,\n props: undefined as unknown as ResolveProps<CustomProps>,\n ...createComposition({\n components: resolvedComposables as Composables | undefined,\n name,\n }),\n });\n };\n\n return definedResourceLayout;\n}\n"],"mappings":";;;;;;;;;AA+EA,SAAS,sBACP,OACiC;CACjC,OAAO,OAAO,UAAU,cAAc,UAAU,QAAQ,gBAAgB;AAC1E;AAEA,SAAS,8BACP,OACsC;CACtC,OACE,UAAU,QACV,OAAO,UAAU,YACjB,YAAY,SACX,MAA+B,WAAW;AAE/C;AAEA,SAAS,mBAAmB,SAAkC;CAC5D,MAAM,kBAA0D,CAAC;CACjE,MAAM,eAAwC,CAAC;CAE/C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAAG;EAClD,IAAI,sBAAsB,KAAK,GAAG;GAChC,gBAAgB,OAAO;GACvB;EACF;EAEA,IAAI,8BAA8B,KAAK,GAAG;GACxC,aAAa,OAAO,MAAM;GAE1B,IAAI,MAAM,SAAS,OAAO,MAAM,UAAU,UACxC,OAAO,OAAO,iBAAiB,MAAM,KAAK;EAE9C;CACF;CAEA,OAAO;EACL;EACA;CACF;AACF;AAwFA,SAAgB,qBAOd,SAOA;CACA,MAAM,EAAE,SAAS,SAAS,WAAW,WAAW;CAChD,MAAM,sBAAsB,mBAAmB,SAAS;CACxD,MAAM,gBAAgB,2BAA2B,QAAQ,EAAE,KACzD,eAAe,mBAAmB,CACpC;CACA,MAAM,yBAMD,kBAAkB;EACrB,MAAM,EACJ,MACA,OAAO,yBACP,GAAG,sBACD;EACJ,MAAM,yBACJ,eAEE;EACJ,MAAM,WAAW,WAAW,OAAO,EAAE,QAAQ,IAAI;EAQjD,MAAM,EAAE,iBAAiB,iBAAiB,mBAAmB;GAC3D,GAPA,OAAO,YAAY,aACf,QAAQ;IACN,UAAU;IACV,MAAM;GACR,CAAC,IACD;GAGJ,GAAI;GACJ,GAAG;EACL,CAAC;EACD,MAAM,EAAE,aAAa,QAAQ,OAAO,gBAAgB;EACpD,MAAM,oBAAoB,aAAa;EACvC,MAAM,qBAAqB,aAAa;EAKxC,MAAM,sBAAsB;GAC1B,GAL4B,KAC5B,iBACA,OAAO,KAAK,sBAAsB,CAAC,CAAC,CAGb;GACvB,GAAG;EACL;EACA,MAAM,gBAGF;GACF,UAAU,cAAc;GACxB;GACA;EACF;EACA,MAAM,sBAAsB,cACxB,yBAAyB,aAAa,aAAa,IACnD;EACJ,MAAM,sBAAsB;GAC1B,aAAa;GACb,UAAU,cAAc;GACxB,MAAM,cAAc;GACpB,SAAS;EACX;EAEA,SAAS,UAAU,OAAwC;GACzD,MAAM,iBAAiB,cAAc,qBAAqB,KAAK;GAC/D,MAAM,mBAAmB,OAAO,KAAK,sBAAsB,CAAC,CAAC;GAC7D,MAAM,0BAA0B,KAC9B,iBACA,gBACF;GAYA,MAAM,yBAAyB,cAC7B,yBACA;IAZA,GAAG,4BAA4B,uBAAuB;IACtD,GAAG,KACD,cACA,gBACF;IACA,GAAG,KACD,mBACA,gBACF;GAIiB,CACnB;GAWA,OAAO,0CAAG,OAAO;IATf,GAAG;IACH,GAAG;GAQ4B,GAAG,mBAAmB,EAAI;EAC7D;EAEA,SAAS,kBACP,oBACA;GACA,IAAI,CAAC,mBAAmB,YACtB,OAAO,CAAC;GAGV,OAAO,EACL,gBAAgB,uBAAuB,kBAAkB,EAC3D;EACF;EAEA,OAAO,OAAO,OAAO,WAAW;GAC9B,aAAa;GACb,OAAO;GACP,GAAG,kBAAkB;IACnB,YAAY;IACZ;GACF,CAAC;EACH,CAAC;CACH;CAEA,OAAO;AACT"}
package/dist/index.cjs CHANGED
@@ -1,17 +1,18 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_utils = require('./utils.cjs');
3
3
  const require_composable = require('./composable.cjs');
4
- const require_create_value = require('./create-value.cjs');
4
+ const require_builders = require('./validators/builders.cjs');
5
+ const require_validate_props = require('./validators/validate-props.cjs');
5
6
  const require_resource = require('./resource.cjs');
6
7
  const require_create_config = require('./create-config.cjs');
7
8
 
8
9
  exports.createComposableComponent = require_composable.createComposableComponent;
9
- exports.createPrimitivePropBuilder = require_create_value.createPrimitivePropBuilder;
10
- exports.createProp = require_create_value.createProp;
10
+ exports.createPrimitivePropBuilder = require_builders.createPrimitivePropBuilder;
11
+ exports.createProp = require_builders.createProp;
11
12
  exports.defineResourceLayout = require_create_config.defineResourceLayout;
12
13
  exports.makeComposable = require_composable.makeComposable;
13
14
  exports.normalizeResource = require_resource.normalizeResource;
14
15
  exports.normalizeResources = require_resource.normalizeResources;
15
16
  exports.pick = require_utils.pick;
16
17
  exports.toResourceEnum = require_resource.toResourceEnum;
17
- exports.validateProps = require_create_value.validateProps;
18
+ exports.validateProps = require_validate_props.validateProps;
package/dist/index.d.cts CHANGED
@@ -1,4 +1,6 @@
1
- import { AnyBuiltPropDefinition, ResolveLayoutProps, ResolveProps, createPrimitivePropBuilder, createProp, validateProps } from "./create-value.cjs";
1
+ import { AnyBuiltPropDefinition, ResolveLayoutProps, ResolveProps } from "./validators/types.cjs";
2
+ import { createPrimitivePropBuilder, createProp } from "./validators/builders.cjs";
3
+ import { validateProps } from "./validators/validate-props.cjs";
2
4
  import { BaseComponent, MergeIntersection, Show, UnionToIntersection, pick } from "./utils.cjs";
3
5
  import { LayoutResourceKey, NormalizeResource, NormalizeResources, ResourceDefinition, ResourceEnum, ResourceLayoutComponentProps, ResourceTree, normalizeResource, normalizeResources, toResourceEnum } from "./resource.cjs";
4
6
  import { InPropsDefinition, InPropsFunction, InPropsObject, InPropsOptions, IncludedProps, InferredInProps, LayoutRenderProps } from "./props.cjs";
package/dist/index.d.mts CHANGED
@@ -1,4 +1,6 @@
1
- import { AnyBuiltPropDefinition, ResolveLayoutProps, ResolveProps, createPrimitivePropBuilder, createProp, validateProps } from "./create-value.mjs";
1
+ import { AnyBuiltPropDefinition, ResolveLayoutProps, ResolveProps } from "./validators/types.mjs";
2
+ import { createPrimitivePropBuilder, createProp } from "./validators/builders.mjs";
3
+ import { validateProps } from "./validators/validate-props.mjs";
2
4
  import { BaseComponent, MergeIntersection, Show, UnionToIntersection, pick } from "./utils.mjs";
3
5
  import { LayoutResourceKey, NormalizeResource, NormalizeResources, ResourceDefinition, ResourceEnum, ResourceLayoutComponentProps, ResourceTree, normalizeResource, normalizeResources, toResourceEnum } from "./resource.mjs";
4
6
  import { InPropsDefinition, InPropsFunction, InPropsObject, InPropsOptions, IncludedProps, InferredInProps, LayoutRenderProps } from "./props.mjs";
package/dist/index.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  import { pick } from "./utils.mjs";
2
2
  import { createComposableComponent, makeComposable } from "./composable.mjs";
3
- import { createPrimitivePropBuilder, createProp, validateProps } from "./create-value.mjs";
3
+ import { createPrimitivePropBuilder, createProp } from "./validators/builders.mjs";
4
+ import { validateProps } from "./validators/validate-props.mjs";
4
5
  import { normalizeResource, normalizeResources, toResourceEnum } from "./resource.mjs";
5
6
  import { defineResourceLayout } from "./create-config.mjs";
6
7
 
package/dist/props.d.cts CHANGED
@@ -1,4 +1,5 @@
1
- import { AnyBuiltPropDefinition, EnumWrappedProp, LiteralWrappedProp, ResolveProps } from "./create-value.cjs";
1
+ import { AnyBuiltPropDefinition, ResolveProps } from "./validators/types.cjs";
2
+ import { EnumWrappedProp, LiteralWrappedProp } from "./validators/builders.cjs";
2
3
  import { Show } from "./utils.cjs";
3
4
  import { ResourceDefinition, ResourceEnum } from "./resource.cjs";
4
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"props.d.cts","names":[],"sources":["../src/props.ts"],"mappings":";;;;;KASY,aAAA,GAAgB,MAAM,SAAS,sBAAA;AAAA,KAC/B,cAAA,mBACQ,aAAA,CAAc,kBAAA;EAGhC,IAAA,EAAM,kBAAA,CAAmB,IAAA;EACzB,QAAA,EAAU,eAAA,CAAgB,YAAA,CAAa,SAAA;AAAA;AAAA,KAE7B,eAAA,mBACQ,aAAA,CAAc,kBAAA,2BAEhC,KAAA,EAAO,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,IAAA,OACnC,aAAA;AAAA,KACO,iBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,aAAA,GAAgB,eAAA,CAAgB,SAAA;AAAA,KACxB,eAAA,mBACQ,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,KAChC,OAAA,SAAgB,eAAA,CAAgB,SAAA,IAAa,UAAA,CAAW,OAAA,IAAW,OAAA;;;;KAI3D,aAAA,oBACE,CAAC;AAAA,KAEH,iBAAA,mBACQ,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,SAClB,IAAA,CACF,YAAA,CACE,WAAA,GACE,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,OAAA,SAAgB,YAAA"}
1
+ {"version":3,"file":"props.d.cts","names":[],"sources":["../src/props.ts"],"mappings":";;;;;;KASY,aAAA,GAAgB,MAAM,SAAS,sBAAA;AAAA,KAC/B,cAAA,mBACQ,aAAA,CAAc,kBAAA;EAGhC,IAAA,EAAM,kBAAA,CAAmB,IAAA;EACzB,QAAA,EAAU,eAAA,CAAgB,YAAA,CAAa,SAAA;AAAA;AAAA,KAE7B,eAAA,mBACQ,aAAA,CAAc,kBAAA,2BAEhC,KAAA,EAAO,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,IAAA,OACnC,aAAA;AAAA,KACO,iBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,aAAA,GAAgB,eAAA,CAAgB,SAAA;AAAA,KACxB,eAAA,mBACQ,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,KAChC,OAAA,SAAgB,eAAA,CAAgB,SAAA,IAAa,UAAA,CAAW,OAAA,IAAW,OAAA;AAnBN;AACjE;;AADiE,KAuBrD,aAAA,oBACE,CAAC;AAAA,KAEH,iBAAA,mBACQ,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,SAClB,IAAA,CACF,YAAA,CACE,WAAA,GACE,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,OAAA,SAAgB,YAAA"}
package/dist/props.d.mts CHANGED
@@ -1,4 +1,5 @@
1
- import { AnyBuiltPropDefinition, EnumWrappedProp, LiteralWrappedProp, ResolveProps } from "./create-value.mjs";
1
+ import { AnyBuiltPropDefinition, ResolveProps } from "./validators/types.mjs";
2
+ import { EnumWrappedProp, LiteralWrappedProp } from "./validators/builders.mjs";
2
3
  import { Show } from "./utils.mjs";
3
4
  import { ResourceDefinition, ResourceEnum } from "./resource.mjs";
4
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"props.d.mts","names":[],"sources":["../src/props.ts"],"mappings":";;;;;KASY,aAAA,GAAgB,MAAM,SAAS,sBAAA;AAAA,KAC/B,cAAA,mBACQ,aAAA,CAAc,kBAAA;EAGhC,IAAA,EAAM,kBAAA,CAAmB,IAAA;EACzB,QAAA,EAAU,eAAA,CAAgB,YAAA,CAAa,SAAA;AAAA;AAAA,KAE7B,eAAA,mBACQ,aAAA,CAAc,kBAAA,2BAEhC,KAAA,EAAO,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,IAAA,OACnC,aAAA;AAAA,KACO,iBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,aAAA,GAAgB,eAAA,CAAgB,SAAA;AAAA,KACxB,eAAA,mBACQ,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,KAChC,OAAA,SAAgB,eAAA,CAAgB,SAAA,IAAa,UAAA,CAAW,OAAA,IAAW,OAAA;;;;KAI3D,aAAA,oBACE,CAAC;AAAA,KAEH,iBAAA,mBACQ,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,SAClB,IAAA,CACF,YAAA,CACE,WAAA,GACE,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,OAAA,SAAgB,YAAA"}
1
+ {"version":3,"file":"props.d.mts","names":[],"sources":["../src/props.ts"],"mappings":";;;;;;KASY,aAAA,GAAgB,MAAM,SAAS,sBAAA;AAAA,KAC/B,cAAA,mBACQ,aAAA,CAAc,kBAAA;EAGhC,IAAA,EAAM,kBAAA,CAAmB,IAAA;EACzB,QAAA,EAAU,eAAA,CAAgB,YAAA,CAAa,SAAA;AAAA;AAAA,KAE7B,eAAA,mBACQ,aAAA,CAAc,kBAAA,2BAEhC,KAAA,EAAO,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,IAAA,OACnC,aAAA;AAAA,KACO,iBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,aAAA,GAAgB,eAAA,CAAgB,SAAA;AAAA,KACxB,eAAA,mBACQ,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,KAChC,OAAA,SAAgB,eAAA,CAAgB,SAAA,IAAa,UAAA,CAAW,OAAA,IAAW,OAAA;AAnBN;AACjE;;AADiE,KAuBrD,aAAA,oBACE,CAAC;AAAA,KAEH,iBAAA,mBACQ,aAAA,CAAc,kBAAA,mBAChB,iBAAA,CAAkB,SAAA,wBACb,aAAA,CAAc,eAAA,CAAgB,SAAA,EAAW,OAAA,6BAC1C,aAAA,SAClB,IAAA,CACF,YAAA,CACE,WAAA,GACE,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,OAAA,SAAgB,YAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"resource.cjs","names":[],"sources":["../src/resource.ts"],"sourcesContent":["import { ReactNode } from 'react';\r\nimport { NonEmptyReadonlyArray } from './create-value';\r\nimport { MergeIntersection, UnionToIntersection } from './utils';\r\n\r\nexport type ResourceDefinition =\r\n | string\r\n | {\r\n value: string;\r\n subResources: ReadonlyArray<\r\n ResourceDefinition & {\r\n /**\r\n * Whether to allow any string as a sub resource.\r\n *\r\n * @default false\r\n */\r\n allowAnyString?: boolean;\r\n }\r\n >;\r\n };\r\n\r\nexport type ResourceTree = Record<\r\n string,\r\n {\r\n subResources: ResourceTree;\r\n }\r\n>;\r\n\r\nexport type NormalizeResource<Resource extends ResourceDefinition> =\r\n Resource extends string\r\n ? {\r\n [Key in Resource]: {\r\n subResources: {};\r\n };\r\n }\r\n : Resource extends {\r\n value: infer Value extends string;\r\n subResources: infer SubResources extends\r\n ReadonlyArray<ResourceDefinition>;\r\n }\r\n ? {\r\n [Key in Value]: {\r\n subResources: NormalizeResources<SubResources>;\r\n };\r\n }\r\n : never;\r\n\r\nexport type NormalizeResources<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n> = MergeIntersection<\r\n UnionToIntersection<NormalizeResource<Resources[number]>>\r\n>;\r\nexport type ResourceLayoutComponentProps = {\r\n children: ReactNode;\r\n};\r\n\r\nfunction normalizeResourceTree(resource: ResourceDefinition): ResourceTree {\r\n if (typeof resource === 'string') {\r\n return {\r\n [resource]: {\r\n subResources: {},\r\n },\r\n };\r\n }\r\n\r\n const { value, subResources } = resource;\r\n\r\n return {\r\n [value]: {\r\n subResources: normalizeResourcesTree(subResources),\r\n },\r\n };\r\n}\r\n\r\nfunction normalizeResourcesTree(\r\n resources: ReadonlyArray<ResourceDefinition>,\r\n): ResourceTree {\r\n const normalizedResources: ResourceTree = {};\r\n\r\n for (const resource of resources) {\r\n Object.assign(normalizedResources, normalizeResourceTree(resource));\r\n }\r\n\r\n return normalizedResources;\r\n}\r\n\r\nexport function normalizeResource(resource: ResourceDefinition): ResourceTree {\r\n return normalizeResourceTree(resource);\r\n}\r\n\r\nexport function normalizeResources<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n>(resources: Resources): NormalizeResources<Resources> {\r\n return normalizeResourcesTree(resources) as NormalizeResources<Resources>;\r\n}\r\n\r\ntype ResourceDefinitionValue<Resource extends ResourceDefinition> =\r\n Resource extends string\r\n ? Resource\r\n : Resource extends { value: infer Value extends string }\r\n ? Value\r\n : never;\r\n\r\n/**\r\n * Top-level resource names declared in a `resources` array. Preserves string\r\n * literal unions for const resource definitions (unlike `keyof` on the\r\n * normalized resource tree, which tends to widen to `string` in hovers).\r\n */\r\nexport type LayoutResourceKey<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n> = ResourceDefinitionValue<Resources[number]>;\r\n\r\nexport type ResourceEnum<Resources extends ReadonlyArray<ResourceDefinition>> =\r\n NonEmptyReadonlyArray<LayoutResourceKey<Resources>>;\r\nexport function toResourceEnum<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n>(resources: NormalizeResources<Resources>) {\r\n const keys = Object.keys(resources);\r\n\r\n if (keys.length === 0) {\r\n throw new Error('No resources provided');\r\n }\r\n\r\n return keys as unknown as ResourceEnum<Resources>;\r\n}\r\n"],"mappings":";;AAuDA,SAAS,sBAAsB,UAA4C;CACzE,IAAI,OAAO,aAAa,UACtB,OAAO,GACJ,WAAW,EACV,cAAc,CAAC,EACjB,EACF;CAGF,MAAM,EAAE,OAAO,iBAAiB;CAEhC,OAAO,GACJ,QAAQ,EACP,cAAc,uBAAuB,YAAY,EACnD,EACF;AACF;AAEA,SAAS,uBACP,WACc;CACd,MAAM,sBAAoC,CAAC;CAE3C,KAAK,MAAM,YAAY,WACrB,OAAO,OAAO,qBAAqB,sBAAsB,QAAQ,CAAC;CAGpE,OAAO;AACT;AAEA,SAAgB,kBAAkB,UAA4C;CAC5E,OAAO,sBAAsB,QAAQ;AACvC;AAEA,SAAgB,mBAEd,WAAqD;CACrD,OAAO,uBAAuB,SAAS;AACzC;AAoBA,SAAgB,eAEd,WAA0C;CAC1C,MAAM,OAAO,OAAO,KAAK,SAAS;CAElC,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,MAAM,uBAAuB;CAGzC,OAAO;AACT"}
1
+ {"version":3,"file":"resource.cjs","names":[],"sources":["../src/resource.ts"],"sourcesContent":["import { ReactNode } from 'react';\nimport { NonEmptyReadonlyArray } from './validators';\nimport { MergeIntersection, UnionToIntersection } from './utils';\n\nexport type ResourceDefinition =\n | string\n | {\n value: string;\n subResources: ReadonlyArray<\n ResourceDefinition & {\n /**\n * Whether to allow any string as a sub resource.\n *\n * @default false\n */\n allowAnyString?: boolean;\n }\n >;\n };\n\nexport type ResourceTree = Record<\n string,\n {\n subResources: ResourceTree;\n }\n>;\n\nexport type NormalizeResource<Resource extends ResourceDefinition> =\n Resource extends string\n ? {\n [Key in Resource]: {\n subResources: {};\n };\n }\n : Resource extends {\n value: infer Value extends string;\n subResources: infer SubResources extends\n ReadonlyArray<ResourceDefinition>;\n }\n ? {\n [Key in Value]: {\n subResources: NormalizeResources<SubResources>;\n };\n }\n : never;\n\nexport type NormalizeResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n> = MergeIntersection<\n UnionToIntersection<NormalizeResource<Resources[number]>>\n>;\nexport type ResourceLayoutComponentProps = {\n children: ReactNode;\n};\n\nfunction normalizeResourceTree(resource: ResourceDefinition): ResourceTree {\n if (typeof resource === 'string') {\n return {\n [resource]: {\n subResources: {},\n },\n };\n }\n\n const { value, subResources } = resource;\n\n return {\n [value]: {\n subResources: normalizeResourcesTree(subResources),\n },\n };\n}\n\nfunction normalizeResourcesTree(\n resources: ReadonlyArray<ResourceDefinition>,\n): ResourceTree {\n const normalizedResources: ResourceTree = {};\n\n for (const resource of resources) {\n Object.assign(normalizedResources, normalizeResourceTree(resource));\n }\n\n return normalizedResources;\n}\n\nexport function normalizeResource(resource: ResourceDefinition): ResourceTree {\n return normalizeResourceTree(resource);\n}\n\nexport function normalizeResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n>(resources: Resources): NormalizeResources<Resources> {\n return normalizeResourcesTree(resources) as NormalizeResources<Resources>;\n}\n\ntype ResourceDefinitionValue<Resource extends ResourceDefinition> =\n Resource extends string\n ? Resource\n : Resource extends { value: infer Value extends string }\n ? Value\n : never;\n\n/**\n * Top-level resource names declared in a `resources` array. Preserves string\n * literal unions for const resource definitions (unlike `keyof` on the\n * normalized resource tree, which tends to widen to `string` in hovers).\n */\nexport type LayoutResourceKey<\n Resources extends ReadonlyArray<ResourceDefinition>,\n> = ResourceDefinitionValue<Resources[number]>;\n\nexport type ResourceEnum<Resources extends ReadonlyArray<ResourceDefinition>> =\n NonEmptyReadonlyArray<LayoutResourceKey<Resources>>;\nexport function toResourceEnum<\n Resources extends ReadonlyArray<ResourceDefinition>,\n>(resources: NormalizeResources<Resources>) {\n const keys = Object.keys(resources);\n\n if (keys.length === 0) {\n throw new Error('No resources provided');\n }\n\n return keys as unknown as ResourceEnum<Resources>;\n}\n"],"mappings":";;AAuDA,SAAS,sBAAsB,UAA4C;CACzE,IAAI,OAAO,aAAa,UACtB,OAAO,GACJ,WAAW,EACV,cAAc,CAAC,EACjB,EACF;CAGF,MAAM,EAAE,OAAO,iBAAiB;CAEhC,OAAO,GACJ,QAAQ,EACP,cAAc,uBAAuB,YAAY,EACnD,EACF;AACF;AAEA,SAAS,uBACP,WACc;CACd,MAAM,sBAAoC,CAAC;CAE3C,KAAK,MAAM,YAAY,WACrB,OAAO,OAAO,qBAAqB,sBAAsB,QAAQ,CAAC;CAGpE,OAAO;AACT;AAEA,SAAgB,kBAAkB,UAA4C;CAC5E,OAAO,sBAAsB,QAAQ;AACvC;AAEA,SAAgB,mBAEd,WAAqD;CACrD,OAAO,uBAAuB,SAAS;AACzC;AAoBA,SAAgB,eAEd,WAA0C;CAC1C,MAAM,OAAO,OAAO,KAAK,SAAS;CAElC,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,MAAM,uBAAuB;CAGzC,OAAO;AACT"}
@@ -1,4 +1,4 @@
1
- import { NonEmptyReadonlyArray } from "./create-value.cjs";
1
+ import { NonEmptyReadonlyArray } from "./validators/types.cjs";
2
2
  import { MergeIntersection, UnionToIntersection } from "./utils.cjs";
3
3
  import { ReactNode } from "react";
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"resource.d.cts","names":[],"sources":["../src/resource.ts"],"mappings":";;;;;KAIY,kBAAA;EAGN,KAAA;EACA,YAAA,EAAc,aAAa,CACzB,kBAAA;IALsB;;;;;IAWpB,cAAA;EAAA;AAAA;AAAA,KAKE,YAAA,GAAe,MAAM;EAG7B,YAAA,EAAc,YAAA;AAAA;AAAA,KAIN,iBAAA,kBAAmC,kBAAA,IAC7C,QAAA,4BAEc,QAAA;EACN,YAAA;AAAA,MAGJ,QAAA;EACI,KAAA;EACA,YAAA,6BACE,aAAA,CAAc,kBAAA;AAAA,cAGR,KAAA;EACN,YAAA,EAAc,kBAAA,CAAmB,YAAA;AAAA;AAAA,KAKjC,kBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,iBAAA,CACF,mBAAA,CAAoB,iBAAA,CAAkB,SAAA;AAAA,KAE5B,4BAAA;EACV,QAAA,EAAU,SAAS;AAAA;AAAA,iBAiCL,iBAAA,CAAkB,QAAA,EAAU,kBAAA,GAAqB,YAAY;AAAA,iBAI7D,kBAAA,mBACI,aAAA,CAAc,kBAAA,GAChC,SAAA,EAAW,SAAA,GAAY,kBAAA,CAAmB,SAAA;AAAA,KAIvC,uBAAA,kBAAyC,kBAAA,IAC5C,QAAA,kBACI,QAAA,GACA,QAAA;EAAmB,KAAA;AAAA,IACjB,KAAA;;;;;;KAQI,iBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,uBAAA,CAAwB,SAAA;AAAA,KAEhB,YAAA,mBAA+B,aAAA,CAAc,kBAAA,KACvD,qBAAA,CAAsB,iBAAA,CAAkB,SAAA;AAAA,iBAC1B,cAAA,mBACI,aAAA,CAAc,kBAAA,GAChC,SAAA,EAAW,kBAAA,CAAmB,SAAA,IAOJ,YAAA,CAAa,SAAA"}
1
+ {"version":3,"file":"resource.d.cts","names":[],"sources":["../src/resource.ts"],"mappings":";;;;;KAIY,kBAAA;EAGN,KAAA;EACA,YAAA,EAAc,aAAa,CACzB,kBAAA;IALI;;;;;IAWF,cAAA;EAAA;AAAA;AAAA,KAKE,YAAA,GAAe,MAAM;EAG7B,YAAA,EAAc,YAAA;AAAA;AAAA,KAIN,iBAAA,kBAAmC,kBAAA,IAC7C,QAAA,4BAEc,QAAA;EACN,YAAA;AAAA,MAGJ,QAAA;EACI,KAAA;EACA,YAAA,6BACE,aAAA,CAAc,kBAAA;AAAA,cAGR,KAAA;EACN,YAAA,EAAc,kBAAA,CAAmB,YAAA;AAAA;AAAA,KAKjC,kBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,iBAAA,CACF,mBAAA,CAAoB,iBAAA,CAAkB,SAAA;AAAA,KAE5B,4BAAA;EACV,QAAA,EAAU,SAAS;AAAA;AAAA,iBAiCL,iBAAA,CAAkB,QAAA,EAAU,kBAAA,GAAqB,YAAY;AAAA,iBAI7D,kBAAA,mBACI,aAAA,CAAc,kBAAA,GAChC,SAAA,EAAW,SAAA,GAAY,kBAAA,CAAmB,SAAA;AAAA,KAIvC,uBAAA,kBAAyC,kBAAA,IAC5C,QAAA,kBACI,QAAA,GACA,QAAA;EAAmB,KAAA;AAAA,IACjB,KAAA;;;;;;KAQI,iBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,uBAAA,CAAwB,SAAA;AAAA,KAEhB,YAAA,mBAA+B,aAAA,CAAc,kBAAA,KACvD,qBAAA,CAAsB,iBAAA,CAAkB,SAAA;AAAA,iBAC1B,cAAA,mBACI,aAAA,CAAc,kBAAA,GAChC,SAAA,EAAW,kBAAA,CAAmB,SAAA,IAOJ,YAAA,CAAa,SAAA"}
@@ -1,4 +1,4 @@
1
- import { NonEmptyReadonlyArray } from "./create-value.mjs";
1
+ import { NonEmptyReadonlyArray } from "./validators/types.mjs";
2
2
  import { MergeIntersection, UnionToIntersection } from "./utils.mjs";
3
3
  import { ReactNode } from "react";
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"resource.d.mts","names":[],"sources":["../src/resource.ts"],"mappings":";;;;;KAIY,kBAAA;EAGN,KAAA;EACA,YAAA,EAAc,aAAa,CACzB,kBAAA;IALsB;;;;;IAWpB,cAAA;EAAA;AAAA;AAAA,KAKE,YAAA,GAAe,MAAM;EAG7B,YAAA,EAAc,YAAA;AAAA;AAAA,KAIN,iBAAA,kBAAmC,kBAAA,IAC7C,QAAA,4BAEc,QAAA;EACN,YAAA;AAAA,MAGJ,QAAA;EACI,KAAA;EACA,YAAA,6BACE,aAAA,CAAc,kBAAA;AAAA,cAGR,KAAA;EACN,YAAA,EAAc,kBAAA,CAAmB,YAAA;AAAA;AAAA,KAKjC,kBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,iBAAA,CACF,mBAAA,CAAoB,iBAAA,CAAkB,SAAA;AAAA,KAE5B,4BAAA;EACV,QAAA,EAAU,SAAS;AAAA;AAAA,iBAiCL,iBAAA,CAAkB,QAAA,EAAU,kBAAA,GAAqB,YAAY;AAAA,iBAI7D,kBAAA,mBACI,aAAA,CAAc,kBAAA,GAChC,SAAA,EAAW,SAAA,GAAY,kBAAA,CAAmB,SAAA;AAAA,KAIvC,uBAAA,kBAAyC,kBAAA,IAC5C,QAAA,kBACI,QAAA,GACA,QAAA;EAAmB,KAAA;AAAA,IACjB,KAAA;;;;;;KAQI,iBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,uBAAA,CAAwB,SAAA;AAAA,KAEhB,YAAA,mBAA+B,aAAA,CAAc,kBAAA,KACvD,qBAAA,CAAsB,iBAAA,CAAkB,SAAA;AAAA,iBAC1B,cAAA,mBACI,aAAA,CAAc,kBAAA,GAChC,SAAA,EAAW,kBAAA,CAAmB,SAAA,IAOJ,YAAA,CAAa,SAAA"}
1
+ {"version":3,"file":"resource.d.mts","names":[],"sources":["../src/resource.ts"],"mappings":";;;;;KAIY,kBAAA;EAGN,KAAA;EACA,YAAA,EAAc,aAAa,CACzB,kBAAA;IALI;;;;;IAWF,cAAA;EAAA;AAAA;AAAA,KAKE,YAAA,GAAe,MAAM;EAG7B,YAAA,EAAc,YAAA;AAAA;AAAA,KAIN,iBAAA,kBAAmC,kBAAA,IAC7C,QAAA,4BAEc,QAAA;EACN,YAAA;AAAA,MAGJ,QAAA;EACI,KAAA;EACA,YAAA,6BACE,aAAA,CAAc,kBAAA;AAAA,cAGR,KAAA;EACN,YAAA,EAAc,kBAAA,CAAmB,YAAA;AAAA;AAAA,KAKjC,kBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,iBAAA,CACF,mBAAA,CAAoB,iBAAA,CAAkB,SAAA;AAAA,KAE5B,4BAAA;EACV,QAAA,EAAU,SAAS;AAAA;AAAA,iBAiCL,iBAAA,CAAkB,QAAA,EAAU,kBAAA,GAAqB,YAAY;AAAA,iBAI7D,kBAAA,mBACI,aAAA,CAAc,kBAAA,GAChC,SAAA,EAAW,SAAA,GAAY,kBAAA,CAAmB,SAAA;AAAA,KAIvC,uBAAA,kBAAyC,kBAAA,IAC5C,QAAA,kBACI,QAAA,GACA,QAAA;EAAmB,KAAA;AAAA,IACjB,KAAA;;;;;;KAQI,iBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,uBAAA,CAAwB,SAAA;AAAA,KAEhB,YAAA,mBAA+B,aAAA,CAAc,kBAAA,KACvD,qBAAA,CAAsB,iBAAA,CAAkB,SAAA;AAAA,iBAC1B,cAAA,mBACI,aAAA,CAAc,kBAAA,GAChC,SAAA,EAAW,kBAAA,CAAmB,SAAA,IAOJ,YAAA,CAAa,SAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"resource.mjs","names":[],"sources":["../src/resource.ts"],"sourcesContent":["import { ReactNode } from 'react';\r\nimport { NonEmptyReadonlyArray } from './create-value';\r\nimport { MergeIntersection, UnionToIntersection } from './utils';\r\n\r\nexport type ResourceDefinition =\r\n | string\r\n | {\r\n value: string;\r\n subResources: ReadonlyArray<\r\n ResourceDefinition & {\r\n /**\r\n * Whether to allow any string as a sub resource.\r\n *\r\n * @default false\r\n */\r\n allowAnyString?: boolean;\r\n }\r\n >;\r\n };\r\n\r\nexport type ResourceTree = Record<\r\n string,\r\n {\r\n subResources: ResourceTree;\r\n }\r\n>;\r\n\r\nexport type NormalizeResource<Resource extends ResourceDefinition> =\r\n Resource extends string\r\n ? {\r\n [Key in Resource]: {\r\n subResources: {};\r\n };\r\n }\r\n : Resource extends {\r\n value: infer Value extends string;\r\n subResources: infer SubResources extends\r\n ReadonlyArray<ResourceDefinition>;\r\n }\r\n ? {\r\n [Key in Value]: {\r\n subResources: NormalizeResources<SubResources>;\r\n };\r\n }\r\n : never;\r\n\r\nexport type NormalizeResources<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n> = MergeIntersection<\r\n UnionToIntersection<NormalizeResource<Resources[number]>>\r\n>;\r\nexport type ResourceLayoutComponentProps = {\r\n children: ReactNode;\r\n};\r\n\r\nfunction normalizeResourceTree(resource: ResourceDefinition): ResourceTree {\r\n if (typeof resource === 'string') {\r\n return {\r\n [resource]: {\r\n subResources: {},\r\n },\r\n };\r\n }\r\n\r\n const { value, subResources } = resource;\r\n\r\n return {\r\n [value]: {\r\n subResources: normalizeResourcesTree(subResources),\r\n },\r\n };\r\n}\r\n\r\nfunction normalizeResourcesTree(\r\n resources: ReadonlyArray<ResourceDefinition>,\r\n): ResourceTree {\r\n const normalizedResources: ResourceTree = {};\r\n\r\n for (const resource of resources) {\r\n Object.assign(normalizedResources, normalizeResourceTree(resource));\r\n }\r\n\r\n return normalizedResources;\r\n}\r\n\r\nexport function normalizeResource(resource: ResourceDefinition): ResourceTree {\r\n return normalizeResourceTree(resource);\r\n}\r\n\r\nexport function normalizeResources<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n>(resources: Resources): NormalizeResources<Resources> {\r\n return normalizeResourcesTree(resources) as NormalizeResources<Resources>;\r\n}\r\n\r\ntype ResourceDefinitionValue<Resource extends ResourceDefinition> =\r\n Resource extends string\r\n ? Resource\r\n : Resource extends { value: infer Value extends string }\r\n ? Value\r\n : never;\r\n\r\n/**\r\n * Top-level resource names declared in a `resources` array. Preserves string\r\n * literal unions for const resource definitions (unlike `keyof` on the\r\n * normalized resource tree, which tends to widen to `string` in hovers).\r\n */\r\nexport type LayoutResourceKey<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n> = ResourceDefinitionValue<Resources[number]>;\r\n\r\nexport type ResourceEnum<Resources extends ReadonlyArray<ResourceDefinition>> =\r\n NonEmptyReadonlyArray<LayoutResourceKey<Resources>>;\r\nexport function toResourceEnum<\r\n Resources extends ReadonlyArray<ResourceDefinition>,\r\n>(resources: NormalizeResources<Resources>) {\r\n const keys = Object.keys(resources);\r\n\r\n if (keys.length === 0) {\r\n throw new Error('No resources provided');\r\n }\r\n\r\n return keys as unknown as ResourceEnum<Resources>;\r\n}\r\n"],"mappings":";AAuDA,SAAS,sBAAsB,UAA4C;CACzE,IAAI,OAAO,aAAa,UACtB,OAAO,GACJ,WAAW,EACV,cAAc,CAAC,EACjB,EACF;CAGF,MAAM,EAAE,OAAO,iBAAiB;CAEhC,OAAO,GACJ,QAAQ,EACP,cAAc,uBAAuB,YAAY,EACnD,EACF;AACF;AAEA,SAAS,uBACP,WACc;CACd,MAAM,sBAAoC,CAAC;CAE3C,KAAK,MAAM,YAAY,WACrB,OAAO,OAAO,qBAAqB,sBAAsB,QAAQ,CAAC;CAGpE,OAAO;AACT;AAEA,SAAgB,kBAAkB,UAA4C;CAC5E,OAAO,sBAAsB,QAAQ;AACvC;AAEA,SAAgB,mBAEd,WAAqD;CACrD,OAAO,uBAAuB,SAAS;AACzC;AAoBA,SAAgB,eAEd,WAA0C;CAC1C,MAAM,OAAO,OAAO,KAAK,SAAS;CAElC,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,MAAM,uBAAuB;CAGzC,OAAO;AACT"}
1
+ {"version":3,"file":"resource.mjs","names":[],"sources":["../src/resource.ts"],"sourcesContent":["import { ReactNode } from 'react';\nimport { NonEmptyReadonlyArray } from './validators';\nimport { MergeIntersection, UnionToIntersection } from './utils';\n\nexport type ResourceDefinition =\n | string\n | {\n value: string;\n subResources: ReadonlyArray<\n ResourceDefinition & {\n /**\n * Whether to allow any string as a sub resource.\n *\n * @default false\n */\n allowAnyString?: boolean;\n }\n >;\n };\n\nexport type ResourceTree = Record<\n string,\n {\n subResources: ResourceTree;\n }\n>;\n\nexport type NormalizeResource<Resource extends ResourceDefinition> =\n Resource extends string\n ? {\n [Key in Resource]: {\n subResources: {};\n };\n }\n : Resource extends {\n value: infer Value extends string;\n subResources: infer SubResources extends\n ReadonlyArray<ResourceDefinition>;\n }\n ? {\n [Key in Value]: {\n subResources: NormalizeResources<SubResources>;\n };\n }\n : never;\n\nexport type NormalizeResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n> = MergeIntersection<\n UnionToIntersection<NormalizeResource<Resources[number]>>\n>;\nexport type ResourceLayoutComponentProps = {\n children: ReactNode;\n};\n\nfunction normalizeResourceTree(resource: ResourceDefinition): ResourceTree {\n if (typeof resource === 'string') {\n return {\n [resource]: {\n subResources: {},\n },\n };\n }\n\n const { value, subResources } = resource;\n\n return {\n [value]: {\n subResources: normalizeResourcesTree(subResources),\n },\n };\n}\n\nfunction normalizeResourcesTree(\n resources: ReadonlyArray<ResourceDefinition>,\n): ResourceTree {\n const normalizedResources: ResourceTree = {};\n\n for (const resource of resources) {\n Object.assign(normalizedResources, normalizeResourceTree(resource));\n }\n\n return normalizedResources;\n}\n\nexport function normalizeResource(resource: ResourceDefinition): ResourceTree {\n return normalizeResourceTree(resource);\n}\n\nexport function normalizeResources<\n Resources extends ReadonlyArray<ResourceDefinition>,\n>(resources: Resources): NormalizeResources<Resources> {\n return normalizeResourcesTree(resources) as NormalizeResources<Resources>;\n}\n\ntype ResourceDefinitionValue<Resource extends ResourceDefinition> =\n Resource extends string\n ? Resource\n : Resource extends { value: infer Value extends string }\n ? Value\n : never;\n\n/**\n * Top-level resource names declared in a `resources` array. Preserves string\n * literal unions for const resource definitions (unlike `keyof` on the\n * normalized resource tree, which tends to widen to `string` in hovers).\n */\nexport type LayoutResourceKey<\n Resources extends ReadonlyArray<ResourceDefinition>,\n> = ResourceDefinitionValue<Resources[number]>;\n\nexport type ResourceEnum<Resources extends ReadonlyArray<ResourceDefinition>> =\n NonEmptyReadonlyArray<LayoutResourceKey<Resources>>;\nexport function toResourceEnum<\n Resources extends ReadonlyArray<ResourceDefinition>,\n>(resources: NormalizeResources<Resources>) {\n const keys = Object.keys(resources);\n\n if (keys.length === 0) {\n throw new Error('No resources provided');\n }\n\n return keys as unknown as ResourceEnum<Resources>;\n}\n"],"mappings":";AAuDA,SAAS,sBAAsB,UAA4C;CACzE,IAAI,OAAO,aAAa,UACtB,OAAO,GACJ,WAAW,EACV,cAAc,CAAC,EACjB,EACF;CAGF,MAAM,EAAE,OAAO,iBAAiB;CAEhC,OAAO,GACJ,QAAQ,EACP,cAAc,uBAAuB,YAAY,EACnD,EACF;AACF;AAEA,SAAS,uBACP,WACc;CACd,MAAM,sBAAoC,CAAC;CAE3C,KAAK,MAAM,YAAY,WACrB,OAAO,OAAO,qBAAqB,sBAAsB,QAAQ,CAAC;CAGpE,OAAO;AACT;AAEA,SAAgB,kBAAkB,UAA4C;CAC5E,OAAO,sBAAsB,QAAQ;AACvC;AAEA,SAAgB,mBAEd,WAAqD;CACrD,OAAO,uBAAuB,SAAS;AACzC;AAoBA,SAAgB,eAEd,WAA0C;CAC1C,MAAM,OAAO,OAAO,KAAK,SAAS;CAElC,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,MAAM,uBAAuB;CAGzC,OAAO;AACT"}