@vaadin/hilla-generator-plugin-signals 24.5.0-beta1 → 24.5.0-beta2

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;AAKjE,OAAW,EAA6C,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAY5F,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;CAmHtB"}
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;AAa5F,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;CA0JtB"}
@@ -1,4 +1,5 @@
1
1
  import { template, transform, traverse } from "@vaadin/hilla-generator-utils/ast.js";
2
+ import createFullyUniqueIdentifier from "@vaadin/hilla-generator-utils/createFullyUniqueIdentifier.js";
2
3
  import createSourceFile from "@vaadin/hilla-generator-utils/createSourceFile.js";
3
4
  import DependencyManager from "@vaadin/hilla-generator-utils/dependencies/DependencyManager.js";
4
5
  import PathManager from "@vaadin/hilla-generator-utils/dependencies/PathManager.js";
@@ -8,6 +9,7 @@ const CONNECT_CLIENT = "$CONNECT_CLIENT$";
8
9
  const METHOD_NAME = "$METHOD_NAME$";
9
10
  const SIGNAL = "$SIGNAL$";
10
11
  const RETURN_TYPE = "$RETURN_TYPE$";
12
+ const INITIAL_VALUE = "$INITIAL_VALUE$";
11
13
  const signals = ["NumberSignal", "ValueSignal"];
12
14
  const genericSignals = ["ValueSignal"];
13
15
  class SignalProcessor {
@@ -34,30 +36,37 @@ class SignalProcessor {
34
36
  const [file] = ts.transform(this.#sourceFile, [
35
37
  transform((tsNode) => {
36
38
  if (ts.isFunctionDeclaration(tsNode) && tsNode.name && this.#methods.has(tsNode.name.text)) {
39
+ const signalId = this.#replaceSignalImport(tsNode);
40
+ let initialValue = signalId.text.startsWith("NumberSignal") ? ts.factory.createNumericLiteral("0") : ts.factory.createIdentifier("undefined");
37
41
  const filteredParams = tsNode.parameters.filter(
38
42
  (p) => !p.type || !ts.isTypeReferenceNode(p.type) || p.type.typeName !== initTypeId
39
43
  );
40
- if (filteredParams.length > 0) {
41
- functionParams.set(tsNode.name.text, filteredParams);
42
- }
43
44
  const paramNames = filteredParams.map((p) => p.name.text).join(", ");
44
- const signalId = this.#replaceSignalImport(tsNode);
45
45
  let genericReturnType;
46
46
  if (genericSignals.includes(signalId.text)) {
47
47
  genericReturnType = tsNode.type.typeArguments[0];
48
+ const defaultValueType = SignalProcessor.#getDefaultValueType(genericReturnType);
49
+ if (defaultValueType) {
50
+ const { alias, param } = SignalProcessor.#createDefaultValueParameter(defaultValueType);
51
+ initialValue = alias;
52
+ filteredParams.push(param);
53
+ }
48
54
  }
49
55
  const returnType = genericReturnType ?? signalId;
50
- const INITIAL_VALUE = signalId.text.startsWith("NumberSignal") ? "0" : "undefined";
56
+ if (filteredParams.length > 0) {
57
+ functionParams.set(tsNode.name.text, filteredParams);
58
+ }
51
59
  return template(
52
60
  `function ${METHOD_NAME}(): ${RETURN_TYPE} {
53
- return new ${SIGNAL}(${INITIAL_VALUE}, { client: ${CONNECT_CLIENT}, endpoint: '${this.#service}', method: '${tsNode.name.text}'${filteredParams.length > 0 ? `, params: { ${paramNames} }` : ""} });
61
+ return new ${SIGNAL}(${INITIAL_VALUE}, { client: ${CONNECT_CLIENT}, endpoint: '${this.#service}', method: '${tsNode.name.text}'${paramNames.length ? `, params: { ${paramNames} }` : ""} });
54
62
  }`,
55
63
  (statements) => statements,
56
64
  [
57
65
  transform((node) => ts.isIdentifier(node) && node.text === METHOD_NAME ? tsNode.name : node),
58
66
  transform((node) => ts.isIdentifier(node) && node.text === SIGNAL ? signalId : node),
59
67
  transform((node) => ts.isIdentifier(node) && node.text === RETURN_TYPE ? returnType : node),
60
- transform((node) => ts.isIdentifier(node) && node.text === CONNECT_CLIENT ? connectClientId : node)
68
+ transform((node) => ts.isIdentifier(node) && node.text === CONNECT_CLIENT ? connectClientId : node),
69
+ transform((node) => ts.isIdentifier(node) && node.text === INITIAL_VALUE ? initialValue : node)
61
70
  ]
62
71
  );
63
72
  }
@@ -98,6 +107,25 @@ class SignalProcessor {
98
107
  file.fileName
99
108
  );
100
109
  }
110
+ static #getDefaultValueType(node) {
111
+ 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])) {
112
+ return node.types[0].typeArguments[0];
113
+ }
114
+ return void 0;
115
+ }
116
+ static #createDefaultValueParameter(returnType) {
117
+ const alias = createFullyUniqueIdentifier("defaultValue");
118
+ const bindingPattern = ts.factory.createObjectBindingPattern([
119
+ ts.factory.createBindingElement(void 0, ts.factory.createIdentifier("defaultValue"), alias, void 0)
120
+ ]);
121
+ const paramType = ts.factory.createTypeLiteralNode([
122
+ ts.factory.createPropertySignature(void 0, ts.factory.createIdentifier("defaultValue"), void 0, returnType)
123
+ ]);
124
+ return {
125
+ alias,
126
+ param: ts.factory.createParameterDeclaration(void 0, void 0, bindingPattern, void 0, paramType)
127
+ };
128
+ }
101
129
  #replaceSignalImport(method) {
102
130
  const { imports } = this.#dependencyManager;
103
131
  if (method.type) {
@@ -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 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$';\n\nconst signals = ['NumberSignal', 'ValueSignal'];\nconst genericSignals = ['ValueSignal'];\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 filteredParams = tsNode.parameters.filter(\n (p) => !p.type || !ts.isTypeReferenceNode(p.type) || p.type.typeName !== initTypeId,\n );\n if (filteredParams.length > 0) {\n functionParams.set(tsNode.name.text, filteredParams);\n }\n const paramNames = filteredParams.map((p) => (p.name as ts.Identifier).text).join(', ');\n const signalId = this.#replaceSignalImport(tsNode);\n let genericReturnType;\n if (genericSignals.includes(signalId.text)) {\n genericReturnType = (tsNode.type as ts.TypeReferenceNode).typeArguments![0];\n }\n const returnType = genericReturnType ?? signalId;\n const INITIAL_VALUE = signalId.text.startsWith('NumberSignal') ? '0' : 'undefined';\n return template(\n `function ${METHOD_NAME}(): ${RETURN_TYPE} {\n return new ${SIGNAL}(${INITIAL_VALUE}, { client: ${CONNECT_CLIENT}, endpoint: '${this.#service}', method: '${tsNode.name.text}'${filteredParams.length > 0 ? `, 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 ],\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 #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'];\nconst genericSignals = ['ValueSignal'];\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 let genericReturnType;\n if (genericSignals.includes(signalId.text)) {\n genericReturnType = (tsNode.type as ts.TypeReferenceNode).typeArguments![0];\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 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}(${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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",
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.5.0-beta1",
3
+ "version": "24.5.0-beta2",
4
4
  "description": "A Hilla TypeScript Generator plugin to add Shared Signals support",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -51,10 +51,10 @@
51
51
  "access": "public"
52
52
  },
53
53
  "dependencies": {
54
- "@vaadin/hilla-generator-core": "24.5.0-beta1",
55
- "@vaadin/hilla-generator-plugin-backbone": "24.5.0-beta1",
56
- "@vaadin/hilla-generator-plugin-client": "24.5.0-beta1",
57
- "@vaadin/hilla-generator-utils": "24.5.0-beta1",
54
+ "@vaadin/hilla-generator-core": "24.5.0-beta2",
55
+ "@vaadin/hilla-generator-plugin-backbone": "24.5.0-beta2",
56
+ "@vaadin/hilla-generator-plugin-client": "24.5.0-beta2",
57
+ "@vaadin/hilla-generator-utils": "24.5.0-beta2",
58
58
  "fast-deep-equal": "^3.1.3",
59
59
  "iterator-helpers-polyfill": "^3.0.1",
60
60
  "openapi-types": "^12.1.3",
@@ -66,8 +66,8 @@
66
66
  "@types/node": "^20.7.1",
67
67
  "@types/sinon": "^10.0.17",
68
68
  "@types/sinon-chai": "^3.2.10",
69
- "@vaadin/hilla-generator-core": "24.5.0-beta1",
70
- "@vaadin/hilla-generator-plugin-client": "24.5.0-beta1",
69
+ "@vaadin/hilla-generator-core": "24.5.0-beta2",
70
+ "@vaadin/hilla-generator-plugin-client": "24.5.0-beta2",
71
71
  "c8": "^8.0.1",
72
72
  "chai": "^4.3.10",
73
73
  "concurrently": "^8.2.1",