@avijs/compiler 0.1.0 → 0.1.1

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.
package/dist/check.js CHANGED
@@ -66,13 +66,17 @@ function checkClass(node, source, checker, out) {
66
66
  const element = list.elements[i];
67
67
  if (!element || param.dotDotDotToken)
68
68
  return;
69
- const provided = tokenType(element, checker);
70
- if (!provided) {
69
+ const token = tokenType(element, checker);
70
+ if (!token) {
71
71
  report(element, 'warning', 'AVI003', `Cannot tell what ${element.getText(source)} resolves to`);
72
72
  return;
73
73
  }
74
+ const { type: provided, generic } = token;
74
75
  const expected = checker.getTypeAtLocation(param);
75
- if (!checker.isTypeAssignableTo(provided, expected)) {
76
+ // A generic constructor returns its type with open type parameters; a parameter typed as the
77
+ // same class (with its defaults) is a match.
78
+ const sameClass = generic && provided.getSymbol() === expected.getSymbol();
79
+ if (!sameClass && !checker.isTypeAssignableTo(provided, expected)) {
76
80
  report(element, 'error', 'AVI004', `${className}.inject[${String(i)}] provides ${checker.typeToString(provided)}, but parameter "${param.name.getText(source)}" expects ${checker.typeToString(expected)}`);
77
81
  }
78
82
  });
@@ -92,10 +96,15 @@ function unwrap(expression) {
92
96
  function tokenType(element, checker) {
93
97
  const type = checker.getTypeAtLocation(element);
94
98
  const construct = type.getConstructSignatures()[0];
95
- if (construct)
96
- return construct.getReturnType();
99
+ if (construct) {
100
+ return {
101
+ type: construct.getReturnType(),
102
+ generic: (construct.typeParameters?.length ?? 0) > 0,
103
+ };
104
+ }
97
105
  if (type.getSymbol()?.getName() === 'InjectionToken') {
98
- return checker.getTypeArguments(type)[0];
106
+ const value = checker.getTypeArguments(type)[0];
107
+ return value && { type: value, generic: false };
99
108
  }
100
109
  return undefined;
101
110
  }
package/dist/check.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@avijs/compiler",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Optional build-time checks and manifests for Avi.js apps.",
5
5
  "keywords": [
6
6
  "avi",
@@ -45,7 +45,7 @@
45
45
  "access": "public"
46
46
  },
47
47
  "dependencies": {
48
- "@avijs/core": "0.1.0"
48
+ "@avijs/core": "0.1.1"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "typescript": ">=5.8"
package/src/check.ts CHANGED
@@ -102,8 +102,8 @@ function checkClass(
102
102
  params.forEach((param, i) => {
103
103
  const element = list.elements[i];
104
104
  if (!element || param.dotDotDotToken) return;
105
- const provided = tokenType(element, checker);
106
- if (!provided) {
105
+ const token = tokenType(element, checker);
106
+ if (!token) {
107
107
  report(
108
108
  element,
109
109
  'warning',
@@ -112,8 +112,12 @@ function checkClass(
112
112
  );
113
113
  return;
114
114
  }
115
+ const { type: provided, generic } = token;
115
116
  const expected = checker.getTypeAtLocation(param);
116
- if (!checker.isTypeAssignableTo(provided, expected)) {
117
+ // A generic constructor returns its type with open type parameters; a parameter typed as the
118
+ // same class (with its defaults) is a match.
119
+ const sameClass = generic && provided.getSymbol() === expected.getSymbol();
120
+ if (!sameClass && !checker.isTypeAssignableTo(provided, expected)) {
117
121
  report(
118
122
  element,
119
123
  'error',
@@ -139,12 +143,21 @@ function unwrap(expression: ts.Expression | undefined): ts.Expression | undefine
139
143
  }
140
144
 
141
145
  /** A class token resolves to its instance type; an `InjectionToken<T>` to `T`. */
142
- function tokenType(element: ts.Expression, checker: ts.TypeChecker): ts.Type | undefined {
146
+ function tokenType(
147
+ element: ts.Expression,
148
+ checker: ts.TypeChecker,
149
+ ): { type: ts.Type; generic: boolean } | undefined {
143
150
  const type = checker.getTypeAtLocation(element);
144
151
  const construct = type.getConstructSignatures()[0];
145
- if (construct) return construct.getReturnType();
152
+ if (construct) {
153
+ return {
154
+ type: construct.getReturnType(),
155
+ generic: (construct.typeParameters?.length ?? 0) > 0,
156
+ };
157
+ }
146
158
  if (type.getSymbol()?.getName() === 'InjectionToken') {
147
- return checker.getTypeArguments(type as ts.TypeReference)[0];
159
+ const value = checker.getTypeArguments(type as ts.TypeReference)[0];
160
+ return value && { type: value, generic: false };
148
161
  }
149
162
  return undefined;
150
163
  }