@craft-ts/component 0.7.0-beta.13

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 (190) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +36 -0
  3. package/src/index.d.ts +40 -0
  4. package/src/index.d.ts.map +1 -0
  5. package/src/index.js +38 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/a11y-control.d.ts +58 -0
  8. package/src/lib/a11y-control.d.ts.map +1 -0
  9. package/src/lib/a11y-control.js +74 -0
  10. package/src/lib/a11y-control.js.map +1 -0
  11. package/src/lib/a11y.d.ts +87 -0
  12. package/src/lib/a11y.d.ts.map +1 -0
  13. package/src/lib/a11y.js +96 -0
  14. package/src/lib/a11y.js.map +1 -0
  15. package/src/lib/ai/ai-context-menu.d.ts +140 -0
  16. package/src/lib/ai/ai-context-menu.d.ts.map +1 -0
  17. package/src/lib/ai/ai-context-menu.js +66 -0
  18. package/src/lib/ai/ai-context-menu.js.map +1 -0
  19. package/src/lib/ai/ai-send-dialog.d.ts +1263 -0
  20. package/src/lib/ai/ai-send-dialog.d.ts.map +1 -0
  21. package/src/lib/ai/ai-send-dialog.js +288 -0
  22. package/src/lib/ai/ai-send-dialog.js.map +1 -0
  23. package/src/lib/ai/send-context-to-ai.d.ts +29 -0
  24. package/src/lib/ai/send-context-to-ai.d.ts.map +1 -0
  25. package/src/lib/ai/send-context-to-ai.js +127 -0
  26. package/src/lib/ai/send-context-to-ai.js.map +1 -0
  27. package/src/lib/assert-defined-input.d.ts +26 -0
  28. package/src/lib/assert-defined-input.d.ts.map +1 -0
  29. package/src/lib/assert-defined-input.js +47 -0
  30. package/src/lib/assert-defined-input.js.map +1 -0
  31. package/src/lib/block.d.ts +36 -0
  32. package/src/lib/block.d.ts.map +1 -0
  33. package/src/lib/block.js +55 -0
  34. package/src/lib/block.js.map +1 -0
  35. package/src/lib/bootstrap.d.ts +32 -0
  36. package/src/lib/bootstrap.d.ts.map +1 -0
  37. package/src/lib/bootstrap.js +60 -0
  38. package/src/lib/bootstrap.js.map +1 -0
  39. package/src/lib/bridge.d.ts +56 -0
  40. package/src/lib/bridge.d.ts.map +1 -0
  41. package/src/lib/bridge.js +81 -0
  42. package/src/lib/bridge.js.map +1 -0
  43. package/src/lib/component.d.ts +46 -0
  44. package/src/lib/component.d.ts.map +1 -0
  45. package/src/lib/component.js +118 -0
  46. package/src/lib/component.js.map +1 -0
  47. package/src/lib/composition.d.ts +17 -0
  48. package/src/lib/composition.d.ts.map +1 -0
  49. package/src/lib/composition.js +28 -0
  50. package/src/lib/composition.js.map +1 -0
  51. package/src/lib/craft-defaults.d.ts +2 -0
  52. package/src/lib/craft-defaults.d.ts.map +1 -0
  53. package/src/lib/craft-defaults.js +41 -0
  54. package/src/lib/craft-defaults.js.map +1 -0
  55. package/src/lib/craft-host-tokens.d.ts +6 -0
  56. package/src/lib/craft-host-tokens.d.ts.map +1 -0
  57. package/src/lib/craft-host-tokens.js +7 -0
  58. package/src/lib/craft-host-tokens.js.map +1 -0
  59. package/src/lib/craft-router-outlet.d.ts +15 -0
  60. package/src/lib/craft-router-outlet.d.ts.map +1 -0
  61. package/src/lib/craft-router-outlet.js +10 -0
  62. package/src/lib/craft-router-outlet.js.map +1 -0
  63. package/src/lib/css-vars.d.ts +31 -0
  64. package/src/lib/css-vars.d.ts.map +1 -0
  65. package/src/lib/css-vars.js +43 -0
  66. package/src/lib/css-vars.js.map +1 -0
  67. package/src/lib/css-vars.type.d.ts +151 -0
  68. package/src/lib/css-vars.type.d.ts.map +1 -0
  69. package/src/lib/css-vars.type.js +1 -0
  70. package/src/lib/css-vars.type.js.map +1 -0
  71. package/src/lib/defer.d.ts +31 -0
  72. package/src/lib/defer.d.ts.map +1 -0
  73. package/src/lib/defer.js +19 -0
  74. package/src/lib/defer.js.map +1 -0
  75. package/src/lib/directive.d.ts +9 -0
  76. package/src/lib/directive.d.ts.map +1 -0
  77. package/src/lib/directive.js +31 -0
  78. package/src/lib/directive.js.map +1 -0
  79. package/src/lib/each-scheduling.d.ts +59 -0
  80. package/src/lib/each-scheduling.d.ts.map +1 -0
  81. package/src/lib/each-scheduling.js +120 -0
  82. package/src/lib/each-scheduling.js.map +1 -0
  83. package/src/lib/each.d.ts +29 -0
  84. package/src/lib/each.d.ts.map +1 -0
  85. package/src/lib/each.js +23 -0
  86. package/src/lib/each.js.map +1 -0
  87. package/src/lib/factory-runtime.d.ts +5 -0
  88. package/src/lib/factory-runtime.d.ts.map +1 -0
  89. package/src/lib/factory-runtime.js +26 -0
  90. package/src/lib/factory-runtime.js.map +1 -0
  91. package/src/lib/field-exception-block.d.ts +96 -0
  92. package/src/lib/field-exception-block.d.ts.map +1 -0
  93. package/src/lib/field-exception-block.js +44 -0
  94. package/src/lib/field-exception-block.js.map +1 -0
  95. package/src/lib/host-runtime.d.ts +60 -0
  96. package/src/lib/host-runtime.d.ts.map +1 -0
  97. package/src/lib/host-runtime.js +16 -0
  98. package/src/lib/host-runtime.js.map +1 -0
  99. package/src/lib/hydrate.d.ts +15 -0
  100. package/src/lib/hydrate.d.ts.map +1 -0
  101. package/src/lib/hydrate.js +79 -0
  102. package/src/lib/hydrate.js.map +1 -0
  103. package/src/lib/hyperscript.d.ts +148 -0
  104. package/src/lib/hyperscript.d.ts.map +1 -0
  105. package/src/lib/hyperscript.js +96 -0
  106. package/src/lib/hyperscript.js.map +1 -0
  107. package/src/lib/if-block.d.ts +8 -0
  108. package/src/lib/if-block.d.ts.map +1 -0
  109. package/src/lib/if-block.js +16 -0
  110. package/src/lib/if-block.js.map +1 -0
  111. package/src/lib/locator.d.ts +170 -0
  112. package/src/lib/locator.d.ts.map +1 -0
  113. package/src/lib/locator.js +151 -0
  114. package/src/lib/locator.js.map +1 -0
  115. package/src/lib/match-block.d.ts +38 -0
  116. package/src/lib/match-block.d.ts.map +1 -0
  117. package/src/lib/match-block.js +29 -0
  118. package/src/lib/match-block.js.map +1 -0
  119. package/src/lib/pending-block.d.ts +125 -0
  120. package/src/lib/pending-block.d.ts.map +1 -0
  121. package/src/lib/pending-block.js +48 -0
  122. package/src/lib/pending-block.js.map +1 -0
  123. package/src/lib/project.d.ts +19 -0
  124. package/src/lib/project.d.ts.map +1 -0
  125. package/src/lib/project.js +56 -0
  126. package/src/lib/project.js.map +1 -0
  127. package/src/lib/render/hydration-metadata.d.ts +3 -0
  128. package/src/lib/render/hydration-metadata.d.ts.map +1 -0
  129. package/src/lib/render/hydration-metadata.js +8 -0
  130. package/src/lib/render/hydration-metadata.js.map +1 -0
  131. package/src/lib/render/hydration.d.ts +24 -0
  132. package/src/lib/render/hydration.d.ts.map +1 -0
  133. package/src/lib/render/hydration.js +181 -0
  134. package/src/lib/render/hydration.js.map +1 -0
  135. package/src/lib/render/interpreter.d.ts +32 -0
  136. package/src/lib/render/interpreter.d.ts.map +1 -0
  137. package/src/lib/render/interpreter.js +3588 -0
  138. package/src/lib/render/interpreter.js.map +1 -0
  139. package/src/lib/render/server-style-collector.d.ts +6 -0
  140. package/src/lib/render/server-style-collector.d.ts.map +1 -0
  141. package/src/lib/render/server-style-collector.js +23 -0
  142. package/src/lib/render/server-style-collector.js.map +1 -0
  143. package/src/lib/render/ssr-coordinator.d.ts +20 -0
  144. package/src/lib/render/ssr-coordinator.d.ts.map +1 -0
  145. package/src/lib/render/ssr-coordinator.js +99 -0
  146. package/src/lib/render/ssr-coordinator.js.map +1 -0
  147. package/src/lib/render/string-dom.d.ts +9 -0
  148. package/src/lib/render/string-dom.d.ts.map +1 -0
  149. package/src/lib/render/string-dom.js +377 -0
  150. package/src/lib/render/string-dom.js.map +1 -0
  151. package/src/lib/render/style-registry.d.ts +14 -0
  152. package/src/lib/render/style-registry.d.ts.map +1 -0
  153. package/src/lib/render/style-registry.js +79 -0
  154. package/src/lib/render/style-registry.js.map +1 -0
  155. package/src/lib/render/style-scope.d.ts +30 -0
  156. package/src/lib/render/style-scope.d.ts.map +1 -0
  157. package/src/lib/render/style-scope.js +261 -0
  158. package/src/lib/render/style-scope.js.map +1 -0
  159. package/src/lib/render/vnode.d.ts +330 -0
  160. package/src/lib/render/vnode.d.ts.map +1 -0
  161. package/src/lib/render/vnode.js +293 -0
  162. package/src/lib/render/vnode.js.map +1 -0
  163. package/src/lib/server-render.d.ts +34 -0
  164. package/src/lib/server-render.d.ts.map +1 -0
  165. package/src/lib/server-render.js +84 -0
  166. package/src/lib/server-render.js.map +1 -0
  167. package/src/lib/start.d.ts +13 -0
  168. package/src/lib/start.d.ts.map +1 -0
  169. package/src/lib/start.js +20 -0
  170. package/src/lib/start.js.map +1 -0
  171. package/src/lib/template-contract.d.ts +347 -0
  172. package/src/lib/template-contract.d.ts.map +1 -0
  173. package/src/lib/template-contract.js +1 -0
  174. package/src/lib/template-contract.js.map +1 -0
  175. package/src/lib/template.d.ts +11 -0
  176. package/src/lib/template.d.ts.map +1 -0
  177. package/src/lib/template.js +21 -0
  178. package/src/lib/template.js.map +1 -0
  179. package/src/lib/testing.d.ts +157 -0
  180. package/src/lib/testing.d.ts.map +1 -0
  181. package/src/lib/testing.js +416 -0
  182. package/src/lib/testing.js.map +1 -0
  183. package/src/lib/types.d.ts +442 -0
  184. package/src/lib/types.d.ts.map +1 -0
  185. package/src/lib/types.js +22 -0
  186. package/src/lib/types.js.map +1 -0
  187. package/testing/public-api.d.ts +3 -0
  188. package/testing/public-api.d.ts.map +1 -0
  189. package/testing/public-api.js +3 -0
  190. package/testing/public-api.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-contract.js","sourceRoot":"","sources":["../../../../../libs/component/src/lib/template-contract.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n CraftComponent,\n ComponentTemplateOf,\n ComponentTemplateNameOf,\n FactoryContext,\n Output,\n PropsOf,\n TemplateMethodUse,\n} from './types';\nimport type {\n NamedYieldableValue,\n Yieldable,\n YieldableMethod,\n} from '@craft-ts/core';\nimport type {\n ComponentNode,\n CraftDirectiveNode,\n CraftNodeChildren,\n DeferNode,\n EachNode,\n IfBlockNode,\n ElementNodeBase,\n} from './render/vnode';\n\nexport type TemplateContractError<Message extends string> = {\n readonly error: Message;\n};\n\ntype IsAny<Value> = 0 extends 1 & Value ? true : false;\n\ntype IsUnion<Value, Whole = Value> = Value extends any\n ? [Whole] extends [Value]\n ? false\n : true\n : never;\n\ntype ContractErrors<Result> = Extract<Result, TemplateContractError<string>>;\n\ntype ContractResult<Result> = [ContractErrors<Result>] extends [never]\n ? true\n : ContractErrors<Result>;\n\ntype Registered<\n Component,\n Registry extends readonly CraftComponent<any, any>[],\n> = [Component] extends [Registry[number]] ? true : false;\n\ntype ComponentName<Component> =\n Component extends CraftComponent<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n infer Name\n >\n ? Name\n : 'anonymous';\n\ntype ComponentPropsMatch<\n ActualProps,\n Component extends CraftComponent<any, any>,\n> =\n IsAny<ActualProps> extends true\n ? TemplateContractError<`Props for component ${ComponentName<Component>} could not be inferred.`>\n : InvalidComponentProps<ActualProps, Component>;\n\ntype InvalidComponentProps<\n ActualProps,\n Component extends CraftComponent<any, any>,\n> = {\n [Key in keyof PropsOf<Component>]-?: Key extends keyof ActualProps\n ? ActualProps[Key] extends PropsOf<Component>[Key]\n ? never\n : TemplateContractError<`Prop ${Key & string} on component ${ComponentName<Component>} has an incompatible type.`>\n : TemplateContractError<`Prop ${Key & string} is missing on component ${ComponentName<Component>}.`>;\n}[keyof PropsOf<Component>] extends never\n ? true\n : {\n [Key in keyof PropsOf<Component>]-?: Key extends keyof ActualProps\n ? ActualProps[Key] extends PropsOf<Component>[Key]\n ? never\n : TemplateContractError<`Prop ${Key & string} on component ${ComponentName<Component>} has an incompatible type.`>\n : TemplateContractError<`Prop ${Key & string} is missing on component ${ComponentName<Component>}.`>;\n }[keyof PropsOf<Component>];\n\ntype IsTemplateCallback<Value> = Value extends\n | Yieldable<any, any, any>\n | YieldableMethod<any, any, any>\n ? true\n : false;\n\ntype InvalidCallback<Message extends string, Value> =\n IsTemplateCallback<Value> extends true\n ? never\n : TemplateContractError<Message>;\n\ntype DomEventKey = keyof GlobalEventHandlersEventMap & string;\n\ntype InvalidElementCallbacks<Props> = {\n [Key in keyof Props & string]: Key extends DomEventKey\n ? Props[Key] extends (...args: any[]) => any\n ? InvalidCallback<\n `Event ${Key} must use a generator callback or a branded Craft method.`,\n Props[Key]\n >\n : never\n : Key extends `on${Capitalize<DomEventKey>}`\n ? Props[Key] extends (...args: any[]) => any\n ? InvalidCallback<\n `Event ${Key} must use a generator callback or a branded Craft method.`,\n Props[Key]\n >\n : never\n : never;\n}[keyof Props & string];\n\ntype FactoryOf<Component> =\n Component extends CraftComponent<any, any, infer Factory> ? Factory : never;\n\ntype OutputKeys<Component> = {\n [Key in keyof FactoryContext<FactoryOf<Component>>]: FactoryContext<\n FactoryOf<Component>\n >[Key] extends Output<(...args: any[]) => any>\n ? Key\n : never;\n}[keyof FactoryContext<FactoryOf<Component>>];\n\ntype InvalidOutputCallbacks<\n ActualProps,\n Component extends CraftComponent<any, any>,\n> = {\n [Key in OutputKeys<Component> & string]: Key extends keyof ActualProps\n ? ActualProps[Key] extends (...args: any[]) => any\n ? InvalidCallback<\n `Output ${Key} on component ${ComponentName<Component>} must use a generator callback or a branded Craft method.`,\n ActualProps[Key]\n >\n : never\n : never;\n}[OutputKeys<Component> & string];\n\ntype ComponentOfNode<Node> = Node extends {\n readonly component: infer Component;\n}\n ? Component extends CraftComponent<any, any>\n ? Component\n : never\n : never;\n\ntype VisitChildren<\n Children,\n Registry extends readonly CraftComponent<any, any>[],\n Seen extends readonly unknown[],\n> = Children extends readonly (infer Child)[]\n ? VisitChildren<Child, Registry, Seen>\n : Children extends ElementNodeBase<any, any, infer Props, infer Nested>\n ? InvalidElementCallbacks<Props> | VisitChildren<Nested, Registry, Seen>\n : Children extends ComponentNode<infer ActualProps, any, any>\n ?\n | ComponentPropsMatch<ActualProps, ComponentOfNode<Children>>\n | InvalidOutputCallbacks<ActualProps, ComponentOfNode<Children>>\n | VisitComponent<ComponentOfNode<Children>, Registry, Seen>\n : Children extends CraftDirectiveNode<any>\n ? VisitChildren<Children['node'], Registry, Seen>\n : Children extends EachNode<\n infer _Item,\n infer _Key,\n infer _Dependencies\n >\n ? VisitChildren<\n | ReturnType<Children['itemTemplate']>\n | (Children['empty'] extends (...args: any[]) => infer Empty\n ? Empty\n : never),\n Registry,\n Seen\n >\n : Children extends DeferNode<infer Loaded, infer _Dependencies>\n ? VisitChildren<\n Loaded extends CraftComponent<any, any>\n ? ComponentNode<PropsOf<Loaded>, {}, Loaded>\n : ReturnType<Children['resolve']>,\n Registry,\n Seen\n >\n : true;\n\ntype VisitComponent<\n Component extends CraftComponent<any, any>,\n Registry extends readonly CraftComponent<any, any>[],\n Seen extends readonly unknown[],\n> =\n IsAny<Component> extends true\n ? TemplateContractError<'Dynamic component references cannot be resolved.'>\n : IsUnion<Component> extends true\n ? TemplateContractError<'Union component references cannot be resolved by the template contract; register a concrete component.'>\n : Registered<Component, Registry> extends true\n ? Component extends Seen[number]\n ? true\n : VisitChildren<\n ReturnType<ComponentTemplateOf<Component>>,\n Registry,\n [...Seen, Component]\n >\n : TemplateContractError<`Component ${ComponentName<Component>} is missing from the template registry.`>;\n\ntype RootVisit<\n Component extends CraftComponent<any, any>,\n Registry extends readonly CraftComponent<any, any>[],\n> = VisitChildren<\n ReturnType<ComponentTemplateOf<Component>>,\n Registry,\n [Component]\n>;\n\nexport type TemplateContractAssertions<\n Component extends CraftComponent<any, any>,\n Registry extends readonly CraftComponent<any, any>[],\n> = {\n readonly component: Component;\n readonly registry: Registry;\n readonly valid: true;\n};\n\n/**\n * Type-only template setup contract. It never creates an Angular fixture or\n * touches the DOM; invalid child registrations resolve to a diagnostic type.\n */\nexport type SetupTestComponentTemplate<\n Component extends CraftComponent<any, any>,\n Registry extends readonly CraftComponent<any, any>[] = [],\n> =\n ContractResult<RootVisit<Component, Registry>> extends infer Result\n ? Result extends TemplateContractError<any>\n ? Result\n : TemplateContractAssertions<Component, Registry>\n : never;\n\ntype ElementMatching<Children, Tag extends string, Props> =\n Children extends ElementNodeBase<any, infer ActualTag, infer ActualProps>\n ? ActualTag extends Tag\n ? [Props] extends [never]\n ? true\n : ActualProps extends Props\n ? Props extends ActualProps\n ? true\n : false\n : false\n : false\n : never;\n\ntype FindElement<\n Children,\n Tag extends string,\n Props = never,\n> = Children extends readonly (infer Child)[]\n ? FindElement<Child, Tag, Props>\n : Children extends ElementNodeBase<any, infer ActualTag, any>\n ? ActualTag extends Tag\n ? ElementMatching<Children, Tag, Props>\n : FindElement<Children['children'], Tag, Props>\n : Children extends CraftDirectiveNode<any>\n ? FindElement<Children['node'], Tag, Props>\n : Children extends ComponentNode<any, any, infer Component>\n ? FindElement<ReturnType<ComponentTemplateOf<Component>>, Tag, Props>\n : Children extends EachNode<any, any>\n ? FindElement<\n | ReturnType<Children['itemTemplate']>\n | (Children['empty'] extends (...args: any[]) => infer Empty\n ? Empty\n : never),\n Tag,\n Props\n >\n : Children extends IfBlockNode<\n infer ConditionName,\n any,\n infer True,\n infer False\n >\n ? FindElement<True | False, Tag, Props>\n : Children extends DeferNode<infer Loaded>\n ? FindElement<\n Loaded extends CraftComponent<any, any>\n ? ReturnType<ComponentTemplateOf<Loaded>>\n : ReturnType<Children['resolve']>,\n Tag,\n Props\n >\n : false;\n\nexport type TemplateHasElement<\n Children extends CraftNodeChildren,\n Tag extends string,\n> = FindElement<Children, Tag>;\n\n/** Checks the exact tag and props of a matching element. */\nexport type TemplateHasElementWithProps<\n Children extends CraftNodeChildren,\n Tag extends string,\n Props extends object,\n> = FindElement<Children, Tag, Props>;\n\ntype VisitProperty<\n Children,\n Tag extends string,\n Property extends string,\n Value,\n> = Children extends readonly (infer Child)[]\n ? VisitProperty<Child, Tag, Property, Value>\n : Children extends ElementNodeBase<\n any,\n infer ActualTag,\n infer Props,\n infer Nested\n >\n ? ActualTag extends Tag\n ? Property extends keyof Props\n ? NonNullable<Props[Property]> extends Value\n ? true\n : false\n : false\n : VisitProperty<Nested, Tag, Property, Value>\n : Children extends CraftDirectiveNode<any>\n ? VisitProperty<Children['node'], Tag, Property, Value>\n : Children extends ComponentNode<any, any, infer Component>\n ? VisitProperty<\n ReturnType<ComponentTemplateOf<Component>>,\n Tag,\n Property,\n Value\n >\n : Children extends EachNode<any, any>\n ? VisitProperty<\n (\n | ReturnType<Children['itemTemplate']>\n | (Children['empty'] extends (...args: any[]) => infer Empty\n ? Empty\n : never)\n ) &\n CraftNodeChildren,\n Tag,\n Property,\n Value\n >\n : Children extends DeferNode<infer Loaded>\n ? VisitProperty<\n Loaded extends CraftComponent<any, any>\n ? ReturnType<ComponentTemplateOf<Loaded>>\n : ReturnType<Children['resolve']>,\n Tag,\n Property,\n Value\n >\n : false;\n\n/** Checks the type of a static or dynamic property on an element. */\nexport type TemplateHasProperty<\n Children extends CraftNodeChildren,\n Tag extends string,\n Property extends string,\n Value,\n> = VisitProperty<Children, Tag, Property, Value>;\n\ntype VisitYieldableProperty<\n Children,\n Tag extends string,\n Property extends string,\n Result,\n> = Children extends readonly (infer Child)[]\n ? VisitYieldableProperty<Child, Tag, Property, Result>\n : Children extends ElementNodeBase<\n any,\n infer ActualTag,\n infer Props,\n infer Nested\n >\n ? ActualTag extends Tag\n ? Property extends keyof Props\n ? NonNullable<Props[Property]> extends (\n ...args: infer Args\n ) => Generator<any, infer ActualResult, any>\n ? Args extends []\n ? ActualResult extends Result\n ? Result extends ActualResult\n ? true\n : false\n : false\n : false\n : false\n : false\n : VisitYieldableProperty<Nested, Tag, Property, Result>\n : Children extends CraftDirectiveNode<any>\n ? VisitYieldableProperty<Children['node'], Tag, Property, Result>\n : Children extends ComponentNode<any, any, infer Component>\n ? VisitYieldableProperty<\n ReturnType<ComponentTemplateOf<Component>>,\n Tag,\n Property,\n Result\n >\n : Children extends EachNode<any, any>\n ? VisitYieldableProperty<\n (\n | ReturnType<Children['itemTemplate']>\n | (Children['empty'] extends (...args: any[]) => infer Empty\n ? Empty\n : never)\n ) &\n CraftNodeChildren,\n Tag,\n Property,\n Result\n >\n : Children extends DeferNode<infer Loaded>\n ? VisitYieldableProperty<\n Loaded extends CraftComponent<any, any>\n ? ReturnType<ComponentTemplateOf<Loaded>>\n : ReturnType<Children['resolve']>,\n Tag,\n Property,\n Result\n >\n : false;\n\n/** Checks that an element property is driven by a no-argument generator. */\nexport type TemplateHasYieldableProperty<\n Children extends CraftNodeChildren,\n Tag extends string,\n Property extends string,\n Result,\n> = TemplateHasProperty<\n Children,\n Tag,\n Property,\n Yieldable<[], Result, unknown>\n>;\n\ntype VisitContextUse<\n Children,\n Tag extends string,\n Property extends string,\n ContextMethod extends string,\n> = Children extends readonly (infer Child)[]\n ? VisitContextUse<Child, Tag, Property, ContextMethod>\n : Children extends ElementNodeBase<\n any,\n infer ActualTag,\n infer Props,\n infer Nested\n >\n ? ActualTag extends Tag\n ? Property extends keyof Props\n ? NonNullable<Props[Property]> extends (\n ...args: any[]\n ) => Generator<infer Yielded, infer Returned, any>\n ? TemplateMethodUse<ContextMethod> extends Yielded | Returned\n ? true\n : Extract<\n Yielded | Returned,\n TemplateMethodUse<ContextMethod>\n > extends never\n ? false\n : true\n : false\n : false\n : VisitContextUse<Nested, Tag, Property, ContextMethod>\n : Children extends CraftDirectiveNode<any>\n ? VisitContextUse<Children['node'], Tag, Property, ContextMethod>\n : Children extends ComponentNode<any, any, infer Component>\n ? VisitContextUse<\n ReturnType<ComponentTemplateOf<Component>>,\n Tag,\n Property,\n ContextMethod\n >\n : Children extends EachNode<any, any>\n ? VisitContextUse<\n (\n | ReturnType<Children['itemTemplate']>\n | (Children['empty'] extends (...args: any[]) => infer Empty\n ? Empty\n : never)\n ) &\n CraftNodeChildren,\n Tag,\n Property,\n ContextMethod\n >\n : Children extends DeferNode<infer Loaded>\n ? VisitContextUse<\n Loaded extends CraftComponent<any, any>\n ? ReturnType<ComponentTemplateOf<Loaded>>\n : ReturnType<Children['resolve']>,\n Tag,\n Property,\n ContextMethod\n >\n : false;\n\n/** Checks that a property callback delegates to a named template context member. */\nexport type TemplateDelegatesToContext<\n Children extends CraftNodeChildren,\n Tag extends string,\n Property extends string,\n ContextMethod extends string = Property,\n> = VisitContextUse<Children, Tag, Property, ContextMethod>;\n\ntype EventHandlerOf<\n Props,\n EventName extends string,\n> = EventName extends keyof Props\n ? Props[EventName]\n : `on${Capitalize<EventName>}` extends keyof Props\n ? Props[`on${Capitalize<EventName>}`]\n : never;\n\ntype VisitEvent<\n Children,\n Tag extends string,\n EventName extends string,\n Handler extends (...args: any[]) => any,\n> = Children extends readonly (infer Child)[]\n ? VisitEvent<Child, Tag, EventName, Handler>\n : Children extends ElementNodeBase<any, infer ActualTag, infer Props>\n ? ActualTag extends Tag\n ? EventHandlerOf<Props, EventName> extends Handler\n ? Handler extends EventHandlerOf<Props, EventName>\n ? true\n : false\n : false\n : VisitEvent<Children['children'], Tag, EventName, Handler>\n : Children extends CraftDirectiveNode<any>\n ? VisitEvent<Children['node'], Tag, EventName, Handler>\n : Children extends ComponentNode<any, any, infer Component>\n ? VisitEvent<\n ReturnType<ComponentTemplateOf<Component>>,\n Tag,\n EventName,\n Handler\n >\n : false;\n\ntype VisitOutput<\n Children,\n Target extends CraftComponent<any, any>,\n Name extends keyof PropsOf<Target> & string,\n Handler extends (...args: any[]) => any,\n> = Children extends readonly (infer Child)[]\n ? VisitOutput<Child, Target, Name, Handler>\n : Children extends ElementNodeBase<any, any, any, infer Nested>\n ? VisitOutput<Nested, Target, Name, Handler>\n : Children extends CraftDirectiveNode<any>\n ? VisitOutput<Children['node'], Target, Name, Handler>\n : Children extends ComponentNode<infer Props, any, infer Actual>\n ? [Actual] extends [Target]\n ? Name extends keyof Props\n ? Props[Name] extends Handler\n ? Handler extends Props[Name]\n ? true\n : false\n : false\n : false\n : VisitOutput<\n ReturnType<ComponentTemplateOf<Actual>>,\n Target,\n Name,\n Handler\n >\n : Children extends EachNode<any, any>\n ? VisitOutput<\n | ReturnType<Children['itemTemplate']>\n | (Children['empty'] extends (...args: any[]) => infer Empty\n ? Empty\n : never),\n Target,\n Name,\n Handler\n >\n : Children extends DeferNode<infer Loaded>\n ? VisitOutput<\n Loaded extends CraftComponent<any, any>\n ? ReturnType<ComponentTemplateOf<Loaded>>\n : ReturnType<Children['resolve']>,\n Target,\n Name,\n Handler\n >\n : false;\n\n/** Checks an event callback and therefore preserves its argument type. */\nexport type TemplateHasEvent<\n Children extends CraftNodeChildren,\n Tag extends string,\n EventName extends string,\n Handler extends (...args: any[]) => any,\n> = VisitEvent<Children, Tag, EventName, Handler>;\n\n/** Checks that a DOM event is a generator callback with the given arguments. */\nexport type TemplateHasYieldableEvent<\n Children extends CraftNodeChildren,\n Tag extends string,\n EventName extends string,\n Args extends unknown[],\n> = VisitYieldableEvent<Children, Tag, EventName, Args>;\n\n/** Checks a branded Craft method used directly as a DOM event callback. */\nexport type TemplateHasYieldableMethodEvent<\n Children extends CraftNodeChildren,\n Tag extends string,\n EventName extends string,\n Args extends unknown[],\n> = TemplateHasEvent<Children, Tag, EventName, YieldableMethod<Args, any, any>>;\n\ntype VisitYieldableEvent<\n Children,\n Tag extends string,\n EventName extends string,\n Args extends unknown[],\n> = Children extends readonly (infer Child)[]\n ? VisitYieldableEvent<Child, Tag, EventName, Args>\n : Children extends ElementNodeBase<any, infer ActualTag, infer Props>\n ? ActualTag extends Tag\n ? EventHandlerOf<Props, EventName> extends (\n ...args: infer ActualArgs\n ) => Generator<any, any, any>\n ? ActualArgs extends Args\n ? Args extends ActualArgs\n ? true\n : false\n : false\n : false\n : VisitYieldableEvent<Children['children'], Tag, EventName, Args>\n : Children extends CraftDirectiveNode<any>\n ? VisitYieldableEvent<Children['node'], Tag, EventName, Args>\n : Children extends ComponentNode<any, any, infer Component>\n ? VisitYieldableEvent<\n ReturnType<ComponentTemplateOf<Component>>,\n Tag,\n EventName,\n Args\n >\n : false;\n\n/** Checks an output callback passed to a concrete Craft child component. */\nexport type TemplateHasOutput<\n Children extends CraftNodeChildren,\n Component extends CraftComponent<any, any>,\n Name extends keyof PropsOf<Component> & string,\n Handler extends (...args: any[]) => any,\n> = VisitOutput<Children, Component, Name, Handler>;\n\nexport type TemplateUsesComponent<\n Children extends CraftNodeChildren,\n Component extends CraftComponent<any, any>,\n> = Children extends readonly (infer Child)[]\n ? TemplateUsesComponent<Child & CraftNodeChildren, Component>\n : Children extends ComponentNode<any, any, infer Actual>\n ? [Actual] extends [Component]\n ? true\n : TemplateUsesComponent<\n ReturnType<ComponentTemplateOf<Actual>>,\n Component\n >\n : Children extends ElementNodeBase<any, any, any, infer Nested>\n ? TemplateUsesComponent<Nested, Component>\n : Children extends CraftDirectiveNode<any>\n ? TemplateUsesComponent<Children['node'], Component>\n : Children extends EachNode<any, any>\n ? TemplateUsesComponent<\n (\n | ReturnType<Children['itemTemplate']>\n | (Children['empty'] extends (...args: any[]) => infer Empty\n ? Empty\n : never)\n ) &\n CraftNodeChildren,\n Component\n >\n : Children extends DeferNode<infer Loaded>\n ? Loaded extends CraftComponent<any, any>\n ? [Loaded] extends [Component]\n ? true\n : TemplateUsesComponent<\n ReturnType<ComponentTemplateOf<Loaded>>,\n Component\n >\n : TemplateUsesComponent<\n ReturnType<Children['resolve']>,\n Component\n >\n : false;\n\ntype VisibilityValue = boolean | 'nonEmpty' | 'empty';\ntype Visibility = Readonly<Record<string, VisibilityValue>>;\n\ntype VisibilityMatches<\n Actual extends Visibility,\n Expected extends Visibility,\n> = keyof Expected extends never\n ? keyof Actual extends never\n ? true\n : false\n : {\n [Key in keyof Expected]: Key extends keyof Actual\n ? Actual[Key] extends Expected[Key]\n ? Expected[Key] extends Actual[Key]\n ? never\n : false\n : false\n : false;\n }[keyof Expected] extends never\n ? true\n : {\n [Key in keyof Expected]: Key extends keyof Actual\n ? Actual[Key] extends Expected[Key]\n ? Expected[Key] extends Actual[Key]\n ? never\n : false\n : false\n : false;\n }[keyof Expected];\n\ntype StateMarkerMatches<Value, StateName extends string> =\n Value extends NamedYieldableValue<infer ActualName extends string, any>\n ? ActualName extends StateName\n ? true\n : false\n : Value extends TemplateMethodUse<StateName>\n ? true\n : false;\n\ntype ValueUsesState<Value, StateName extends string> =\n IsAny<Value> extends true\n ? false\n : StateMarkerMatches<Value, StateName> extends true\n ? true\n : Value extends (\n ...args: any[]\n ) => Generator<infer Yielded, infer Returned, any>\n ? TemplateMethodUse<StateName> extends Yielded | Returned\n ? true\n : false\n : Value extends (...args: any[]) => infer Returned\n ? Returned extends TemplateMethodUse<StateName>\n ? true\n : false\n : Value extends readonly (infer Item)[]\n ? ValueUsesState<Item, StateName>\n : Value extends object\n ? true extends {\n [Key in keyof Value]: ValueUsesState<Value[Key], StateName>;\n }[keyof Value]\n ? true\n : false\n : false;\n\ntype RenderPropsUseState<Props, StateName extends string> = true extends {\n [Key in keyof Props & string]: Key extends DomEventKey\n ? false\n : Key extends `on${Capitalize<DomEventKey>}`\n ? false\n : ValueUsesState<Props[Key], StateName>;\n}[keyof Props & string]\n ? true\n : false;\n\ntype VisitRenderedState<\n Children,\n StateName extends string,\n Expected extends Visibility,\n Current extends Visibility = {},\n Seen extends readonly unknown[] = [],\n Depth extends readonly unknown[] = [],\n> = Depth['length'] extends 8\n ? false\n : Children extends readonly (infer Child)[]\n ? VisitRenderedState<\n Child,\n StateName,\n Expected,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : Children extends ElementNodeBase<any, any, infer Props, infer Nested>\n ?\n | (RenderPropsUseState<Props, StateName> extends true\n ? VisibilityMatches<Current, Expected>\n : false)\n | VisitRenderedState<\n Nested,\n StateName,\n Expected,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : Children extends CraftDirectiveNode<any>\n ? VisitRenderedState<\n Children['node'],\n StateName,\n Expected,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : Children extends ComponentNode<any, any, infer Component>\n ? Component extends Seen[number]\n ? false\n : VisitRenderedState<\n ReturnType<ComponentTemplateOf<Component>>,\n StateName,\n Expected,\n Current,\n [...Seen, Component],\n [...Depth, unknown]\n >\n : Children extends EachNode<\n any,\n any,\n any,\n infer SourceName,\n infer Item,\n infer Empty\n >\n ?\n | VisitRenderedState<\n Item,\n StateName,\n Expected,\n Extract<SourceName, string> extends never\n ? Current\n : AddVisibility<\n Current,\n Extract<SourceName, string>,\n 'nonEmpty'\n >,\n Seen,\n [...Depth, unknown]\n >\n | VisitRenderedState<\n Empty,\n StateName,\n Expected,\n Extract<SourceName, string> extends never\n ? Current\n : AddVisibility<\n Current,\n Extract<SourceName, string>,\n 'empty'\n >,\n Seen,\n [...Depth, unknown]\n >\n : Children extends IfBlockNode<\n infer ConditionName,\n any,\n infer True,\n infer False\n >\n ?\n | VisitRenderedState<\n True,\n StateName,\n Expected,\n AddVisibility<Current, ConditionName, true>,\n Seen,\n [...Depth, unknown]\n >\n | VisitRenderedState<\n False,\n StateName,\n Expected,\n AddVisibility<Current, ConditionName, false>,\n Seen,\n [...Depth, unknown]\n >\n : Children extends DeferNode<infer Loaded>\n ? VisitRenderedState<\n Loaded extends CraftComponent<any, any>\n ? ReturnType<ComponentTemplateOf<Loaded>>\n : ReturnType<Children['resolve']>,\n StateName,\n Expected,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : ValueUsesState<Children, StateName> extends true\n ? VisibilityMatches<Current, Expected>\n : false;\n\ntype RenderedStateResult<Result> =\n true extends Extract<Result, true> ? true : false;\n\n/** Checks that a named reactive value is used by a rendered binding. */\nexport type TemplateRendersStateWhen<\n Children,\n StateName extends string,\n Conditions extends { readonly when?: Visibility } = {},\n> = RenderedStateResult<\n VisitRenderedState<\n Children,\n StateName,\n Conditions extends { readonly when: infer When extends Visibility }\n ? When\n : {}\n >\n>;\n\ntype ActionHandlerAvailable<Handler> = IsTemplateCallback<Handler>;\n\ntype ActionElementMatches<\n Props,\n LocalName,\n EventName extends string,\n ExpectedLocalName extends string,\n> = LocalName extends ExpectedLocalName\n ? ExpectedLocalName extends LocalName\n ? EventHandlerOf<Props, EventName> extends infer Handler\n ? ActionHandlerAvailable<Handler>\n : false\n : false\n : false;\n\ntype VisitAvailableAction<\n Children,\n EventName extends string,\n LocalName extends string,\n Expected extends Visibility,\n Current extends Visibility = {},\n Seen extends readonly unknown[] = [],\n Depth extends readonly unknown[] = [],\n> = Depth['length'] extends 8\n ? false\n : Children extends readonly (infer Child)[]\n ? VisitAvailableAction<\n Child,\n EventName,\n LocalName,\n Expected,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : Children extends ElementNodeBase<\n any,\n any,\n infer Props,\n infer Nested,\n infer ActualLocalName\n >\n ?\n | (ActionElementMatches<\n Props,\n ActualLocalName,\n EventName,\n LocalName\n > extends true\n ? VisibilityMatches<Current, Expected>\n : false)\n | VisitAvailableAction<\n Nested,\n EventName,\n LocalName,\n Expected,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : Children extends CraftDirectiveNode<any>\n ? VisitAvailableAction<\n Children['node'],\n EventName,\n LocalName,\n Expected,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : Children extends ComponentNode<any, any, infer Component>\n ? Component extends Seen[number]\n ? false\n : VisitAvailableAction<\n ReturnType<ComponentTemplateOf<Component>>,\n EventName,\n LocalName,\n Expected,\n Current,\n [...Seen, Component],\n [...Depth, unknown]\n >\n : Children extends EachNode<\n any,\n any,\n any,\n infer SourceName,\n infer Item,\n infer Empty\n >\n ?\n | VisitAvailableAction<\n Item,\n EventName,\n LocalName,\n Expected,\n Extract<SourceName, string> extends never\n ? Current\n : AddVisibility<\n Current,\n Extract<SourceName, string>,\n 'nonEmpty'\n >,\n Seen,\n [...Depth, unknown]\n >\n | VisitAvailableAction<\n Empty,\n EventName,\n LocalName,\n Expected,\n Extract<SourceName, string> extends never\n ? Current\n : AddVisibility<\n Current,\n Extract<SourceName, string>,\n 'empty'\n >,\n Seen,\n [...Depth, unknown]\n >\n : Children extends IfBlockNode<\n infer ConditionName,\n any,\n infer True,\n infer False\n >\n ?\n | VisitAvailableAction<\n True,\n EventName,\n LocalName,\n Expected,\n AddVisibility<Current, ConditionName, true>,\n Seen,\n [...Depth, unknown]\n >\n | VisitAvailableAction<\n False,\n EventName,\n LocalName,\n Expected,\n AddVisibility<Current, ConditionName, false>,\n Seen,\n [...Depth, unknown]\n >\n : Children extends DeferNode<infer Loaded>\n ? VisitAvailableAction<\n Loaded extends CraftComponent<any, any>\n ? ReturnType<ComponentTemplateOf<Loaded>>\n : ReturnType<Children['resolve']>,\n EventName,\n LocalName,\n Expected,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : false;\n\ntype AvailableActionResult<Result> =\n true extends Extract<Result, true> ? true : false;\n\n/** Checks an event action on a named element and its visibility path. */\nexport type TemplateRenderAvailableActionWhen<\n Children,\n ActionKey extends `${string}:${string}`,\n Conditions extends { readonly when?: Visibility } = {},\n> = ActionKey extends `${infer EventName}:${infer LocalName}`\n ? AvailableActionResult<\n VisitAvailableAction<\n Children,\n EventName,\n LocalName,\n Conditions extends { readonly when: infer When extends Visibility }\n ? When\n : {}\n >\n >\n : false;\n\ntype AddVisibility<\n Current extends Visibility,\n Key extends string,\n Value extends VisibilityValue,\n> = Current & { readonly [K in Key]: Value };\n\ntype NamedElementMatches<\n Owner extends string,\n Identity extends string,\n Tag extends string,\n LocalName,\n> = LocalName extends string\n ? Identity extends `${infer IdentityOwner}:${infer IdentityTag}:${infer IdentityLocal}`\n ? (\n [Owner] extends [never]\n ? true\n : Owner extends IdentityOwner\n ? true\n : false\n ) extends true\n ? [Tag, LocalName] extends [IdentityTag, IdentityLocal]\n ? true\n : false\n : false\n : false\n : false;\n\ntype LiteralString<Value> = Value extends string\n ? string extends Value\n ? never\n : Value\n : never;\n\ntype NamedElementIdentity<\n Owner extends string,\n Tag extends string,\n LocalName extends string,\n> = string extends Owner\n ? `${string}:${Tag}:${LocalName}`\n : [Owner] extends [never]\n ? `${string}:${Tag}:${LocalName}`\n : `${Owner}:${Tag}:${LocalName}`;\n\ntype VisitNamedElementIdentities<\n Children,\n Owner extends string = never,\n Seen extends readonly unknown[] = [],\n Depth extends readonly unknown[] = [],\n> = Depth['length'] extends 8\n ? never\n : IsAny<Children> extends true\n ? never\n : Children extends readonly (infer Child)[]\n ? VisitNamedElementIdentities<Child, Owner, Seen, [...Depth, unknown]>\n : Children extends ElementNodeBase<\n any,\n infer Tag extends string,\n any,\n infer Nested,\n infer LocalName\n >\n ? LiteralString<Extract<LocalName, string>> extends infer Name extends\n string\n ?\n | NamedElementIdentity<Owner, Tag, Name>\n | VisitNamedElementIdentities<\n Nested,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : VisitNamedElementIdentities<\n Nested,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : Children extends CraftDirectiveNode<any>\n ? VisitNamedElementIdentities<\n Children['node'],\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : Children extends ComponentNode<any, any, infer Component>\n ? IsAny<Component> extends true\n ? never\n : Component extends Seen[number]\n ? never\n : VisitNamedElementIdentities<\n ReturnType<ComponentTemplateOf<Component>>,\n ComponentName<Component>,\n [...Seen, Component],\n [...Depth, unknown]\n >\n : Children extends EachNode<\n any,\n any,\n any,\n any,\n infer Item,\n infer Empty\n >\n ? VisitNamedElementIdentities<\n Item | Empty,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : Children extends IfBlockNode<any, any, infer True, infer False>\n ? VisitNamedElementIdentities<\n True | False,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : Children extends DeferNode<infer Loaded>\n ? VisitNamedElementIdentities<\n Loaded extends CraftComponent<any, any>\n ? ReturnType<ComponentTemplateOf<Loaded>>\n : ReturnType<Children['resolve']>,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : never;\n\ntype TemplateContractOutput<Template> = Template extends (\n ...args: any[]\n) => infer Output\n ? Output\n : Template;\n\ntype TemplateContractOwner<Template> = Template extends (...args: any[]) => any\n ? ComponentTemplateNameOf<Template> extends infer Name extends string\n ? string extends Name\n ? never\n : Name\n : never\n : never;\n\n/** Named element identities available for a template, for editor completion. */\nexport type TemplateNamedElementIdentity<Template> =\n VisitNamedElementIdentities<\n TemplateContractOutput<Template>,\n TemplateContractOwner<Template>\n >;\n\ntype TemplateContextOf<Template> = Template extends (\n context: infer Context,\n ...args: any[]\n) => any\n ? Context\n : never;\n\ntype TemplateContextPathKeys<Value> = Exclude<\n keyof Value,\n keyof ((...args: never[]) => unknown) | symbol | number\n> &\n string;\n\ntype TemplateContextPaths<\n Value,\n Prefix extends string = '',\n Depth extends readonly unknown[] = [],\n> = Depth['length'] extends 8\n ? never\n :\n | Prefix\n | (Value extends readonly unknown[]\n ? never\n : Value extends object\n ? {\n [Key in TemplateContextPathKeys<Value>]: TemplateContextPaths<\n Value[Key],\n Prefix extends '' ? Key : `${Prefix}.${Key}`,\n [...Depth, unknown]\n >;\n }[TemplateContextPathKeys<Value>]\n : never);\n\n/** Context paths available for a template callback, with editor completion. */\nexport type TemplateContextMethodOf<Template> = Extract<\n TemplateContextPaths<TemplateContextOf<Template>>,\n string\n>;\n\ntype NamedElementPropsOf<\n Children,\n Identity extends string,\n Owner extends string = never,\n Seen extends readonly unknown[] = [],\n Depth extends readonly unknown[] = [],\n> = Depth['length'] extends 8\n ? never\n : IsAny<Children> extends true\n ? never\n : Children extends readonly (infer Child)[]\n ? NamedElementPropsOf<Child, Identity, Owner, Seen, [...Depth, unknown]>\n : Children extends ElementNodeBase<\n any,\n infer Tag,\n infer Props,\n infer Nested,\n infer LocalName\n >\n ? NamedElementMatches<\n Owner,\n Identity,\n Tag,\n Extract<LocalName, string>\n > extends true\n ? Props\n : NamedElementPropsOf<\n Nested,\n Identity,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : Children extends CraftDirectiveNode<any>\n ? NamedElementPropsOf<\n Children['node'],\n Identity,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : Children extends ComponentNode<any, any, infer Component>\n ? Component extends Seen[number]\n ? never\n : NamedElementPropsOf<\n ReturnType<ComponentTemplateOf<Component>>,\n Identity,\n ComponentName<Component>,\n [...Seen, Component],\n [...Depth, unknown]\n >\n : Children extends EachNode<\n any,\n any,\n any,\n any,\n infer Item,\n infer Empty\n >\n ? NamedElementPropsOf<\n Item | Empty,\n Identity,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : Children extends IfBlockNode<any, any, infer True, infer False>\n ? NamedElementPropsOf<\n True | False,\n Identity,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : Children extends DeferNode<infer Loaded>\n ? NamedElementPropsOf<\n Loaded extends CraftComponent<any, any>\n ? ReturnType<ComponentTemplateOf<Loaded>>\n : ReturnType<Children['resolve']>,\n Identity,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : never;\n\n/** Properties declared on a named element, with editor completion. */\nexport type TemplateNamedElementProperty<\n Template,\n Identity extends TemplateNamedElementIdentity<Template>,\n> = Extract<\n keyof NamedElementPropsOf<\n TemplateContractOutput<Template>,\n Identity,\n TemplateContractOwner<Template>\n >,\n string\n>;\n\ntype TemplateContextUseResult<Result> =\n true extends Extract<Result, true> ? true : false;\n\ntype HandlerDelegatesToContext<\n Handler,\n ContextMethod extends string,\n> = Handler extends (\n ...args: any[]\n) => Generator<infer Yielded, infer Returned, any>\n ? TemplateMethodUse<ContextMethod> extends Yielded | Returned\n ? true\n : false\n : false;\n\ntype NamedElementDelegatesToContextOf<\n Children,\n Identity extends string,\n Property extends string,\n ContextMethod extends string,\n Owner extends string = never,\n Seen extends readonly unknown[] = [],\n Depth extends readonly unknown[] = [],\n> = Depth['length'] extends 8\n ? false\n : Children extends readonly (infer Child)[]\n ? NamedElementDelegatesToContextOf<\n Child,\n Identity,\n Property,\n ContextMethod,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : Children extends ElementNodeBase<\n any,\n infer Tag,\n infer Props,\n infer Nested,\n infer LocalName\n >\n ?\n | (NamedElementMatches<\n Owner,\n Identity,\n Tag,\n Extract<LocalName, string>\n > extends true\n ? Property extends keyof Props\n ? HandlerDelegatesToContext<Props[Property], ContextMethod>\n : false\n : false)\n | NamedElementDelegatesToContextOf<\n Nested,\n Identity,\n Property,\n ContextMethod,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : Children extends CraftDirectiveNode<any>\n ? NamedElementDelegatesToContextOf<\n Children['node'],\n Identity,\n Property,\n ContextMethod,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : Children extends ComponentNode<any, any, infer Component>\n ? Component extends Seen[number]\n ? false\n : NamedElementDelegatesToContextOf<\n ReturnType<ComponentTemplateOf<Component>>,\n Identity,\n Property,\n ContextMethod,\n ComponentName<Component>,\n [...Seen, Component],\n [...Depth, unknown]\n >\n : Children extends EachNode<\n any,\n any,\n any,\n any,\n infer Item,\n infer Empty\n >\n ? NamedElementDelegatesToContextOf<\n Item | Empty,\n Identity,\n Property,\n ContextMethod,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : Children extends IfBlockNode<any, any, infer True, infer False>\n ? NamedElementDelegatesToContextOf<\n True | False,\n Identity,\n Property,\n ContextMethod,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : Children extends DeferNode<infer Loaded>\n ? NamedElementDelegatesToContextOf<\n Loaded extends CraftComponent<any, any>\n ? ReturnType<ComponentTemplateOf<Loaded>>\n : ReturnType<Children['resolve']>,\n Identity,\n Property,\n ContextMethod,\n Owner,\n Seen,\n [...Depth, unknown]\n >\n : false;\n\n/** Checks that a named element property delegates to a context method. */\nexport type TemplateNamedElementDelegatesToContext<\n Template,\n Identity extends TemplateNamedElementIdentity<Template>,\n Property extends TemplateNamedElementProperty<Template, Identity>,\n ContextMethod extends TemplateContextMethodOf<Template>,\n> = TemplateContextUseResult<\n NamedElementDelegatesToContextOf<\n TemplateContractOutput<Template>,\n Identity,\n Property,\n ContextMethod,\n TemplateContractOwner<Template>\n >\n>;\n\ntype NamedElementRendersStateWhenOf<\n Children,\n Identity extends string,\n Property extends string,\n StateName extends string,\n Expected extends Visibility,\n Owner extends string = never,\n Current extends Visibility = {},\n Seen extends readonly unknown[] = [],\n Depth extends readonly unknown[] = [],\n> = Depth['length'] extends 8\n ? false\n : Children extends readonly (infer Child)[]\n ? NamedElementRendersStateWhenOf<\n Child,\n Identity,\n Property,\n StateName,\n Expected,\n Owner,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : Children extends ElementNodeBase<\n any,\n infer Tag,\n infer Props,\n infer Nested,\n infer LocalName\n >\n ?\n | (NamedElementMatches<\n Owner,\n Identity,\n Tag,\n Extract<LocalName, string>\n > extends true\n ? Property extends keyof Props\n ? ValueUsesState<Props[Property], StateName> extends true\n ? VisibilityMatches<Current, Expected>\n : false\n : false\n : false)\n | NamedElementRendersStateWhenOf<\n Nested,\n Identity,\n Property,\n StateName,\n Expected,\n Owner,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : Children extends CraftDirectiveNode<any>\n ? NamedElementRendersStateWhenOf<\n Children['node'],\n Identity,\n Property,\n StateName,\n Expected,\n Owner,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : Children extends ComponentNode<any, any, infer Component>\n ? Component extends Seen[number]\n ? false\n : NamedElementRendersStateWhenOf<\n ReturnType<ComponentTemplateOf<Component>>,\n Identity,\n Property,\n StateName,\n Expected,\n ComponentName<Component>,\n Current,\n [...Seen, Component],\n [...Depth, unknown]\n >\n : Children extends EachNode<\n any,\n any,\n any,\n infer SourceName,\n infer Item,\n infer Empty\n >\n ?\n | NamedElementRendersStateWhenOf<\n Item,\n Identity,\n Property,\n StateName,\n Expected,\n Owner,\n Extract<SourceName, string> extends never\n ? Current\n : AddVisibility<\n Current,\n Extract<SourceName, string>,\n 'nonEmpty'\n >,\n Seen,\n [...Depth, unknown]\n >\n | NamedElementRendersStateWhenOf<\n Empty,\n Identity,\n Property,\n StateName,\n Expected,\n Owner,\n Extract<SourceName, string> extends never\n ? Current\n : AddVisibility<\n Current,\n Extract<SourceName, string>,\n 'empty'\n >,\n Seen,\n [...Depth, unknown]\n >\n : Children extends IfBlockNode<\n infer ConditionName,\n any,\n infer True,\n infer False\n >\n ?\n | NamedElementRendersStateWhenOf<\n True,\n Identity,\n Property,\n StateName,\n Expected,\n Owner,\n AddVisibility<Current, ConditionName, true>,\n Seen,\n [...Depth, unknown]\n >\n | NamedElementRendersStateWhenOf<\n False,\n Identity,\n Property,\n StateName,\n Expected,\n Owner,\n AddVisibility<Current, ConditionName, false>,\n Seen,\n [...Depth, unknown]\n >\n : Children extends DeferNode<infer Loaded>\n ? NamedElementRendersStateWhenOf<\n Loaded extends CraftComponent<any, any>\n ? ReturnType<ComponentTemplateOf<Loaded>>\n : ReturnType<Children['resolve']>,\n Identity,\n Property,\n StateName,\n Expected,\n Owner,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : false;\n\n/** Checks that a named element property is driven by a context state. */\nexport type TemplateNamedElementRendersStateWhen<\n Template,\n Identity extends TemplateNamedElementIdentity<Template>,\n Property extends TemplateNamedElementProperty<Template, Identity>,\n StateName extends TemplateContextMethodOf<Template>,\n Conditions extends { readonly when?: Visibility } = {},\n> = TemplateContextUseResult<\n NamedElementRendersStateWhenOf<\n TemplateContractOutput<Template>,\n Identity,\n Property,\n StateName,\n Conditions extends { readonly when: infer When extends Visibility }\n ? When\n : {},\n TemplateContractOwner<Template>\n >\n>;\n\ntype VisitNamedElement<\n Children,\n Identity extends string,\n Expected extends Visibility,\n Owner extends string = never,\n Current extends Visibility = {},\n Seen extends readonly unknown[] = [],\n Depth extends readonly unknown[] = [],\n> = Depth['length'] extends 8\n ? false\n : Children extends readonly (infer Child)[]\n ? VisitNamedElement<\n Child,\n Identity,\n Expected,\n Owner,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : Children extends ElementNodeBase<\n any,\n infer Tag,\n any,\n infer Nested,\n infer LocalName\n >\n ?\n | (NamedElementMatches<\n Owner,\n Identity,\n Tag,\n Extract<LocalName, string>\n > extends true\n ? VisibilityMatches<Current, Expected>\n : false)\n | VisitNamedElement<\n Nested,\n Identity,\n Expected,\n Owner,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : Children extends CraftDirectiveNode<any>\n ? VisitNamedElement<\n Children['node'],\n Identity,\n Expected,\n Owner,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : Children extends ComponentNode<any, any, infer Component>\n ? Component extends Seen[number]\n ? false\n : VisitNamedElement<\n ReturnType<ComponentTemplateOf<Component>>,\n Identity,\n Expected,\n ComponentName<Component>,\n Current,\n [...Seen, Component],\n [...Depth, unknown]\n >\n : Children extends EachNode<\n any,\n any,\n any,\n infer SourceName,\n infer Item,\n infer Empty\n >\n ?\n | VisitNamedElement<\n Item,\n Identity,\n Expected,\n Owner,\n Extract<SourceName, string> extends never\n ? Current\n : AddVisibility<\n Current,\n Extract<SourceName, string>,\n 'nonEmpty'\n >,\n Seen,\n [...Depth, unknown]\n >\n | VisitNamedElement<\n Empty,\n Identity,\n Expected,\n Owner,\n Extract<SourceName, string> extends never\n ? Current\n : AddVisibility<\n Current,\n Extract<SourceName, string>,\n 'empty'\n >,\n Seen,\n [...Depth, unknown]\n >\n : Children extends IfBlockNode<\n infer ConditionName,\n any,\n infer True,\n infer False\n >\n ?\n | VisitNamedElement<\n True,\n Identity,\n Expected,\n Owner,\n AddVisibility<Current, ConditionName, true>,\n Seen,\n [...Depth, unknown]\n >\n | VisitNamedElement<\n False,\n Identity,\n Expected,\n Owner,\n AddVisibility<Current, ConditionName, false>,\n Seen,\n [...Depth, unknown]\n >\n : Children extends DeferNode<infer Loaded>\n ? VisitNamedElement<\n Loaded extends CraftComponent<any, any>\n ? ReturnType<ComponentTemplateOf<Loaded>>\n : ReturnType<Children['resolve']>,\n Identity,\n Expected,\n Owner,\n Current,\n Seen,\n [...Depth, unknown]\n >\n : false;\n\ntype NamedElementResult<Result> =\n true extends Extract<Result, true>\n ? true\n : Extract<Result, TemplateContractError<string>> extends never\n ? false\n : Extract<Result, TemplateContractError<string>>;\n\n/** Checks a named element and the visibility path that renders it. */\nexport type TemplateRendersNamedElementWhen<\n Children,\n Identity extends TemplateNamedElementIdentity<Children>,\n Conditions extends { readonly when?: Visibility } = {},\n> = NamedElementResult<\n VisitNamedElement<\n TemplateContractOutput<Children>,\n Identity,\n Conditions extends { readonly when: infer When extends Visibility }\n ? When\n : {},\n TemplateContractOwner<Children>\n >\n>;\n"]}
@@ -0,0 +1,11 @@
1
+ import type { CraftNodeChildren, CraftNodeChildrenDependencies, TemplateNode } from './render/vnode';
2
+ import { type CraftTemplate, type InputValue } from './types';
3
+ type TemplateContextInput<Context> = Context extends object ? {
4
+ [Key in keyof Context]: Context[Key] | InputValue<Context[Key]>;
5
+ } : Context | InputValue<Context>;
6
+ /** Creates an inert, reusable and context-checked Craft template fragment. */
7
+ export declare function craftTemplate<Context, Output extends CraftNodeChildren = CraftNodeChildren>(renderer: (context: Context) => Output): CraftTemplate<Context, Output>;
8
+ /** Schedules a typed template for rendering without evaluating it eagerly. */
9
+ export declare function renderTemplate<Context, Output extends CraftNodeChildren>(template: CraftTemplate<Context, Output>, context: TemplateContextInput<NoInfer<Context>>): TemplateNode<Context, Output, CraftNodeChildrenDependencies<Output>>;
10
+ export {};
11
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../../../libs/component/src/lib/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,6BAA6B,EAC7B,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,UAAU,EAChB,MAAM,SAAS,CAAC;AAGjB,KAAK,oBAAoB,CAAC,OAAO,IAAI,OAAO,SAAS,MAAM,GACvD;KACG,GAAG,IAAI,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;CAChE,GACD,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;AAElC,8EAA8E;AAC9E,wBAAgB,aAAa,CAC3B,OAAO,EACP,MAAM,SAAS,iBAAiB,GAAG,iBAAiB,EACpD,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAUxE;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,SAAS,iBAAiB,EACtE,QAAQ,EAAE,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,EACxC,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAC9C,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAOtE"}
@@ -0,0 +1,21 @@
1
+ import { CRAFT_TEMPLATE, } from './types';
2
+ import { currentCraftRenderContext } from './render/vnode';
3
+ /** Creates an inert, reusable and context-checked Craft template fragment. */
4
+ export function craftTemplate(renderer) {
5
+ const template = ((context) => renderer(context));
6
+ Object.defineProperty(template, CRAFT_TEMPLATE, {
7
+ value: true,
8
+ enumerable: false,
9
+ });
10
+ return template;
11
+ }
12
+ /** Schedules a typed template for rendering without evaluating it eagerly. */
13
+ export function renderTemplate(template, context) {
14
+ return {
15
+ kind: 'template',
16
+ template,
17
+ context: context,
18
+ declarationContext: currentCraftRenderContext(),
19
+ };
20
+ }
21
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../../../libs/component/src/lib/template.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,cAAc,GAGf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAQ3D,8EAA8E;AAC9E,MAAM,UAAU,aAAa,CAG3B,QAAsC;IACtC,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAGxD,CAAC;IACF,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE;QAC9C,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAC5B,QAAwC,EACxC,OAA+C;IAE/C,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ;QACR,OAAO,EAAE,OAAkB;QAC3B,kBAAkB,EAAE,yBAAyB,EAAE;KAChD,CAAC;AACJ,CAAC","sourcesContent":["import type {\n CraftNodeChildren,\n CraftNodeChildrenDependencies,\n TemplateNode,\n} from './render/vnode';\nimport {\n CRAFT_TEMPLATE,\n type CraftTemplate,\n type InputValue,\n} from './types';\nimport { currentCraftRenderContext } from './render/vnode';\n\ntype TemplateContextInput<Context> = Context extends object\n ? {\n [Key in keyof Context]: Context[Key] | InputValue<Context[Key]>;\n }\n : Context | InputValue<Context>;\n\n/** Creates an inert, reusable and context-checked Craft template fragment. */\nexport function craftTemplate<\n Context,\n Output extends CraftNodeChildren = CraftNodeChildren,\n>(renderer: (context: Context) => Output): CraftTemplate<Context, Output> {\n const template = ((context: Context) => renderer(context)) as CraftTemplate<\n Context,\n Output\n >;\n Object.defineProperty(template, CRAFT_TEMPLATE, {\n value: true,\n enumerable: false,\n });\n return template;\n}\n\n/** Schedules a typed template for rendering without evaluating it eagerly. */\nexport function renderTemplate<Context, Output extends CraftNodeChildren>(\n template: CraftTemplate<Context, Output>,\n context: TemplateContextInput<NoInfer<Context>>,\n): TemplateNode<Context, Output, CraftNodeChildrenDependencies<Output>> {\n return {\n kind: 'template',\n template,\n context: context as Context,\n declarationContext: currentCraftRenderContext(),\n };\n}\n"]}
@@ -0,0 +1,157 @@
1
+ import { type CraftServiceProvider, type CompleteServiceDependencyMapFromYielded, type FlattenDependencyTree } from '@craft-ts/core';
2
+ import { type ComponentFactory, type ComponentTemplate, type CraftComponent, type CraftDirective, type FactoryContext, type FactoryYielded, type PropsOf, type TemplateDependencies } from './types';
3
+ import type { CraftTemplateLocatorApi } from './locator';
4
+ type IsAny<T> = 0 extends 1 & T ? true : false;
5
+ type ComponentFactoryOf<Component> = Component extends CraftComponent<any, any, infer Factory extends ComponentFactory> ? Factory : ComponentFactory;
6
+ type ComponentTemplateDepsOf<Component> = Component extends CraftComponent<any, any, any, any, any, infer TemplateDeps> ? TemplateDeps : {};
7
+ type LogicDependenciesOf<Component> = Component extends CraftComponent<any, infer Dependencies extends object> ? Omit<Dependencies, 'missingProvider'> & {
8
+ missingProvider: {};
9
+ } : {};
10
+ type ServiceNamesFromNodeMap<Dependencies extends object> = IsAny<Dependencies> extends true ? never : string extends keyof Dependencies ? never : Extract<keyof FlattenDependencyTree<Dependencies>, string>;
11
+ type ServiceNamesFromProperties<Properties extends object> = {
12
+ [Name in Extract<keyof Properties, string>]: Properties[Name] extends object ? ServiceNamesFromNodeMap<Properties[Name]> : never;
13
+ }[Extract<keyof Properties, string>];
14
+ type ServiceNamesFromContract<Contract> = Contract extends object ? (Contract extends {
15
+ deps: infer Dependencies extends object;
16
+ } ? ServiceNamesFromNodeMap<Dependencies> : never) | (Contract extends {
17
+ propertiesDeps: infer Properties extends object;
18
+ } ? ServiceNamesFromProperties<Properties> : never) | (Contract extends {
19
+ missingProvider: infer Missing extends object;
20
+ } ? ServiceNamesFromNodeMap<Missing> : never) : never;
21
+ /** The dependency contract used when only a Craft component factory is tested. */
22
+ export type CraftComponentLogicDepsOf<Component> = LogicDependenciesOf<Component>;
23
+ /** The service dependency contract used when only a Craft component template is tested. */
24
+ export type CraftComponentTemplateDepsOf<Component> = {
25
+ deps: Record<Extract<ServiceNamesFromContract<ComponentTemplateDepsOf<Component>>, string>, unknown>;
26
+ propertiesDeps: {};
27
+ provided: {};
28
+ publicProperties: {};
29
+ missingProvider: {};
30
+ };
31
+ type DirectiveLogicFactory<Directive> = Directive extends CraftDirective<infer Logic, any, any> ? ReturnType<Logic> extends ComponentFactory ? ReturnType<Logic> : ComponentFactory : ComponentFactory;
32
+ type LogicDependenciesForFactory<Factory extends ComponentFactory> = {
33
+ deps: CompleteServiceDependencyMapFromYielded<FactoryYielded<Factory>>;
34
+ propertiesDeps: {};
35
+ provided: {};
36
+ publicProperties: {};
37
+ missingProvider: {};
38
+ };
39
+ type TemplateContractForTemplate<Template extends ComponentTemplate<any>> = {
40
+ deps: Record<Extract<ServiceNamesFromContract<TemplateDependencies<Template>>, string>, unknown>;
41
+ };
42
+ /** The dependency contract added by a directive's logic decorator. */
43
+ export type CraftDirectiveLogicDepsOf<Directive> = LogicDependenciesForFactory<DirectiveLogicFactory<Directive>>;
44
+ type DirectiveTemplateDependenciesOf<Directive> = Directive extends CraftDirective<any, infer Template, any> ? Template extends (baseTemplate: ComponentTemplate<any>) => infer Decorated ? TemplateDependencies<Decorated> : {} : {};
45
+ /** The service dependencies used by a directive's template decorator. */
46
+ export type CraftDirectiveTemplateDepsOf<Directive> = {
47
+ deps: Record<Extract<ServiceNamesFromContract<DirectiveTemplateDependenciesOf<Directive>>, string>, unknown>;
48
+ propertiesDeps: {};
49
+ provided: {};
50
+ publicProperties: {};
51
+ missingProvider: {};
52
+ };
53
+ type RegisterValue = 'real' | 'provided' | 'notReached' | CraftServiceProvider | Record<string, unknown>;
54
+ type RegisterForNames<Names extends string> = {
55
+ [Name in Names]: RegisterValue;
56
+ };
57
+ type RegisterForContract<Contract> = RegisterForNames<Extract<ServiceNamesFromContract<Contract>, string>>;
58
+ type AppStartDecision = 'run' | 'ignore';
59
+ type TestBedOptions = {
60
+ providers?: CraftServiceProvider[];
61
+ appStart?: Record<string, AppStartDecision>;
62
+ };
63
+ type LogicOptions<Factory extends ComponentFactory, Contract> = TestBedOptions & {
64
+ register: RegisterForContract<Contract>;
65
+ args?: Parameters<Factory>;
66
+ };
67
+ type TemplateOptions<Context, Contract> = TestBedOptions & {
68
+ context: Context;
69
+ register: RegisterForContract<Contract>;
70
+ detectChanges?: boolean;
71
+ };
72
+ declare function setupCraftComponentLogicTestImpl<Component extends CraftComponent<any>, const Contract extends CraftComponentLogicDepsOf<Component> = CraftComponentLogicDepsOf<Component>>(component: Component, options: LogicOptions<ComponentFactoryOf<Component>, Contract>): Promise<{
73
+ context: Awaited<import("@craft-ts/core").ResolveGeneratorResult<ReturnType<ComponentFactoryOf<Component>>>>;
74
+ mocks: Record<string, unknown>;
75
+ injector: import("@craft-ts/core").CraftInjector;
76
+ destroy: () => void;
77
+ }>;
78
+ export declare const setupCraftComponentLogicTest: typeof setupCraftComponentLogicTestImpl & {
79
+ byRegister: typeof setupCraftComponentLogicTestImpl;
80
+ };
81
+ type TemplateTestResult<Component extends CraftComponent<any>, Context> = CraftTemplateLocatorApi<Component> & {
82
+ nativeElement: HTMLDivElement;
83
+ element: HTMLDivElement;
84
+ mocks: Record<string, unknown>;
85
+ detectChanges(): void;
86
+ updateContext(context: Context): void;
87
+ destroy(): void;
88
+ toBeAccessible(): Promise<void>;
89
+ getByRole(role: string, options?: {
90
+ name?: string | RegExp;
91
+ }): HTMLElement;
92
+ queryByRole(role: string, options?: {
93
+ name?: string | RegExp;
94
+ }): HTMLElement | undefined;
95
+ getByLabel(name: string | RegExp): HTMLElement;
96
+ queryByLabel(name: string | RegExp): HTMLElement | undefined;
97
+ };
98
+ declare function setupCraftComponentTemplateTestImpl<Component extends CraftComponent<any>, const Contract extends CraftComponentTemplateDepsOf<Component> = CraftComponentTemplateDepsOf<Component>, Context = unknown>(component: Component, options: TemplateOptions<Context, Contract>): Promise<TemplateTestResult<Component, Context>>;
99
+ export declare const setupCraftComponentTemplateTest: typeof setupCraftComponentTemplateTestImpl & {
100
+ byRegister: typeof setupCraftComponentTemplateTestImpl;
101
+ };
102
+ export declare function renderCraftComponent<Component extends CraftComponent<any>>(component: Component, options?: {
103
+ props?: PropsOf<Component>;
104
+ providers?: CraftServiceProvider[];
105
+ }): Promise<{
106
+ nativeElement: HTMLDivElement;
107
+ element: HTMLDivElement;
108
+ mounted: import("./render/interpreter").MountedCraftComponent<PropsOf<Component>>;
109
+ injector: import("@craft-ts/core").ɵEnvironmentInjector & import("@craft-ts/core").CraftInjector;
110
+ detectChanges: () => void;
111
+ flush: () => Promise<void>;
112
+ destroy(): void;
113
+ }>;
114
+ type DirectiveLogicOptions<BaseLogic extends ComponentFactory, Contract> = LogicOptions<BaseLogic, Contract> & {
115
+ baseLogic: BaseLogic;
116
+ };
117
+ declare function setupCraftDirectiveLogicTestImpl<Directive extends CraftDirective, const BaseLogic extends ComponentFactory, const Contract extends CraftDirectiveLogicDepsOf<Directive> & LogicDependenciesForFactory<BaseLogic> = CraftDirectiveLogicDepsOf<Directive> & LogicDependenciesForFactory<BaseLogic>>(directive: Directive, options: DirectiveLogicOptions<BaseLogic, Contract>): Promise<{
118
+ context: FactoryContext<DirectiveLogicFactory<Directive>>;
119
+ mocks: Record<string, unknown>;
120
+ injector: import("@craft-ts/core").ɵEnvironmentInjector & import("@craft-ts/core").CraftInjector;
121
+ destroy: () => void;
122
+ }>;
123
+ export declare const setupCraftDirectiveLogicTest: typeof setupCraftDirectiveLogicTestImpl & {
124
+ byRegister: typeof setupCraftDirectiveLogicTestImpl;
125
+ };
126
+ type DirectiveTemplateOptions<Context, Contract> = TemplateOptions<Context, Contract> & {
127
+ baseTemplate: ComponentTemplate<any>;
128
+ };
129
+ declare function setupCraftDirectiveTemplateTestImpl<Directive extends CraftDirective, const BaseTemplate extends ComponentTemplate<any>, const Contract extends CraftDirectiveTemplateDepsOf<Directive> & TemplateContractForTemplate<BaseTemplate> = CraftDirectiveTemplateDepsOf<Directive> & TemplateContractForTemplate<BaseTemplate>, Context = unknown>(directive: Directive, options: DirectiveTemplateOptions<Context, Contract> & {
130
+ baseTemplate: BaseTemplate;
131
+ }): Promise<{
132
+ detectChanges: () => void;
133
+ updateContext(context: Context): void;
134
+ destroy(): void;
135
+ getByRole(role: string, options?: {
136
+ name?: string | RegExp;
137
+ }): HTMLElement;
138
+ queryByRole(role: string, options?: {
139
+ name?: string | RegExp;
140
+ }): HTMLElement | undefined;
141
+ getByLabel(name: string | RegExp): HTMLElement;
142
+ queryByLabel(name: string | RegExp): HTMLElement | undefined;
143
+ nativeElement: HTMLDivElement;
144
+ element: HTMLDivElement;
145
+ mocks: Record<string, unknown>;
146
+ }>;
147
+ export declare const setupCraftDirectiveTemplateTest: typeof setupCraftDirectiveTemplateTestImpl & {
148
+ byRegister: typeof setupCraftDirectiveTemplateTestImpl;
149
+ };
150
+ /**
151
+ * WCAG 2.2 AA smoke checks on a mounted Craft tree. Complements axe/AccessLint
152
+ * in application CI: images have alt, controls have a name, tabindex is not
153
+ * positive, ARIA attributes are known.
154
+ */
155
+ export declare function assertAccessible(container: Element): Promise<void>;
156
+ export {};
157
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../../../libs/component/src/lib/testing.ts"],"names":[],"mappings":"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"}