@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,55 @@
1
+ import { CRAFT_DIRECTIVE, COMPONENT_CATCH_BLOCK, } from './types';
2
+ export const CATCH_BLOCK_DIRECTIVE = Symbol('craft-catch-block-directive');
3
+ export class CraftUnhandledExceptionError extends Error {
4
+ _tag;
5
+ constructor(exception) {
6
+ super(`Unhandled Craft exception "${exception._tag}" escaped every block boundary.`);
7
+ this.name = 'CraftUnhandledExceptionError';
8
+ this._tag = exception._tag;
9
+ }
10
+ }
11
+ export function resolveCatchBlockHandler(handler, exception, defaultShowSource, defaultPosition) {
12
+ if (typeof handler === 'function') {
13
+ return {
14
+ children: handler(exception),
15
+ showSource: defaultShowSource,
16
+ position: defaultPosition,
17
+ };
18
+ }
19
+ return {
20
+ children: handler.render(exception),
21
+ showSource: handler.showSource ?? defaultShowSource,
22
+ position: handler.position ?? defaultPosition,
23
+ };
24
+ }
25
+ /** A template boundary which keeps its source block and inserts a fallback. */
26
+ export const catchBlock = {
27
+ exhaustive(handlers, options = {}) {
28
+ const position = options.position ?? 'after';
29
+ const directive = (() => undefined);
30
+ Object.defineProperty(directive, CRAFT_DIRECTIVE, {
31
+ value: {
32
+ name: 'catchBlock.exhaustive',
33
+ meta: {},
34
+ logic: (baseLogic) => baseLogic,
35
+ template: (baseTemplate) => baseTemplate,
36
+ componentOperator: {
37
+ kind: 'catchBlock',
38
+ catchHandlers: handlers,
39
+ catchBlockPosition: position,
40
+ },
41
+ },
42
+ enumerable: false,
43
+ });
44
+ Object.defineProperty(directive, CATCH_BLOCK_DIRECTIVE, {
45
+ value: { handlers, position },
46
+ enumerable: false,
47
+ });
48
+ Object.defineProperty(directive, COMPONENT_CATCH_BLOCK, {
49
+ value: true,
50
+ enumerable: false,
51
+ });
52
+ return directive;
53
+ },
54
+ };
55
+ //# sourceMappingURL=block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../../../../../libs/component/src/lib/block.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,qBAAqB,GAOtB,MAAM,SAAS,CAAC;AAGjB,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC;AAI3E,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAC5C,IAAI,CAAS;IAEtB,YAAY,SAA4B;QACtC,KAAK,CACH,8BAA8B,SAAS,CAAC,IAAI,iCAAiC,CAC9E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;CACF;AAgBD,MAAM,UAAU,wBAAwB,CACtC,OAA+B,EAC/B,SAA4B,EAC5B,iBAA0B,EAC1B,eAAmC;IAMnC,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO;YACL,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC;YAC5B,UAAU,EAAE,iBAAiB;YAC7B,QAAQ,EAAE,eAAe;SAC1B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;QACnC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,iBAAiB;QACnD,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,eAAe;KAC9C,CAAC;AACJ,CAAC;AAYD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,UAAU,CACR,QAAkB,EAClB,UAAsD,EAAE;QAExD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC;QAC7C,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,CACtB,SAAS,CAA6C,CAAC;QACzD,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,eAAe,EAAE;YAChD,KAAK,EAAE;gBACL,IAAI,EAAE,uBAAuB;gBAC7B,IAAI,EAAE,EAAE;gBACR,KAAK,EAAE,CAAC,SAAkC,EAAE,EAAE,CAAC,SAAS;gBACxD,QAAQ,EAAE,CAAC,YAAmC,EAAE,EAAE,CAAC,YAAY;gBAC/D,iBAAiB,EAAE;oBACjB,IAAI,EAAE,YAAY;oBAClB,aAAa,EAAE,QAAQ;oBACvB,kBAAkB,EAAE,QAAQ;iBAC7B;aACF;YACD,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,qBAAqB,EAAE;YACtD,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;YAC7B,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,qBAAqB,EAAE;YACtD,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;CACF,CAAC","sourcesContent":["import type { AnyCraftException } from '@craft-ts/core';\nimport {\n CRAFT_DIRECTIVE,\n COMPONENT_CATCH_BLOCK,\n type ComponentOperator,\n type ComponentExceptionHandler,\n type ComponentExceptionHandlerDefinition,\n type ComponentExceptionHandlerEntry,\n type ComponentExceptionHandlerOptions,\n type CraftDirective,\n} from './types';\nimport type { CraftNodeChildren } from './render/vnode';\n\nexport const CATCH_BLOCK_DIRECTIVE = Symbol('craft-catch-block-directive');\n\nexport type CatchBlockPosition = 'before' | 'after';\n\nexport class CraftUnhandledExceptionError extends Error {\n readonly _tag: string;\n\n constructor(exception: AnyCraftException) {\n super(\n `Unhandled Craft exception \"${exception._tag}\" escaped every block boundary.`,\n );\n this.name = 'CraftUnhandledExceptionError';\n this._tag = exception._tag;\n }\n}\n\nexport type CatchBlockHandler = ComponentExceptionHandler;\nexport type CatchBlockHandlerOptions = ComponentExceptionHandlerOptions;\nexport type CatchBlockHandlerDefinition = ComponentExceptionHandlerDefinition;\nexport type CatchBlockHandlerEntry = ComponentExceptionHandlerEntry;\nexport type CatchBlockHandlers = Record<string, CatchBlockHandlerEntry>;\nexport type CatchBlockHandlerChildren<Handler> =\n Handler extends ComponentExceptionHandlerEntry\n ? Handler extends (...args: any[]) => infer Children\n ? Children\n : Handler extends { readonly render: (...args: any[]) => infer Children }\n ? Children\n : never\n : never;\n\nexport function resolveCatchBlockHandler(\n handler: CatchBlockHandlerEntry,\n exception: AnyCraftException,\n defaultShowSource: boolean,\n defaultPosition: CatchBlockPosition,\n): {\n readonly children: CraftNodeChildren;\n readonly showSource: boolean;\n readonly position: CatchBlockPosition;\n} {\n if (typeof handler === 'function') {\n return {\n children: handler(exception),\n showSource: defaultShowSource,\n position: defaultPosition,\n };\n }\n\n return {\n children: handler.render(exception),\n showSource: handler.showSource ?? defaultShowSource,\n position: handler.position ?? defaultPosition,\n };\n}\n\nexport type CatchBlockDirective<Handlers extends CatchBlockHandlers> =\n CraftDirective &\n ComponentOperator<readonly [], Extract<keyof Handlers, string>> & {\n readonly [COMPONENT_CATCH_BLOCK]: true;\n readonly [CATCH_BLOCK_DIRECTIVE]: {\n readonly handlers: Handlers;\n readonly position: CatchBlockPosition;\n };\n };\n\n/** A template boundary which keeps its source block and inserts a fallback. */\nexport const catchBlock = {\n exhaustive<const Handlers extends CatchBlockHandlers>(\n handlers: Handlers,\n options: { readonly position?: CatchBlockPosition } = {},\n ): CatchBlockDirective<Handlers> {\n const position = options.position ?? 'after';\n const directive = (() =>\n undefined) as unknown as CatchBlockDirective<Handlers>;\n Object.defineProperty(directive, CRAFT_DIRECTIVE, {\n value: {\n name: 'catchBlock.exhaustive',\n meta: {},\n logic: (baseLogic: (...args: any[]) => any) => baseLogic,\n template: (baseTemplate: (context: any) => any) => baseTemplate,\n componentOperator: {\n kind: 'catchBlock',\n catchHandlers: handlers,\n catchBlockPosition: position,\n },\n },\n enumerable: false,\n });\n Object.defineProperty(directive, CATCH_BLOCK_DIRECTIVE, {\n value: { handlers, position },\n enumerable: false,\n });\n Object.defineProperty(directive, COMPONENT_CATCH_BLOCK, {\n value: true,\n enumerable: false,\n });\n return directive;\n },\n};\n"]}
@@ -0,0 +1,32 @@
1
+ import { ɵinject as inject, type CraftInjector } from '@craft-ts/core';
2
+ export type BootstrapCraftOptions = {
3
+ /**
4
+ * The result of `craftAppConfig(...)`. Its `providers` already carry the
5
+ * root component, the router and one APP_INITIALIZER per appStart service.
6
+ */
7
+ readonly config: {
8
+ readonly providers: readonly unknown[];
9
+ };
10
+ /**
11
+ * Where to mount. Defaults to the first `<craft-root>` in the document, or
12
+ * `document.body` when there is none.
13
+ */
14
+ readonly host?: Element;
15
+ };
16
+ export type CraftAppRef = {
17
+ readonly injector: CraftInjector;
18
+ destroy(): void;
19
+ };
20
+ export declare function ɵcreateCraftApplicationInjector(config: BootstrapCraftOptions['config'], additionalProviders?: readonly unknown[]): CraftInjector;
21
+ export declare function ɵrunCraftAppInitializers(injector: CraftInjector): readonly unknown[];
22
+ /**
23
+ * Boots a Craft application: builds the root injector, runs the app-start
24
+ * hooks, then mounts the root component.
25
+ *
26
+ * This replaces Angular's `bootstrapApplication`. There is no platform to
27
+ * create and no zone to enter — an injector and a mount is the whole of it.
28
+ */
29
+ export declare function bootstrapCraft(options: BootstrapCraftOptions): CraftAppRef;
30
+ /** Re-exported so apps can reach the boot injector without importing core. */
31
+ export { inject as ɵbootstrapInject };
32
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../../../libs/component/src/lib/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAWL,OAAO,IAAI,MAAM,EAEjB,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AAKxB,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,OAAO,EAAE,CAAA;KAAE,CAAC;IAC5D;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC;AAOF,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EACvC,mBAAmB,GAAE,SAAS,OAAO,EAAO,GAC3C,aAAa,CAkBf;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,aAAa,GACtB,SAAS,OAAO,EAAE,CAMpB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,WAAW,CA+B1E;AAED,8EAA8E;AAC9E,OAAO,EAAE,MAAM,IAAI,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { APP_INITIALIZER, COMPONENT_REGISTER, CRAFT_PLATFORM, CRAFT_PRIMITIVE_REGISTRY, CraftPrimitiveRegistry, createBrowserPlatform, createComponentRegister, createCraftInjector, ɵcreateEnvironmentInjector as createEnvironmentInjector, ɵgetCraftRootDefaultProviders as getCraftRootDefaultProviders, ɵinject as inject, ɵrunInInjectionContext as runInInjectionContext, } from '@craft-ts/core';
2
+ import { mountCraftComponent } from './bridge';
3
+ import { CRAFT_ROOT_COMPONENT } from './craft-host-tokens';
4
+ function resolveHost(host) {
5
+ if (host)
6
+ return host;
7
+ return document.querySelector('craft-root') ?? document.body;
8
+ }
9
+ export function ɵcreateCraftApplicationInjector(config, additionalProviders = []) {
10
+ return createEnvironmentInjector([
11
+ ...getCraftRootDefaultProviders(),
12
+ {
13
+ provide: COMPONENT_REGISTER,
14
+ useValue: createComponentRegister(),
15
+ },
16
+ {
17
+ provide: CRAFT_PRIMITIVE_REGISTRY,
18
+ useValue: new CraftPrimitiveRegistry(),
19
+ },
20
+ ...config.providers,
21
+ ...additionalProviders,
22
+ ], createCraftInjector([]), 'CraftApp');
23
+ }
24
+ export function ɵrunCraftAppInitializers(injector) {
25
+ return injector
26
+ .get(APP_INITIALIZER, [])
27
+ .map((initializer) => runInInjectionContext(injector, initializer));
28
+ }
29
+ /**
30
+ * Boots a Craft application: builds the root injector, runs the app-start
31
+ * hooks, then mounts the root component.
32
+ *
33
+ * This replaces Angular's `bootstrapApplication`. There is no platform to
34
+ * create and no zone to enter — an injector and a mount is the whole of it.
35
+ */
36
+ export function bootstrapCraft(options) {
37
+ const platform = createBrowserPlatform(window);
38
+ const injector = ɵcreateCraftApplicationInjector(options.config, [
39
+ { provide: CRAFT_PLATFORM, useValue: platform },
40
+ ]);
41
+ // appStart hooks run before the first render, so a service that seeds state
42
+ // has done so by the time the root component reads it.
43
+ ɵrunCraftAppInitializers(injector);
44
+ const root = injector.get(CRAFT_ROOT_COMPONENT);
45
+ if (!root) {
46
+ throw new Error('bootstrapCraft found no root component. Add provideCraftRootComponent(App) to your app config.');
47
+ }
48
+ const mounted = mountCraftComponent(root, resolveHost(options.host), injector);
49
+ return {
50
+ injector,
51
+ destroy() {
52
+ mounted.destroy();
53
+ platform.history.dispose();
54
+ injector.destroy?.();
55
+ },
56
+ };
57
+ }
58
+ /** Re-exported so apps can reach the boot injector without importing core. */
59
+ export { inject as ɵbootstrapInject };
60
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../../../libs/component/src/lib/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,0BAA0B,IAAI,yBAAyB,EACvD,6BAA6B,IAAI,4BAA4B,EAC7D,OAAO,IAAI,MAAM,EACjB,sBAAsB,IAAI,qBAAqB,GAEhD,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAqB3D,SAAS,WAAW,CAAC,IAAyB;IAC5C,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,MAAuC,EACvC,sBAA0C,EAAE;IAE5C,OAAO,yBAAyB,CAC9B;QACE,GAAG,4BAA4B,EAAE;QACjC;YACE,OAAO,EAAE,kBAAkB;YAC3B,QAAQ,EAAE,uBAAuB,EAAE;SACpC;QACD;YACE,OAAO,EAAE,wBAAwB;YACjC,QAAQ,EAAE,IAAI,sBAAsB,EAAE;SACvC;QACD,GAAG,MAAM,CAAC,SAAS;QACnB,GAAG,mBAAmB;KACvB,EACD,mBAAmB,CAAC,EAAE,CAAC,EACvB,UAAU,CACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,QAAuB;IAEvB,OAAO,QAAQ;SACZ,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC;SACxB,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CACnB,qBAAqB,CAAC,QAAQ,EAAE,WAA4B,CAAC,CAC9D,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,+BAA+B,CAAC,OAAO,CAAC,MAAM,EAAE;QAC/D,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE;KAChD,CAAC,CAAC;IAEH,4EAA4E;IAC5E,uDAAuD;IACvD,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAwB,CAAC;IACvE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,mBAAmB,CACjC,IAAI,EACJ,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EACzB,QAAQ,CACT,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,OAAO;YACL,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,QAAiC,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,OAAO,EAAE,MAAM,IAAI,gBAAgB,EAAE,CAAC","sourcesContent":["import {\n APP_INITIALIZER,\n COMPONENT_REGISTER,\n CRAFT_PLATFORM,\n CRAFT_PRIMITIVE_REGISTRY,\n CraftPrimitiveRegistry,\n createBrowserPlatform,\n createComponentRegister,\n createCraftInjector,\n ɵcreateEnvironmentInjector as createEnvironmentInjector,\n ɵgetCraftRootDefaultProviders as getCraftRootDefaultProviders,\n ɵinject as inject,\n ɵrunInInjectionContext as runInInjectionContext,\n type CraftInjector,\n} from '@craft-ts/core';\nimport { mountCraftComponent } from './bridge';\nimport { CRAFT_ROOT_COMPONENT } from './craft-host-tokens';\nimport type { CraftComponent } from './types';\n\nexport type BootstrapCraftOptions = {\n /**\n * The result of `craftAppConfig(...)`. Its `providers` already carry the\n * root component, the router and one APP_INITIALIZER per appStart service.\n */\n readonly config: { readonly providers: readonly unknown[] };\n /**\n * Where to mount. Defaults to the first `<craft-root>` in the document, or\n * `document.body` when there is none.\n */\n readonly host?: Element;\n};\n\nexport type CraftAppRef = {\n readonly injector: CraftInjector;\n destroy(): void;\n};\n\nfunction resolveHost(host: Element | undefined): Element {\n if (host) return host;\n return document.querySelector('craft-root') ?? document.body;\n}\n\nexport function ɵcreateCraftApplicationInjector(\n config: BootstrapCraftOptions['config'],\n additionalProviders: readonly unknown[] = [],\n): CraftInjector {\n return createEnvironmentInjector(\n [\n ...getCraftRootDefaultProviders(),\n {\n provide: COMPONENT_REGISTER,\n useValue: createComponentRegister(),\n },\n {\n provide: CRAFT_PRIMITIVE_REGISTRY,\n useValue: new CraftPrimitiveRegistry(),\n },\n ...config.providers,\n ...additionalProviders,\n ],\n createCraftInjector([]),\n 'CraftApp',\n );\n}\n\nexport function ɵrunCraftAppInitializers(\n injector: CraftInjector,\n): readonly unknown[] {\n return injector\n .get(APP_INITIALIZER, [])\n .map((initializer) =>\n runInInjectionContext(injector, initializer as () => unknown),\n );\n}\n\n/**\n * Boots a Craft application: builds the root injector, runs the app-start\n * hooks, then mounts the root component.\n *\n * This replaces Angular's `bootstrapApplication`. There is no platform to\n * create and no zone to enter — an injector and a mount is the whole of it.\n */\nexport function bootstrapCraft(options: BootstrapCraftOptions): CraftAppRef {\n const platform = createBrowserPlatform(window);\n const injector = ɵcreateCraftApplicationInjector(options.config, [\n { provide: CRAFT_PLATFORM, useValue: platform },\n ]);\n\n // appStart hooks run before the first render, so a service that seeds state\n // has done so by the time the root component reads it.\n ɵrunCraftAppInitializers(injector);\n\n const root = injector.get(CRAFT_ROOT_COMPONENT) as CraftComponent<any>;\n if (!root) {\n throw new Error(\n 'bootstrapCraft found no root component. Add provideCraftRootComponent(App) to your app config.',\n );\n }\n\n const mounted = mountCraftComponent(\n root,\n resolveHost(options.host),\n injector,\n );\n\n return {\n injector,\n destroy() {\n mounted.destroy();\n platform.history.dispose();\n (injector as { destroy?(): void }).destroy?.();\n },\n };\n}\n\n/** Re-exported so apps can reach the boot injector without importing core. */\nexport { inject as ɵbootstrapInject };\n"]}
@@ -0,0 +1,56 @@
1
+ import { type ComponentDepsCarrier, type ComponentDepsOf, type ComponentExceptionsCarrier, type CraftRouteLazyLoadHelpers } from '@craft-ts/core';
2
+ import { type MountedCraftComponent } from './render/interpreter';
3
+ import type { ComponentFieldExceptionsOf, ComponentInitializationExceptionsOf, ComponentCssVarsOf, ComponentNameOf, CraftComponent, PropsOf } from './types';
4
+ import type { CssVarContract } from './css-vars.type';
5
+ export type CraftMountRef<Props extends object> = MountedCraftComponent<Props>;
6
+ type IsAny<Value> = 0 extends 1 & Value ? true : false;
7
+ type RequireHandledMountFieldExceptions<Component> = IsAny<ComponentFieldExceptionsOf<Component>> extends true ? unknown : unknown extends ComponentFieldExceptionsOf<Component> ? unknown : [ComponentFieldExceptionsOf<Component>] extends [never] ? unknown : {
8
+ 'fieldExceptionBlock.exhaustive is required before mounting component field exceptions': ComponentFieldExceptionsOf<Component>;
9
+ };
10
+ export declare function mountCraftComponent<Component extends CraftComponent<any>>(component: Component & RequireHandledMountFieldExceptions<Component>, hostElement: Element, injector: object, props?: PropsOf<Component>): CraftMountRef<PropsOf<Component>>;
11
+ type ValueProvider = {
12
+ provide: object;
13
+ useValue: unknown;
14
+ multi?: boolean;
15
+ };
16
+ type Route = {
17
+ providers?: readonly unknown[];
18
+ };
19
+ type Type<T> = new (...args: never[]) => T;
20
+ export { CRAFT_GLOBAL_ERROR_COMPONENT, CRAFT_PENDING_COMPONENT, CRAFT_ROOT_COMPONENT, CRAFT_ROUTE_LOAD_ERROR_COMPONENT, CRAFT_ROUTED_COMPONENT, } from './craft-host-tokens';
21
+ export declare function provideCraftComponent(component: CraftComponent<any>): ValueProvider;
22
+ type RequireHandledRouteFieldExceptions<Component> = IsAny<ComponentFieldExceptionsOf<Component>> extends true ? unknown : unknown extends ComponentFieldExceptionsOf<Component> ? unknown : [ComponentFieldExceptionsOf<Component>] extends [never] ? unknown : {
23
+ 'fieldExceptionBlock.exhaustive is required before routing component field exceptions': ComponentFieldExceptionsOf<Component>;
24
+ };
25
+ export type CraftRouteCssVarsCarrier<Contract extends CssVarContract = CssVarContract, Name extends string = string> = {
26
+ readonly __craftRouteCssVars__?: {
27
+ readonly component: Name;
28
+ readonly contract: Contract;
29
+ };
30
+ };
31
+ type RouteCssVarErrors<Value> = Value extends {
32
+ readonly _routes: infer Routes;
33
+ } ? RouteCssVarErrors<Routes> : Value extends readonly (infer Route)[] ? RouteCssVarErrors<Route> : Value extends CraftRouteCssVarsCarrier<infer Contract, infer Name extends string> ? [Contract['required']] extends [never] ? never : {
34
+ readonly component: Name;
35
+ readonly missing: Contract['required'];
36
+ } : Value extends {
37
+ readonly children?: infer Children;
38
+ } ? RouteCssVarErrors<NonNullable<Children>> : never;
39
+ type AssertCssVarsSatisfied<Routes> = [RouteCssVarErrors<Routes>] extends [
40
+ never
41
+ ] ? unknown : {
42
+ readonly ERROR_unsatisfied_css_vars: RouteCssVarErrors<Routes>;
43
+ };
44
+ /** Compile-time proof that no required CSS variable reaches a route root. */
45
+ export declare function assertCssVarsSatisfied<Routes>(routes: Routes & AssertCssVarsSatisfied<Routes>): Routes;
46
+ export declare function loadCraftComponent<const Component extends CraftComponent<any>>(loader: ((helpers: CraftRouteLazyLoadHelpers) => Promise<Component>) & RequireHandledRouteFieldExceptions<NoInfer<Component>>, additionalProviders?: NonNullable<Route['providers']>): {
47
+ loadComponent: (helpers: CraftRouteLazyLoadHelpers) => Promise<Type<unknown>>;
48
+ providers: NonNullable<Route['providers']>;
49
+ } & ComponentDepsCarrier<ComponentDepsOf<Component>> & ComponentExceptionsCarrier<ComponentInitializationExceptionsOf<Component>> & CraftRouteCssVarsCarrier<ComponentCssVarsOf<Component>, ComponentNameOf<Component>>;
50
+ export declare function craftComponentRouteData(component: CraftComponent<any>): Readonly<Record<string, unknown>>;
51
+ export declare function provideCraftRootComponent(component: CraftComponent<any>): ValueProvider;
52
+ export declare function provideCraftGlobalErrorComponent(component: CraftComponent<any>): ValueProvider;
53
+ export declare function provideCraftRouteLoadErrorComponent(component: CraftComponent<any>): ValueProvider;
54
+ export declare function provideCraftPendingComponent(component: CraftComponent<any>): ValueProvider;
55
+ export declare function craftPendingComponentRouteData(component: CraftComponent<any>): Readonly<Record<string, unknown>>;
56
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../../../../libs/component/src/lib/bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import { CRAFT_ROUTE_TARGET, craftRouteTarget, } from '@craft-ts/core';
2
+ import { CRAFT_GLOBAL_ERROR_COMPONENT, CRAFT_PENDING_COMPONENT, CRAFT_ROOT_COMPONENT, CRAFT_ROUTE_LOAD_ERROR_COMPONENT, CRAFT_ROUTED_COMPONENT, } from './craft-host-tokens';
3
+ import { mountInterpretedComponent, } from './render/interpreter';
4
+ export function mountCraftComponent(component, hostElement, injector, props = {}) {
5
+ return mountInterpretedComponent(component, hostElement, injector, props);
6
+ }
7
+ export { CRAFT_GLOBAL_ERROR_COMPONENT, CRAFT_PENDING_COMPONENT, CRAFT_ROOT_COMPONENT, CRAFT_ROUTE_LOAD_ERROR_COMPONENT, CRAFT_ROUTED_COMPONENT, } from './craft-host-tokens';
8
+ export function provideCraftComponent(component) {
9
+ return {
10
+ provide: CRAFT_ROUTED_COMPONENT,
11
+ useValue: component,
12
+ };
13
+ }
14
+ /** Compile-time proof that no required CSS variable reaches a route root. */
15
+ export function assertCssVarsSatisfied(routes) {
16
+ return routes;
17
+ }
18
+ export function loadCraftComponent(loader, additionalProviders = []) {
19
+ let loadedComponent;
20
+ const fragment = {
21
+ loadComponent: async (helpers) => {
22
+ loadedComponent = (await loader(helpers));
23
+ // The Angular host used to stand in here and read the component back out
24
+ // of CRAFT_ROUTE_TARGET. The outlet mounts Craft components directly.
25
+ return loadedComponent;
26
+ },
27
+ providers: [
28
+ {
29
+ provide: CRAFT_ROUTE_TARGET,
30
+ useFactory: () => {
31
+ if (!loadedComponent) {
32
+ throw new Error('loadCraftComponent() must finish loading before its route target is resolved.');
33
+ }
34
+ return craftRouteTarget(loadedComponent);
35
+ },
36
+ },
37
+ {
38
+ provide: CRAFT_ROUTED_COMPONENT,
39
+ useFactory: () => {
40
+ if (!loadedComponent) {
41
+ throw new Error('loadCraftComponent() must finish loading before the route host is created.');
42
+ }
43
+ return loadedComponent;
44
+ },
45
+ },
46
+ ...additionalProviders,
47
+ ],
48
+ };
49
+ return fragment;
50
+ }
51
+ export function craftComponentRouteData(component) {
52
+ return { craftComponent: component };
53
+ }
54
+ export function provideCraftRootComponent(component) {
55
+ return {
56
+ provide: CRAFT_ROOT_COMPONENT,
57
+ useValue: component,
58
+ };
59
+ }
60
+ export function provideCraftGlobalErrorComponent(component) {
61
+ return {
62
+ provide: CRAFT_GLOBAL_ERROR_COMPONENT,
63
+ useValue: component,
64
+ };
65
+ }
66
+ export function provideCraftRouteLoadErrorComponent(component) {
67
+ return {
68
+ provide: CRAFT_ROUTE_LOAD_ERROR_COMPONENT,
69
+ useValue: component,
70
+ };
71
+ }
72
+ export function provideCraftPendingComponent(component) {
73
+ return {
74
+ provide: CRAFT_PENDING_COMPONENT,
75
+ useValue: component,
76
+ };
77
+ }
78
+ export function craftPendingComponentRouteData(component) {
79
+ return { craftPendingComponent: component };
80
+ }
81
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../../../../libs/component/src/lib/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GAKjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,oBAAoB,EACpB,gCAAgC,EAChC,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,yBAAyB,GAE1B,MAAM,sBAAsB,CAAC;AA0B9B,MAAM,UAAU,mBAAmB,CACjC,SAAoE,EACpE,WAAoB,EACpB,QAAgB,EAChB,QAA4B,EAAwB;IAEpD,OAAO,yBAAyB,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC5E,CAAC;AAcD,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,oBAAoB,EACpB,gCAAgC,EAChC,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,qBAAqB,CACnC,SAA8B;IAE9B,OAAO;QACL,OAAO,EAAE,sBAAsB;QAC/B,QAAQ,EAAE,SAAS;KACpB,CAAC;AACJ,CAAC;AAiDD,6EAA6E;AAC7E,MAAM,UAAU,sBAAsB,CACpC,MAA+C;IAE/C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,MACwD,EACxD,sBAAuD,EAAE;IAYzD,IAAI,eAAsC,CAAC;IAE3C,MAAM,QAAQ,GAAG;QACf,aAAa,EAAE,KAAK,EAAE,OAAkC,EAAE,EAAE;YAC1D,eAAe,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAc,CAAC;YACvD,yEAAyE;YACzE,sEAAsE;YACtE,OAAO,eAA2C,CAAC;QACrD,CAAC;QACD,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,UAAU,EAAE,GAAG,EAAE;oBACf,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;oBACJ,CAAC;oBACD,OAAO,gBAAgB,CAAC,eAAe,CAAC,CAAC;gBAC3C,CAAC;aACF;YACD;gBACE,OAAO,EAAE,sBAAsB;gBAC/B,UAAU,EAAE,GAAG,EAAE;oBACf,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;oBACJ,CAAC;oBACD,OAAO,eAAe,CAAC;gBACzB,CAAC;aACF;YACD,GAAG,mBAAmB;SACvB;KACF,CAAC;IAEF,OAAO,QAEqE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,SAA8B;IAE9B,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,SAA8B;IAE9B,OAAO;QACL,OAAO,EAAE,oBAAoB;QAC7B,QAAQ,EAAE,SAAS;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,SAA8B;IAE9B,OAAO;QACL,OAAO,EAAE,4BAA4B;QACrC,QAAQ,EAAE,SAAS;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,SAA8B;IAE9B,OAAO;QACL,OAAO,EAAE,gCAAgC;QACzC,QAAQ,EAAE,SAAS;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,SAA8B;IAE9B,OAAO;QACL,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,SAAS;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,SAA8B;IAE9B,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC;AAC9C,CAAC","sourcesContent":["import {\n CRAFT_ROUTE_TARGET,\n craftRouteTarget,\n type ComponentDepsCarrier,\n type ComponentDepsOf,\n type ComponentExceptionsCarrier,\n type CraftRouteLazyLoadHelpers,\n} from '@craft-ts/core';\nimport {\n CRAFT_GLOBAL_ERROR_COMPONENT,\n CRAFT_PENDING_COMPONENT,\n CRAFT_ROOT_COMPONENT,\n CRAFT_ROUTE_LOAD_ERROR_COMPONENT,\n CRAFT_ROUTED_COMPONENT,\n} from './craft-host-tokens';\nimport {\n mountInterpretedComponent,\n type MountedCraftComponent,\n} from './render/interpreter';\nimport type {\n ComponentFieldExceptionsOf,\n ComponentInitializationExceptionsOf,\n ComponentCssVarsOf,\n ComponentNameOf,\n CraftComponent,\n PropsOf,\n} from './types';\nimport type { CssVarContract } from './css-vars.type';\n\nexport type CraftMountRef<Props extends object> = MountedCraftComponent<Props>;\n\ntype IsAny<Value> = 0 extends 1 & Value ? true : false;\n\ntype RequireHandledMountFieldExceptions<Component> =\n IsAny<ComponentFieldExceptionsOf<Component>> extends true\n ? unknown\n : unknown extends ComponentFieldExceptionsOf<Component>\n ? unknown\n : [ComponentFieldExceptionsOf<Component>] extends [never]\n ? unknown\n : {\n 'fieldExceptionBlock.exhaustive is required before mounting component field exceptions': ComponentFieldExceptionsOf<Component>;\n };\n\nexport function mountCraftComponent<Component extends CraftComponent<any>>(\n component: Component & RequireHandledMountFieldExceptions<Component>,\n hostElement: Element,\n injector: object,\n props: PropsOf<Component> = {} as PropsOf<Component>,\n): CraftMountRef<PropsOf<Component>> {\n return mountInterpretedComponent(component, hostElement, injector, props);\n}\n\ntype ValueProvider = {\n provide: object;\n useValue: unknown;\n multi?: boolean;\n};\n\ntype Route = {\n providers?: readonly unknown[];\n};\n\ntype Type<T> = new (...args: never[]) => T;\n\nexport {\n CRAFT_GLOBAL_ERROR_COMPONENT,\n CRAFT_PENDING_COMPONENT,\n CRAFT_ROOT_COMPONENT,\n CRAFT_ROUTE_LOAD_ERROR_COMPONENT,\n CRAFT_ROUTED_COMPONENT,\n} from './craft-host-tokens';\n\nexport function provideCraftComponent(\n component: CraftComponent<any>,\n): ValueProvider {\n return {\n provide: CRAFT_ROUTED_COMPONENT,\n useValue: component,\n };\n}\n\ntype RequireHandledRouteFieldExceptions<Component> =\n IsAny<ComponentFieldExceptionsOf<Component>> extends true\n ? unknown\n : unknown extends ComponentFieldExceptionsOf<Component>\n ? unknown\n : [ComponentFieldExceptionsOf<Component>] extends [never]\n ? unknown\n : {\n 'fieldExceptionBlock.exhaustive is required before routing component field exceptions': ComponentFieldExceptionsOf<Component>;\n };\n\nexport type CraftRouteCssVarsCarrier<\n Contract extends CssVarContract = CssVarContract,\n Name extends string = string,\n> = {\n readonly __craftRouteCssVars__?: {\n readonly component: Name;\n readonly contract: Contract;\n };\n};\n\ntype RouteCssVarErrors<Value> = Value extends {\n readonly _routes: infer Routes;\n}\n ? RouteCssVarErrors<Routes>\n : Value extends readonly (infer Route)[]\n ? RouteCssVarErrors<Route>\n : Value extends CraftRouteCssVarsCarrier<\n infer Contract,\n infer Name extends string\n >\n ? [Contract['required']] extends [never]\n ? never\n : {\n readonly component: Name;\n readonly missing: Contract['required'];\n }\n : Value extends { readonly children?: infer Children }\n ? RouteCssVarErrors<NonNullable<Children>>\n : never;\n\ntype AssertCssVarsSatisfied<Routes> = [RouteCssVarErrors<Routes>] extends [\n never,\n]\n ? unknown\n : { readonly ERROR_unsatisfied_css_vars: RouteCssVarErrors<Routes> };\n\n/** Compile-time proof that no required CSS variable reaches a route root. */\nexport function assertCssVarsSatisfied<Routes>(\n routes: Routes & AssertCssVarsSatisfied<Routes>,\n): Routes {\n return routes;\n}\n\nexport function loadCraftComponent<const Component extends CraftComponent<any>>(\n loader: ((helpers: CraftRouteLazyLoadHelpers) => Promise<Component>) &\n RequireHandledRouteFieldExceptions<NoInfer<Component>>,\n additionalProviders: NonNullable<Route['providers']> = [],\n): {\n loadComponent: (\n helpers: CraftRouteLazyLoadHelpers,\n ) => Promise<Type<unknown>>;\n providers: NonNullable<Route['providers']>;\n} & ComponentDepsCarrier<ComponentDepsOf<Component>> &\n ComponentExceptionsCarrier<ComponentInitializationExceptionsOf<Component>> &\n CraftRouteCssVarsCarrier<\n ComponentCssVarsOf<Component>,\n ComponentNameOf<Component>\n > {\n let loadedComponent: Component | undefined;\n\n const fragment = {\n loadComponent: async (helpers: CraftRouteLazyLoadHelpers) => {\n loadedComponent = (await loader(helpers)) as Component;\n // The Angular host used to stand in here and read the component back out\n // of CRAFT_ROUTE_TARGET. The outlet mounts Craft components directly.\n return loadedComponent as unknown as Type<unknown>;\n },\n providers: [\n {\n provide: CRAFT_ROUTE_TARGET,\n useFactory: () => {\n if (!loadedComponent) {\n throw new Error(\n 'loadCraftComponent() must finish loading before its route target is resolved.',\n );\n }\n return craftRouteTarget(loadedComponent);\n },\n },\n {\n provide: CRAFT_ROUTED_COMPONENT,\n useFactory: () => {\n if (!loadedComponent) {\n throw new Error(\n 'loadCraftComponent() must finish loading before the route host is created.',\n );\n }\n return loadedComponent;\n },\n },\n ...additionalProviders,\n ],\n };\n\n return fragment as unknown as typeof fragment &\n ComponentDepsCarrier<ComponentDepsOf<Component>> &\n ComponentExceptionsCarrier<ComponentInitializationExceptionsOf<Component>>;\n}\n\nexport function craftComponentRouteData(\n component: CraftComponent<any>,\n): Readonly<Record<string, unknown>> {\n return { craftComponent: component };\n}\n\nexport function provideCraftRootComponent(\n component: CraftComponent<any>,\n): ValueProvider {\n return {\n provide: CRAFT_ROOT_COMPONENT,\n useValue: component,\n };\n}\n\nexport function provideCraftGlobalErrorComponent(\n component: CraftComponent<any>,\n): ValueProvider {\n return {\n provide: CRAFT_GLOBAL_ERROR_COMPONENT,\n useValue: component,\n };\n}\n\nexport function provideCraftRouteLoadErrorComponent(\n component: CraftComponent<any>,\n): ValueProvider {\n return {\n provide: CRAFT_ROUTE_LOAD_ERROR_COMPONENT,\n useValue: component,\n };\n}\n\nexport function provideCraftPendingComponent(\n component: CraftComponent<any>,\n): ValueProvider {\n return {\n provide: CRAFT_PENDING_COMPONENT,\n useValue: component,\n };\n}\n\nexport function craftPendingComponentRouteData(\n component: CraftComponent<any>,\n): Readonly<Record<string, unknown>> {\n return { craftPendingComponent: component };\n}\n\n"]}
@@ -0,0 +1,46 @@
1
+ import { type CraftComponentDependencies } from '@craft-ts/core';
2
+ import { type ComponentFactory, type ComponentMeta, type ComponentInitializationExceptionCodesForTemplate, type ComponentTemplate, type ComponentResidualFieldExceptions, type ContentRequirementsOfContext, type CraftComponent, type FactoryContext, type FactoryYielded, type PropsFromFactory, type TemplateDependencies, type TemplateCssVars, type TemplateHeadingNeed, type TemplatePendingSources, type TemplateSettledExceptions } from './types';
3
+ import type { CssVarsContractOfMeta } from './css-vars.type';
4
+ type ProvidersFromMeta<Meta extends ComponentMeta> = Meta extends {
5
+ readonly providers: infer Providers;
6
+ } ? Providers : readonly [];
7
+ type ContentSlotNamesForFactory<Factory extends ComponentFactory> = {
8
+ [Key in keyof PropsFromFactory<Factory>]: NonNullable<PropsFromFactory<Factory>[Key]> extends (...args: any[]) => any ? Key : never;
9
+ }[keyof PropsFromFactory<Factory>] & string;
10
+ type ValidContentStyles<Meta extends ComponentMeta, Factory extends ComponentFactory> = Meta extends {
11
+ readonly contentStyles?: infer Styles;
12
+ } ? Exclude<keyof NonNullable<Styles>, ContentSlotNamesForFactory<NoInfer<Factory>>> extends never ? unknown : never : unknown;
13
+ type IsAny<Value> = 0 extends 1 & Value ? true : false;
14
+ /**
15
+ * A template may only render an async source (`settledValue`, or a
16
+ * `craftComputed` that consumed one with `yield* settled(...)`) from inside a
17
+ * `pendingBlock` boundary. Anything left uncovered fails here, on the template
18
+ * argument, naming the sources that have nowhere to show their loading state.
19
+ */
20
+ type ValidPendingSources<Template> = IsAny<TemplatePendingSources<Template>> extends true ? unknown : string extends TemplatePendingSources<Template> ? unknown : [TemplatePendingSources<Template>] extends [never] ? unknown : {
21
+ readonly ERROR_async_source_rendered_outside_a_pendingBlock: TemplatePendingSources<Template>;
22
+ };
23
+ /**
24
+ * A template may only render a value whose settled read can raise an exception
25
+ * from inside a `catchBlock`. Anything left uncovered fails here, on the
26
+ * template argument, naming the codes with nowhere to be handled.
27
+ */
28
+ type ValidSettledExceptions<Template> = IsAny<TemplateSettledExceptions<Template>> extends true ? unknown : string extends TemplateSettledExceptions<Template> ? unknown : [TemplateSettledExceptions<Template>] extends [never] ? unknown : {
29
+ readonly ERROR_settled_read_exception_not_caught_by_a_catchBlock: TemplateSettledExceptions<Template>;
30
+ };
31
+ /**
32
+ * A reusable child may render `heading()` without a local `headingSection` —
33
+ * the need bubbles. The *parent* that calls that child must wrap the call in
34
+ * `headingSection` (same DNA as `pendingBlock` on the parent, not the child).
35
+ */
36
+ type ValidHeadingNeed<Template> = IsAny<TemplateHeadingNeed<Template>> extends true ? unknown : string extends TemplateHeadingNeed<Template> ? unknown : [Extract<TemplateHeadingNeed<Template>, 'heading-from-child'>] extends [
37
+ never
38
+ ] ? unknown : {
39
+ readonly ERROR_child_heading_rendered_outside_a_headingSection: 'heading-from-child';
40
+ };
41
+ type ValidInheritedCssVars<Meta extends ComponentMeta, Template> = IsAny<TemplateCssVars<Template>['inherited']> extends true ? unknown : Exclude<TemplateCssVars<Template>['inherited'], CssVarsContractOfMeta<Meta>['declared']> extends infer Missing ? [Missing] extends [never] ? unknown : {
42
+ readonly ERROR_css_var_marked_inherit_is_not_declared_here: Missing;
43
+ } : never;
44
+ export declare function craftComponent<const Name extends string, const Meta extends ComponentMeta, Factory extends ComponentFactory, Template extends ComponentTemplate<FactoryContext<Factory>>>(name: Name, meta: Meta & ValidContentStyles<Meta, Factory>, factory: Factory, template: Template & ValidInheritedCssVars<Meta, NoInfer<Template>> & ValidPendingSources<NoInfer<Template>> & ValidSettledExceptions<NoInfer<Template>> & ValidHeadingNeed<NoInfer<Template>>): CraftComponent<PropsFromFactory<Factory>, CraftComponentDependencies<FactoryYielded<Factory>, FactoryContext<Factory>, ProvidersFromMeta<Meta>, PropsFromFactory<Factory>, TemplateDependencies<Template>>, Factory, Meta, Factory, TemplateDependencies<Template>, Template, Name, ComponentInitializationExceptionCodesForTemplate<Factory, ProvidersFromMeta<Meta>, Template>, ContentRequirementsOfContext<FactoryContext<Factory>>, ComponentResidualFieldExceptions<Factory, Template>>;
45
+ export {};
46
+ //# sourceMappingURL=component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../../../../libs/component/src/lib/component.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ import { CRAFT_REGISTRATION_TARGET, } from '@craft-ts/core';
2
+ import { CRAFT_COMPONENT, CRAFT_DIRECTIVE, } from './types';
3
+ import { forwardedCssVarStyles } from './css-vars';
4
+ import { applyHostPropsToChildren, currentCraftRenderContext, mergeHostProps, pipeCraftNode, } from './render/vnode';
5
+ function mergeStyles(...sources) {
6
+ return sources.flatMap((source) => typeof source === 'string' ? [source] : (source ?? []));
7
+ }
8
+ export function craftComponent(name, meta, factory, template) {
9
+ return createCraftComponent({
10
+ name,
11
+ meta,
12
+ factory,
13
+ template,
14
+ styleOwners: [{ name, styles: mergeStyles(meta.styles, meta.stylesUrl) }],
15
+ scopeDefinition: undefined,
16
+ });
17
+ }
18
+ function createCraftComponent(definition) {
19
+ // Keep host props in the template pipeline. This lets a directive pass
20
+ // additional host props to its base template while preserving props that
21
+ // were already supplied by the component caller.
22
+ const hostAwareTemplate = (context, hostProps) => {
23
+ const children = definition.template(context, hostProps);
24
+ const forwardedStyles = forwardedCssVarStyles(children);
25
+ const withForwardedDefaults = mergeHostProps(definition.meta.host ?? {}, {
26
+ style: forwardedStyles,
27
+ });
28
+ const effectiveHostProps = mergeHostProps(withForwardedDefaults, hostProps ?? {});
29
+ return applyHostPropsToChildren(children, effectiveHostProps);
30
+ };
31
+ const craftComponent = ((props = {}) => {
32
+ const node = {
33
+ kind: 'component',
34
+ component: craftComponent,
35
+ props,
36
+ declarationContext: currentCraftRenderContext(),
37
+ };
38
+ if ('key' in props) {
39
+ Object.defineProperty(node, 'key', {
40
+ configurable: false,
41
+ enumerable: false,
42
+ get: () => props['key'],
43
+ });
44
+ }
45
+ Object.defineProperty(node, 'pipe', {
46
+ value: (directive) => pipeCraftNode(node, directive),
47
+ enumerable: false,
48
+ });
49
+ return node;
50
+ });
51
+ const scopeDefinition = definition.scopeDefinition ?? {};
52
+ const styleOwners = definition.styleOwners.map((owner, index) => index === 0 && !owner.definition
53
+ ? { ...owner, definition: scopeDefinition }
54
+ : owner);
55
+ Object.defineProperty(craftComponent, CRAFT_COMPONENT, {
56
+ value: {
57
+ ...definition,
58
+ template: hostAwareTemplate,
59
+ scopeDefinition,
60
+ styleOwners,
61
+ },
62
+ enumerable: false,
63
+ });
64
+ Object.defineProperty(craftComponent, CRAFT_REGISTRATION_TARGET, {
65
+ value: { kind: 'component', name: definition.name },
66
+ enumerable: false,
67
+ });
68
+ Object.defineProperty(craftComponent, 'pipe', {
69
+ value: (...directives) => directives.reduce((current, directive) => {
70
+ const currentComponent = current;
71
+ const resolvedDirective = (CRAFT_DIRECTIVE in directive ? directive : directive(currentComponent));
72
+ const currentDefinition = currentComponent[CRAFT_COMPONENT];
73
+ const currentTemplate = currentDefinition.template;
74
+ return createCraftComponent({
75
+ name: currentDefinition.name,
76
+ meta: currentDefinition.meta,
77
+ factory: resolvedDirective[CRAFT_DIRECTIVE].logic(currentDefinition.factory),
78
+ template: resolvedDirective[CRAFT_DIRECTIVE].template(currentTemplate),
79
+ styleOwners: [
80
+ ...currentDefinition.styleOwners,
81
+ {
82
+ name: resolvedDirective[CRAFT_DIRECTIVE].name,
83
+ styles: mergeStyles(resolvedDirective[CRAFT_DIRECTIVE].meta.styles, resolvedDirective[CRAFT_DIRECTIVE].meta.stylesUrl),
84
+ definition: resolvedDirective[CRAFT_DIRECTIVE],
85
+ registrationTarget: resolvedDirective,
86
+ },
87
+ ],
88
+ scopeDefinition: currentDefinition.scopeDefinition,
89
+ composition: mergeComponentComposition(currentDefinition.composition, resolvedDirective[CRAFT_DIRECTIVE].componentOperator),
90
+ });
91
+ }, craftComponent),
92
+ enumerable: false,
93
+ });
94
+ return craftComponent;
95
+ }
96
+ function mergeComponentComposition(existing, next) {
97
+ if (!existing && !next) {
98
+ return undefined;
99
+ }
100
+ const providers = [
101
+ ...(existing?.providers ?? []),
102
+ ...(next?.providers ?? []),
103
+ ];
104
+ const catchHandlers = next?.catchHandlers ?? existing?.catchHandlers;
105
+ const catchTagHandlers = next?.catchTagHandlers ?? existing?.catchTagHandlers;
106
+ const catchBlockPosition = next?.catchBlockPosition ?? existing?.catchBlockPosition;
107
+ const fieldExceptionHandlers = next?.fieldExceptionHandlers ?? existing?.fieldExceptionHandlers;
108
+ const fieldExceptionOptions = next?.fieldExceptionOptions ?? existing?.fieldExceptionOptions;
109
+ return {
110
+ ...(providers.length ? { providers } : {}),
111
+ ...(catchHandlers ? { catchHandlers } : {}),
112
+ ...(catchTagHandlers ? { catchTagHandlers } : {}),
113
+ ...(catchBlockPosition ? { catchBlockPosition } : {}),
114
+ ...(fieldExceptionHandlers ? { fieldExceptionHandlers } : {}),
115
+ ...(fieldExceptionOptions ? { fieldExceptionOptions } : {}),
116
+ };
117
+ }
118
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../../../../../libs/component/src/lib/component.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,GAE1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,eAAe,EACf,eAAe,GAkBhB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,cAAc,EACd,aAAa,GACd,MAAM,gBAAgB,CAAC;AAQxB,SAAS,WAAW,CAClB,GAAG,OAA4D;IAE/D,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAChC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CACvD,CAAC;AACJ,CAAC;AA4FD,MAAM,UAAU,cAAc,CAM5B,IAAU,EACV,IAA8C,EAC9C,OAAgB,EAChB,QAIqC;IAwBrC,OAAO,oBAAoB,CAAgC;QACzD,IAAI;QACJ,IAAI;QACJ,OAAO;QACP,QAAQ;QACR,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzE,eAAe,EAAE,SAAS;KAC3B,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAK3B,UAQD;IAgCC,uEAAuE;IACvE,yEAAyE;IACzE,iDAAiD;IACjD,MAAM,iBAAiB,GAA+C,CACpE,OAAO,EACP,SAAS,EACT,EAAE;QACF,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,eAAe,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,qBAAqB,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE;YACvE,KAAK,EAAE,eAAe;SACvB,CAAC,CAAC;QACH,MAAM,kBAAkB,GAAG,cAAc,CACvC,qBAAqB,EACrB,SAAS,IAAI,EAAE,CAChB,CAAC;QACF,OAAO,wBAAwB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IAChE,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,CACtB,QAA2B,EAAuB,EACD,EAAE;QACnD,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,cAGV;YACD,KAAK;YACL,kBAAkB,EAAE,yBAAyB,EAAE;SACc,CAAC;QAChE,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YACnB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE;gBACjC,YAAY,EAAE,KAAK;gBACnB,UAAU,EAAE,KAAK;gBACjB,GAAG,EAAE,GAAG,EAAE,CAAE,KAAiC,CAAC,KAAK,CAAC;aACrD,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE;YAClC,KAAK,EAAE,CAAC,SAAkB,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,SAAkB,CAAC;YACtE,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC,CAgBA,CAAC;IAEF,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,IAAI,EAAE,CAAC;IACzD,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAC9D,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU;QAC9B,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE;QAC3C,CAAC,CAAC,KAAK,CACV,CAAC;IAEF,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,eAAe,EAAE;QACrD,KAAK,EAAE;YACL,GAAG,UAAU;YACb,QAAQ,EAAE,iBAAiB;YAC3B,eAAe;YACf,WAAW;SACZ;QACD,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IAEH,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,yBAAyB,EAAE;QAC/D,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE;QACnD,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IAEH,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE;QAC5C,KAAK,EAAE,CACL,GAAG,UAcA,EACH,EAAE,CACF,UAAU,CAAC,MAAM,CAAU,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE;YAChD,MAAM,gBAAgB,GAAG,OAA8B,CAAC;YACxD,MAAM,iBAAiB,GAAG,CACxB,eAAe,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAcvE,CAAC;YACF,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;YAC5D,MAAM,eAAe,GAAG,iBAAiB,CAAC,QAAQ,CAAC;YACnD,OAAO,oBAAoB,CAAqB;gBAC9C,IAAI,EAAE,iBAAiB,CAAC,IAAI;gBAC5B,IAAI,EAAE,iBAAiB,CAAC,IAAI;gBAC5B,OAAO,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC,KAAK,CAC/C,iBAAiB,CAAC,OAAO,CAC1B;gBACD,QAAQ,EACN,iBAAiB,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAC9D,WAAW,EAAE;oBACX,GAAG,iBAAiB,CAAC,WAAW;oBAChC;wBACE,IAAI,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC,IAAI;wBAC7C,MAAM,EAAE,WAAW,CACjB,iBAAiB,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,EAC9C,iBAAiB,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,CAClD;wBACD,UAAU,EAAE,iBAAiB,CAAC,eAAe,CAAC;wBAC9C,kBAAkB,EAAE,iBAAiB;qBACtC;iBACF;gBACD,eAAe,EAAE,iBAAiB,CAAC,eAAe;gBAClD,WAAW,EAAE,yBAAyB,CACpC,iBAAiB,CAAC,WAAW,EAC7B,iBAAiB,CAAC,eAAe,CAAC,CAAC,iBAAiB,CACrD;aACF,CAAC,CAAC;QACL,CAAC,EAAE,cAAc,CAAC;QACpB,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,yBAAyB,CAChC,QAAoD,EACpD,IAAgD;IAEhD,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG;QAChB,GAAG,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC;QAC9B,GAAG,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC;KAC3B,CAAC;IACF,MAAM,aAAa,GAAG,IAAI,EAAE,aAAa,IAAI,QAAQ,EAAE,aAAa,CAAC;IACrE,MAAM,gBAAgB,GAAG,IAAI,EAAE,gBAAgB,IAAI,QAAQ,EAAE,gBAAgB,CAAC;IAC9E,MAAM,kBAAkB,GACtB,IAAI,EAAE,kBAAkB,IAAI,QAAQ,EAAE,kBAAkB,CAAC;IAC3D,MAAM,sBAAsB,GAC1B,IAAI,EAAE,sBAAsB,IAAI,QAAQ,EAAE,sBAAsB,CAAC;IACnE,MAAM,qBAAqB,GACzB,IAAI,EAAE,qBAAqB,IAAI,QAAQ,EAAE,qBAAqB,CAAC;IAEjE,OAAO;QACL,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC","sourcesContent":["import {\n CRAFT_REGISTRATION_TARGET,\n type CraftComponentDependencies,\n} from '@craft-ts/core';\nimport {\n CRAFT_COMPONENT,\n CRAFT_DIRECTIVE,\n type ComponentFactory,\n type ComponentMeta,\n type ComponentCompositionDefinition,\n type ComponentInitializationExceptionCodesForTemplate,\n type ComponentTemplate,\n type ComponentResidualFieldExceptions,\n type ContentRequirementsOfContext,\n type CraftComponent,\n type FactoryContext,\n type FactoryYielded,\n type PropsFromFactory,\n type StyleOwner,\n type TemplateDependencies,\n type TemplateCssVars,\n type TemplateHeadingNeed,\n type TemplatePendingSources,\n type TemplateSettledExceptions,\n} from './types';\nimport type { CssVarsContractOfMeta } from './css-vars.type';\nimport { forwardedCssVarStyles } from './css-vars';\nimport type { HostProps } from './hyperscript';\nimport type { ComponentNode } from './render/vnode';\nimport {\n applyHostPropsToChildren,\n currentCraftRenderContext,\n mergeHostProps,\n pipeCraftNode,\n} from './render/vnode';\n\ntype ProvidersFromMeta<Meta extends ComponentMeta> = Meta extends {\n readonly providers: infer Providers;\n}\n ? Providers\n : readonly [];\n\nfunction mergeStyles(\n ...sources: readonly (string | readonly string[] | undefined)[]\n): readonly string[] {\n return sources.flatMap((source) =>\n typeof source === 'string' ? [source] : (source ?? []),\n );\n}\n\ntype ContentSlotNamesForFactory<Factory extends ComponentFactory> = {\n [Key in keyof PropsFromFactory<Factory>]: NonNullable<\n PropsFromFactory<Factory>[Key]\n > extends (...args: any[]) => any\n ? Key\n : never;\n}[keyof PropsFromFactory<Factory>] &\n string;\n\ntype ValidContentStyles<\n Meta extends ComponentMeta,\n Factory extends ComponentFactory,\n> = Meta extends { readonly contentStyles?: infer Styles }\n ? Exclude<\n keyof NonNullable<Styles>,\n ContentSlotNamesForFactory<NoInfer<Factory>>\n > extends never\n ? unknown\n : never\n : unknown;\n\ntype IsAny<Value> = 0 extends 1 & Value ? true : false;\n\n/**\n * A template may only render an async source (`settledValue`, or a\n * `craftComputed` that consumed one with `yield* settled(...)`) from inside a\n * `pendingBlock` boundary. Anything left uncovered fails here, on the template\n * argument, naming the sources that have nowhere to show their loading state.\n */\ntype ValidPendingSources<Template> =\n IsAny<TemplatePendingSources<Template>> extends true\n ? unknown\n : // `string` means the template's children were not narrowed at all (a\n // broadly typed template): there is no source to point at.\n string extends TemplatePendingSources<Template>\n ? unknown\n : [TemplatePendingSources<Template>] extends [never]\n ? unknown\n : {\n readonly ERROR_async_source_rendered_outside_a_pendingBlock: TemplatePendingSources<Template>;\n };\n\n/**\n * A template may only render a value whose settled read can raise an exception\n * from inside a `catchBlock`. Anything left uncovered fails here, on the\n * template argument, naming the codes with nowhere to be handled.\n */\ntype ValidSettledExceptions<Template> =\n IsAny<TemplateSettledExceptions<Template>> extends true\n ? unknown\n : string extends TemplateSettledExceptions<Template>\n ? unknown\n : [TemplateSettledExceptions<Template>] extends [never]\n ? unknown\n : {\n readonly ERROR_settled_read_exception_not_caught_by_a_catchBlock: TemplateSettledExceptions<Template>;\n };\n\n/**\n * A reusable child may render `heading()` without a local `headingSection` —\n * the need bubbles. The *parent* that calls that child must wrap the call in\n * `headingSection` (same DNA as `pendingBlock` on the parent, not the child).\n */\ntype ValidHeadingNeed<Template> =\n IsAny<TemplateHeadingNeed<Template>> extends true\n ? unknown\n : string extends TemplateHeadingNeed<Template>\n ? unknown\n : [Extract<TemplateHeadingNeed<Template>, 'heading-from-child'>] extends [\n never,\n ]\n ? unknown\n : {\n readonly ERROR_child_heading_rendered_outside_a_headingSection: 'heading-from-child';\n };\n\ntype ValidInheritedCssVars<Meta extends ComponentMeta, Template> =\n IsAny<TemplateCssVars<Template>['inherited']> extends true\n ? unknown\n : Exclude<\n TemplateCssVars<Template>['inherited'],\n CssVarsContractOfMeta<Meta>['declared']\n > extends infer Missing\n ? [Missing] extends [never]\n ? unknown\n : {\n readonly ERROR_css_var_marked_inherit_is_not_declared_here: Missing;\n }\n : never;\n\nexport function craftComponent<\n const Name extends string,\n const Meta extends ComponentMeta,\n Factory extends ComponentFactory,\n Template extends ComponentTemplate<FactoryContext<Factory>>,\n>(\n name: Name,\n meta: Meta & ValidContentStyles<Meta, Factory>,\n factory: Factory,\n template: Template &\n ValidInheritedCssVars<Meta, NoInfer<Template>> &\n ValidPendingSources<NoInfer<Template>> &\n ValidSettledExceptions<NoInfer<Template>> &\n ValidHeadingNeed<NoInfer<Template>>,\n): CraftComponent<\n PropsFromFactory<Factory>,\n CraftComponentDependencies<\n FactoryYielded<Factory>,\n FactoryContext<Factory>,\n ProvidersFromMeta<Meta>,\n PropsFromFactory<Factory>,\n TemplateDependencies<Template>\n >,\n Factory,\n Meta,\n Factory,\n TemplateDependencies<Template>,\n Template,\n Name,\n ComponentInitializationExceptionCodesForTemplate<\n Factory,\n ProvidersFromMeta<Meta>,\n Template\n >,\n ContentRequirementsOfContext<FactoryContext<Factory>>,\n ComponentResidualFieldExceptions<Factory, Template>\n> {\n return createCraftComponent<Name, Meta, Factory, Template>({\n name,\n meta,\n factory,\n template,\n styleOwners: [{ name, styles: mergeStyles(meta.styles, meta.stylesUrl) }],\n scopeDefinition: undefined,\n });\n}\n\nfunction createCraftComponent<\n const Name extends string,\n const Meta extends ComponentMeta,\n Factory extends ComponentFactory,\n Template extends ComponentTemplate<FactoryContext<Factory>>,\n>(definition: {\n readonly name: Name;\n readonly meta: Meta;\n readonly factory: Factory;\n readonly template: Template;\n readonly styleOwners: readonly StyleOwner[];\n readonly scopeDefinition: object | undefined;\n readonly composition?: ComponentCompositionDefinition;\n}): CraftComponent<\n PropsFromFactory<Factory>,\n CraftComponentDependencies<\n FactoryYielded<Factory>,\n FactoryContext<Factory>,\n ProvidersFromMeta<Meta>,\n PropsFromFactory<Factory>,\n TemplateDependencies<Template>\n >,\n Factory,\n Meta,\n Factory,\n TemplateDependencies<Template>,\n Template,\n Name,\n ComponentInitializationExceptionCodesForTemplate<\n Factory,\n ProvidersFromMeta<Meta>,\n Template\n >,\n ContentRequirementsOfContext<FactoryContext<Factory>>,\n ComponentResidualFieldExceptions<Factory, Template>\n> {\n type Props = PropsFromFactory<Factory>;\n type ComponentDeps = CraftComponentDependencies<\n FactoryYielded<Factory>,\n FactoryContext<Factory>,\n ProvidersFromMeta<Meta>,\n Props,\n TemplateDependencies<Template>\n >;\n\n // Keep host props in the template pipeline. This lets a directive pass\n // additional host props to its base template while preserving props that\n // were already supplied by the component caller.\n const hostAwareTemplate: ComponentTemplate<FactoryContext<Factory>> = (\n context,\n hostProps,\n ) => {\n const children = definition.template(context, hostProps);\n const forwardedStyles = forwardedCssVarStyles(children);\n const withForwardedDefaults = mergeHostProps(definition.meta.host ?? {}, {\n style: forwardedStyles,\n });\n const effectiveHostProps = mergeHostProps(\n withForwardedDefaults,\n hostProps ?? {},\n );\n return applyHostPropsToChildren(children, effectiveHostProps);\n };\n\n const craftComponent = ((\n props: Props & HostProps = {} as Props & HostProps,\n ): ComponentNode<Props & HostProps, ComponentDeps> => {\n const node = {\n kind: 'component',\n component: craftComponent as unknown as CraftComponent<\n any,\n ComponentDeps\n >,\n props,\n declarationContext: currentCraftRenderContext(),\n } as unknown as ComponentNode<Props & HostProps, ComponentDeps>;\n if ('key' in props) {\n Object.defineProperty(node, 'key', {\n configurable: false,\n enumerable: false,\n get: () => (props as Record<string, unknown>)['key'],\n });\n }\n Object.defineProperty(node, 'pipe', {\n value: (directive: unknown) => pipeCraftNode(node, directive as never),\n enumerable: false,\n });\n return node;\n }) as unknown as CraftComponent<\n Props,\n ComponentDeps,\n Factory,\n Meta,\n Factory,\n TemplateDependencies<Template>,\n Template,\n Name,\n ComponentInitializationExceptionCodesForTemplate<\n Factory,\n ProvidersFromMeta<Meta>,\n Template\n >,\n ContentRequirementsOfContext<FactoryContext<Factory>>,\n ComponentResidualFieldExceptions<Factory, Template>\n >;\n\n const scopeDefinition = definition.scopeDefinition ?? {};\n const styleOwners = definition.styleOwners.map((owner, index) =>\n index === 0 && !owner.definition\n ? { ...owner, definition: scopeDefinition }\n : owner,\n );\n\n Object.defineProperty(craftComponent, CRAFT_COMPONENT, {\n value: {\n ...definition,\n template: hostAwareTemplate,\n scopeDefinition,\n styleOwners,\n },\n enumerable: false,\n });\n\n Object.defineProperty(craftComponent, CRAFT_REGISTRATION_TARGET, {\n value: { kind: 'component', name: definition.name },\n enumerable: false,\n });\n\n Object.defineProperty(craftComponent, 'pipe', {\n value: (\n ...directives: {\n readonly [CRAFT_DIRECTIVE]?: {\n readonly name: string;\n readonly meta: {\n readonly styles?: string | readonly string[];\n readonly stylesUrl?: string | readonly string[];\n };\n readonly logic: (baseLogic: ComponentFactory) => ComponentFactory;\n readonly template: (\n baseTemplate: ComponentTemplate<any>,\n ) => ComponentTemplate<any>;\n readonly componentOperator?: ComponentCompositionDefinition;\n };\n (...args: any[]): unknown;\n }[]\n ) =>\n directives.reduce<unknown>((current, directive) => {\n const currentComponent = current as CraftComponent<any>;\n const resolvedDirective = (\n CRAFT_DIRECTIVE in directive ? directive : directive(currentComponent)\n ) as {\n readonly [CRAFT_DIRECTIVE]: {\n readonly name: string;\n readonly meta: {\n readonly styles?: string | readonly string[];\n readonly stylesUrl?: string | readonly string[];\n };\n readonly logic: (baseLogic: ComponentFactory) => ComponentFactory;\n readonly template: (\n baseTemplate: ComponentTemplate<any>,\n ) => ComponentTemplate<any>;\n readonly componentOperator?: ComponentCompositionDefinition;\n };\n };\n const currentDefinition = currentComponent[CRAFT_COMPONENT];\n const currentTemplate = currentDefinition.template;\n return createCraftComponent<any, any, any, any>({\n name: currentDefinition.name,\n meta: currentDefinition.meta,\n factory: resolvedDirective[CRAFT_DIRECTIVE].logic(\n currentDefinition.factory,\n ),\n template:\n resolvedDirective[CRAFT_DIRECTIVE].template(currentTemplate),\n styleOwners: [\n ...currentDefinition.styleOwners,\n {\n name: resolvedDirective[CRAFT_DIRECTIVE].name,\n styles: mergeStyles(\n resolvedDirective[CRAFT_DIRECTIVE].meta.styles,\n resolvedDirective[CRAFT_DIRECTIVE].meta.stylesUrl,\n ),\n definition: resolvedDirective[CRAFT_DIRECTIVE],\n registrationTarget: resolvedDirective,\n },\n ],\n scopeDefinition: currentDefinition.scopeDefinition,\n composition: mergeComponentComposition(\n currentDefinition.composition,\n resolvedDirective[CRAFT_DIRECTIVE].componentOperator,\n ),\n });\n }, craftComponent),\n enumerable: false,\n });\n\n return craftComponent;\n}\n\nfunction mergeComponentComposition(\n existing: ComponentCompositionDefinition | undefined,\n next: ComponentCompositionDefinition | undefined,\n): ComponentCompositionDefinition | undefined {\n if (!existing && !next) {\n return undefined;\n }\n\n const providers = [\n ...(existing?.providers ?? []),\n ...(next?.providers ?? []),\n ];\n const catchHandlers = next?.catchHandlers ?? existing?.catchHandlers;\n const catchTagHandlers = next?.catchTagHandlers ?? existing?.catchTagHandlers;\n const catchBlockPosition =\n next?.catchBlockPosition ?? existing?.catchBlockPosition;\n const fieldExceptionHandlers =\n next?.fieldExceptionHandlers ?? existing?.fieldExceptionHandlers;\n const fieldExceptionOptions =\n next?.fieldExceptionOptions ?? existing?.fieldExceptionOptions;\n\n return {\n ...(providers.length ? { providers } : {}),\n ...(catchHandlers ? { catchHandlers } : {}),\n ...(catchTagHandlers ? { catchTagHandlers } : {}),\n ...(catchBlockPosition ? { catchBlockPosition } : {}),\n ...(fieldExceptionHandlers ? { fieldExceptionHandlers } : {}),\n ...(fieldExceptionOptions ? { fieldExceptionOptions } : {}),\n };\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import type { AnyCraftException, CraftServiceProvider } from '@craft-ts/core';
2
+ import { type ComponentOperator, type ComponentInitializationExceptionsOf, type CraftComponent } from './types';
3
+ /** Adds a component-local provider scope to the component invocation. */
4
+ export declare function withProviders<const Providers extends readonly CraftServiceProvider[]>(providers: Providers): ComponentOperator<Providers>;
5
+ export type CatchTagHandlers<Codes extends string> = {
6
+ readonly [Code in Codes]: (exception: AnyCraftException & {
7
+ readonly _tag: Code;
8
+ }) => Generator<unknown, void, unknown>;
9
+ };
10
+ /** Component-logic adapter for the core catchTag exhaustive algorithm. */
11
+ interface CatchTag {
12
+ exhaustive<Codes extends string, const Handlers extends CatchTagHandlers<Codes> = CatchTagHandlers<Codes>>(handlers: CatchTagHandlers<Codes> & Handlers): ComponentOperator<readonly [], Extract<keyof Handlers, string>>;
13
+ exhaustive<Component extends CraftComponent<any>, const Handlers extends CatchTagHandlers<ComponentInitializationExceptionsOf<NoInfer<Component>>> = CatchTagHandlers<ComponentInitializationExceptionsOf<Component>>>(component: Component, handlers: CatchTagHandlers<ComponentInitializationExceptionsOf<NoInfer<Component>>> & Handlers): ComponentOperator<readonly [], Extract<keyof Handlers, string>>;
14
+ }
15
+ export declare const catchTag: CatchTag;
16
+ export {};
17
+ //# sourceMappingURL=composition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../../../../../libs/component/src/lib/composition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,mCAAmC,EACxC,KAAK,cAAc,EACpB,MAAM,SAAS,CAAC;AAEjB,yEAAyE;AACzE,wBAAgB,aAAa,CAC3B,KAAK,CAAC,SAAS,SAAS,SAAS,oBAAoB,EAAE,EACvD,SAAS,EAAE,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAepD;AAED,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,MAAM,IAAI;IACnD,QAAQ,EAAE,IAAI,IAAI,KAAK,GAAG,CACxB,SAAS,EAAE,iBAAiB,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;KAAE,KACnD,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC;CACvC,CAAC;AAEF,0EAA0E;AAC1E,UAAU,QAAQ;IAChB,UAAU,CACR,KAAK,SAAS,MAAM,EACpB,KAAK,CAAC,QAAQ,SAAS,gBAAgB,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAExE,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,QAAQ,GAC3C,iBAAiB,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,MAAM,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACnE,UAAU,CACR,SAAS,SAAS,cAAc,CAAC,GAAG,CAAC,EACrC,KAAK,CAAC,QAAQ,SAAS,gBAAgB,CACrC,mCAAmC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CACxD,GAAG,gBAAgB,CAAC,mCAAmC,CAAC,SAAS,CAAC,CAAC,EAEpE,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,gBAAgB,CACxB,mCAAmC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CACxD,GACC,QAAQ,GACT,iBAAiB,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,MAAM,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;CACpE;AA6BD,eAAO,MAAM,QAAQ,EAAE,QAEtB,CAAC"}