@vaadin/hilla-generator-plugin-signals 24.6.5 → 24.7.0-alpha10

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.
@@ -1 +1 @@
1
- {"version":3,"file":"SignalProcessor.d.ts","sourceRoot":"","sources":["src/SignalProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,wCAAwC,CAAC;AAMjE,OAAW,EAA6C,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAc5F,MAAM,CAAC,OAAO,OAAO,eAAe;;gBAOtB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM;IAShG,OAAO,IAAI,UAAU;CA6JtB"}
1
+ {"version":3,"file":"SignalProcessor.d.ts","sourceRoot":"","sources":["src/SignalProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,wCAAwC,CAAC;AAMjE,OAAW,EAA6C,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAuB5F,MAAM,CAAC,OAAO,OAAO,eAAe;;gBAOtB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM;IAShG,OAAO,IAAI,UAAU;CAqStB"}
@@ -13,6 +13,14 @@ const INITIAL_VALUE = "$INITIAL_VALUE$";
13
13
  const signals = ["NumberSignal", "ValueSignal", "ListSignal"];
14
14
  const genericSignals = ["ValueSignal", "ListSignal"];
15
15
  const collectionSignals = ["ListSignal"];
16
+ const primitiveModels = Object.freeze(
17
+ /* @__PURE__ */ new Map([
18
+ [ts.SyntaxKind.StringKeyword, "StringModel"],
19
+ [ts.SyntaxKind.NumberKeyword, "NumberModel"],
20
+ [ts.SyntaxKind.BooleanKeyword, "BooleanModel"],
21
+ [ts.SyntaxKind.ArrayType, "ArrayModel"]
22
+ ])
23
+ );
16
24
  class SignalProcessor {
17
25
  #dependencyManager;
18
26
  #owner;
@@ -38,23 +46,17 @@ class SignalProcessor {
38
46
  transform((tsNode) => {
39
47
  if (ts.isFunctionDeclaration(tsNode) && tsNode.name && this.#methods.has(tsNode.name.text)) {
40
48
  const signalId = this.#replaceSignalImport(tsNode);
41
- let initialValue = signalId.text.startsWith("NumberSignal") ? ts.factory.createNumericLiteral("0") : ts.factory.createIdentifier("undefined");
42
49
  const filteredParams = tsNode.parameters.filter(
43
50
  (p) => !p.type || !ts.isTypeReferenceNode(p.type) || p.type.typeName !== initTypeId
44
51
  );
45
52
  const paramNames = filteredParams.map((p) => p.name.text).join(", ");
46
53
  const isCollectionSignal = collectionSignals.includes(signalId.text);
47
- let genericReturnType;
48
- if (genericSignals.includes(signalId.text)) {
49
- genericReturnType = tsNode.type.typeArguments[0];
50
- if (!isCollectionSignal) {
51
- const defaultValueType = SignalProcessor.#getDefaultValueType(genericReturnType);
52
- if (defaultValueType) {
53
- const { alias, param } = SignalProcessor.#createDefaultValueParameter(defaultValueType);
54
- initialValue = alias;
55
- filteredParams.push(param);
56
- }
57
- }
54
+ const { defaultValueExpression, defaultValueParam, genericReturnType } = this.#createDefaultValue(
55
+ signalId,
56
+ tsNode
57
+ );
58
+ if (defaultValueParam) {
59
+ filteredParams.push(defaultValueParam);
58
60
  }
59
61
  const returnType = genericReturnType ?? signalId;
60
62
  if (filteredParams.length > 0) {
@@ -70,7 +72,9 @@ class SignalProcessor {
70
72
  transform((node) => ts.isIdentifier(node) && node.text === SIGNAL ? signalId : node),
71
73
  transform((node) => ts.isIdentifier(node) && node.text === RETURN_TYPE ? returnType : node),
72
74
  transform((node) => ts.isIdentifier(node) && node.text === CONNECT_CLIENT ? connectClientId : node),
73
- transform((node) => ts.isIdentifier(node) && node.text === INITIAL_VALUE ? initialValue : node)
75
+ transform(
76
+ (node) => ts.isIdentifier(node) && node.text === INITIAL_VALUE ? defaultValueExpression : node
77
+ )
74
78
  ]
75
79
  );
76
80
  }
@@ -111,24 +115,123 @@ class SignalProcessor {
111
115
  file.fileName
112
116
  );
113
117
  }
118
+ #createDefaultValue(signalId, functionDeclaration) {
119
+ const defaultValue = {
120
+ defaultValueExpression: signalId.text.startsWith("NumberSignal") ? ts.factory.createNumericLiteral("0") : ts.factory.createIdentifier("undefined"),
121
+ defaultValueParam: void 0,
122
+ genericReturnType: void 0
123
+ };
124
+ if (!genericSignals.includes(signalId.text)) {
125
+ return defaultValue;
126
+ }
127
+ [defaultValue.genericReturnType] = functionDeclaration.type.typeArguments;
128
+ if (collectionSignals.includes(signalId.text)) {
129
+ return defaultValue;
130
+ }
131
+ const defaultValueType = SignalProcessor.#getDefaultValueType(defaultValue.genericReturnType);
132
+ if (!defaultValueType) {
133
+ return defaultValue;
134
+ }
135
+ defaultValue.defaultValueParam = SignalProcessor.#createDefaultValueParameter(defaultValueType);
136
+ const emptyValueExpression = this.#createEmptyValueExpression(defaultValueType);
137
+ defaultValue.defaultValueExpression = ts.factory.createBinaryExpression(
138
+ ts.factory.createPropertyAccessChain(
139
+ ts.factory.createIdentifier("options"),
140
+ ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),
141
+ ts.factory.createIdentifier("defaultValue")
142
+ ),
143
+ ts.factory.createToken(ts.SyntaxKind.QuestionQuestionToken),
144
+ emptyValueExpression
145
+ );
146
+ return defaultValue;
147
+ }
114
148
  static #getDefaultValueType(node) {
115
149
  if (ts.isUnionTypeNode(node) && node.types.length && ts.isTypeReferenceNode(node.types[0]) && node.types[0].typeArguments?.length === 1 && ts.isUnionTypeNode(node.types[0].typeArguments[0])) {
116
150
  return node.types[0].typeArguments[0];
117
151
  }
118
152
  return void 0;
119
153
  }
120
- static #createDefaultValueParameter(returnType) {
121
- const alias = createFullyUniqueIdentifier("defaultValue");
122
- const bindingPattern = ts.factory.createObjectBindingPattern([
123
- ts.factory.createBindingElement(void 0, ts.factory.createIdentifier("defaultValue"), alias, void 0)
124
- ]);
154
+ static #createDefaultValueParameter(defaultValueType) {
125
155
  const paramType = ts.factory.createTypeLiteralNode([
126
- ts.factory.createPropertySignature(void 0, ts.factory.createIdentifier("defaultValue"), void 0, returnType)
156
+ ts.factory.createPropertySignature(
157
+ void 0,
158
+ ts.factory.createIdentifier("defaultValue"),
159
+ void 0,
160
+ defaultValueType
161
+ )
127
162
  ]);
128
- return {
129
- alias,
130
- param: ts.factory.createParameterDeclaration(void 0, void 0, bindingPattern, void 0, paramType)
131
- };
163
+ return ts.factory.createParameterDeclaration(
164
+ void 0,
165
+ void 0,
166
+ "options",
167
+ ts.factory.createToken(ts.SyntaxKind.QuestionToken),
168
+ paramType
169
+ );
170
+ }
171
+ static #isDefaultValueTypeNullable(defaultValueType) {
172
+ return ts.isUnionTypeNode(defaultValueType) && defaultValueType.types.length && defaultValueType.types.length > 1 && defaultValueType.types.map((t) => t.kind).includes(ts.SyntaxKind.UndefinedKeyword);
173
+ }
174
+ #createEmptyValueExpression(defaultValueType) {
175
+ if (SignalProcessor.#isDefaultValueTypeNullable(defaultValueType)) {
176
+ return ts.factory.createIdentifier("undefined");
177
+ }
178
+ const importedModelUniqueId = this.#determineModelImportUniqueIdentifier(defaultValueType);
179
+ return ts.factory.createCallExpression(
180
+ ts.factory.createPropertyAccessExpression(importedModelUniqueId, "createEmptyValue"),
181
+ void 0,
182
+ []
183
+ );
184
+ }
185
+ #determineModelImportUniqueIdentifier(returnTypeNode) {
186
+ let modelName = primitiveModels.get(returnTypeNode.types[0].kind);
187
+ let entityName;
188
+ if (modelName === void 0) {
189
+ const { entityName: e, modelName: m } = SignalProcessor.#extractModelNameFromTypeNode(returnTypeNode);
190
+ modelName = m;
191
+ entityName = e;
192
+ }
193
+ const modelImportUniqueId = this.#getExistingEntityModelUniqueIdentifier(modelName) ?? createFullyUniqueIdentifier(modelName);
194
+ this.#addModelImport(entityName, modelName, modelImportUniqueId);
195
+ return modelImportUniqueId;
196
+ }
197
+ static #extractModelNameFromTypeNode(returnTypeNode) {
198
+ if (ts.isTypeReferenceNode(returnTypeNode.types[0])) {
199
+ const typeIdentifier = returnTypeNode.types[0].typeName;
200
+ if (ts.isIdentifier(typeIdentifier)) {
201
+ const entityName = typeIdentifier.text;
202
+ const modelName = `${entityName}Model`;
203
+ return { entityName, modelName };
204
+ }
205
+ }
206
+ throw new Error("Unsupported type reference node");
207
+ }
208
+ #getExistingEntityModelUniqueIdentifier(modelName) {
209
+ const { imports } = this.#dependencyManager;
210
+ return imports.named.getIdentifier("@vaadin/hilla-lit-form", modelName) ?? imports.default.iter().find(([path]) => path.endsWith(`/${modelName}.js`))?.[1];
211
+ }
212
+ #addModelImport(entityName, modelName, modelNameUniqueId) {
213
+ if (modelName) {
214
+ if (primitiveModels.values().find((primitiveModel) => primitiveModel === modelName)) {
215
+ const { imports } = this.#dependencyManager;
216
+ const importedModel = imports.named.getIdentifier("@vaadin/hilla-lit-form", modelName);
217
+ if (importedModel === void 0) {
218
+ imports.named.add("@vaadin/hilla-lit-form", modelName, false, modelNameUniqueId);
219
+ }
220
+ } else {
221
+ this.#addObjectModelImport(entityName, modelName, modelNameUniqueId);
222
+ }
223
+ }
224
+ }
225
+ #addObjectModelImport(entityName, modelName, modelNameUniqueId) {
226
+ const { imports } = this.#dependencyManager;
227
+ const entityImport = imports.default.iter().map(([path]) => path).find((path) => path.startsWith("./") && path.endsWith(`/${entityName}.js`));
228
+ if (entityImport) {
229
+ const entityModelImportPath = entityImport.replace(`/${entityName}.js`, `/${modelName}.js`);
230
+ const importedModel = imports.default.paths().find((path) => path === entityModelImportPath);
231
+ if (importedModel === void 0) {
232
+ imports.default.add(entityModelImportPath, modelName, false, modelNameUniqueId);
233
+ }
234
+ }
132
235
  }
133
236
  #replaceSignalImport(method) {
134
237
  const { imports } = this.#dependencyManager;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["src/SignalProcessor.ts"],
4
- "sourcesContent": ["import type Plugin from '@vaadin/hilla-generator-core/Plugin.js';\nimport { template, transform, traverse } from '@vaadin/hilla-generator-utils/ast.js';\nimport createFullyUniqueIdentifier from '@vaadin/hilla-generator-utils/createFullyUniqueIdentifier.js';\nimport createSourceFile from '@vaadin/hilla-generator-utils/createSourceFile.js';\nimport DependencyManager from '@vaadin/hilla-generator-utils/dependencies/DependencyManager.js';\nimport PathManager from '@vaadin/hilla-generator-utils/dependencies/PathManager.js';\nimport ts, { type FunctionDeclaration, type Identifier, type SourceFile } from 'typescript';\n\nconst HILLA_REACT_SIGNALS = '@vaadin/hilla-react-signals';\n\nconst CONNECT_CLIENT = '$CONNECT_CLIENT$';\nconst METHOD_NAME = '$METHOD_NAME$';\nconst SIGNAL = '$SIGNAL$';\nconst RETURN_TYPE = '$RETURN_TYPE$';\nconst INITIAL_VALUE = '$INITIAL_VALUE$';\n\nconst signals = ['NumberSignal', 'ValueSignal', 'ListSignal'];\nconst genericSignals = ['ValueSignal', 'ListSignal'];\nconst collectionSignals = ['ListSignal'];\n\nexport default class SignalProcessor {\n readonly #dependencyManager: DependencyManager;\n readonly #owner: Plugin;\n readonly #service: string;\n readonly #methods: Map<string, string>;\n readonly #sourceFile: SourceFile;\n\n constructor(service: string, methods: Map<string, string>, sourceFile: SourceFile, owner: Plugin) {\n this.#service = service;\n this.#methods = methods;\n this.#sourceFile = sourceFile;\n this.#owner = owner;\n this.#dependencyManager = new DependencyManager(new PathManager({ extension: '.js' }));\n this.#dependencyManager.imports.fromCode(this.#sourceFile);\n }\n\n process(): SourceFile {\n this.#owner.logger.debug(`Processing signals: ${this.#service}`);\n const { imports } = this.#dependencyManager;\n\n const [, connectClientId] = imports.default.iter().find(([path]) => path.includes('connect-client'))!;\n\n const initTypeId = imports.named.getIdentifier('@vaadin/hilla-frontend', 'EndpointRequestInit');\n let initTypeUsageCount = 0;\n const functionParams: Map<string, ts.ParameterDeclaration[]> = new Map<string, ts.ParameterDeclaration[]>();\n\n const [file] = ts.transform<SourceFile>(this.#sourceFile, [\n transform((tsNode) => {\n if (ts.isFunctionDeclaration(tsNode) && tsNode.name && this.#methods.has(tsNode.name.text)) {\n const signalId = this.#replaceSignalImport(tsNode);\n let initialValue: ts.Expression = signalId.text.startsWith('NumberSignal')\n ? ts.factory.createNumericLiteral('0')\n : ts.factory.createIdentifier('undefined');\n const filteredParams = tsNode.parameters.filter(\n (p) => !p.type || !ts.isTypeReferenceNode(p.type) || p.type.typeName !== initTypeId,\n );\n // `filteredParams` can be altered after, need to store the param names now\n const paramNames = filteredParams.map((p) => (p.name as ts.Identifier).text).join(', ');\n const isCollectionSignal = collectionSignals.includes(signalId.text);\n let genericReturnType;\n if (genericSignals.includes(signalId.text)) {\n genericReturnType = (tsNode.type as ts.TypeReferenceNode).typeArguments![0];\n if (!isCollectionSignal) {\n const defaultValueType = SignalProcessor.#getDefaultValueType(genericReturnType);\n if (defaultValueType) {\n const { alias, param } = SignalProcessor.#createDefaultValueParameter(defaultValueType);\n initialValue = alias;\n filteredParams.push(param);\n }\n }\n }\n const returnType = genericReturnType ?? signalId;\n if (filteredParams.length > 0) {\n functionParams.set(tsNode.name.text, filteredParams);\n }\n return template(\n `function ${METHOD_NAME}(): ${RETURN_TYPE} {\n return new ${SIGNAL}(${isCollectionSignal ? '' : `${INITIAL_VALUE}, `}{ client: ${CONNECT_CLIENT}, endpoint: '${this.#service}', method: '${tsNode.name.text}'${paramNames.length ? `, params: { ${paramNames} }` : ''} });\n}`,\n (statements) => statements,\n [\n transform((node) => (ts.isIdentifier(node) && node.text === METHOD_NAME ? tsNode.name : node)),\n transform((node) => (ts.isIdentifier(node) && node.text === SIGNAL ? signalId : node)),\n transform((node) => (ts.isIdentifier(node) && node.text === RETURN_TYPE ? returnType : node)),\n transform((node) => (ts.isIdentifier(node) && node.text === CONNECT_CLIENT ? connectClientId : node)),\n transform((node) => (ts.isIdentifier(node) && node.text === INITIAL_VALUE ? initialValue : node)),\n ],\n );\n }\n return tsNode;\n }),\n transform((tsNode) => {\n if (\n ts.isFunctionDeclaration(tsNode) &&\n tsNode.name &&\n this.#methods.has(tsNode.name.text) &&\n functionParams.has(tsNode.name.text)\n ) {\n return ts.factory.updateFunctionDeclaration(\n tsNode,\n tsNode.modifiers,\n tsNode.asteriskToken,\n tsNode.name,\n tsNode.typeParameters,\n functionParams.get(tsNode.name.text)!,\n tsNode.type,\n tsNode.body,\n );\n }\n return tsNode;\n }),\n transform((tsNode) => {\n if (ts.isFunctionDeclaration(tsNode)) {\n if (\n !(tsNode.name && this.#methods.has(tsNode.name.text)) &&\n tsNode.parameters.some((p) => p.type && ts.isTypeReferenceNode(p.type) && p.type.typeName === initTypeId)\n ) {\n initTypeUsageCount += 1;\n }\n }\n return tsNode;\n }),\n ]).transformed;\n\n if (initTypeUsageCount === 0) {\n imports.named.remove('@vaadin/hilla-frontend', 'EndpointRequestInit');\n }\n\n return createSourceFile(\n [\n ...this.#dependencyManager.imports.toCode(),\n ...file.statements.filter((statement) => !ts.isImportDeclaration(statement)),\n ],\n file.fileName,\n );\n }\n\n static #getDefaultValueType(node: ts.Node) {\n if (\n ts.isUnionTypeNode(node) &&\n node.types.length &&\n ts.isTypeReferenceNode(node.types[0]) &&\n node.types[0].typeArguments?.length === 1 &&\n ts.isUnionTypeNode(node.types[0].typeArguments[0])\n ) {\n return node.types[0].typeArguments[0];\n }\n\n return undefined;\n }\n\n static #createDefaultValueParameter(returnType: ts.TypeNode) {\n const alias = createFullyUniqueIdentifier('defaultValue');\n const bindingPattern = ts.factory.createObjectBindingPattern([\n ts.factory.createBindingElement(undefined, ts.factory.createIdentifier('defaultValue'), alias, undefined),\n ]);\n const paramType = ts.factory.createTypeLiteralNode([\n ts.factory.createPropertySignature(undefined, ts.factory.createIdentifier('defaultValue'), undefined, returnType),\n ]);\n // Return both the alias and the full parameter\n return {\n alias,\n param: ts.factory.createParameterDeclaration(undefined, undefined, bindingPattern, undefined, paramType),\n };\n }\n\n #replaceSignalImport(method: FunctionDeclaration): Identifier {\n const { imports } = this.#dependencyManager;\n\n if (method.type) {\n const type = traverse(method.type, (node) =>\n ts.isIdentifier(node) && signals.includes(node.text) ? node : undefined,\n );\n\n if (type) {\n const signalId = imports.named.getIdentifier(HILLA_REACT_SIGNALS, type.text);\n\n if (signalId) {\n return signalId;\n }\n\n const result = imports.default.iter().find(([_p, id]) => id.text === type.text);\n\n if (result) {\n const [path] = result;\n imports.default.remove(path);\n return imports.named.add(HILLA_REACT_SIGNALS, type.text, false, type);\n }\n }\n }\n\n throw new Error('Signal type not found');\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type Plugin from '@vaadin/hilla-generator-core/Plugin.js';\nimport { template, transform, traverse } from '@vaadin/hilla-generator-utils/ast.js';\nimport createFullyUniqueIdentifier from '@vaadin/hilla-generator-utils/createFullyUniqueIdentifier.js';\nimport createSourceFile from '@vaadin/hilla-generator-utils/createSourceFile.js';\nimport DependencyManager from '@vaadin/hilla-generator-utils/dependencies/DependencyManager.js';\nimport PathManager from '@vaadin/hilla-generator-utils/dependencies/PathManager.js';\nimport ts, { type FunctionDeclaration, type Identifier, type SourceFile } from 'typescript';\n\nconst HILLA_REACT_SIGNALS = '@vaadin/hilla-react-signals';\n\nconst CONNECT_CLIENT = '$CONNECT_CLIENT$';\nconst METHOD_NAME = '$METHOD_NAME$';\nconst SIGNAL = '$SIGNAL$';\nconst RETURN_TYPE = '$RETURN_TYPE$';\nconst INITIAL_VALUE = '$INITIAL_VALUE$';\n\nconst signals = ['NumberSignal', 'ValueSignal', 'ListSignal'];\nconst genericSignals = ['ValueSignal', 'ListSignal'];\nconst collectionSignals = ['ListSignal'];\n\nconst primitiveModels = Object.freeze(\n new Map<ts.SyntaxKind, string>([\n [ts.SyntaxKind.StringKeyword, 'StringModel'],\n [ts.SyntaxKind.NumberKeyword, 'NumberModel'],\n [ts.SyntaxKind.BooleanKeyword, 'BooleanModel'],\n [ts.SyntaxKind.ArrayType, 'ArrayModel'],\n ]),\n);\n\nexport default class SignalProcessor {\n readonly #dependencyManager: DependencyManager;\n readonly #owner: Plugin;\n readonly #service: string;\n readonly #methods: Map<string, string>;\n readonly #sourceFile: SourceFile;\n\n constructor(service: string, methods: Map<string, string>, sourceFile: SourceFile, owner: Plugin) {\n this.#service = service;\n this.#methods = methods;\n this.#sourceFile = sourceFile;\n this.#owner = owner;\n this.#dependencyManager = new DependencyManager(new PathManager({ extension: '.js' }));\n this.#dependencyManager.imports.fromCode(this.#sourceFile);\n }\n\n process(): SourceFile {\n this.#owner.logger.debug(`Processing signals: ${this.#service}`);\n const { imports } = this.#dependencyManager;\n\n const [, connectClientId] = imports.default.iter().find(([path]) => path.includes('connect-client'))!;\n\n const initTypeId = imports.named.getIdentifier('@vaadin/hilla-frontend', 'EndpointRequestInit');\n let initTypeUsageCount = 0;\n const functionParams: Map<string, ts.ParameterDeclaration[]> = new Map<string, ts.ParameterDeclaration[]>();\n\n const [file] = ts.transform<SourceFile>(this.#sourceFile, [\n transform((tsNode) => {\n if (ts.isFunctionDeclaration(tsNode) && tsNode.name && this.#methods.has(tsNode.name.text)) {\n const signalId = this.#replaceSignalImport(tsNode);\n const filteredParams = tsNode.parameters.filter(\n (p) => !p.type || !ts.isTypeReferenceNode(p.type) || p.type.typeName !== initTypeId,\n );\n // `filteredParams` can be altered after, need to store the param names now\n const paramNames = filteredParams.map((p) => (p.name as ts.Identifier).text).join(', ');\n const isCollectionSignal = collectionSignals.includes(signalId.text);\n\n const { defaultValueExpression, defaultValueParam, genericReturnType } = this.#createDefaultValue(\n signalId,\n tsNode,\n );\n if (defaultValueParam) {\n filteredParams.push(defaultValueParam);\n }\n\n const returnType = genericReturnType ?? signalId;\n if (filteredParams.length > 0) {\n functionParams.set(tsNode.name.text, filteredParams);\n }\n return template(\n `function ${METHOD_NAME}(): ${RETURN_TYPE} {\n return new ${SIGNAL}(${\n isCollectionSignal ? '' : `${INITIAL_VALUE}, `\n }{ client: ${CONNECT_CLIENT}, endpoint: '${this.#service}', method: '${tsNode.name.text}'${\n paramNames.length ? `, params: { ${paramNames} }` : ''\n } });\n}`,\n (statements) => statements,\n [\n transform((node) => (ts.isIdentifier(node) && node.text === METHOD_NAME ? tsNode.name : node)),\n transform((node) => (ts.isIdentifier(node) && node.text === SIGNAL ? signalId : node)),\n transform((node) => (ts.isIdentifier(node) && node.text === RETURN_TYPE ? returnType : node)),\n transform((node) => (ts.isIdentifier(node) && node.text === CONNECT_CLIENT ? connectClientId : node)),\n transform((node) =>\n ts.isIdentifier(node) && node.text === INITIAL_VALUE ? defaultValueExpression : node,\n ),\n ],\n );\n }\n return tsNode;\n }),\n transform((tsNode) => {\n if (\n ts.isFunctionDeclaration(tsNode) &&\n tsNode.name &&\n this.#methods.has(tsNode.name.text) &&\n functionParams.has(tsNode.name.text)\n ) {\n return ts.factory.updateFunctionDeclaration(\n tsNode,\n tsNode.modifiers,\n tsNode.asteriskToken,\n tsNode.name,\n tsNode.typeParameters,\n functionParams.get(tsNode.name.text)!,\n tsNode.type,\n tsNode.body,\n );\n }\n return tsNode;\n }),\n transform((tsNode) => {\n if (ts.isFunctionDeclaration(tsNode)) {\n if (\n !(tsNode.name && this.#methods.has(tsNode.name.text)) &&\n tsNode.parameters.some((p) => p.type && ts.isTypeReferenceNode(p.type) && p.type.typeName === initTypeId)\n ) {\n initTypeUsageCount += 1;\n }\n }\n return tsNode;\n }),\n ]).transformed;\n\n if (initTypeUsageCount === 0) {\n imports.named.remove('@vaadin/hilla-frontend', 'EndpointRequestInit');\n }\n\n return createSourceFile(\n [\n ...this.#dependencyManager.imports.toCode(),\n ...file.statements.filter((statement) => !ts.isImportDeclaration(statement)),\n ],\n file.fileName,\n );\n }\n\n #createDefaultValue(signalId: ts.Identifier, functionDeclaration: FunctionDeclaration) {\n const defaultValue: {\n defaultValueExpression: ts.Expression | ts.Identifier;\n defaultValueParam: ts.ParameterDeclaration | undefined;\n genericReturnType: ts.TypeNode | undefined;\n } = {\n defaultValueExpression: signalId.text.startsWith('NumberSignal')\n ? ts.factory.createNumericLiteral('0')\n : ts.factory.createIdentifier('undefined'),\n defaultValueParam: undefined,\n genericReturnType: undefined,\n };\n\n if (!genericSignals.includes(signalId.text)) {\n return defaultValue;\n }\n\n [defaultValue.genericReturnType] = (functionDeclaration.type as ts.TypeReferenceNode).typeArguments!;\n\n if (collectionSignals.includes(signalId.text)) {\n return defaultValue;\n }\n\n const defaultValueType = SignalProcessor.#getDefaultValueType(defaultValue.genericReturnType);\n if (!defaultValueType) {\n return defaultValue;\n }\n\n defaultValue.defaultValueParam = SignalProcessor.#createDefaultValueParameter(defaultValueType);\n const emptyValueExpression = this.#createEmptyValueExpression(defaultValueType);\n\n defaultValue.defaultValueExpression = ts.factory.createBinaryExpression(\n ts.factory.createPropertyAccessChain(\n ts.factory.createIdentifier('options'),\n ts.factory.createToken(ts.SyntaxKind.QuestionDotToken),\n ts.factory.createIdentifier('defaultValue'),\n ),\n ts.factory.createToken(ts.SyntaxKind.QuestionQuestionToken),\n emptyValueExpression,\n );\n\n return defaultValue;\n }\n\n static #getDefaultValueType(node: ts.Node) {\n if (\n ts.isUnionTypeNode(node) &&\n node.types.length &&\n ts.isTypeReferenceNode(node.types[0]) &&\n node.types[0].typeArguments?.length === 1 &&\n ts.isUnionTypeNode(node.types[0].typeArguments[0])\n ) {\n return node.types[0].typeArguments[0];\n }\n return undefined;\n }\n\n static #createDefaultValueParameter(defaultValueType: ts.TypeNode) {\n const paramType = ts.factory.createTypeLiteralNode([\n ts.factory.createPropertySignature(\n undefined,\n ts.factory.createIdentifier('defaultValue'),\n undefined,\n defaultValueType,\n ),\n ]);\n\n return ts.factory.createParameterDeclaration(\n undefined,\n undefined,\n 'options',\n ts.factory.createToken(ts.SyntaxKind.QuestionToken),\n paramType,\n );\n }\n\n static #isDefaultValueTypeNullable(defaultValueType: ts.TypeNode) {\n return (\n ts.isUnionTypeNode(defaultValueType) &&\n defaultValueType.types.length &&\n defaultValueType.types.length > 1 &&\n defaultValueType.types.map((t) => t.kind).includes(ts.SyntaxKind.UndefinedKeyword)\n );\n }\n\n #createEmptyValueExpression(defaultValueType: ts.UnionTypeNode) {\n if (SignalProcessor.#isDefaultValueTypeNullable(defaultValueType)) {\n return ts.factory.createIdentifier('undefined');\n }\n const importedModelUniqueId = this.#determineModelImportUniqueIdentifier(defaultValueType);\n return ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(importedModelUniqueId, 'createEmptyValue'),\n undefined,\n [],\n );\n }\n\n #determineModelImportUniqueIdentifier(returnTypeNode: ts.UnionTypeNode) {\n let modelName = primitiveModels.get(returnTypeNode.types[0].kind);\n let entityName;\n if (modelName === undefined) {\n const { entityName: e, modelName: m } = SignalProcessor.#extractModelNameFromTypeNode(returnTypeNode);\n modelName = m;\n entityName = e;\n }\n const modelImportUniqueId =\n this.#getExistingEntityModelUniqueIdentifier(modelName) ?? createFullyUniqueIdentifier(modelName);\n\n this.#addModelImport(entityName, modelName, modelImportUniqueId);\n return modelImportUniqueId;\n }\n\n static #extractModelNameFromTypeNode(returnTypeNode: ts.UnionTypeNode) {\n if (ts.isTypeReferenceNode(returnTypeNode.types[0])) {\n const typeIdentifier = returnTypeNode.types[0].typeName;\n if (ts.isIdentifier(typeIdentifier)) {\n const entityName = typeIdentifier.text;\n const modelName = `${entityName}Model`;\n return { entityName, modelName };\n }\n }\n throw new Error('Unsupported type reference node');\n }\n\n #getExistingEntityModelUniqueIdentifier(modelName: string) {\n const { imports } = this.#dependencyManager;\n return (\n imports.named.getIdentifier('@vaadin/hilla-lit-form', modelName) ??\n imports.default.iter().find(([path]) => path.endsWith(`/${modelName}.js`))?.[1]\n );\n }\n\n #addModelImport(\n entityName: string | undefined,\n modelName: string | undefined,\n modelNameUniqueId: ts.Identifier | undefined,\n ) {\n if (modelName) {\n if (primitiveModels.values().find((primitiveModel) => primitiveModel === modelName)) {\n const { imports } = this.#dependencyManager;\n const importedModel = imports.named.getIdentifier('@vaadin/hilla-lit-form', modelName);\n if (importedModel === undefined) {\n imports.named.add('@vaadin/hilla-lit-form', modelName, false, modelNameUniqueId);\n }\n } else {\n this.#addObjectModelImport(entityName!, modelName, modelNameUniqueId!);\n }\n }\n }\n\n #addObjectModelImport(entityName: string, modelName: string, modelNameUniqueId: ts.Identifier) {\n const { imports } = this.#dependencyManager;\n const entityImport = imports.default\n .iter()\n .map(([path]) => path)\n .find((path) => path.startsWith('./') && path.endsWith(`/${entityName}.js`));\n if (entityImport) {\n const entityModelImportPath = entityImport.replace(`/${entityName}.js`, `/${modelName}.js`);\n const importedModel = imports.default.paths().find((path) => path === entityModelImportPath);\n if (importedModel === undefined) {\n imports.default.add(entityModelImportPath, modelName, false, modelNameUniqueId);\n }\n }\n }\n\n #replaceSignalImport(method: FunctionDeclaration): Identifier {\n const { imports } = this.#dependencyManager;\n\n if (method.type) {\n const type = traverse(method.type, (node) =>\n ts.isIdentifier(node) && signals.includes(node.text) ? node : undefined,\n );\n\n if (type) {\n const signalId = imports.named.getIdentifier(HILLA_REACT_SIGNALS, type.text);\n\n if (signalId) {\n return signalId;\n }\n\n const result = imports.default.iter().find(([_p, id]) => id.text === type.text);\n\n if (result) {\n const [path] = result;\n imports.default.remove(path);\n return imports.named.add(HILLA_REACT_SIGNALS, type.text, false, type);\n }\n }\n }\n\n throw new Error('Signal type not found');\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/hilla-generator-plugin-signals",
3
- "version": "24.6.5",
3
+ "version": "24.7.0-alpha10",
4
4
  "description": "A Hilla TypeScript Generator plugin to add Shared Signals support",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -15,9 +15,10 @@
15
15
  "build:copy": "cd src && copyfiles **/*.d.ts ..",
16
16
  "lint": "eslint src test",
17
17
  "lint:fix": "eslint src test --fix",
18
- "test": "mocha test/**/*.spec.ts --config ../../../.mocharc.cjs",
19
- "test:update": "npm run test -- --update",
20
- "test:coverage": "c8 -c ../../../.c8rc.json npm test",
18
+ "test": "vitest --run",
19
+ "test:coverage": "vitest --run --coverage",
20
+ "test:update": "vitest --run --update",
21
+ "test:watch": "vitest",
21
22
  "typecheck": "tsc --noEmit"
22
23
  },
23
24
  "exports": {
@@ -51,32 +52,13 @@
51
52
  "access": "public"
52
53
  },
53
54
  "dependencies": {
54
- "@vaadin/hilla-generator-core": "24.6.5",
55
- "@vaadin/hilla-generator-plugin-backbone": "24.6.5",
56
- "@vaadin/hilla-generator-plugin-client": "24.6.5",
57
- "@vaadin/hilla-generator-utils": "24.6.5",
58
- "fast-deep-equal": "^3.1.3",
59
- "iterator-helpers-polyfill": "^3.0.1",
60
- "openapi-types": "^12.1.3",
61
- "typescript": "5.7.2"
62
- },
63
- "devDependencies": {
64
- "@types/chai": "^4.3.6",
65
- "@types/mocha": "^10.0.2",
66
- "@types/node": "^20.7.1",
67
- "@types/sinon": "^10.0.17",
68
- "@types/sinon-chai": "^3.2.10",
69
- "@vaadin/hilla-generator-core": "24.6.5",
70
- "@vaadin/hilla-generator-plugin-client": "24.6.5",
71
- "c8": "^8.0.1",
72
- "chai": "^4.3.10",
73
- "concurrently": "^8.2.1",
74
- "copyfiles": "^2.4.1",
75
- "mocha": "^10.8.2",
76
- "monocart-coverage-reports": "^2.11.5",
77
- "pino": "^8.21.0",
78
- "sinon": "^16.1.3",
79
- "sinon-chai": "^3.7.0",
80
- "type-fest": "^4.3.2"
55
+ "@vaadin/hilla-generator-core": "24.7.0-alpha10",
56
+ "@vaadin/hilla-generator-plugin-backbone": "24.7.0-alpha10",
57
+ "@vaadin/hilla-generator-plugin-client": "24.7.0-alpha10",
58
+ "@vaadin/hilla-generator-utils": "24.7.0-alpha10",
59
+ "fast-deep-equal": "3.1.3",
60
+ "iterator-helpers-polyfill": "3.0.1",
61
+ "openapi-types": "12.1.3",
62
+ "typescript": "5.7.3"
81
63
  }
82
64
  }