jest-preset-angular 12.2.0 → 12.2.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/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## [12.2.1](https://github.com/thymikee/jest-preset-angular/compare/v12.2.0...v12.2.1) (2022-08-28)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **transformers:** adopt ts 4.8 changes for `replace-resource` ([#1739](https://github.com/thymikee/jest-preset-angular/issues/1739)) ([aea7205](https://github.com/thymikee/jest-preset-angular/commit/aea7205afb9622f2ba09a032505b8dbf5c7105c1)), closes [#1732](https://github.com/thymikee/jest-preset-angular/issues/1732)
7
+
8
+
9
+
1
10
  # [12.2.0](https://github.com/thymikee/jest-preset-angular/compare/v12.1.0...v12.2.0) (2022-07-14)
2
11
 
3
12
 
@@ -160,7 +160,9 @@ function entityNameToValue(node) {
160
160
  return left !== null ? typescript_1.default.factory.createPropertyAccessExpression(left, node.right) : null;
161
161
  }
162
162
  else if (typescript_1.default.isIdentifier(node)) {
163
- return typescript_1.default.getMutableClone(node);
163
+ const clone = typescript_1.default.setOriginalNode(typescript_1.default.factory.createIdentifier(node.text), node);
164
+ clone.parent = node.parent;
165
+ return clone;
164
166
  }
165
167
  else {
166
168
  return null;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.reflectObjectLiteral = exports.findMember = exports.filterToMembersWithDecorator = exports.reflectTypeEntityToDeclaration = exports.reflectIdentifierOfDeclaration = exports.reflectNameOfDeclaration = exports.TypeScriptReflectionHost = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const typescript_1 = tslib_1.__importDefault(require("typescript"));
6
+ const ts_compatibility_1 = require("../../ts_compatibility");
6
7
  const host_1 = require("./host");
7
8
  const type_to_value_1 = require("./type_to_value");
8
9
  const util_1 = require("./util");
@@ -11,11 +12,11 @@ class TypeScriptReflectionHost {
11
12
  this.checker = checker;
12
13
  }
13
14
  getDecoratorsOfDeclaration(declaration) {
14
- if (declaration.decorators === undefined || declaration.decorators.length === 0) {
15
- return null;
16
- }
17
- return declaration.decorators.map(decorator => this._reflectDecorator(decorator))
18
- .filter((dec) => dec !== null);
15
+ const decorators = (0, ts_compatibility_1.getDecorators)(declaration);
16
+ return decorators !== undefined && decorators.length ?
17
+ decorators.map(decorator => this._reflectDecorator(decorator))
18
+ .filter((dec) => dec !== null) :
19
+ null;
19
20
  }
20
21
  getMembersOfClass(clazz) {
21
22
  const tsClazz = castDeclarationToClassOrDie(clazz);
@@ -149,8 +150,9 @@ class TypeScriptReflectionHost {
149
150
  if (typescript_1.default.isVariableDeclaration(decl) && typescript_1.default.isVariableDeclarationList(decl.parent)) {
150
151
  topLevel = decl.parent.parent;
151
152
  }
152
- if (topLevel.modifiers !== undefined &&
153
- topLevel.modifiers.some(modifier => modifier.kind === typescript_1.default.SyntaxKind.ExportKeyword)) {
153
+ const modifiers = (0, ts_compatibility_1.getModifiers)(topLevel);
154
+ if (modifiers !== undefined &&
155
+ modifiers.some(modifier => modifier.kind === typescript_1.default.SyntaxKind.ExportKeyword)) {
154
156
  return true;
155
157
  }
156
158
  if (topLevel.parent === undefined || !typescript_1.default.isSourceFile(topLevel.parent)) {
@@ -310,8 +312,8 @@ class TypeScriptReflectionHost {
310
312
  return null;
311
313
  }
312
314
  const decorators = this.getDecoratorsOfDeclaration(node);
313
- const isStatic = node.modifiers !== undefined &&
314
- node.modifiers.some(mod => mod.kind === typescript_1.default.SyntaxKind.StaticKeyword);
315
+ const modifiers = (0, ts_compatibility_1.getModifiers)(node);
316
+ const isStatic = modifiers !== undefined && modifiers.some(mod => mod.kind === typescript_1.default.SyntaxKind.StaticKeyword);
315
317
  return {
316
318
  node,
317
319
  implementation: node,
@@ -499,7 +501,8 @@ function getFarLeftIdentifier(propertyAccess) {
499
501
  }
500
502
  function getContainingImportDeclaration(node) {
501
503
  return typescript_1.default.isImportSpecifier(node) ? node.parent.parent.parent :
502
- typescript_1.default.isNamespaceImport(node) ? node.parent.parent : null;
504
+ typescript_1.default.isNamespaceImport(node) ? node.parent.parent :
505
+ null;
503
506
  }
504
507
  function getExportedName(decl, originalId) {
505
508
  return typescript_1.default.isImportSpecifier(decl) ?
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./src/ts_cross_version_utils"), exports);
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getDownlevelDecoratorsTransform = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const typescript_1 = tslib_1.__importDefault(require("typescript"));
6
+ const ts_compatibility_1 = require("../../ngtsc/ts_compatibility");
6
7
  const patch_alias_reference_resolution_1 = require("./patch_alias_reference_resolution");
7
8
  function isAngularDecorator(decorator, isCore) {
8
9
  return isCore || (decorator.import !== null && decorator.import.from === '@angular/core');
@@ -61,7 +62,7 @@ function createCtorParametersClassProperty(diagnostics, entityNameToExpression,
61
62
  params.push(typescript_1.default.factory.createObjectLiteralExpression(members));
62
63
  }
63
64
  const initializer = typescript_1.default.factory.createArrowFunction(undefined, undefined, [], undefined, typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.EqualsGreaterThanToken), typescript_1.default.factory.createArrayLiteralExpression(params, true));
64
- const ctorProp = typescript_1.default.factory.createPropertyDeclaration(undefined, [typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.StaticKeyword)], 'ctorParameters', undefined, undefined, initializer);
65
+ const ctorProp = (0, ts_compatibility_1.createPropertyDeclaration)([typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.StaticKeyword)], 'ctorParameters', undefined, undefined, initializer);
65
66
  if (isClosureCompilerEnabled) {
66
67
  typescript_1.default.setSyntheticLeadingComments(ctorProp, [
67
68
  {
@@ -145,7 +146,7 @@ function getDownlevelDecoratorsTransform(typeChecker, host, diagnostics, isCore,
145
146
  function createDecoratorClassProperty(decoratorList) {
146
147
  const modifier = typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.StaticKeyword);
147
148
  const initializer = typescript_1.default.factory.createArrayLiteralExpression(decoratorList, true);
148
- const prop = typescript_1.default.factory.createPropertyDeclaration(undefined, [modifier], 'decorators', undefined, undefined, initializer);
149
+ const prop = (0, ts_compatibility_1.createPropertyDeclaration)([modifier], 'decorators', undefined, undefined, initializer);
149
150
  addJSDocTypeAnnotation(prop, DECORATOR_INVOCATION_JSDOC_TYPE);
150
151
  return prop;
151
152
  }
@@ -155,7 +156,7 @@ function getDownlevelDecoratorsTransform(typeChecker, host, diagnostics, isCore,
155
156
  entries.push(typescript_1.default.factory.createPropertyAssignment(name, typescript_1.default.factory.createArrayLiteralExpression(decorators.map(deco => extractMetadataFromSingleDecorator(deco, diagnostics)))));
156
157
  }
157
158
  const initializer = typescript_1.default.factory.createObjectLiteralExpression(entries, true);
158
- const prop = typescript_1.default.factory.createPropertyDeclaration(undefined, [typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.StaticKeyword)], 'propDecorators', undefined, undefined, initializer);
159
+ const prop = (0, ts_compatibility_1.createPropertyDeclaration)([typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.StaticKeyword)], 'propDecorators', undefined, undefined, initializer);
159
160
  addJSDocTypeAnnotation(prop, `!Object<string, ${DECORATOR_INVOCATION_JSDOC_TYPE}>`);
160
161
  return prop;
161
162
  }
@@ -178,10 +179,10 @@ function getDownlevelDecoratorsTransform(typeChecker, host, diagnostics, isCore,
178
179
  if ((0, patch_alias_reference_resolution_1.isAliasImportDeclaration)(decl)) {
179
180
  referencedParameterTypes.add(decl);
180
181
  if (decl.name !== undefined) {
181
- return typescript_1.default.getMutableClone(decl.name);
182
+ return typescript_1.default.setOriginalNode(typescript_1.default.factory.createIdentifier(decl.name.text), decl.name);
182
183
  }
183
184
  }
184
- return typescript_1.default.getMutableClone(name);
185
+ return typescript_1.default.setOriginalNode(typescript_1.default.factory.createIdentifier(name.text), name);
185
186
  }
186
187
  function transformClassElement(element) {
187
188
  element = typescript_1.default.visitEachChild(element, decoratorDownlevelVisitor, context);
@@ -209,12 +210,10 @@ function getDownlevelDecoratorsTransform(typeChecker, host, diagnostics, isCore,
209
210
  });
210
211
  return [undefined, element, []];
211
212
  }
212
- const name = element.name.text;
213
- const mutable = typescript_1.default.getMutableClone(element);
214
- mutable.decorators = decoratorsToKeep.length ?
215
- typescript_1.default.setTextRange(typescript_1.default.factory.createNodeArray(decoratorsToKeep), mutable.decorators) :
216
- undefined;
217
- return [name, mutable, toLower];
213
+ const modifiers = decoratorsToKeep.length ?
214
+ typescript_1.default.setTextRange(typescript_1.default.factory.createNodeArray((0, ts_compatibility_1.combineModifiers)(decoratorsToKeep, (0, ts_compatibility_1.getModifiers)(element))), element.modifiers) :
215
+ (0, ts_compatibility_1.getModifiers)(element);
216
+ return [element.name.text, cloneClassElementWithModifiers(element, modifiers), toLower];
218
217
  }
219
218
  function transformConstructor(ctor) {
220
219
  ctor = typescript_1.default.visitEachChild(ctor, decoratorDownlevelVisitor, context);
@@ -237,14 +236,13 @@ function getDownlevelDecoratorsTransform(typeChecker, host, diagnostics, isCore,
237
236
  paramInfo.type = param.type;
238
237
  }
239
238
  parametersInfo.push(paramInfo);
240
- const newParam = typescript_1.default.factory.updateParameterDeclaration(param, decoratorsToKeep.length ? decoratorsToKeep : undefined, param.modifiers, param.dotDotDotToken, param.name, param.questionToken, param.type, param.initializer);
239
+ const newParam = (0, ts_compatibility_1.updateParameterDeclaration)(param, (0, ts_compatibility_1.combineModifiers)(decoratorsToKeep.length ? decoratorsToKeep : undefined, (0, ts_compatibility_1.getModifiers)(param)), param.dotDotDotToken, param.name, param.questionToken, param.type, param.initializer);
241
240
  newParameters.push(newParam);
242
241
  }
243
- const updated = typescript_1.default.factory.updateConstructorDeclaration(ctor, ctor.decorators, ctor.modifiers, newParameters, ctor.body);
242
+ const updated = (0, ts_compatibility_1.updateConstructorDeclaration)(ctor, (0, ts_compatibility_1.getModifiers)(ctor), newParameters, ctor.body);
244
243
  return [updated, parametersInfo];
245
244
  }
246
245
  function transformClassDeclaration(classDecl) {
247
- classDecl = typescript_1.default.getMutableClone(classDecl);
248
246
  const newMembers = [];
249
247
  const decoratedProperties = new Map();
250
248
  let classParameters = null;
@@ -274,7 +272,7 @@ function getDownlevelDecoratorsTransform(typeChecker, host, diagnostics, isCore,
274
272
  }
275
273
  newMembers.push(typescript_1.default.visitEachChild(member, decoratorDownlevelVisitor, context));
276
274
  }
277
- const decoratorsToKeep = new Set(classDecl.decorators);
275
+ const decoratorsToKeep = new Set((0, ts_compatibility_1.getDecorators)(classDecl));
278
276
  const possibleAngularDecorators = host.getDecoratorsOfDeclaration(classDecl) || [];
279
277
  let hasAngularDecorator = false;
280
278
  const decoratorsToLower = [];
@@ -301,7 +299,7 @@ function getDownlevelDecoratorsTransform(typeChecker, host, diagnostics, isCore,
301
299
  newMembers.push(createPropDecoratorsClassProperty(diagnostics, decoratedProperties));
302
300
  }
303
301
  const members = typescript_1.default.setTextRange(typescript_1.default.factory.createNodeArray(newMembers, classDecl.members.hasTrailingComma), classDecl.members);
304
- return typescript_1.default.factory.updateClassDeclaration(classDecl, decoratorsToKeep.size ? Array.from(decoratorsToKeep) : undefined, classDecl.modifiers, classDecl.name, classDecl.typeParameters, classDecl.heritageClauses, members);
302
+ return (0, ts_compatibility_1.createClassDeclaration)((0, ts_compatibility_1.combineModifiers)(decoratorsToKeep.size ? Array.from(decoratorsToKeep) : undefined, (0, ts_compatibility_1.getModifiers)(classDecl)), classDecl.name, classDecl.typeParameters, classDecl.heritageClauses, members);
305
303
  }
306
304
  function decoratorDownlevelVisitor(node) {
307
305
  if (typescript_1.default.isClassDeclaration(node)) {
@@ -315,3 +313,23 @@ function getDownlevelDecoratorsTransform(typeChecker, host, diagnostics, isCore,
315
313
  };
316
314
  }
317
315
  exports.getDownlevelDecoratorsTransform = getDownlevelDecoratorsTransform;
316
+ function cloneClassElementWithModifiers(node, modifiers) {
317
+ let clone;
318
+ if (typescript_1.default.isMethodDeclaration(node)) {
319
+ clone = (0, ts_compatibility_1.createMethodDeclaration)(modifiers, node.asteriskToken, node.name, node.questionToken, node.typeParameters, node.parameters, node.type, node.body);
320
+ }
321
+ else if (typescript_1.default.isPropertyDeclaration(node)) {
322
+ clone = (0, ts_compatibility_1.createPropertyDeclaration)(modifiers, node.name, node.questionToken, node.type, node.initializer);
323
+ }
324
+ else if (typescript_1.default.isGetAccessor(node)) {
325
+ clone =
326
+ (0, ts_compatibility_1.createGetAccessorDeclaration)(modifiers, node.name, node.parameters, node.type, node.body);
327
+ }
328
+ else if (typescript_1.default.isSetAccessor(node)) {
329
+ clone = (0, ts_compatibility_1.createSetAccessorDeclaration)(modifiers, node.name, node.parameters, node.body);
330
+ }
331
+ else {
332
+ throw new Error(`Unsupported decorated member with kind ${typescript_1.default.SyntaxKind[node.kind]}`);
333
+ }
334
+ return typescript_1.default.setOriginalNode(clone, node);
335
+ }
@@ -4,6 +4,19 @@ exports.replaceResources = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const typescript_1 = tslib_1.__importDefault(require("typescript"));
6
6
  const constants_1 = require("../constants");
7
+ const isAfterVersion = (targetMajor, targetMinor) => {
8
+ const [major, minor] = typescript_1.default.versionMajorMinor.split('.').map((part) => parseInt(part));
9
+ if (major < targetMajor) {
10
+ return false;
11
+ }
12
+ else if (major > targetMajor) {
13
+ return true;
14
+ }
15
+ else {
16
+ return minor >= targetMinor;
17
+ }
18
+ };
19
+ const IS_TS_48 = isAfterVersion(4, 8);
7
20
  const shouldTransform = (fileName) => !fileName.endsWith('.ngfactory.ts') && !fileName.endsWith('.ngstyle.ts');
8
21
  function replaceResources({ program }) {
9
22
  return (context) => {
@@ -13,10 +26,7 @@ function replaceResources({ program }) {
13
26
  const nodeFactory = context.factory;
14
27
  const visitNode = (node) => {
15
28
  if (typescript_1.default.isClassDeclaration(node)) {
16
- const decorators = typescript_1.default.visitNodes(node.decorators, (node) => typescript_1.default.isDecorator(node)
17
- ? visitDecorator(nodeFactory, node, typeChecker, resourceImportDeclarations, moduleKind)
18
- : node);
19
- return nodeFactory.updateClassDeclaration(node, decorators, node.modifiers, node.name, node.typeParameters, node.heritageClauses, node.members);
29
+ return visitClassDeclaration(nodeFactory, typeChecker, node, resourceImportDeclarations, moduleKind);
20
30
  }
21
31
  return typescript_1.default.visitEachChild(node, visitNode, context);
22
32
  };
@@ -33,6 +43,34 @@ function replaceResources({ program }) {
33
43
  };
34
44
  }
35
45
  exports.replaceResources = replaceResources;
46
+ function visitClassDeclaration(nodeFactory, typeChecker, node, resourceImportDeclarations, moduleKind) {
47
+ var _a;
48
+ let decorators;
49
+ let modifiers;
50
+ if (IS_TS_48) {
51
+ (_a = node.modifiers) === null || _a === void 0 ? void 0 : _a.forEach((modifier) => {
52
+ if (typescript_1.default.isDecorator(modifier)) {
53
+ decorators !== null && decorators !== void 0 ? decorators : (decorators = []);
54
+ decorators.push(modifier);
55
+ }
56
+ else {
57
+ modifiers = modifiers !== null && modifiers !== void 0 ? modifiers : (modifiers = []);
58
+ modifiers.push(modifier);
59
+ }
60
+ });
61
+ }
62
+ else {
63
+ decorators = node.decorators;
64
+ modifiers = node.modifiers;
65
+ }
66
+ if (!decorators || !decorators.length) {
67
+ return node;
68
+ }
69
+ decorators = decorators.map((current) => visitDecorator(nodeFactory, current, typeChecker, resourceImportDeclarations, moduleKind));
70
+ return IS_TS_48
71
+ ? nodeFactory.updateClassDeclaration(node, [...decorators, ...(modifiers !== null && modifiers !== void 0 ? modifiers : [])], node.name, node.typeParameters, node.heritageClauses, node.members)
72
+ : nodeFactory.updateClassDeclaration(node, decorators, modifiers, node.name, node.typeParameters, node.heritageClauses, node.members);
73
+ }
36
74
  function visitDecorator(nodeFactory, node, typeChecker, resourceImportDeclarations, moduleKind) {
37
75
  if (!isComponentDecorator(node, typeChecker)) {
38
76
  return node;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jest-preset-angular",
3
- "version": "12.2.0",
3
+ "version": "12.2.1",
4
4
  "description": "Jest preset configuration for Angular projects",
5
5
  "license": "MIT",
6
6
  "engines": {
@@ -62,31 +62,31 @@
62
62
  "typescript": ">=4.3"
63
63
  },
64
64
  "devDependencies": {
65
- "@angular-devkit/build-angular": "^14.0.6",
66
- "@angular/animations": "^14.0.6",
67
- "@angular/common": "^14.0.6",
68
- "@angular/compiler": "^14.0.6",
69
- "@angular/compiler-cli": "~14.0.6",
70
- "@angular/core": "^14.0.6",
71
- "@angular/platform-browser": "^14.0.6",
72
- "@angular/platform-browser-dynamic": "^14.0.6",
65
+ "@angular-devkit/build-angular": "^14.2.1",
66
+ "@angular/animations": "^14.2.0",
67
+ "@angular/common": "^14.2.0",
68
+ "@angular/compiler": "^14.2.0",
69
+ "@angular/compiler-cli": "~14.2.0",
70
+ "@angular/core": "^14.2.0",
71
+ "@angular/platform-browser": "^14.2.0",
72
+ "@angular/platform-browser-dynamic": "^14.2.0",
73
73
  "@commitlint/cli": "^17.0.3",
74
74
  "@commitlint/config-angular": "^17.0.3",
75
75
  "@jest/transform": "^28.1.3",
76
76
  "@jest/types": "^28.1.3",
77
- "@types/jest": "^28.1.5",
78
- "@types/node": "^16.11.44",
79
- "@types/semver": "^7.3.10",
80
- "@typescript-eslint/eslint-plugin": "^5.30.6",
81
- "@typescript-eslint/parser": "^5.30.6",
77
+ "@types/jest": "^28.1.8",
78
+ "@types/node": "^16.11.56",
79
+ "@types/semver": "^7.3.12",
80
+ "@typescript-eslint/eslint-plugin": "^5.35.1",
81
+ "@typescript-eslint/parser": "^5.35.1",
82
82
  "chalk": "^4.1.2",
83
83
  "conventional-changelog-cli": "^2.2.2",
84
84
  "cross-env": "^7.0.3",
85
- "eslint": "^8.19.0",
85
+ "eslint": "^8.23.0",
86
86
  "eslint-config-prettier": "^8.5.0",
87
87
  "eslint-plugin-import": "^2.26.0",
88
- "eslint-plugin-jest": "^26.5.3",
89
- "eslint-plugin-jsdoc": "^39.3.3",
88
+ "eslint-plugin-jest": "^26.9.0",
89
+ "eslint-plugin-jsdoc": "^39.3.6",
90
90
  "eslint-plugin-prefer-arrow": "^1.2.3",
91
91
  "eslint-plugin-prettier": "^4.2.1",
92
92
  "execa": "5.1.1",
@@ -101,8 +101,8 @@
101
101
  "rimraf": "^3.0.2",
102
102
  "rxjs": "^7.5.6",
103
103
  "tslib": "^2.4.0",
104
- "typescript": "^4.7.4",
105
- "zone.js": "^0.11.6"
104
+ "typescript": "^4.8.2",
105
+ "zone.js": "^0.11.8"
106
106
  },
107
- "packageManager": "yarn@3.2.1"
107
+ "packageManager": "yarn@3.2.3"
108
108
  }