@fragno-dev/core 0.1.7 → 0.1.8

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 (79) hide show
  1. package/.turbo/turbo-build.log +45 -53
  2. package/CHANGELOG.md +6 -0
  3. package/dist/api/api.d.ts +2 -2
  4. package/dist/api/api.js +3 -2
  5. package/dist/api/fragment-builder.d.ts +2 -4
  6. package/dist/api/fragment-builder.js +1 -1
  7. package/dist/api/fragment-instantiation.d.ts +2 -4
  8. package/dist/api/fragment-instantiation.js +3 -5
  9. package/dist/api/route.d.ts +2 -3
  10. package/dist/api/route.js +1 -1
  11. package/dist/api-BFrUCIsF.d.ts +963 -0
  12. package/dist/api-BFrUCIsF.d.ts.map +1 -0
  13. package/dist/client/client.d.ts +1 -3
  14. package/dist/client/client.js +4 -5
  15. package/dist/client/client.svelte.d.ts +2 -3
  16. package/dist/client/client.svelte.d.ts.map +1 -1
  17. package/dist/client/client.svelte.js +4 -5
  18. package/dist/client/client.svelte.js.map +1 -1
  19. package/dist/client/react.d.ts +2 -3
  20. package/dist/client/react.d.ts.map +1 -1
  21. package/dist/client/react.js +4 -5
  22. package/dist/client/react.js.map +1 -1
  23. package/dist/client/solid.d.ts +2 -3
  24. package/dist/client/solid.d.ts.map +1 -1
  25. package/dist/client/solid.js +4 -5
  26. package/dist/client/solid.js.map +1 -1
  27. package/dist/client/vanilla.d.ts +2 -3
  28. package/dist/client/vanilla.d.ts.map +1 -1
  29. package/dist/client/vanilla.js +4 -5
  30. package/dist/client/vanilla.js.map +1 -1
  31. package/dist/client/vue.d.ts +2 -3
  32. package/dist/client/vue.d.ts.map +1 -1
  33. package/dist/client/vue.js +4 -5
  34. package/dist/client/vue.js.map +1 -1
  35. package/dist/{client-C5LsYHEI.js → client-DAFHcKqA.js} +4 -4
  36. package/dist/{client-C5LsYHEI.js.map → client-DAFHcKqA.js.map} +1 -1
  37. package/dist/fragment-builder-Boh2vNHq.js +108 -0
  38. package/dist/fragment-builder-Boh2vNHq.js.map +1 -0
  39. package/dist/fragment-instantiation-DUT-HLl1.js +898 -0
  40. package/dist/fragment-instantiation-DUT-HLl1.js.map +1 -0
  41. package/dist/integrations/react-ssr.js +1 -1
  42. package/dist/mod.d.ts +2 -4
  43. package/dist/mod.js +4 -6
  44. package/dist/{route-C5Uryylh.js → route-C4CyNHkC.js} +8 -3
  45. package/dist/route-C4CyNHkC.js.map +1 -0
  46. package/dist/{ssr-BByDVfFD.js → ssr-kyKI7pqH.js} +1 -1
  47. package/dist/{ssr-BByDVfFD.js.map → ssr-kyKI7pqH.js.map} +1 -1
  48. package/dist/test/test.d.ts +6 -7
  49. package/dist/test/test.d.ts.map +1 -1
  50. package/dist/test/test.js +9 -7
  51. package/dist/test/test.js.map +1 -1
  52. package/package.json +1 -1
  53. package/src/api/api.ts +45 -6
  54. package/src/api/fragment-builder.ts +463 -25
  55. package/src/api/fragment-instantiation.test.ts +249 -7
  56. package/src/api/fragment-instantiation.ts +283 -16
  57. package/src/api/fragment-services.test.ts +462 -0
  58. package/src/api/fragment.test.ts +65 -17
  59. package/src/api/request-middleware.test.ts +6 -3
  60. package/src/api/route.test.ts +111 -1
  61. package/src/api/route.ts +323 -14
  62. package/src/mod.ts +11 -1
  63. package/src/test/test.test.ts +20 -15
  64. package/src/test/test.ts +48 -9
  65. package/dist/api-BWN97TOr.d.ts +0 -377
  66. package/dist/api-BWN97TOr.d.ts.map +0 -1
  67. package/dist/api-DngJDcmO.js +0 -54
  68. package/dist/api-DngJDcmO.js.map +0 -1
  69. package/dist/fragment-builder-DOnCVBqc.js +0 -47
  70. package/dist/fragment-builder-DOnCVBqc.js.map +0 -1
  71. package/dist/fragment-builder-MGr68GNb.d.ts +0 -409
  72. package/dist/fragment-builder-MGr68GNb.d.ts.map +0 -1
  73. package/dist/fragment-instantiation-C4wvwl6V.js +0 -446
  74. package/dist/fragment-instantiation-C4wvwl6V.js.map +0 -1
  75. package/dist/request-output-context-CdIjwmEN.js +0 -320
  76. package/dist/request-output-context-CdIjwmEN.js.map +0 -1
  77. package/dist/route-Bl9Zr1Yv.d.ts +0 -26
  78. package/dist/route-Bl9Zr1Yv.d.ts.map +0 -1
  79. package/dist/route-C5Uryylh.js.map +0 -1
@@ -0,0 +1,108 @@
1
+ //#region src/api/fragment-builder.ts
2
+ var FragmentBuilder = class FragmentBuilder {
3
+ #definition;
4
+ constructor(definition) {
5
+ this.#definition = definition;
6
+ }
7
+ get definition() {
8
+ return this.#definition;
9
+ }
10
+ get $requiredOptions() {
11
+ throw new Error("Type only method. Do not call.");
12
+ }
13
+ withDependencies(fn) {
14
+ const providedServices = this.#definition.providedServices;
15
+ const recastProvidedServices = typeof providedServices === "function" ? providedServices : providedServices;
16
+ return new FragmentBuilder({
17
+ name: this.#definition.name,
18
+ dependencies: (config, options) => {
19
+ return fn({
20
+ config,
21
+ fragnoConfig: options
22
+ });
23
+ },
24
+ services: void 0,
25
+ additionalContext: this.#definition.additionalContext,
26
+ usedServices: this.#definition.usedServices,
27
+ providedServices: recastProvidedServices
28
+ });
29
+ }
30
+ usesService(serviceName, options) {
31
+ const isOptional = options?.optional ?? false;
32
+ return new FragmentBuilder({
33
+ name: this.#definition.name,
34
+ dependencies: this.#definition.dependencies,
35
+ services: this.#definition.services,
36
+ additionalContext: this.#definition.additionalContext,
37
+ usedServices: {
38
+ ...this.#definition.usedServices,
39
+ [serviceName]: {
40
+ name: serviceName,
41
+ required: !isOptional
42
+ }
43
+ },
44
+ providedServices: this.#definition.providedServices
45
+ });
46
+ }
47
+ providesService(...args) {
48
+ const defineService = (services) => services;
49
+ if (args.length === 1) {
50
+ const [fnOrServices] = args;
51
+ const servicesCallback = (config, options, deps) => {
52
+ if (typeof fnOrServices === "function") return fnOrServices({
53
+ config,
54
+ fragnoConfig: options,
55
+ deps,
56
+ defineService
57
+ });
58
+ else return fnOrServices;
59
+ };
60
+ return new FragmentBuilder({
61
+ name: this.#definition.name,
62
+ dependencies: this.#definition.dependencies,
63
+ services: servicesCallback,
64
+ additionalContext: this.#definition.additionalContext,
65
+ usedServices: this.#definition.usedServices,
66
+ providedServices: this.#definition.providedServices
67
+ });
68
+ } else {
69
+ const [serviceName, fnOrService] = args;
70
+ const createService = (config, options, deps) => {
71
+ if (typeof fnOrService === "function") return fnOrService({
72
+ config,
73
+ fragnoConfig: options,
74
+ deps,
75
+ defineService
76
+ });
77
+ else return fnOrService;
78
+ };
79
+ const existingProvidedServices = this.#definition.providedServices;
80
+ const newProvidedServices = typeof existingProvidedServices === "function" ? (config, options, deps) => {
81
+ const existing = existingProvidedServices(config, options, deps);
82
+ const newService = createService(config, options, deps);
83
+ return {
84
+ ...existing,
85
+ [serviceName]: newService
86
+ };
87
+ } : {
88
+ ...existingProvidedServices,
89
+ [serviceName]: createService
90
+ };
91
+ return new FragmentBuilder({
92
+ name: this.#definition.name,
93
+ dependencies: this.#definition.dependencies,
94
+ services: this.#definition.services,
95
+ additionalContext: this.#definition.additionalContext,
96
+ usedServices: this.#definition.usedServices,
97
+ providedServices: newProvidedServices
98
+ });
99
+ }
100
+ }
101
+ };
102
+ function defineFragment(name) {
103
+ return new FragmentBuilder({ name });
104
+ }
105
+
106
+ //#endregion
107
+ export { defineFragment as n, FragmentBuilder as t };
108
+ //# sourceMappingURL=fragment-builder-Boh2vNHq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fragment-builder-Boh2vNHq.js","names":["#definition","newProvidedServices:\n | {\n [K in keyof (TProvidedServices & {\n [K in TServiceName]: TService;\n })]: (TProvidedServices & {\n [K in TServiceName]: TService;\n })[K];\n }\n | ((\n config: TConfig,\n options: FragnoPublicConfig,\n deps: TDeps & TUsedServices,\n ) => TProvidedServices & { [K in TServiceName]: TService })"],"sources":["../src/api/fragment-builder.ts"],"sourcesContent":["import type { RequestThisContext } from \"./api\";\nimport type { FragnoPublicConfig } from \"./fragment-instantiation\";\nimport type { RequestInputContext } from \"./request-input-context\";\nimport type { RequestOutputContext } from \"./request-output-context\";\n\n/**\n * Metadata for a service dependency\n */\ninterface ServiceMetadata {\n /** Name of the service */\n name: string;\n /** Whether this service is required (false means optional) */\n required: boolean;\n}\n\nexport type RouteHandler = (\n this: RequestThisContext,\n inputContext: RequestInputContext,\n outputContext: RequestOutputContext,\n) => Promise<Response>;\n\nexport interface FragmentDefinition<\n TConfig,\n TDeps = {},\n TServices = {},\n TAdditionalContext extends Record<string, unknown> = {},\n TUsedServices = {},\n TProvidedServices = {},\n TThisContext extends RequestThisContext = RequestThisContext,\n> {\n name: string;\n dependencies?: (config: TConfig, options: FragnoPublicConfig) => TDeps;\n services?: (\n config: TConfig,\n options: FragnoPublicConfig,\n deps: TDeps & TUsedServices,\n ) => TServices;\n additionalContext?: TAdditionalContext;\n createHandlerWrapper?: (\n options: FragnoPublicConfig,\n ) => (\n handler: (this: TThisContext, ...args: Parameters<RouteHandler>) => ReturnType<RouteHandler>,\n ) => RouteHandler;\n /** Services that this fragment uses (can be required or optional) */\n usedServices?: {\n [K in keyof TUsedServices]: ServiceMetadata;\n };\n /** Services that this fragment provides to other fragments (can be a factory function or direct object) */\n providedServices?:\n | {\n [K in keyof TProvidedServices]: TProvidedServices[K];\n }\n | ((\n config: TConfig,\n options: FragnoPublicConfig,\n deps: TDeps & TUsedServices,\n ) => TProvidedServices);\n}\n\nexport class FragmentBuilder<\n const TConfig,\n const TDeps = {},\n const TServices = {},\n const TAdditionalContext extends Record<string, unknown> = {},\n const TUsedServices = {},\n const TProvidedServices = {},\n const TThisContext extends RequestThisContext = RequestThisContext,\n> {\n #definition: FragmentDefinition<\n TConfig,\n TDeps,\n TServices,\n TAdditionalContext,\n TUsedServices,\n TProvidedServices,\n TThisContext\n >;\n\n constructor(\n definition: FragmentDefinition<\n TConfig,\n TDeps,\n TServices,\n TAdditionalContext,\n TUsedServices,\n TProvidedServices,\n TThisContext\n >,\n ) {\n this.#definition = definition;\n }\n\n get definition() {\n return this.#definition;\n }\n\n get $requiredOptions(): FragnoPublicConfig {\n throw new Error(\"Type only method. Do not call.\");\n }\n\n withDependencies<TNewDeps>(\n fn: (\n context: { config: TConfig; fragnoConfig: FragnoPublicConfig } & TAdditionalContext,\n ) => TNewDeps,\n ): FragmentBuilder<\n TConfig,\n TNewDeps,\n {},\n TAdditionalContext,\n TUsedServices,\n TProvidedServices,\n TThisContext\n > {\n // Safe cast: If providedServices is a function, we need to update its signature to use TNewDeps.\n // This is safe because the function will be called with the new deps at runtime.\n const providedServices = this.#definition.providedServices;\n const recastProvidedServices =\n typeof providedServices === \"function\"\n ? (providedServices as unknown as (\n config: TConfig,\n options: FragnoPublicConfig,\n deps: TNewDeps & TUsedServices,\n ) => TProvidedServices)\n : providedServices;\n\n return new FragmentBuilder<\n TConfig,\n TNewDeps,\n {},\n TAdditionalContext,\n TUsedServices,\n TProvidedServices,\n TThisContext\n >({\n name: this.#definition.name,\n dependencies: (config: TConfig, options: FragnoPublicConfig) => {\n return fn({ config, fragnoConfig: options } as {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n } & TAdditionalContext);\n },\n services: undefined,\n additionalContext: this.#definition.additionalContext,\n usedServices: this.#definition.usedServices,\n providedServices: recastProvidedServices,\n });\n }\n\n /**\n * Declare that this fragment uses a service.\n * By default, the service is required. Pass { optional: true } to make it optional.\n *\n * @example\n * ```ts\n * // Required service\n * defineFragment(\"my-fragment\")\n * .usesService<\"email\", IEmailService>(\"email\")\n * .providesService(({ deps, define }) => define({\n * sendWelcome: () => deps.email.send(...)\n * }))\n *\n * // Optional service\n * defineFragment(\"my-fragment\")\n * .usesService<\"email\", IEmailService>(\"email\", { optional: true })\n * .providesService(({ deps, define }) => define({\n * sendWelcome: () => {\n * if (deps.email) {\n * deps.email.send(...)\n * }\n * }\n * }))\n * ```\n */\n usesService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n options?: { optional?: false },\n ): FragmentBuilder<\n TConfig,\n TDeps,\n TServices,\n TAdditionalContext,\n TUsedServices & { [K in TServiceName]: TService },\n TProvidedServices,\n TThisContext\n >;\n usesService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n options: { optional: true },\n ): FragmentBuilder<\n TConfig,\n TDeps,\n TServices,\n TAdditionalContext,\n TUsedServices & { [K in TServiceName]: TService | undefined },\n TProvidedServices,\n TThisContext\n >;\n usesService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n options?: { optional?: boolean },\n ): FragmentBuilder<\n TConfig,\n TDeps,\n TServices,\n TAdditionalContext,\n TUsedServices & { [K in TServiceName]: TService | TService | undefined },\n TProvidedServices,\n TThisContext\n > {\n const isOptional = options?.optional ?? false;\n return new FragmentBuilder<\n TConfig,\n TDeps,\n TServices,\n TAdditionalContext,\n TUsedServices & { [K in TServiceName]: TService | (TService | undefined) },\n TProvidedServices,\n TThisContext\n >({\n name: this.#definition.name,\n dependencies: this.#definition.dependencies,\n services: this.#definition.services as\n | ((\n config: TConfig,\n options: FragnoPublicConfig,\n deps: TDeps &\n (TUsedServices & { [K in TServiceName]: TService | (TService | undefined) }),\n ) => TServices)\n | undefined,\n additionalContext: this.#definition.additionalContext,\n usedServices: {\n ...this.#definition.usedServices,\n [serviceName]: { name: serviceName, required: !isOptional },\n } as {\n [K in keyof (TUsedServices & {\n [K in TServiceName]: TService | (TService | undefined);\n })]: ServiceMetadata;\n },\n providedServices: this.#definition.providedServices,\n });\n }\n\n /**\n * Define services for this fragment (unnamed) using a callback.\n * Use the `defineService` function from the callback context for proper typing (optional).\n */\n providesService<TNewServices>(\n fn: (context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps & TUsedServices;\n defineService: <T>(services: T) => T;\n }) => TNewServices,\n ): FragmentBuilder<\n TConfig,\n TDeps,\n TNewServices,\n TAdditionalContext,\n TUsedServices,\n TProvidedServices,\n TThisContext\n >;\n\n /**\n * Define services for this fragment (unnamed) using a direct object.\n */\n providesService<TNewServices>(\n services: TNewServices,\n ): FragmentBuilder<\n TConfig,\n TDeps,\n TNewServices,\n TAdditionalContext,\n TUsedServices,\n TProvidedServices,\n TThisContext\n >;\n\n /**\n * Provide a named service using a callback.\n * Use the `defineService` function from the callback context for proper typing (optional).\n *\n * @example\n * ```ts\n * interface IEmailService {\n * send(to: string, subject: string, body: string): Promise<void>;\n * }\n *\n * defineFragment(\"email-fragment\")\n * .providesService<\"email\", IEmailService>(\"email\", ({ defineService }) => defineService({\n * send: async (to, subject, body) => {\n * // implementation\n * }\n * }))\n * ```\n */\n providesService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n fn: (context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps & TUsedServices;\n defineService: <T>(services: T) => T;\n }) => TService,\n ): FragmentBuilder<\n TConfig,\n TDeps,\n TServices,\n TAdditionalContext,\n TUsedServices,\n TProvidedServices & { [K in TServiceName]: TService },\n TThisContext\n >;\n\n /**\n * Provide a named service using a direct object.\n */\n providesService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n service: TService,\n ): FragmentBuilder<\n TConfig,\n TDeps,\n TServices,\n TAdditionalContext,\n TUsedServices,\n TProvidedServices & { [K in TServiceName]: TService },\n TThisContext\n >;\n\n providesService<TServiceName extends string, TService>(\n ...args:\n | [\n fnOrServices:\n | ((context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps & TUsedServices;\n defineService: <T>(services: T) => T;\n }) => TService)\n | TService,\n ]\n | [\n serviceName: TServiceName,\n fnOrService:\n | ((context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps & TUsedServices;\n defineService: <T>(services: T) => T;\n }) => TService)\n | TService,\n ]\n ):\n | FragmentBuilder<\n TConfig,\n TDeps,\n TService,\n TAdditionalContext,\n TUsedServices,\n TProvidedServices,\n TThisContext\n >\n | FragmentBuilder<\n TConfig,\n TDeps,\n TServices,\n TAdditionalContext,\n TUsedServices,\n TProvidedServices & { [K in TServiceName]: TService },\n TThisContext\n > {\n // The defineService function is just an identity function at runtime\n const defineService = <T>(services: T) => services;\n\n if (args.length === 1) {\n // Unnamed service\n const [fnOrServices] = args;\n\n // Create a callback that provides the full context including defineService\n const servicesCallback = (\n config: TConfig,\n options: FragnoPublicConfig,\n deps: TDeps & TUsedServices,\n ): TService => {\n if (typeof fnOrServices === \"function\") {\n // It's a factory function - call it with context\n const fn = fnOrServices as (context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps & TUsedServices;\n defineService: <T>(services: T) => T;\n }) => TService;\n return fn({\n config,\n fragnoConfig: options,\n deps,\n defineService,\n });\n } else {\n // It's a direct service object\n return fnOrServices;\n }\n };\n\n return new FragmentBuilder<\n TConfig,\n TDeps,\n TService,\n TAdditionalContext,\n TUsedServices,\n TProvidedServices,\n TThisContext\n >({\n name: this.#definition.name,\n dependencies: this.#definition.dependencies,\n services: servicesCallback as (\n config: TConfig,\n options: FragnoPublicConfig,\n deps: TDeps & TUsedServices,\n ) => TService,\n additionalContext: this.#definition.additionalContext,\n usedServices: this.#definition.usedServices,\n providedServices: this.#definition.providedServices,\n });\n } else {\n // Named service\n const [serviceName, fnOrService] = args;\n\n // Create a callback that provides the full context including defineService\n const createService = (\n config: TConfig,\n options: FragnoPublicConfig,\n deps: TDeps & TUsedServices,\n ): TService => {\n if (typeof fnOrService === \"function\") {\n // It's a factory function - call it with context\n const fn = fnOrService as (context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps & TUsedServices;\n defineService: <T>(services: T) => T;\n }) => TService;\n return fn({\n config,\n fragnoConfig: options,\n deps,\n defineService,\n });\n } else {\n // It's a direct service object\n return fnOrService;\n }\n };\n\n // We need to handle both function and object forms of providedServices\n const existingProvidedServices = this.#definition.providedServices;\n const newProvidedServices:\n | {\n [K in keyof (TProvidedServices & {\n [K in TServiceName]: TService;\n })]: (TProvidedServices & {\n [K in TServiceName]: TService;\n })[K];\n }\n | ((\n config: TConfig,\n options: FragnoPublicConfig,\n deps: TDeps & TUsedServices,\n ) => TProvidedServices & { [K in TServiceName]: TService }) =\n typeof existingProvidedServices === \"function\"\n ? // If existing is a function, create a new function that calls both\n (config: TConfig, options: FragnoPublicConfig, deps: TDeps & TUsedServices) => {\n const existing = existingProvidedServices(config, options, deps);\n const newService = createService(config, options, deps);\n return {\n ...existing,\n [serviceName]: newService,\n } as TProvidedServices & { [K in TServiceName]: TService };\n }\n : // If existing is an object or undefined, spread it\n ({\n ...existingProvidedServices,\n [serviceName]: createService,\n } as {\n [K in keyof (TProvidedServices & {\n [K in TServiceName]: TService;\n })]: (TProvidedServices & {\n [K in TServiceName]: TService;\n })[K];\n });\n\n return new FragmentBuilder<\n TConfig,\n TDeps,\n TServices,\n TAdditionalContext,\n TUsedServices,\n TProvidedServices & { [K in TServiceName]: TService },\n TThisContext\n >({\n name: this.#definition.name,\n dependencies: this.#definition.dependencies,\n services: this.#definition.services,\n additionalContext: this.#definition.additionalContext,\n usedServices: this.#definition.usedServices,\n providedServices: newProvidedServices,\n });\n }\n }\n}\nexport function defineFragment<TConfig = {}>(\n name: string,\n): FragmentBuilder<TConfig, {}, {}, {}, {}, {}, RequestThisContext> {\n return new FragmentBuilder({\n name,\n });\n}\n"],"mappings":";AA2DA,IAAa,kBAAb,MAAa,gBAQX;CACA;CAUA,YACE,YASA;AACA,QAAKA,aAAc;;CAGrB,IAAI,aAAa;AACf,SAAO,MAAKA;;CAGd,IAAI,mBAAuC;AACzC,QAAM,IAAI,MAAM,iCAAiC;;CAGnD,iBACE,IAWA;EAGA,MAAM,mBAAmB,MAAKA,WAAY;EAC1C,MAAM,yBACJ,OAAO,qBAAqB,aACvB,mBAKD;AAEN,SAAO,IAAI,gBAQT;GACA,MAAM,MAAKA,WAAY;GACvB,eAAe,QAAiB,YAAgC;AAC9D,WAAO,GAAG;KAAE;KAAQ,cAAc;KAAS,CAGpB;;GAEzB,UAAU;GACV,mBAAmB,MAAKA,WAAY;GACpC,cAAc,MAAKA,WAAY;GAC/B,kBAAkB;GACnB,CAAC;;CAoDJ,YACE,aACA,SASA;EACA,MAAM,aAAa,SAAS,YAAY;AACxC,SAAO,IAAI,gBAQT;GACA,MAAM,MAAKA,WAAY;GACvB,cAAc,MAAKA,WAAY;GAC/B,UAAU,MAAKA,WAAY;GAQ3B,mBAAmB,MAAKA,WAAY;GACpC,cAAc;IACZ,GAAG,MAAKA,WAAY;KACnB,cAAc;KAAE,MAAM;KAAa,UAAU,CAAC;KAAY;IAC5D;GAKD,kBAAkB,MAAKA,WAAY;GACpC,CAAC;;CA2FJ,gBACE,GAAG,MAwCC;EAEJ,MAAM,iBAAoB,aAAgB;AAE1C,MAAI,KAAK,WAAW,GAAG;GAErB,MAAM,CAAC,gBAAgB;GAGvB,MAAM,oBACJ,QACA,SACA,SACa;AACb,QAAI,OAAO,iBAAiB,WAQ1B,QANW,aAMD;KACR;KACA,cAAc;KACd;KACA;KACD,CAAC;QAGF,QAAO;;AAIX,UAAO,IAAI,gBAQT;IACA,MAAM,MAAKA,WAAY;IACvB,cAAc,MAAKA,WAAY;IAC/B,UAAU;IAKV,mBAAmB,MAAKA,WAAY;IACpC,cAAc,MAAKA,WAAY;IAC/B,kBAAkB,MAAKA,WAAY;IACpC,CAAC;SACG;GAEL,MAAM,CAAC,aAAa,eAAe;GAGnC,MAAM,iBACJ,QACA,SACA,SACa;AACb,QAAI,OAAO,gBAAgB,WAQzB,QANW,YAMD;KACR;KACA,cAAc;KACd;KACA;KACD,CAAC;QAGF,QAAO;;GAKX,MAAM,2BAA2B,MAAKA,WAAY;GAClD,MAAMC,sBAaJ,OAAO,6BAA6B,cAE/B,QAAiB,SAA6B,SAAgC;IAC7E,MAAM,WAAW,yBAAyB,QAAQ,SAAS,KAAK;IAChE,MAAM,aAAa,cAAc,QAAQ,SAAS,KAAK;AACvD,WAAO;KACL,GAAG;MACF,cAAc;KAChB;OAGF;IACC,GAAG;KACF,cAAc;IAChB;AAQP,UAAO,IAAI,gBAQT;IACA,MAAM,MAAKD,WAAY;IACvB,cAAc,MAAKA,WAAY;IAC/B,UAAU,MAAKA,WAAY;IAC3B,mBAAmB,MAAKA,WAAY;IACpC,cAAc,MAAKA,WAAY;IAC/B,kBAAkB;IACnB,CAAC;;;;AAIR,SAAgB,eACd,MACkE;AAClE,QAAO,IAAI,gBAAgB,EACzB,MACD,CAAC"}