@powerlines/plugin-alloy 0.26.26 → 0.26.27

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 (105) hide show
  1. package/dist/core/components/infrastructure-file.cjs +13 -8
  2. package/dist/core/components/infrastructure-file.mjs +13 -8
  3. package/dist/core/components/infrastructure-file.mjs.map +1 -1
  4. package/dist/core/components/output.cjs +17 -10
  5. package/dist/core/components/output.mjs +17 -10
  6. package/dist/core/components/output.mjs.map +1 -1
  7. package/dist/core/components/single-line-comment.cjs +6 -4
  8. package/dist/core/components/single-line-comment.mjs +6 -4
  9. package/dist/core/components/single-line-comment.mjs.map +1 -1
  10. package/dist/core/components/source-file.cjs +10 -6
  11. package/dist/core/components/source-file.mjs +10 -6
  12. package/dist/core/components/source-file.mjs.map +1 -1
  13. package/dist/core/components/spacing.cjs +6 -4
  14. package/dist/core/components/spacing.mjs +6 -4
  15. package/dist/core/components/spacing.mjs.map +1 -1
  16. package/dist/core/contexts/context.mjs.map +1 -1
  17. package/dist/core/contexts/meta.mjs.map +1 -1
  18. package/dist/core/contexts/reflection.mjs.map +1 -1
  19. package/dist/core/helpers/code.mjs.map +1 -1
  20. package/dist/hcl/components/block-declaration.cjs +12 -8
  21. package/dist/hcl/components/block-declaration.mjs +12 -8
  22. package/dist/hcl/components/block-declaration.mjs.map +1 -1
  23. package/dist/hcl/components/hcl-file.cjs +35 -21
  24. package/dist/hcl/components/hcl-file.mjs +36 -22
  25. package/dist/hcl/components/hcl-file.mjs.map +1 -1
  26. package/dist/hcl/components/packer-file.cjs +8 -8
  27. package/dist/hcl/components/packer-file.mjs +8 -8
  28. package/dist/hcl/components/packer-file.mjs.map +1 -1
  29. package/dist/hcl/components/terraform-file.cjs +8 -8
  30. package/dist/hcl/components/terraform-file.mjs +8 -8
  31. package/dist/hcl/components/terraform-file.mjs.map +1 -1
  32. package/dist/helpers/capnp.mjs.map +1 -1
  33. package/dist/helpers/create-builtin.mjs.map +1 -1
  34. package/dist/helpers/refkey.mjs.map +1 -1
  35. package/dist/helpers/typescript.mjs.map +1 -1
  36. package/dist/index.cjs +16 -8
  37. package/dist/index.d.cts.map +1 -1
  38. package/dist/index.d.mts.map +1 -1
  39. package/dist/index.mjs +15 -8
  40. package/dist/index.mjs.map +1 -1
  41. package/dist/markdown/components/front-matter.cjs +9 -7
  42. package/dist/markdown/components/front-matter.mjs +9 -7
  43. package/dist/markdown/components/front-matter.mjs.map +1 -1
  44. package/dist/markdown/components/markdown-file.cjs +76 -44
  45. package/dist/markdown/components/markdown-file.mjs +76 -44
  46. package/dist/markdown/components/markdown-file.mjs.map +1 -1
  47. package/dist/markdown/components/markdown-table.cjs +49 -28
  48. package/dist/markdown/components/markdown-table.mjs +49 -28
  49. package/dist/markdown/components/markdown-table.mjs.map +1 -1
  50. package/dist/markdown/contexts/markdown-table.mjs.map +1 -1
  51. package/dist/render.cjs +3 -3
  52. package/dist/render.mjs +4 -4
  53. package/dist/render.mjs.map +1 -1
  54. package/dist/types/components.cjs +9 -0
  55. package/dist/types/components.mjs +10 -1
  56. package/dist/types/components.mjs.map +1 -0
  57. package/dist/typescript/components/builtin-file.cjs +30 -20
  58. package/dist/typescript/components/builtin-file.mjs +30 -20
  59. package/dist/typescript/components/builtin-file.mjs.map +1 -1
  60. package/dist/typescript/components/class-declaration.cjs +180 -100
  61. package/dist/typescript/components/class-declaration.mjs +180 -100
  62. package/dist/typescript/components/class-declaration.mjs.map +1 -1
  63. package/dist/typescript/components/dynamic-import-statement.cjs +2 -6
  64. package/dist/typescript/components/dynamic-import-statement.mjs +2 -6
  65. package/dist/typescript/components/dynamic-import-statement.mjs.map +1 -1
  66. package/dist/typescript/components/entry-file.cjs +10 -7
  67. package/dist/typescript/components/entry-file.mjs +10 -7
  68. package/dist/typescript/components/entry-file.mjs.map +1 -1
  69. package/dist/typescript/components/interface-declaration.cjs +127 -74
  70. package/dist/typescript/components/interface-declaration.mjs +127 -74
  71. package/dist/typescript/components/interface-declaration.mjs.map +1 -1
  72. package/dist/typescript/components/object-declaration.cjs +84 -50
  73. package/dist/typescript/components/object-declaration.mjs +84 -50
  74. package/dist/typescript/components/object-declaration.mjs.map +1 -1
  75. package/dist/typescript/components/property-name.cjs +3 -3
  76. package/dist/typescript/components/property-name.mjs +3 -3
  77. package/dist/typescript/components/property-name.mjs.map +1 -1
  78. package/dist/typescript/components/record-expression.mjs.map +1 -1
  79. package/dist/typescript/components/tsdoc-reflection.cjs +241 -108
  80. package/dist/typescript/components/tsdoc-reflection.mjs +241 -108
  81. package/dist/typescript/components/tsdoc-reflection.mjs.map +1 -1
  82. package/dist/typescript/components/tsdoc.cjs +265 -168
  83. package/dist/typescript/components/tsdoc.mjs +265 -168
  84. package/dist/typescript/components/tsdoc.mjs.map +1 -1
  85. package/dist/typescript/components/type-declaration.cjs +20 -15
  86. package/dist/typescript/components/type-declaration.mjs +20 -15
  87. package/dist/typescript/components/type-declaration.mjs.map +1 -1
  88. package/dist/typescript/components/type-parameters.cjs +56 -29
  89. package/dist/typescript/components/type-parameters.mjs +56 -29
  90. package/dist/typescript/components/type-parameters.mjs.map +1 -1
  91. package/dist/typescript/components/typescript-file.cjs +135 -74
  92. package/dist/typescript/components/typescript-file.mjs +135 -74
  93. package/dist/typescript/components/typescript-file.mjs.map +1 -1
  94. package/dist/typescript/contexts/lexical-scope.cjs +5 -3
  95. package/dist/typescript/contexts/lexical-scope.mjs +5 -3
  96. package/dist/typescript/contexts/lexical-scope.mjs.map +1 -1
  97. package/dist/typescript/contexts/member-scope.cjs +5 -3
  98. package/dist/typescript/contexts/member-scope.mjs +5 -3
  99. package/dist/typescript/contexts/member-scope.mjs.map +1 -1
  100. package/dist/typescript/helpers/get-call-signature-props.mjs.map +1 -1
  101. package/dist/typescript/helpers/utilities.mjs.map +1 -1
  102. package/dist/yaml/components/yaml-file.cjs +92 -47
  103. package/dist/yaml/components/yaml-file.mjs +92 -47
  104. package/dist/yaml/components/yaml-file.mjs.map +1 -1
  105. package/package.json +6 -6
@@ -6,8 +6,8 @@ const require_typescript_contexts_member_scope = require('../contexts/member-sco
6
6
  const require_typescript_components_property_name = require('./property-name.cjs');
7
7
  const require_typescript_components_type_parameters = require('./type-parameters.cjs');
8
8
  const require_typescript_components_tsdoc_reflection = require('./tsdoc-reflection.cjs');
9
- let _alloy_js_core = require("@alloy-js/core");
10
9
  let _alloy_js_core_jsx_runtime = require("@alloy-js/core/jsx-runtime");
10
+ let _alloy_js_core = require("@alloy-js/core");
11
11
  let _powerlines_deepkit_vendor_type = require("@powerlines/deepkit/vendor/type");
12
12
  let _stryke_string_format_pascal_case = require("@stryke/string-format/pascal-case");
13
13
  let _stryke_type_checks_is_string = require("@stryke/type-checks/is-string");
@@ -20,10 +20,16 @@ const InterfaceExpression = (0, _alloy_js_typescript.ensureTypeRefContext)(funct
20
20
  binder: (0, _alloy_js_typescript.useTSLexicalScope)()?.binder
21
21
  });
22
22
  (0, _alloy_js_core.emitSymbol)(symbol);
23
- return /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)("group", { children: /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(require_typescript_contexts_member_scope.MemberScope, {
24
- ownerSymbol: symbol,
25
- children: /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(_alloy_js_core.Block, { children: props.children })
26
- }) });
23
+ return (0, _alloy_js_core_jsx_runtime.createIntrinsic)("group", { get children() {
24
+ return (0, _alloy_js_core_jsx_runtime.createComponent)(require_typescript_contexts_member_scope.MemberScope, {
25
+ ownerSymbol: symbol,
26
+ get children() {
27
+ return (0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_core.Block, { get children() {
28
+ return props.children;
29
+ } });
30
+ }
31
+ });
32
+ } });
27
33
  });
28
34
  /**
29
35
  * Create a TypeScript interface member.
@@ -37,17 +43,23 @@ const InterfaceExpression = (0, _alloy_js_typescript.ensureTypeRefContext)(funct
37
43
  function InterfaceMember(props) {
38
44
  const type = props.type ?? props.children;
39
45
  const readonly = props.readonly ? "readonly " : "";
40
- if ("indexer" in props) return /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsxs)(_alloy_js_core_jsx_runtime.Fragment, { children: [
41
- /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(_alloy_js_core.Show, {
42
- when: Boolean(props.doc),
43
- children: /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(require_typescript_components_tsdoc.TSDoc, { heading: props.doc })
46
+ if ("indexer" in props) return [
47
+ (0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_core.Show, {
48
+ get when() {
49
+ return Boolean(props.doc);
50
+ },
51
+ get children() {
52
+ return (0, _alloy_js_core_jsx_runtime.createComponent)(require_typescript_components_tsdoc.TSDoc, { get heading() {
53
+ return props.doc;
54
+ } });
55
+ }
44
56
  }),
45
57
  readonly,
46
58
  "[",
47
- props.indexer,
59
+ (0, _alloy_js_core_jsx_runtime.memo)(() => props.indexer),
48
60
  "]: ",
49
61
  type
50
- ] });
62
+ ];
51
63
  const optionality = props.optional ? "?" : "";
52
64
  const scope = (0, _alloy_js_typescript.useTSMemberScope)();
53
65
  const sym = (0, _alloy_js_core.createSymbol)(_alloy_js_typescript.TSOutputSymbol, props.name, scope.ownerSymbol.staticMembers, {
@@ -62,25 +74,33 @@ function InterfaceMember(props) {
62
74
  const symbol = Array.from(taken)[0];
63
75
  if (symbol?.isTransient) symbol.moveMembersTo(sym);
64
76
  });
65
- return /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsxs)(_alloy_js_core.MemberDeclaration, {
77
+ return (0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_core.MemberDeclaration, {
66
78
  symbol: sym,
67
- children: [
68
- /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(_alloy_js_core.Show, {
69
- when: Boolean(props.doc),
70
- children: /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(require_typescript_components_tsdoc.TSDoc, { heading: props.doc })
71
- }),
72
- readonly,
73
- /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(require_typescript_components_property_name.PropertyName, {}),
74
- optionality,
75
- ": ",
76
- type
77
- ]
79
+ get children() {
80
+ return [
81
+ (0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_core.Show, {
82
+ get when() {
83
+ return Boolean(props.doc);
84
+ },
85
+ get children() {
86
+ return (0, _alloy_js_core_jsx_runtime.createComponent)(require_typescript_components_tsdoc.TSDoc, { get heading() {
87
+ return props.doc;
88
+ } });
89
+ }
90
+ }),
91
+ readonly,
92
+ (0, _alloy_js_core_jsx_runtime.createComponent)(require_typescript_components_property_name.PropertyName, {}),
93
+ optionality,
94
+ ": ",
95
+ type
96
+ ];
97
+ }
78
98
  });
79
99
  }
80
100
  const BaseInterfaceDeclaration = (0, _alloy_js_typescript.ensureTypeRefContext)(function InterfaceDeclaration(props) {
81
101
  const ExprSlot = (0, _alloy_js_core.createSymbolSlot)();
82
102
  const children = (0, _alloy_js_core.childrenArray)(() => props.children);
83
- const extendsPart = props.extends ? /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsxs)(_alloy_js_core_jsx_runtime.Fragment, { children: [" extends ", props.extends] }) : "";
103
+ const extendsPart = props.extends ? [" extends ", (0, _alloy_js_core_jsx_runtime.memo)(() => props.extends)] : "";
84
104
  const filteredChildren = (0, _alloy_js_core.findUnkeyedChildren)(children);
85
105
  const currentScope = (0, _alloy_js_typescript.useTSLexicalScope)();
86
106
  const binder = currentScope?.binder;
@@ -99,23 +119,34 @@ const BaseInterfaceDeclaration = (0, _alloy_js_typescript.ensureTypeRefContext)(
99
119
  for (const symbol of takenSymbols) if (symbol.isTransient) symbol.moveMembersTo(sym);
100
120
  }
101
121
  });
102
- return /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsxs)(_alloy_js_core_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(_alloy_js_core.Show, {
103
- when: Boolean(props.doc),
104
- children: /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(require_typescript_components_tsdoc.TSDoc, { heading: props.doc })
105
- }), /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsxs)(_alloy_js_typescript.Declaration, {
106
- ...props,
122
+ return [(0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_core.Show, {
123
+ get when() {
124
+ return Boolean(props.doc);
125
+ },
126
+ get children() {
127
+ return (0, _alloy_js_core_jsx_runtime.createComponent)(require_typescript_components_tsdoc.TSDoc, { get heading() {
128
+ return props.doc;
129
+ } });
130
+ }
131
+ }), (0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_typescript.Declaration, (0, _alloy_js_core_jsx_runtime.mergeProps)(props, {
107
132
  nameKind: "interface",
108
133
  kind: "type",
109
134
  symbol: sym,
110
- children: [
111
- "interface ",
112
- /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(_alloy_js_core.Name, {}),
113
- props.typeParameters && /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(require_typescript_components_type_parameters.TypeParameters, { parameters: props.typeParameters }),
114
- extendsPart,
115
- " ",
116
- /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(ExprSlot, { children: /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(InterfaceExpression, { children: filteredChildren }) })
117
- ]
118
- })] });
135
+ get children() {
136
+ return [
137
+ "interface ",
138
+ (0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_core.Name, {}),
139
+ (0, _alloy_js_core_jsx_runtime.memo)(() => (0, _alloy_js_core_jsx_runtime.memo)(() => !!props.typeParameters)() && (0, _alloy_js_core_jsx_runtime.createComponent)(require_typescript_components_type_parameters.TypeParameters, { get parameters() {
140
+ return props.typeParameters;
141
+ } })),
142
+ extendsPart,
143
+ " ",
144
+ (0, _alloy_js_core_jsx_runtime.createComponent)(ExprSlot, { get children() {
145
+ return (0, _alloy_js_core_jsx_runtime.createComponent)(InterfaceExpression, { children: filteredChildren });
146
+ } })
147
+ ];
148
+ }
149
+ }))];
119
150
  });
120
151
  /**
121
152
  * Generates a TypeScript interface for the given reflection class.
@@ -129,33 +160,44 @@ function InterfaceDeclaration(props) {
129
160
  ]);
130
161
  const interfaceName = (0, _alloy_js_core.computed)(() => (0, _stryke_string_format_pascal_case.pascalCase)(((0, _stryke_type_checks_is_string.isString)(name) ? name : name.toString()) || reflection?.getName()));
131
162
  const properties = (0, _alloy_js_core.computed)(() => reflection ? reflection.getProperties().filter((item) => !item.isIgnored()).sort((a, b) => a.isReadonly() && b.isReadonly() || !a.isReadonly() && !b.isReadonly() ? a.getNameAsString().localeCompare(b.getNameAsString()) : a.isReadonly() ? 1 : -1) : []);
132
- return /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(_alloy_js_core.Show, {
133
- when: reflection && properties.value.length > 0,
134
- fallback: /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(BaseInterfaceDeclaration, {
135
- ...props,
136
- name: interfaceName.value
137
- }),
138
- children: /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsxs)(require_core_contexts_reflection.ReflectionClassContext.Provider, {
139
- value: { reflection },
140
- children: [/* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(require_typescript_components_tsdoc_reflection.TSDocReflectionClass, {
141
- heading: doc,
142
- reflection
143
- }), /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(BaseInterfaceDeclaration, {
144
- export: true,
145
- name: interfaceName.value,
146
- defaultValue,
147
- ...rest,
148
- children: /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(_alloy_js_core.For, {
149
- each: properties,
150
- doubleHardline: true,
151
- semicolon: true,
152
- children: (prop) => /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(InterfaceDeclarationProperty, {
153
- property: prop,
154
- defaultValue: defaultValue?.value?.[prop.getNameAsString()]
155
- })
156
- })
157
- })]
158
- })
163
+ return (0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_core.Show, {
164
+ get when() {
165
+ return reflection && properties.value.length > 0;
166
+ },
167
+ get fallback() {
168
+ return (0, _alloy_js_core_jsx_runtime.createComponent)(BaseInterfaceDeclaration, (0, _alloy_js_core_jsx_runtime.mergeProps)(props, { get name() {
169
+ return interfaceName.value;
170
+ } }));
171
+ },
172
+ get children() {
173
+ return (0, _alloy_js_core_jsx_runtime.createComponent)(require_core_contexts_reflection.ReflectionClassContext.Provider, {
174
+ value: { reflection },
175
+ get children() {
176
+ return [(0, _alloy_js_core_jsx_runtime.createComponent)(require_typescript_components_tsdoc_reflection.TSDocReflectionClass, {
177
+ heading: doc,
178
+ reflection
179
+ }), (0, _alloy_js_core_jsx_runtime.createComponent)(BaseInterfaceDeclaration, (0, _alloy_js_core_jsx_runtime.mergeProps)({
180
+ "export": true,
181
+ get name() {
182
+ return interfaceName.value;
183
+ },
184
+ defaultValue
185
+ }, rest, { get children() {
186
+ return (0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_core.For, {
187
+ each: properties,
188
+ doubleHardline: true,
189
+ semicolon: true,
190
+ children: (prop) => (0, _alloy_js_core_jsx_runtime.createComponent)(InterfaceDeclarationProperty, {
191
+ property: prop,
192
+ get defaultValue() {
193
+ return defaultValue?.value?.[prop.getNameAsString()];
194
+ }
195
+ })
196
+ });
197
+ } }))];
198
+ }
199
+ });
200
+ }
159
201
  });
160
202
  }
161
203
  /**
@@ -163,19 +205,30 @@ function InterfaceDeclaration(props) {
163
205
  */
164
206
  function InterfaceDeclarationProperty(props) {
165
207
  const [{ property, defaultValue }, rest] = (0, _alloy_js_core.splitProps)(props, ["property", "defaultValue"]);
166
- return /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsxs)(require_core_contexts_reflection.ReflectionPropertyContext.Provider, {
208
+ return (0, _alloy_js_core_jsx_runtime.createComponent)(require_core_contexts_reflection.ReflectionPropertyContext.Provider, {
167
209
  value: {
168
210
  property,
169
211
  defaultValue
170
212
  },
171
- children: [/* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(require_typescript_components_tsdoc_reflection.TSDocContextProperty, {}), /* @__PURE__ */ (0, _alloy_js_core_jsx_runtime.jsx)(InterfaceMember, {
172
- name: property.getNameAsString(),
173
- readonly: property.isReadonly(),
174
- optional: property.isOptional(),
175
- nullish: property.isNullable(),
176
- type: (0, _powerlines_deepkit_vendor_type.stringifyType)(property.getType()),
177
- ...rest
178
- })]
213
+ get children() {
214
+ return [(0, _alloy_js_core_jsx_runtime.createComponent)(require_typescript_components_tsdoc_reflection.TSDocContextProperty, {}), (0, _alloy_js_core_jsx_runtime.createComponent)(InterfaceMember, (0, _alloy_js_core_jsx_runtime.mergeProps)({
215
+ get name() {
216
+ return property.getNameAsString();
217
+ },
218
+ get readonly() {
219
+ return property.isReadonly();
220
+ },
221
+ get optional() {
222
+ return property.isOptional();
223
+ },
224
+ get nullish() {
225
+ return property.isNullable();
226
+ },
227
+ get type() {
228
+ return (0, _powerlines_deepkit_vendor_type.stringifyType)(property.getType());
229
+ }
230
+ }, rest))];
231
+ }
179
232
  });
180
233
  }
181
234
 
@@ -4,8 +4,8 @@ import { MemberScope as MemberScope$1 } from "../contexts/member-scope.mjs";
4
4
  import { PropertyName } from "./property-name.mjs";
5
5
  import { TypeParameters } from "./type-parameters.mjs";
6
6
  import { TSDocContextProperty, TSDocReflectionClass } from "./tsdoc-reflection.mjs";
7
+ import { createComponent, createIntrinsic, memo, mergeProps } from "@alloy-js/core/jsx-runtime";
7
8
  import { Block, For, MemberDeclaration, Name, Show, childrenArray, computed, createSymbol, createSymbolSlot, effect, emitSymbol, findUnkeyedChildren, splitProps, takeSymbols } from "@alloy-js/core";
8
- import { Fragment, jsx, jsxs } from "@alloy-js/core/jsx-runtime";
9
9
  import { stringifyType } from "@powerlines/deepkit/vendor/type";
10
10
  import { pascalCase } from "@stryke/string-format/pascal-case";
11
11
  import { isString } from "@stryke/type-checks/is-string";
@@ -18,10 +18,16 @@ const InterfaceExpression = ensureTypeRefContext(function InterfaceExpression(pr
18
18
  binder: useTSLexicalScope()?.binder
19
19
  });
20
20
  emitSymbol(symbol);
21
- return /* @__PURE__ */ jsx("group", { children: /* @__PURE__ */ jsx(MemberScope$1, {
22
- ownerSymbol: symbol,
23
- children: /* @__PURE__ */ jsx(Block, { children: props.children })
24
- }) });
21
+ return createIntrinsic("group", { get children() {
22
+ return createComponent(MemberScope$1, {
23
+ ownerSymbol: symbol,
24
+ get children() {
25
+ return createComponent(Block, { get children() {
26
+ return props.children;
27
+ } });
28
+ }
29
+ });
30
+ } });
25
31
  });
26
32
  /**
27
33
  * Create a TypeScript interface member.
@@ -35,17 +41,23 @@ const InterfaceExpression = ensureTypeRefContext(function InterfaceExpression(pr
35
41
  function InterfaceMember(props) {
36
42
  const type = props.type ?? props.children;
37
43
  const readonly = props.readonly ? "readonly " : "";
38
- if ("indexer" in props) return /* @__PURE__ */ jsxs(Fragment, { children: [
39
- /* @__PURE__ */ jsx(Show, {
40
- when: Boolean(props.doc),
41
- children: /* @__PURE__ */ jsx(TSDoc, { heading: props.doc })
44
+ if ("indexer" in props) return [
45
+ createComponent(Show, {
46
+ get when() {
47
+ return Boolean(props.doc);
48
+ },
49
+ get children() {
50
+ return createComponent(TSDoc, { get heading() {
51
+ return props.doc;
52
+ } });
53
+ }
42
54
  }),
43
55
  readonly,
44
56
  "[",
45
- props.indexer,
57
+ memo(() => props.indexer),
46
58
  "]: ",
47
59
  type
48
- ] });
60
+ ];
49
61
  const optionality = props.optional ? "?" : "";
50
62
  const scope = useTSMemberScope();
51
63
  const sym = createSymbol(TSOutputSymbol, props.name, scope.ownerSymbol.staticMembers, {
@@ -60,25 +72,33 @@ function InterfaceMember(props) {
60
72
  const symbol = Array.from(taken)[0];
61
73
  if (symbol?.isTransient) symbol.moveMembersTo(sym);
62
74
  });
63
- return /* @__PURE__ */ jsxs(MemberDeclaration, {
75
+ return createComponent(MemberDeclaration, {
64
76
  symbol: sym,
65
- children: [
66
- /* @__PURE__ */ jsx(Show, {
67
- when: Boolean(props.doc),
68
- children: /* @__PURE__ */ jsx(TSDoc, { heading: props.doc })
69
- }),
70
- readonly,
71
- /* @__PURE__ */ jsx(PropertyName, {}),
72
- optionality,
73
- ": ",
74
- type
75
- ]
77
+ get children() {
78
+ return [
79
+ createComponent(Show, {
80
+ get when() {
81
+ return Boolean(props.doc);
82
+ },
83
+ get children() {
84
+ return createComponent(TSDoc, { get heading() {
85
+ return props.doc;
86
+ } });
87
+ }
88
+ }),
89
+ readonly,
90
+ createComponent(PropertyName, {}),
91
+ optionality,
92
+ ": ",
93
+ type
94
+ ];
95
+ }
76
96
  });
77
97
  }
78
98
  const BaseInterfaceDeclaration = ensureTypeRefContext(function InterfaceDeclaration(props) {
79
99
  const ExprSlot = createSymbolSlot();
80
100
  const children = childrenArray(() => props.children);
81
- const extendsPart = props.extends ? /* @__PURE__ */ jsxs(Fragment, { children: [" extends ", props.extends] }) : "";
101
+ const extendsPart = props.extends ? [" extends ", memo(() => props.extends)] : "";
82
102
  const filteredChildren = findUnkeyedChildren(children);
83
103
  const currentScope = useTSLexicalScope();
84
104
  const binder = currentScope?.binder;
@@ -97,23 +117,34 @@ const BaseInterfaceDeclaration = ensureTypeRefContext(function InterfaceDeclarat
97
117
  for (const symbol of takenSymbols) if (symbol.isTransient) symbol.moveMembersTo(sym);
98
118
  }
99
119
  });
100
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Show, {
101
- when: Boolean(props.doc),
102
- children: /* @__PURE__ */ jsx(TSDoc, { heading: props.doc })
103
- }), /* @__PURE__ */ jsxs(Declaration$1, {
104
- ...props,
120
+ return [createComponent(Show, {
121
+ get when() {
122
+ return Boolean(props.doc);
123
+ },
124
+ get children() {
125
+ return createComponent(TSDoc, { get heading() {
126
+ return props.doc;
127
+ } });
128
+ }
129
+ }), createComponent(Declaration$1, mergeProps(props, {
105
130
  nameKind: "interface",
106
131
  kind: "type",
107
132
  symbol: sym,
108
- children: [
109
- "interface ",
110
- /* @__PURE__ */ jsx(Name, {}),
111
- props.typeParameters && /* @__PURE__ */ jsx(TypeParameters, { parameters: props.typeParameters }),
112
- extendsPart,
113
- " ",
114
- /* @__PURE__ */ jsx(ExprSlot, { children: /* @__PURE__ */ jsx(InterfaceExpression, { children: filteredChildren }) })
115
- ]
116
- })] });
133
+ get children() {
134
+ return [
135
+ "interface ",
136
+ createComponent(Name, {}),
137
+ memo(() => memo(() => !!props.typeParameters)() && createComponent(TypeParameters, { get parameters() {
138
+ return props.typeParameters;
139
+ } })),
140
+ extendsPart,
141
+ " ",
142
+ createComponent(ExprSlot, { get children() {
143
+ return createComponent(InterfaceExpression, { children: filteredChildren });
144
+ } })
145
+ ];
146
+ }
147
+ }))];
117
148
  });
118
149
  /**
119
150
  * Generates a TypeScript interface for the given reflection class.
@@ -127,33 +158,44 @@ function InterfaceDeclaration(props) {
127
158
  ]);
128
159
  const interfaceName = computed(() => pascalCase((isString(name) ? name : name.toString()) || reflection?.getName()));
129
160
  const properties = computed(() => reflection ? reflection.getProperties().filter((item) => !item.isIgnored()).sort((a, b) => a.isReadonly() && b.isReadonly() || !a.isReadonly() && !b.isReadonly() ? a.getNameAsString().localeCompare(b.getNameAsString()) : a.isReadonly() ? 1 : -1) : []);
130
- return /* @__PURE__ */ jsx(Show, {
131
- when: reflection && properties.value.length > 0,
132
- fallback: /* @__PURE__ */ jsx(BaseInterfaceDeclaration, {
133
- ...props,
134
- name: interfaceName.value
135
- }),
136
- children: /* @__PURE__ */ jsxs(ReflectionClassContext.Provider, {
137
- value: { reflection },
138
- children: [/* @__PURE__ */ jsx(TSDocReflectionClass, {
139
- heading: doc,
140
- reflection
141
- }), /* @__PURE__ */ jsx(BaseInterfaceDeclaration, {
142
- export: true,
143
- name: interfaceName.value,
144
- defaultValue,
145
- ...rest,
146
- children: /* @__PURE__ */ jsx(For, {
147
- each: properties,
148
- doubleHardline: true,
149
- semicolon: true,
150
- children: (prop) => /* @__PURE__ */ jsx(InterfaceDeclarationProperty, {
151
- property: prop,
152
- defaultValue: defaultValue?.value?.[prop.getNameAsString()]
153
- })
154
- })
155
- })]
156
- })
161
+ return createComponent(Show, {
162
+ get when() {
163
+ return reflection && properties.value.length > 0;
164
+ },
165
+ get fallback() {
166
+ return createComponent(BaseInterfaceDeclaration, mergeProps(props, { get name() {
167
+ return interfaceName.value;
168
+ } }));
169
+ },
170
+ get children() {
171
+ return createComponent(ReflectionClassContext.Provider, {
172
+ value: { reflection },
173
+ get children() {
174
+ return [createComponent(TSDocReflectionClass, {
175
+ heading: doc,
176
+ reflection
177
+ }), createComponent(BaseInterfaceDeclaration, mergeProps({
178
+ "export": true,
179
+ get name() {
180
+ return interfaceName.value;
181
+ },
182
+ defaultValue
183
+ }, rest, { get children() {
184
+ return createComponent(For, {
185
+ each: properties,
186
+ doubleHardline: true,
187
+ semicolon: true,
188
+ children: (prop) => createComponent(InterfaceDeclarationProperty, {
189
+ property: prop,
190
+ get defaultValue() {
191
+ return defaultValue?.value?.[prop.getNameAsString()];
192
+ }
193
+ })
194
+ });
195
+ } }))];
196
+ }
197
+ });
198
+ }
157
199
  });
158
200
  }
159
201
  /**
@@ -161,19 +203,30 @@ function InterfaceDeclaration(props) {
161
203
  */
162
204
  function InterfaceDeclarationProperty(props) {
163
205
  const [{ property, defaultValue }, rest] = splitProps(props, ["property", "defaultValue"]);
164
- return /* @__PURE__ */ jsxs(ReflectionPropertyContext.Provider, {
206
+ return createComponent(ReflectionPropertyContext.Provider, {
165
207
  value: {
166
208
  property,
167
209
  defaultValue
168
210
  },
169
- children: [/* @__PURE__ */ jsx(TSDocContextProperty, {}), /* @__PURE__ */ jsx(InterfaceMember, {
170
- name: property.getNameAsString(),
171
- readonly: property.isReadonly(),
172
- optional: property.isOptional(),
173
- nullish: property.isNullable(),
174
- type: stringifyType(property.getType()),
175
- ...rest
176
- })]
211
+ get children() {
212
+ return [createComponent(TSDocContextProperty, {}), createComponent(InterfaceMember, mergeProps({
213
+ get name() {
214
+ return property.getNameAsString();
215
+ },
216
+ get readonly() {
217
+ return property.isReadonly();
218
+ },
219
+ get optional() {
220
+ return property.isOptional();
221
+ },
222
+ get nullish() {
223
+ return property.isNullable();
224
+ },
225
+ get type() {
226
+ return stringifyType(property.getType());
227
+ }
228
+ }, rest))];
229
+ }
177
230
  });
178
231
  }
179
232
 
@@ -1 +1 @@
1
- {"version":3,"file":"interface-declaration.mjs","names":["MemberScope","Declaration"],"sources":["../../../src/typescript/components/interface-declaration.tsx"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport {\n Block,\n Children,\n childrenArray,\n computed,\n createSymbol,\n createSymbolSlot,\n effect,\n emitSymbol,\n findUnkeyedChildren,\n For,\n MemberDeclaration,\n Name,\n Namekey,\n Ref,\n Refkey,\n Show,\n splitProps,\n takeSymbols\n} from \"@alloy-js/core\";\nimport {\n CommonDeclarationProps,\n Declaration,\n ensureTypeRefContext,\n TSOutputSymbol,\n TSSymbolFlags,\n TypeParameterDescriptor,\n useTSLexicalScope,\n useTSMemberScope,\n useTSNamePolicy\n} from \"@alloy-js/typescript\";\nimport {\n ReflectionClass,\n ReflectionProperty,\n stringifyType\n} from \"@powerlines/deepkit/vendor/type\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport { isString } from \"@stryke/type-checks/is-string\";\nimport {\n ReflectionClassContext,\n ReflectionPropertyContext\n} from \"../../core/contexts/reflection\";\nimport { ComponentProps } from \"../../types/components\";\nimport { MemberScope } from \"../contexts/member-scope\";\nimport { PropertyName } from \"./property-name\";\nimport { TSDoc } from \"./tsdoc\";\nimport { TSDocContextProperty, TSDocReflectionClass } from \"./tsdoc-reflection\";\nimport { TypeParameters } from \"./type-parameters\";\n\nexport interface InterfaceDeclarationProps<\n T extends Record<string, any> = Record<string, any>\n>\n extends CommonDeclarationProps, ComponentProps {\n /**\n * A base type that this interface extends. This can be used to represent inheritance\n */\n extends?: Children;\n\n /**\n * The generic type parameters of the interface.\n */\n typeParameters?: TypeParameterDescriptor[] | string[];\n\n /**\n * The reflection class that describes the properties of this interface.\n *\n * @remarks\n * This is used to generate the members of the interface based on the properties of the reflection class.\n */\n reflection?: ReflectionClass<T>;\n\n /**\n * A default value for this interface.\n *\n * @remarks\n * This is used when the interface is used as a type for a variable declaration, to provide an initial value for the variable.\n */\n defaultValue?: Ref<Partial<T>>;\n\n /**\n * Documentation for the interface. This can be a string or any Alloy component that renders documentation content (such as `TSDoc`).\n */\n doc?: Children;\n}\n\nexport interface InterfaceDeclarationPropertyProps\n extends Omit<InterfaceMemberProps, \"name\">, ComponentProps {\n property: ReflectionProperty;\n defaultValue?: any;\n}\n\nexport interface InterfaceExpressionProps {\n children?: Children;\n}\n\nexport const InterfaceExpression = ensureTypeRefContext(\n function InterfaceExpression(props: InterfaceExpressionProps) {\n const scope = useTSLexicalScope();\n const symbol = createSymbol(TSOutputSymbol, \"\", undefined, {\n transient: true,\n binder: scope?.binder\n });\n\n emitSymbol(symbol);\n\n return (\n <group>\n <MemberScope ownerSymbol={symbol}>\n <Block>{props.children}</Block>\n </MemberScope>\n </group>\n );\n }\n);\n\nexport interface InterfaceMemberPropsBase {\n type?: Children;\n children?: Children;\n readonly?: boolean;\n doc?: Children;\n refkey?: Refkey | Refkey[];\n}\nexport interface InterfacePropertyMemberProps extends InterfaceMemberPropsBase {\n name: string | Namekey;\n optional?: boolean;\n nullish?: boolean;\n}\n\nexport interface InterfaceIndexerMemberProps extends InterfaceMemberPropsBase {\n indexer: Children;\n}\n\nexport type InterfaceMemberProps =\n | InterfacePropertyMemberProps\n | InterfaceIndexerMemberProps;\n\n/**\n * Create a TypeScript interface member.\n *\n * An interface member can either provide a `name` prop to create a named\n * property, or an `indexer` prop to define an indexer for the interface.\n *\n * The type of the member can be provided either as the `type` prop or as the\n * children of the component.\n */\nexport function InterfaceMember(props: InterfaceMemberProps) {\n const type = props.type ?? props.children;\n const readonly = props.readonly ? \"readonly \" : \"\";\n\n if (\"indexer\" in props) {\n return (\n <>\n <Show when={Boolean(props.doc)}>\n <TSDoc heading={props.doc} />\n </Show>\n {readonly}[{props.indexer}]: {type}\n </>\n );\n }\n\n const optionality = props.optional ? \"?\" : \"\";\n const scope = useTSMemberScope();\n const sym = createSymbol(\n TSOutputSymbol,\n props.name,\n scope.ownerSymbol.staticMembers,\n {\n refkeys: props.refkey,\n tsFlags:\n TSSymbolFlags.TypeSymbol |\n ((props.nullish ?? props.optional)\n ? TSSymbolFlags.Nullish\n : TSSymbolFlags.None),\n namePolicy: useTSNamePolicy().for(\"interface-member\"),\n binder: scope.binder\n }\n );\n\n const taken = takeSymbols();\n\n effect(() => {\n if (taken.size > 1) return;\n const symbol = Array.from(taken)[0];\n if (symbol?.isTransient) {\n symbol.moveMembersTo(sym);\n }\n });\n\n return (\n <MemberDeclaration symbol={sym}>\n <Show when={Boolean(props.doc)}>\n <TSDoc heading={props.doc} />\n </Show>\n {readonly}\n <PropertyName />\n {optionality}: {type}\n </MemberDeclaration>\n );\n}\n\nconst BaseInterfaceDeclaration = ensureTypeRefContext(\n function InterfaceDeclaration(props: InterfaceDeclarationProps) {\n const ExprSlot = createSymbolSlot();\n\n const children = childrenArray(() => props.children);\n\n const extendsPart = props.extends ? <> extends {props.extends}</> : \"\";\n const filteredChildren = findUnkeyedChildren(children);\n const currentScope = useTSLexicalScope();\n\n const binder = currentScope?.binder;\n const sym = createSymbol(TSOutputSymbol, props.name, currentScope.types, {\n refkeys: props.refkey,\n default: props.default,\n export: props.export,\n metadata: props.metadata,\n tsFlags: TSSymbolFlags.TypeSymbol,\n namePolicy: useTSNamePolicy().for(\"interface\"),\n binder\n });\n\n effect(() => {\n if (ExprSlot.ref.value) {\n const takenSymbols = ExprSlot.ref.value;\n for (const symbol of takenSymbols) {\n // ignore non-transient symbols (likely not the result of an expression).\n if (symbol.isTransient) {\n symbol.moveMembersTo(sym);\n }\n }\n }\n });\n\n return (\n <>\n <Show when={Boolean(props.doc)}>\n <TSDoc heading={props.doc} />\n </Show>\n <Declaration {...props} nameKind=\"interface\" kind=\"type\" symbol={sym}>\n interface <Name />\n {props.typeParameters && (\n <TypeParameters parameters={props.typeParameters} />\n )}\n {extendsPart}{\" \"}\n <ExprSlot>\n <InterfaceExpression>{filteredChildren}</InterfaceExpression>\n </ExprSlot>\n </Declaration>\n </>\n );\n }\n);\n\n/**\n * Generates a TypeScript interface for the given reflection class.\n */\nexport function InterfaceDeclaration<\n T extends Record<string, any> = Record<string, any>\n>(props: InterfaceDeclarationProps<T>) {\n const [{ name, reflection, doc, defaultValue }, rest] = splitProps(props, [\n \"name\",\n \"reflection\",\n \"doc\",\n \"defaultValue\"\n ]);\n\n const interfaceName = computed(() =>\n pascalCase(\n (isString(name) ? name : name.toString()) || reflection?.getName()\n )\n );\n\n const properties = computed(() =>\n reflection\n ? reflection\n .getProperties()\n .filter(item => !item.isIgnored())\n .sort((a, b) =>\n (a.isReadonly() && b.isReadonly()) ||\n (!a.isReadonly() && !b.isReadonly())\n ? a.getNameAsString().localeCompare(b.getNameAsString())\n : a.isReadonly()\n ? 1\n : -1\n )\n : []\n );\n\n return (\n <Show\n when={reflection && properties.value.length > 0}\n fallback={\n <BaseInterfaceDeclaration {...props} name={interfaceName.value} />\n }>\n <ReflectionClassContext.Provider\n value={{\n reflection: reflection!\n }}>\n <TSDocReflectionClass<T> heading={doc} reflection={reflection!} />\n <BaseInterfaceDeclaration\n export={true}\n name={interfaceName.value}\n defaultValue={defaultValue}\n {...rest}>\n <For each={properties} doubleHardline={true} semicolon={true}>\n {prop => (\n <InterfaceDeclarationProperty\n property={prop}\n defaultValue={defaultValue?.value?.[prop.getNameAsString()]}\n />\n )}\n </For>\n </BaseInterfaceDeclaration>\n </ReflectionClassContext.Provider>\n </Show>\n );\n}\n\n/**\n * Generates a TypeScript interface property for the given reflection class.\n */\nexport function InterfaceDeclarationProperty(\n props: InterfaceDeclarationPropertyProps\n) {\n const [{ property, defaultValue }, rest] = splitProps(props, [\n \"property\",\n \"defaultValue\"\n ]);\n\n return (\n <ReflectionPropertyContext.Provider value={{ property, defaultValue }}>\n <TSDocContextProperty />\n <InterfaceMember\n name={property.getNameAsString()}\n readonly={property.isReadonly()}\n optional={property.isOptional()}\n nullish={property.isNullable()}\n type={stringifyType(property.getType())}\n {...rest}\n />\n </ReflectionPropertyContext.Provider>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"interface-declaration.mjs","names":[],"sources":["../../../src/typescript/components/interface-declaration.tsx"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport {\n Block,\n Children,\n childrenArray,\n computed,\n createSymbol,\n createSymbolSlot,\n effect,\n emitSymbol,\n findUnkeyedChildren,\n For,\n MemberDeclaration,\n Name,\n Namekey,\n Ref,\n Refkey,\n Show,\n splitProps,\n takeSymbols\n} from \"@alloy-js/core\";\nimport {\n CommonDeclarationProps,\n Declaration,\n ensureTypeRefContext,\n TSOutputSymbol,\n TSSymbolFlags,\n TypeParameterDescriptor,\n useTSLexicalScope,\n useTSMemberScope,\n useTSNamePolicy\n} from \"@alloy-js/typescript\";\nimport {\n ReflectionClass,\n ReflectionProperty,\n stringifyType\n} from \"@powerlines/deepkit/vendor/type\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport { isString } from \"@stryke/type-checks/is-string\";\nimport {\n ReflectionClassContext,\n ReflectionPropertyContext\n} from \"../../core/contexts/reflection\";\nimport { ComponentProps } from \"../../types/components\";\nimport { MemberScope } from \"../contexts/member-scope\";\nimport { PropertyName } from \"./property-name\";\nimport { TSDoc } from \"./tsdoc\";\nimport { TSDocContextProperty, TSDocReflectionClass } from \"./tsdoc-reflection\";\nimport { TypeParameters } from \"./type-parameters\";\n\nexport interface InterfaceDeclarationProps<\n T extends Record<string, any> = Record<string, any>\n>\n extends CommonDeclarationProps, ComponentProps {\n /**\n * A base type that this interface extends. This can be used to represent inheritance\n */\n extends?: Children;\n\n /**\n * The generic type parameters of the interface.\n */\n typeParameters?: TypeParameterDescriptor[] | string[];\n\n /**\n * The reflection class that describes the properties of this interface.\n *\n * @remarks\n * This is used to generate the members of the interface based on the properties of the reflection class.\n */\n reflection?: ReflectionClass<T>;\n\n /**\n * A default value for this interface.\n *\n * @remarks\n * This is used when the interface is used as a type for a variable declaration, to provide an initial value for the variable.\n */\n defaultValue?: Ref<Partial<T>>;\n\n /**\n * Documentation for the interface. This can be a string or any Alloy component that renders documentation content (such as `TSDoc`).\n */\n doc?: Children;\n}\n\nexport interface InterfaceDeclarationPropertyProps\n extends Omit<InterfaceMemberProps, \"name\">, ComponentProps {\n property: ReflectionProperty;\n defaultValue?: any;\n}\n\nexport interface InterfaceExpressionProps {\n children?: Children;\n}\n\nexport const InterfaceExpression = ensureTypeRefContext(\n function InterfaceExpression(props: InterfaceExpressionProps) {\n const scope = useTSLexicalScope();\n const symbol = createSymbol(TSOutputSymbol, \"\", undefined, {\n transient: true,\n binder: scope?.binder\n });\n\n emitSymbol(symbol);\n\n return (\n <group>\n <MemberScope ownerSymbol={symbol}>\n <Block>{props.children}</Block>\n </MemberScope>\n </group>\n );\n }\n);\n\nexport interface InterfaceMemberPropsBase {\n type?: Children;\n children?: Children;\n readonly?: boolean;\n doc?: Children;\n refkey?: Refkey | Refkey[];\n}\nexport interface InterfacePropertyMemberProps extends InterfaceMemberPropsBase {\n name: string | Namekey;\n optional?: boolean;\n nullish?: boolean;\n}\n\nexport interface InterfaceIndexerMemberProps extends InterfaceMemberPropsBase {\n indexer: Children;\n}\n\nexport type InterfaceMemberProps =\n | InterfacePropertyMemberProps\n | InterfaceIndexerMemberProps;\n\n/**\n * Create a TypeScript interface member.\n *\n * An interface member can either provide a `name` prop to create a named\n * property, or an `indexer` prop to define an indexer for the interface.\n *\n * The type of the member can be provided either as the `type` prop or as the\n * children of the component.\n */\nexport function InterfaceMember(props: InterfaceMemberProps) {\n const type = props.type ?? props.children;\n const readonly = props.readonly ? \"readonly \" : \"\";\n\n if (\"indexer\" in props) {\n return (\n <>\n <Show when={Boolean(props.doc)}>\n <TSDoc heading={props.doc} />\n </Show>\n {readonly}[{props.indexer}]: {type}\n </>\n );\n }\n\n const optionality = props.optional ? \"?\" : \"\";\n const scope = useTSMemberScope();\n const sym = createSymbol(\n TSOutputSymbol,\n props.name,\n scope.ownerSymbol.staticMembers,\n {\n refkeys: props.refkey,\n tsFlags:\n TSSymbolFlags.TypeSymbol |\n ((props.nullish ?? props.optional)\n ? TSSymbolFlags.Nullish\n : TSSymbolFlags.None),\n namePolicy: useTSNamePolicy().for(\"interface-member\"),\n binder: scope.binder\n }\n );\n\n const taken = takeSymbols();\n\n effect(() => {\n if (taken.size > 1) return;\n const symbol = Array.from(taken)[0];\n if (symbol?.isTransient) {\n symbol.moveMembersTo(sym);\n }\n });\n\n return (\n <MemberDeclaration symbol={sym}>\n <Show when={Boolean(props.doc)}>\n <TSDoc heading={props.doc} />\n </Show>\n {readonly}\n <PropertyName />\n {optionality}: {type}\n </MemberDeclaration>\n );\n}\n\nconst BaseInterfaceDeclaration = ensureTypeRefContext(\n function InterfaceDeclaration(props: InterfaceDeclarationProps) {\n const ExprSlot = createSymbolSlot();\n\n const children = childrenArray(() => props.children);\n\n const extendsPart = props.extends ? <> extends {props.extends}</> : \"\";\n const filteredChildren = findUnkeyedChildren(children);\n const currentScope = useTSLexicalScope();\n\n const binder = currentScope?.binder;\n const sym = createSymbol(TSOutputSymbol, props.name, currentScope.types, {\n refkeys: props.refkey,\n default: props.default,\n export: props.export,\n metadata: props.metadata,\n tsFlags: TSSymbolFlags.TypeSymbol,\n namePolicy: useTSNamePolicy().for(\"interface\"),\n binder\n });\n\n effect(() => {\n if (ExprSlot.ref.value) {\n const takenSymbols = ExprSlot.ref.value;\n for (const symbol of takenSymbols) {\n // ignore non-transient symbols (likely not the result of an expression).\n if (symbol.isTransient) {\n symbol.moveMembersTo(sym);\n }\n }\n }\n });\n\n return (\n <>\n <Show when={Boolean(props.doc)}>\n <TSDoc heading={props.doc} />\n </Show>\n <Declaration {...props} nameKind=\"interface\" kind=\"type\" symbol={sym}>\n interface <Name />\n {props.typeParameters && (\n <TypeParameters parameters={props.typeParameters} />\n )}\n {extendsPart}{\" \"}\n <ExprSlot>\n <InterfaceExpression>{filteredChildren}</InterfaceExpression>\n </ExprSlot>\n </Declaration>\n </>\n );\n }\n);\n\n/**\n * Generates a TypeScript interface for the given reflection class.\n */\nexport function InterfaceDeclaration<\n T extends Record<string, any> = Record<string, any>\n>(props: InterfaceDeclarationProps<T>) {\n const [{ name, reflection, doc, defaultValue }, rest] = splitProps(props, [\n \"name\",\n \"reflection\",\n \"doc\",\n \"defaultValue\"\n ]);\n\n const interfaceName = computed(() =>\n pascalCase(\n (isString(name) ? name : name.toString()) || reflection?.getName()\n )\n );\n\n const properties = computed(() =>\n reflection\n ? reflection\n .getProperties()\n .filter(item => !item.isIgnored())\n .sort((a, b) =>\n (a.isReadonly() && b.isReadonly()) ||\n (!a.isReadonly() && !b.isReadonly())\n ? a.getNameAsString().localeCompare(b.getNameAsString())\n : a.isReadonly()\n ? 1\n : -1\n )\n : []\n );\n\n return (\n <Show\n when={reflection && properties.value.length > 0}\n fallback={\n <BaseInterfaceDeclaration {...props} name={interfaceName.value} />\n }>\n <ReflectionClassContext.Provider\n value={{\n reflection: reflection!\n }}>\n <TSDocReflectionClass<T> heading={doc} reflection={reflection!} />\n <BaseInterfaceDeclaration\n export={true}\n name={interfaceName.value}\n defaultValue={defaultValue}\n {...rest}>\n <For each={properties} doubleHardline={true} semicolon={true}>\n {prop => (\n <InterfaceDeclarationProperty\n property={prop}\n defaultValue={defaultValue?.value?.[prop.getNameAsString()]}\n />\n )}\n </For>\n </BaseInterfaceDeclaration>\n </ReflectionClassContext.Provider>\n </Show>\n );\n}\n\n/**\n * Generates a TypeScript interface property for the given reflection class.\n */\nexport function InterfaceDeclarationProperty(\n props: InterfaceDeclarationPropertyProps\n) {\n const [{ property, defaultValue }, rest] = splitProps(props, [\n \"property\",\n \"defaultValue\"\n ]);\n\n return (\n <ReflectionPropertyContext.Provider value={{ property, defaultValue }}>\n <TSDocContextProperty />\n <InterfaceMember\n name={property.getNameAsString()}\n readonly={property.isReadonly()}\n optional={property.isOptional()}\n nullish={property.isNullable()}\n type={stringifyType(property.getType())}\n {...rest}\n />\n </ReflectionPropertyContext.Provider>\n );\n}\n"],"mappings":"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"}