Skip to content

Commit ceab978

Browse files
committed
feat(babel): alternative setup babel/typescript
1 parent f925564 commit ceab978

14 files changed

+512
-35
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
## Changelog (master)
22

3+
#### Features
4+
* (**BREAKING?**): Add preset `babel` as transpilation alternative to `ts-jest` ([#317](https://github.com/thymikee/jest-preset-angular/pull/317)).
5+
36
### v8.0.0
47

58
#### Features

babel/babel.config.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module.exports = api => ({
2+
presets: [
3+
'@babel/preset-env',
4+
'@babel/preset-typescript'
5+
],
6+
plugins: [
7+
['@babel/plugin-proposal-decorators', {legacy: true}],
8+
['babel-plugin-transform-typescript-metadata', {loose: true}],
9+
['@babel/plugin-proposal-class-properties', {loose: true}],
10+
['jest-preset-angular/babel/inline-template.plugin'],
11+
['const-enum']
12+
]
13+
});

babel/inline-template.plugin.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const { types } = require('@babel/core')
2+
3+
module.exports = (_api) => ({
4+
visitor: {
5+
ObjectProperty(path) {
6+
const node = path.node
7+
if (!types.isIdentifier(node.key)) return
8+
if (node.key.name !== 'templateUrl') return
9+
if (!types.isStringLiteral(node.value)) return
10+
const requireIdentifier = types.identifier('require')
11+
let templateUrl = node.value.value
12+
if (!templateUrl.match(/^(\.\/|\.\.\/|\/)/)) {
13+
templateUrl = `./${templateUrl}`
14+
}
15+
const templateUrlStringLiteral = types.stringLiteral(templateUrl)
16+
const templateCallExpr = types.callExpression(requireIdentifier, [templateUrlStringLiteral])
17+
const templateIdentifier = types.identifier('template')
18+
const templateProperty = types.objectProperty(templateIdentifier, templateCallExpr)
19+
path.replaceWith(templateProperty)
20+
}
21+
}
22+
})

babel/jest-preset.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module.exports = {
2+
transform: {
3+
'^.+\\.(html)$': 'jest-preset-angular/babel/load-html-transformer',
4+
'^.+\\.(ts|js)$': 'babel-jest'
5+
},
6+
testEnvironment: 'jest-environment-jsdom-fifteen',
7+
moduleFileExtensions: ['ts', 'html', 'js', 'json'],
8+
moduleNameMapper: {
9+
'^src/(.*)$': '<rootDir>/src/$1',
10+
'^app/(.*)$': '<rootDir>/src/app/$1',
11+
'^assets/(.*)$': '<rootDir>/src/assets/$1',
12+
'^environments/(.*)$': '<rootDir>/src/environments/$1',
13+
},
14+
transformIgnorePatterns: ['node_modules/(?!@ngrx)'],
15+
snapshotSerializers: [
16+
'jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js',
17+
'jest-preset-angular/build/AngularSnapshotSerializer.js',
18+
'jest-preset-angular/build/HTMLCommentSerializer.js',
19+
],
20+
};

babel/load-html-transformer.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = {
2+
process: src => ({ code: `module.exports=`+JSON.stringify(src) })
3+
};

example/babel.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const babelAngularConfig = require('jest-preset-angular/babel/babel.config')
2+
module.exports = api => {
3+
api.cache(true)
4+
return babelAngularConfig(api)
5+
}
6+

example/jest.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
module.exports = {
2-
preset: "jest-preset-angular",
2+
preset: "jest-preset-angular/babel",
33
snapshotSerializers: [
44
"jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js",
55
"jest-preset-angular/build/AngularSnapshotSerializer.js",

example/package.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,19 @@
3030
"@angular/cli": "~8.3.4",
3131
"@angular/compiler-cli": "~8.2.5",
3232
"@angular/language-service": "~8.2.5",
33+
"@babel/core": "^7.6.2",
34+
"@babel/plugin-proposal-class-properties": "^7.5.5",
35+
"@babel/plugin-proposal-decorators": "^7.6.0",
36+
"@babel/preset-env": "^7.6.2",
37+
"@babel/preset-typescript": "^7.6.0",
3338
"@types/jest": "^24.0.0",
3439
"@types/node": "^11.0.0",
40+
"babel-jest": "^24.9.0",
41+
"babel-plugin-const-enum": "^0.0.2",
42+
"babel-plugin-transform-typescript-metadata": "^0.2.2",
3543
"jest": "^24.0.0",
3644
"jest-preset-angular": "file:../",
45+
"ts-jest": "^24.1.0",
3746
"ts-node": "^8.0.3",
3847
"typescript": "~3.5.3"
3948
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { Injectable } from "@angular/core";
2+
import { HeroCategory, HeroColor } from "./hero-properties";
3+
4+
@Injectable({
5+
providedIn: "root"
6+
})
7+
export class HeroCategoryService {
8+
getCategoryForHero(heroName: string): HeroCategory {
9+
switch (heroName) {
10+
case "Joker":
11+
return HeroCategory.Evil;
12+
case "Batman":
13+
return HeroCategory.Good;
14+
default:
15+
return HeroCategory.Neutral;
16+
}
17+
}
18+
19+
getColorForHero(heroName: string): HeroColor {
20+
switch (heroName) {
21+
case "Joker":
22+
return HeroColor.Purple;
23+
case "Batman":
24+
return HeroColor.Black;
25+
case "Catwoman":
26+
return HeroColor.Black;
27+
default:
28+
return HeroColor.Transparent;
29+
}
30+
}
31+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { async } from "@angular/core/testing";
2+
3+
import { HeroCategoryService } from "./hero-category.service";
4+
import { HeroCategory, HeroColor } from './hero-properties';
5+
6+
describe("HeroCategoryService", () => {
7+
let service: HeroCategoryService;
8+
9+
beforeEach(() => (service = new HeroCategoryService()));
10+
11+
it("should create", () => {
12+
expect(service).toBeTruthy();
13+
});
14+
15+
it("should return the right category for heroes", () => {
16+
expect(service.getCategoryForHero("Batman")).toEqual(HeroCategory.Good);
17+
expect(service.getCategoryForHero("Joker")).toEqual(HeroCategory.Evil);
18+
expect(service.getCategoryForHero("Catwoman")).toEqual(HeroCategory.Neutral);
19+
});
20+
21+
it("should return the right color for heroes", () => {
22+
expect(service.getColorForHero("Batman")).toEqual(HeroColor.Black);
23+
expect(service.getColorForHero("Joker")).toEqual(HeroColor.Purple);
24+
expect(service.getColorForHero("The Penguin")).toEqual(HeroColor.Transparent);
25+
});
26+
27+
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
export enum HeroCategory {
3+
Evil,
4+
Good,
5+
Neutral
6+
}
7+
8+
export const enum HeroColor {
9+
Black = "#000000",
10+
Purple = "#551A8B",
11+
Transparent = "#00000000"
12+
}

0 commit comments

Comments
 (0)