ts-procedures 5.4.0 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +21 -0
  2. package/agent_config/claude-code/skills/guide/SKILL.md +1 -0
  3. package/agent_config/claude-code/skills/guide/anti-patterns.md +37 -4
  4. package/agent_config/claude-code/skills/guide/api-reference.md +86 -0
  5. package/agent_config/claude-code/skills/guide/patterns.md +33 -0
  6. package/agent_config/claude-code/skills/review/checklist.md +2 -0
  7. package/agent_config/claude-code/skills/scaffold/templates/hono-api.md +1 -1
  8. package/agent_config/copilot/copilot-instructions.md +4 -0
  9. package/agent_config/cursor/cursorrules +4 -0
  10. package/build/implementations/http/doc-registry.d.ts +12 -0
  11. package/build/implementations/http/doc-registry.js +114 -0
  12. package/build/implementations/http/doc-registry.js.map +1 -0
  13. package/build/implementations/http/doc-registry.test.d.ts +1 -0
  14. package/build/implementations/http/doc-registry.test.js +321 -0
  15. package/build/implementations/http/doc-registry.test.js.map +1 -0
  16. package/build/implementations/types.d.ts +31 -0
  17. package/package.json +5 -2
  18. package/src/errors.test.ts +0 -163
  19. package/src/errors.ts +0 -107
  20. package/src/exports.ts +0 -7
  21. package/src/implementations/http/README.md +0 -260
  22. package/src/implementations/http/express-rpc/README.md +0 -281
  23. package/src/implementations/http/express-rpc/index.test.ts +0 -957
  24. package/src/implementations/http/express-rpc/index.ts +0 -265
  25. package/src/implementations/http/express-rpc/types.ts +0 -16
  26. package/src/implementations/http/hono-api/index.test.ts +0 -1328
  27. package/src/implementations/http/hono-api/index.ts +0 -461
  28. package/src/implementations/http/hono-api/types.ts +0 -16
  29. package/src/implementations/http/hono-rpc/README.md +0 -358
  30. package/src/implementations/http/hono-rpc/index.test.ts +0 -1075
  31. package/src/implementations/http/hono-rpc/index.ts +0 -237
  32. package/src/implementations/http/hono-rpc/types.ts +0 -16
  33. package/src/implementations/http/hono-stream/README.md +0 -526
  34. package/src/implementations/http/hono-stream/index.test.ts +0 -1676
  35. package/src/implementations/http/hono-stream/index.ts +0 -435
  36. package/src/implementations/http/hono-stream/types.ts +0 -29
  37. package/src/implementations/types.ts +0 -127
  38. package/src/index.test.ts +0 -1194
  39. package/src/index.ts +0 -512
  40. package/src/schema/compute-schema.test.ts +0 -128
  41. package/src/schema/compute-schema.ts +0 -88
  42. package/src/schema/extract-json-schema.test.ts +0 -25
  43. package/src/schema/extract-json-schema.ts +0 -15
  44. package/src/schema/parser.test.ts +0 -182
  45. package/src/schema/parser.ts +0 -215
  46. package/src/schema/resolve-schema-lib.test.ts +0 -19
  47. package/src/schema/resolve-schema-lib.ts +0 -29
  48. package/src/schema/types.ts +0 -20
  49. package/src/stack-utils.test.ts +0 -94
  50. package/src/stack-utils.ts +0 -129
package/README.md CHANGED
@@ -727,6 +727,27 @@ for (const config of procedures) {
727
727
  }
728
728
  ```
729
729
 
730
+ ### DocRegistry — Composing Docs from Multiple Builders
731
+
732
+ Use `DocRegistry` to compose route documentation from any combination of HTTP builders into a typed envelope:
733
+
734
+ ```typescript
735
+ import { DocRegistry } from 'ts-procedures/http-docs'
736
+
737
+ const docs = new DocRegistry({
738
+ basePath: '/api',
739
+ headers: [{ name: 'Authorization', description: 'Bearer token', required: false }],
740
+ errors: DocRegistry.defaultErrors(),
741
+ })
742
+ .from(rpcBuilder)
743
+ .from(apiBuilder)
744
+ .from(streamBuilder)
745
+
746
+ app.get('/docs', (c) => c.json(docs.toJSON()))
747
+ ```
748
+
749
+ `from()` stores a reference — routes are read lazily at `toJSON()` time, so builders can be registered before or after `.build()`. Supports optional `filter` and `transform` options for customizing output.
750
+
730
751
  ## Testing
731
752
 
732
753
  Procedures return handlers that can be called directly in tests:
@@ -82,6 +82,7 @@ All errors include `definedAt` (file:line:column) and enhanced stack traces poin
82
82
  | `ExpressRPCAppBuilder` | `ts-procedures/express-rpc` | POST JSON |
83
83
  | `HonoRPCAppBuilder` | `ts-procedures/hono-rpc` | POST JSON |
84
84
  | `HonoStreamAppBuilder` | `ts-procedures/hono-stream` | SSE or newline-delimited JSON |
85
+ | `DocRegistry` | `ts-procedures/http-docs` | Compose route docs from multiple builders |
85
86
 
86
87
  ### Route Path Format
87
88
 
@@ -451,7 +451,40 @@ console.log(builder.docs)
451
451
 
452
452
  ---
453
453
 
454
- ## 16. Using Async Context Factory Without Error Handling
454
+ ## 16. Manually Wiring a /docs Endpoint Instead of Using DocRegistry
455
+
456
+ **Problem:** Building the docs JSON envelope by hand in every app — duplicating basePath, headers, errors, and route assembly.
457
+
458
+ ```typescript
459
+ // BAD — repeated boilerplate in every app
460
+ app.get('/docs', (c) => c.json({
461
+ basePath: '/api',
462
+ headers: [{ name: 'Authorization', description: 'Bearer token' }],
463
+ errors: [],
464
+ routes: [...rpcBuilder.docs, ...apiBuilder.docs, ...streamBuilder.docs],
465
+ }))
466
+ ```
467
+
468
+ **Fix:** Use `DocRegistry` to compose docs from builders.
469
+
470
+ ```typescript
471
+ // GOOD — declarative, composable, typed
472
+ import { DocRegistry } from 'ts-procedures/http-docs'
473
+
474
+ const docs = new DocRegistry({
475
+ basePath: '/api',
476
+ headers: [{ name: 'Authorization', description: 'Bearer token' }],
477
+ errors: DocRegistry.defaultErrors(),
478
+ }).from(rpcBuilder).from(apiBuilder).from(streamBuilder)
479
+
480
+ app.get('/docs', (c) => c.json(docs.toJSON()))
481
+ ```
482
+
483
+ **Why:** `DocRegistry` provides a typed `DocEnvelope`, includes `defaultErrors()` with JSON Schemas for all 4 procedure error types, reads docs lazily (order-independent), and supports filtering and transformation via `toJSON()` options.
484
+
485
+ ---
486
+
487
+ ## 17. Using Async Context Factory Without Error Handling
455
488
 
456
489
  **Problem:** Async context factories that throw unhandled errors, crashing the request.
457
490
 
@@ -480,7 +513,7 @@ new ExpressRPCAppBuilder({
480
513
 
481
514
  ---
482
515
 
483
- ## 17. Using Both schema.params and schema.input
516
+ ## 18. Using Both schema.params and schema.input
484
517
 
485
518
  **Problem:** Defining both `schema.params` and `schema.input` on the same procedure.
486
519
 
@@ -523,7 +556,7 @@ Create('GetUser', {
523
556
 
524
557
  ---
525
558
 
526
- ## 18. Mismatched Path Param Names in schema.input
559
+ ## 19. Mismatched Path Param Names in schema.input
527
560
 
528
561
  **Problem:** Path template param names don't match `schema.input.pathParams` property names.
529
562
 
@@ -559,7 +592,7 @@ Create('GetUser', {
559
592
 
560
593
  ---
561
594
 
562
- ## 19. Forgetting build() is Async on HonoAPIAppBuilder
595
+ ## 20. Forgetting build() is Async on HonoAPIAppBuilder
563
596
 
564
597
  **Problem:** Not awaiting `build()` on `HonoAPIAppBuilder`.
565
598
 
@@ -665,6 +665,92 @@ type HttpMethod = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head'
665
665
 
666
666
  ---
667
667
 
668
+ ## DocRegistry
669
+
670
+ Composes route documentation from any number of HTTP builders into a typed envelope. Eliminates boilerplate `/docs` endpoint wiring.
671
+
672
+ ```typescript
673
+ import { DocRegistry } from 'ts-procedures/http-docs'
674
+ import type { DocEnvelope, DocRegistryConfig, DocRegistryOutputOptions, HeaderDoc, ErrorDoc, DocSource } from 'ts-procedures/http-docs'
675
+ ```
676
+
677
+ ```typescript
678
+ class DocRegistry {
679
+ constructor(config?: {
680
+ basePath?: string
681
+ headers?: HeaderDoc[]
682
+ errors?: ErrorDoc[]
683
+ })
684
+
685
+ from(source: DocSource<AnyHttpRouteDoc>): this
686
+
687
+ toJSON<T = DocEnvelope>(options?: {
688
+ filter?: (route: AnyHttpRouteDoc) => boolean
689
+ transform?: (envelope: DocEnvelope) => T
690
+ }): T
691
+
692
+ static defaultErrors(): ErrorDoc[]
693
+ }
694
+ ```
695
+
696
+ ### DocSource
697
+
698
+ Any object with a `readonly docs` array. All four HTTP builders (`HonoRPCAppBuilder`, `HonoAPIAppBuilder`, `HonoStreamAppBuilder`, `ExpressRPCAppBuilder`) satisfy this interface.
699
+
700
+ ```typescript
701
+ interface DocSource<T = AnyHttpRouteDoc> {
702
+ readonly docs: T[]
703
+ }
704
+ ```
705
+
706
+ ### HeaderDoc
707
+
708
+ ```typescript
709
+ interface HeaderDoc {
710
+ name: string
711
+ description?: string
712
+ required?: boolean
713
+ example?: string
714
+ }
715
+ ```
716
+
717
+ ### ErrorDoc
718
+
719
+ ```typescript
720
+ interface ErrorDoc {
721
+ name: string
722
+ statusCode: number
723
+ description: string
724
+ schema?: Record<string, unknown>
725
+ }
726
+ ```
727
+
728
+ ### DocEnvelope
729
+
730
+ ```typescript
731
+ interface DocEnvelope {
732
+ basePath: string
733
+ headers: HeaderDoc[]
734
+ errors: ErrorDoc[]
735
+ routes: AnyHttpRouteDoc[]
736
+ }
737
+ ```
738
+
739
+ ### AnyHttpRouteDoc
740
+
741
+ ```typescript
742
+ type AnyHttpRouteDoc = RPCHttpRouteDoc | APIHttpRouteDoc | StreamHttpRouteDoc
743
+ ```
744
+
745
+ ### Key Behaviors
746
+
747
+ - `from()` stores a **reference** to the builder — routes are read lazily at `toJSON()` time, so builders can be registered before or after `.build()`
748
+ - `toJSON()` collects routes via `flatMap(source => source.docs)`, applies optional `filter`, builds envelope, then applies optional `transform`
749
+ - `defaultErrors()` returns 4 `ErrorDoc` entries describing `ProcedureError` (500), `ProcedureValidationError` (400), `ProcedureYieldValidationError` (500), `ProcedureRegistrationError` (500) — each with a JSON Schema for the error response body shape
750
+ - `JSON.stringify(registry)` works directly (calls `toJSON()` implicitly)
751
+
752
+ ---
753
+
668
754
  ## Stack Utilities
669
755
 
670
756
  ### captureDefinitionInfo()
@@ -640,6 +640,39 @@ const openApiPaths = app.docs.map(doc => ({
640
640
 
641
641
  ---
642
642
 
643
+ ## DocRegistry — Composing Docs from Multiple Builders
644
+
645
+ ```typescript
646
+ import { DocRegistry } from 'ts-procedures/http-docs'
647
+
648
+ // Compose docs from any combination of builders
649
+ const docs = new DocRegistry({
650
+ basePath: '/api',
651
+ headers: [{ name: 'Authorization', description: 'Bearer token', required: false }],
652
+ errors: DocRegistry.defaultErrors(),
653
+ })
654
+ .from(rpcBuilder)
655
+ .from(apiBuilder)
656
+ .from(streamBuilder)
657
+
658
+ // Serve as a /docs endpoint
659
+ app.get('/docs', (c) => c.json(docs.toJSON()))
660
+
661
+ // With filtering and transformation
662
+ app.get('/docs', (c) => c.json(docs.toJSON({
663
+ filter: (route) => route.name !== 'InternalHealthCheck',
664
+ transform: (envelope) => ({ ...envelope, generatedAt: new Date().toISOString() }),
665
+ })))
666
+ ```
667
+
668
+ **Key points:**
669
+ - `from()` stores a reference — register builders before or after `.build()`
670
+ - `toJSON()` reads docs lazily, so late-registered procedures are included
671
+ - `DocRegistry.defaultErrors()` provides error schemas for all 4 procedure error types
672
+ - Accepts any object satisfying `{ readonly docs: AnyHttpRouteDoc[] }` — not limited to built-in builders
673
+
674
+ ---
675
+
643
676
  ## Testing Procedures
644
677
 
645
678
  ```typescript
@@ -72,6 +72,7 @@
72
72
 
73
73
  ### SUGGESTION
74
74
  - [ ] Route documentation accessed via `builder.docs` for OpenAPI generation
75
+ - [ ] Uses `DocRegistry` to compose docs from multiple builders instead of manual envelope assembly
75
76
  - [ ] Lifecycle hooks used for observability (logging, metrics)
76
77
 
77
78
  ---
@@ -110,6 +111,7 @@
110
111
 
111
112
  ### SUGGESTION
112
113
  - [ ] Route documentation accessed via `builder.docs` for OpenAPI generation
114
+ - [ ] Uses `DocRegistry` to compose docs across builders instead of manual assembly
113
115
  - [ ] Custom `queryParser` provided if complex query string formats needed
114
116
  - [ ] Lifecycle hooks used for observability (logging, metrics)
115
117
 
@@ -113,7 +113,7 @@ export const {{name}}App = await new HonoAPIAppBuilder({
113
113
  // POST /api/{{name}} → 201
114
114
  // DELETE /api/{{name}}/:id → 204
115
115
 
116
- // Documentation: builder.docs (access before .build() resolves)
116
+ // Documentation: builder.docs or compose with DocRegistry from 'ts-procedures/http-docs'
117
117
  ```
118
118
 
119
119
  ## Test — `{{Name}}.api.test.ts`
@@ -38,6 +38,10 @@ import { HonoStreamAppBuilder, sse } from 'ts-procedures/hono-stream'
38
38
  // Hono API (REST-style)
39
39
  import { HonoAPIAppBuilder } from 'ts-procedures/hono-api'
40
40
  import type { APIConfig, APIInput } from 'ts-procedures/hono-api'
41
+
42
+ // Doc Registry — compose route docs from multiple builders
43
+ import { DocRegistry } from 'ts-procedures/http-docs'
44
+ import type { DocEnvelope, HeaderDoc, ErrorDoc } from 'ts-procedures/http-docs'
41
45
  ```
42
46
 
43
47
  ## Architecture Rules
@@ -38,6 +38,10 @@ import { HonoStreamAppBuilder, sse } from 'ts-procedures/hono-stream'
38
38
  // Hono API (REST-style)
39
39
  import { HonoAPIAppBuilder } from 'ts-procedures/hono-api'
40
40
  import type { APIConfig, APIInput } from 'ts-procedures/hono-api'
41
+
42
+ // Doc Registry — compose route docs from multiple builders
43
+ import { DocRegistry } from 'ts-procedures/http-docs'
44
+ import type { DocEnvelope, HeaderDoc, ErrorDoc } from 'ts-procedures/http-docs'
41
45
  ```
42
46
 
43
47
  ## Architecture Rules
@@ -0,0 +1,12 @@
1
+ import type { AnyHttpRouteDoc, DocEnvelope, DocRegistryConfig, DocRegistryOutputOptions, DocSource, ErrorDoc } from '../types.js';
2
+ export type { AnyHttpRouteDoc, DocEnvelope, DocRegistryConfig, DocRegistryOutputOptions, DocSource, ErrorDoc, HeaderDoc, } from '../types.js';
3
+ export declare class DocRegistry {
4
+ private readonly basePath;
5
+ private readonly headers;
6
+ private readonly errors;
7
+ private readonly sources;
8
+ constructor(config?: DocRegistryConfig);
9
+ from(source: DocSource<AnyHttpRouteDoc>): this;
10
+ toJSON<T = DocEnvelope>(options?: DocRegistryOutputOptions<T>): T;
11
+ static defaultErrors(): ErrorDoc[];
12
+ }
@@ -0,0 +1,114 @@
1
+ export class DocRegistry {
2
+ basePath;
3
+ headers;
4
+ errors;
5
+ sources = [];
6
+ constructor(config) {
7
+ this.basePath = config?.basePath ?? '';
8
+ this.headers = config?.headers ?? [];
9
+ this.errors = config?.errors ?? [];
10
+ }
11
+ from(source) {
12
+ this.sources.push(source);
13
+ return this;
14
+ }
15
+ toJSON(options) {
16
+ let routes = this.sources.flatMap((source) => source.docs);
17
+ if (options?.filter) {
18
+ routes = routes.filter(options.filter);
19
+ }
20
+ const envelope = {
21
+ basePath: this.basePath,
22
+ headers: [...this.headers],
23
+ errors: [...this.errors],
24
+ routes,
25
+ };
26
+ if (options?.transform) {
27
+ return options.transform(envelope);
28
+ }
29
+ return envelope;
30
+ }
31
+ // Keep in sync with src/errors.ts
32
+ static defaultErrors() {
33
+ return [
34
+ {
35
+ name: 'ProcedureError',
36
+ statusCode: 500,
37
+ description: 'An error thrown from within a procedure handler via ctx.error().',
38
+ schema: {
39
+ type: 'object',
40
+ properties: {
41
+ name: { type: 'string', const: 'ProcedureError' },
42
+ procedureName: { type: 'string' },
43
+ message: { type: 'string' },
44
+ meta: { type: 'object' },
45
+ },
46
+ required: ['name', 'procedureName', 'message'],
47
+ },
48
+ },
49
+ {
50
+ name: 'ProcedureValidationError',
51
+ statusCode: 400,
52
+ description: 'Schema validation failed for the procedure input parameters.',
53
+ schema: {
54
+ type: 'object',
55
+ properties: {
56
+ name: { type: 'string', const: 'ProcedureValidationError' },
57
+ procedureName: { type: 'string' },
58
+ message: { type: 'string' },
59
+ errors: {
60
+ type: 'array',
61
+ items: {
62
+ type: 'object',
63
+ properties: {
64
+ instancePath: { type: 'string' },
65
+ message: { type: 'string' },
66
+ },
67
+ },
68
+ },
69
+ },
70
+ required: ['name', 'procedureName', 'message'],
71
+ },
72
+ },
73
+ {
74
+ name: 'ProcedureYieldValidationError',
75
+ statusCode: 500,
76
+ description: 'Schema validation failed for a yielded value in a streaming procedure.',
77
+ schema: {
78
+ type: 'object',
79
+ properties: {
80
+ name: { type: 'string', const: 'ProcedureYieldValidationError' },
81
+ procedureName: { type: 'string' },
82
+ message: { type: 'string' },
83
+ errors: {
84
+ type: 'array',
85
+ items: {
86
+ type: 'object',
87
+ properties: {
88
+ instancePath: { type: 'string' },
89
+ message: { type: 'string' },
90
+ },
91
+ },
92
+ },
93
+ },
94
+ required: ['name', 'procedureName', 'message'],
95
+ },
96
+ },
97
+ {
98
+ name: 'ProcedureRegistrationError',
99
+ statusCode: 500,
100
+ description: 'An invalid schema or configuration was detected at procedure registration time.',
101
+ schema: {
102
+ type: 'object',
103
+ properties: {
104
+ name: { type: 'string', const: 'ProcedureRegistrationError' },
105
+ procedureName: { type: 'string' },
106
+ message: { type: 'string' },
107
+ },
108
+ required: ['name', 'procedureName', 'message'],
109
+ },
110
+ },
111
+ ];
112
+ }
113
+ }
114
+ //# sourceMappingURL=doc-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-registry.js","sourceRoot":"","sources":["../../../src/implementations/http/doc-registry.ts"],"names":[],"mappings":"AAoBA,MAAM,OAAO,WAAW;IACL,QAAQ,CAAQ;IAChB,OAAO,CAAa;IACpB,MAAM,CAAY;IAClB,OAAO,GAAiC,EAAE,CAAA;IAE3D,YAAY,MAA0B;QACpC,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAA;QACtC,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAA;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,EAAE,CAAA;IACpC,CAAC;IAED,IAAI,CAAC,MAAkC;QACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,CAAkB,OAAqC;QAC3D,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAE1D,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACxC,CAAC;QAED,MAAM,QAAQ,GAAgB;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YAC1B,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACxB,MAAM;SACP,CAAA;QAED,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;YACvB,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACpC,CAAC;QAED,OAAO,QAAa,CAAA;IACtB,CAAC;IAED,kCAAkC;IAClC,MAAM,CAAC,aAAa;QAClB,OAAO;YACL;gBACE,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,kEAAkE;gBAC/E,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE;wBACjD,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACjC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC3B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACzB;oBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,CAAC;iBAC/C;aACF;YACD;gBACE,IAAI,EAAE,0BAA0B;gBAChC,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,8DAA8D;gBAC3E,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,0BAA0B,EAAE;wBAC3D,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACjC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC3B,MAAM,EAAE;4BACN,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,UAAU,EAAE;oCACV,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oCAChC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iCAC5B;6BACF;yBACF;qBACF;oBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,CAAC;iBAC/C;aACF;YACD;gBACE,IAAI,EAAE,+BAA+B;gBACrC,UAAU,EAAE,GAAG;gBACf,WAAW,EACT,wEAAwE;gBAC1E,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,+BAA+B,EAAE;wBAChE,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACjC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC3B,MAAM,EAAE;4BACN,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,UAAU,EAAE;oCACV,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oCAChC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iCAC5B;6BACF;yBACF;qBACF;oBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,CAAC;iBAC/C;aACF;YACD;gBACE,IAAI,EAAE,4BAA4B;gBAClC,UAAU,EAAE,GAAG;gBACf,WAAW,EACT,iFAAiF;gBACnF,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,4BAA4B,EAAE;wBAC7D,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACjC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC5B;oBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,CAAC;iBAC/C;aACF;SACF,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export {};