Skip to content

Commit

Permalink
Merge pull request #23 from homer0/next
Browse files Browse the repository at this point in the history
Drop Node 12, fix for webpack 5, and update deps
  • Loading branch information
homer0 committed May 21, 2022
2 parents f9935b2 + 055260b commit deadcc5
Show file tree
Hide file tree
Showing 12 changed files with 3,328 additions and 3,552 deletions.
1 change: 0 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,5 @@ jobs:
- name: Deploy documentation
uses: JamesIves/github-pages-deploy-action@4.1.1
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH: gh-pages
FOLDER: docs
4 changes: 2 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
node: [ '12', '14' ]
node: [ '14', '16' ]
name: Run jest and ESLint (Node ${{ matrix.node }})
steps:
- uses: actions/checkout@v2
Expand All @@ -18,7 +18,7 @@ jobs:
- run: yarn lint:all
- run: yarn test
- name: Coveralls
if: ${{ matrix.node == '12' }}
if: ${{ matrix.node == '14' }}
uses: coverallsapp/github-action@master
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
12
14
51 changes: 25 additions & 26 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,40 +15,39 @@
],
"dependencies": {
"babylon": "^6.18.0",
"@babel/traverse": "7.14.9",
"@babel/types": "7.14.9",
"@babel/generator": "7.14.9",
"fs-extra": "^10.0.0",
"@babel/traverse": "7.18.0",
"@babel/types": "7.18.0",
"@babel/generator": "7.18.0",
"fs-extra": "^10.1.0",
"jimple": "^1.5.0",
"loader-utils": "^2.0.0",
"@rollup/pluginutils": "^4.1.1",
"wootils": "^5.0.0"
"@rollup/pluginutils": "^4.2.1",
"wootils": "^5.0.1"
},
"devDependencies": {
"@babel/preset-env": "7.14.9",
"@babel/core": "7.14.8",
"@babel/plugin-transform-runtime": "7.14.5",
"@commitlint/cli": "^13.1.0",
"@commitlint/config-conventional": "^13.1.0",
"@homer0/eslint-plugin": "^8.0.0",
"@babel/preset-env": "7.18.0",
"@babel/core": "7.18.0",
"@babel/plugin-transform-runtime": "7.18.0",
"@commitlint/cli": "^17.0.0",
"@commitlint/config-conventional": "^17.0.0",
"@homer0/eslint-plugin": "^9.0.2",
"@homer0/prettier-config": "^1.1.1",
"@homer0/prettier-plugin-jsdoc": "^4.0.3",
"@semantic-release/changelog": "^5.0.1",
"@semantic-release/git": "^9.0.0",
"@homer0/prettier-plugin-jsdoc": "^5.1.1",
"@semantic-release/changelog": "^6.0.1",
"@semantic-release/git": "^10.0.1",
"docdash": "homer0/docdash#semver:^2.1.0",
"eslint": "^7.32.0",
"husky": "^7.0.1",
"is-ci": "^3.0.0",
"jest": "^27.0.6",
"jsdoc": "^3.6.7",
"lint-staged": "^11.1.1",
"prettier": "^2.3.2",
"semantic-release": "^17.4.4",
"leasot": "^12.0.0"
"eslint": "^8.16.0",
"husky": "^8.0.1",
"is-ci": "^3.0.1",
"jest": "^28.1.0",
"jsdoc": "^3.6.10",
"lint-staged": "^12.4.1",
"prettier": "^2.6.2",
"semantic-release": "^19.0.2",
"leasot": "^13.1.0"
},
"engine-strict": true,
"engines": {
"node": ">=12"
"node": ">=14"
},
"main": "src/index.js",
"scripts": {
Expand Down
3 changes: 1 addition & 2 deletions src/webpack.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
const loaderUtils = require('loader-utils');
const app = require('./index');
/**
* The loader that implements {@link SvelteExtend} for webpack.
Expand All @@ -11,7 +10,7 @@ const app = require('./index');
* @param {string} source The contents of the file to process.
*/
module.exports = function svelteExtendWebpackLoader(source) {
const { allowedMaxDepth = 0 } = loaderUtils.getOptions(this) || {};
const { allowedMaxDepth = 0 } = this.getOptions() || {};
const callback = this.async();
app
.extend(source, this.resourcePath, allowedMaxDepth)
Expand Down
5 changes: 5 additions & 0 deletions tests/jsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"typeAcquisition": {
"include": ["jest"]
}
}
3 changes: 3 additions & 0 deletions tests/mocks/babelTraverse.mock.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const { createProxyMocksDictionary } = require('./utils');

module.exports = createProxyMocksDictionary();
3 changes: 3 additions & 0 deletions tests/mocks/babelTypes.mock.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const { createProxyMocksDictionary } = require('./utils');

module.exports = createProxyMocksDictionary();
26 changes: 26 additions & 0 deletions tests/mocks/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
module.exports.createProxyMocksDictionary = () =>
new Proxy(
{},
{
mocks: {},
mockClear() {
Object.keys(this.mocks).forEach((fnName) => {
this.mocks[fnName].mockClear();
});
},
get(target, name) {
let result;
if (this[name]) {
result = this[name];
} else {
if (!this.mocks[name]) {
this.mocks[name] = jest.fn();
}

result = this.mocks[name];
}

return result;
},
},
);
52 changes: 25 additions & 27 deletions tests/services/jsMerger.test.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,23 @@
// eslint-disable-next-line global-require
/* eslint-disable global-require */
jest.mock('jimple', () => require('../mocks/jimple.mock'));
jest.mock('@babel/types', () => require('../mocks/babelTypes.mock'));
jest.mock('@babel/traverse', () => require('../mocks/babelTraverse.mock'));
/* eslint-enable global-require */
jest.mock('babylon');
jest.mock('@babel/traverse');
jest.mock('@babel/types');
jest.mock('@babel/generator');
jest.unmock('../../src/services/jsMerger');

const babylon = require('babylon');
const babelTraverse = require('@babel/traverse').default;
const babelTypes = require('@babel/types');
const babelGenerator = require('@babel/generator').default;
const babelTraverse = require('../mocks/babelTraverse.mock');
const babelTypes = require('../mocks/babelTypes.mock');
const { JSMerger, jsMerger } = require('../../src/services/jsMerger');

describe('JSMerger', () => {
beforeEach(() => {
babylon.parse.mockReset();
babelTraverse.mockReset();
babelTypes.isProgram.mockReset();
babelTypes.isImportDeclaration.mockReset();
babelTypes.isVariableDeclaration.mockReset();
babelTypes.isExportNamedDeclaration.mockReset();
babelTypes.isFunctionDeclaration.mockReset();
babelTraverse.mockClear();
babelTypes.mockClear();
babelGenerator.mockReset();
});

Expand Down Expand Up @@ -51,18 +48,20 @@ describe('JSMerger', () => {
// Then
expect(result).toBe(`${baseCode}\n${extendedCode}`);
expect(babylon.parse).toHaveBeenCalledTimes(2);
expect(babylon.parse).toHaveBeenCalledWith(baseCode, { sourceType: 'module' });
expect(babylon.parse).toHaveBeenCalledWith(extendedCode, { sourceType: 'module' });
expect(babelTraverse).toHaveBeenCalledTimes(2);
expect(babelTraverse).toHaveBeenCalledWith(baseAST, {
expect(babylon.parse).toHaveBeenNthCalledWith(1, baseCode, { sourceType: 'module' });
expect(babylon.parse).toHaveBeenNthCalledWith(2, extendedCode, {
sourceType: 'module',
});
expect(babelTraverse.default).toHaveBeenCalledTimes(2);
expect(babelTraverse.default).toHaveBeenNthCalledWith(1, baseAST, {
enter: expect.any(Function),
});
expect(babelTraverse).toHaveBeenCalledWith(extendedAST, {
expect(babelTraverse.default).toHaveBeenNthCalledWith(2, extendedAST, {
enter: expect.any(Function),
});
expect(babelGenerator).toHaveBeenCalledTimes(2);
expect(babelGenerator).toHaveBeenCalledWith(baseAST, {}, baseCode);
expect(babelGenerator).toHaveBeenCalledWith(extendedAST, {}, extendedCode);
expect(babelGenerator).toHaveBeenNthCalledWith(1, baseAST, {}, baseCode);
expect(babelGenerator).toHaveBeenNthCalledWith(2, extendedAST, {}, extendedCode);
});

it('should merge two JS blocks and move import statements to the top', () => {
Expand All @@ -86,7 +85,7 @@ describe('JSMerger', () => {
babelTypes.isImportDeclaration.mockImplementationOnce(() => true);
babelTypes.isImportDeclaration.mockImplementationOnce(() => false);
babylon.parse.mockImplementationOnce(() => baseAST);
babelTraverse.mockImplementationOnce((_, fns) => {
babelTraverse.default.mockImplementationOnce((_, fns) => {
baseNodes.forEach((baseNode) => {
fns.enter(baseNode);
});
Expand All @@ -104,7 +103,7 @@ describe('JSMerger', () => {
babelTypes.isProgram.mockImplementationOnce(() => true);
babelTypes.isImportDeclaration.mockImplementationOnce(() => true);
babylon.parse.mockImplementationOnce(() => extendedAST);
babelTraverse.mockImplementationOnce((_, fns) => {
babelTraverse.default.mockImplementationOnce((_, fns) => {
extendedNodes.forEach((extendedNode) => {
fns.enter(extendedNode);
});
Expand Down Expand Up @@ -177,7 +176,7 @@ describe('JSMerger', () => {
babelTypes.isExportNamedDeclaration.mockImplementationOnce(() => true);
babelTypes.isExportNamedDeclaration.mockImplementationOnce(() => true);
babylon.parse.mockImplementationOnce(() => baseAST);
babelTraverse.mockImplementationOnce((_, fns) => {
babelTraverse.default.mockImplementationOnce((_, fns) => {
baseNodes.forEach((baseNode) => {
fns.enter(baseNode);
});
Expand Down Expand Up @@ -227,7 +226,7 @@ describe('JSMerger', () => {
babelTypes.isExportNamedDeclaration.mockImplementationOnce(() => true);
babelTypes.isExportNamedDeclaration.mockImplementationOnce(() => true);
babylon.parse.mockImplementationOnce(() => extendedAST);
babelTraverse.mockImplementationOnce((_, fns) => {
babelTraverse.default.mockImplementationOnce((_, fns) => {
extendedNodes.forEach((extendedNode) => {
fns.enter(extendedNode);
});
Expand All @@ -239,7 +238,6 @@ describe('JSMerger', () => {
// When
sut = new JSMerger();
result = sut.mergeCode(baseCode, extendedCode);

// Then
expect(result).toBe(`${baseCode}\n${extendedCode}`);
expect(babelTypes.isVariableDeclaration).toHaveBeenCalledTimes(allNodes.length);
Expand Down Expand Up @@ -299,7 +297,7 @@ describe('JSMerger', () => {
babelTypes.isVariableDeclaration.mockImplementationOnce(() => true);
babelTypes.isVariableDeclaration.mockImplementationOnce(() => true);
babylon.parse.mockImplementationOnce(() => baseAST);
babelTraverse.mockImplementationOnce((_, fns) => {
babelTraverse.default.mockImplementationOnce((_, fns) => {
baseNodes.forEach((baseNode) => {
fns.enter(baseNode);
});
Expand Down Expand Up @@ -339,7 +337,7 @@ describe('JSMerger', () => {
babelTypes.isVariableDeclaration.mockImplementationOnce(() => true);
babelTypes.isVariableDeclaration.mockImplementationOnce(() => true);
babylon.parse.mockImplementationOnce(() => extendedAST);
babelTraverse.mockImplementationOnce((_, fns) => {
babelTraverse.default.mockImplementationOnce((_, fns) => {
extendedNodes.forEach((extendedNode) => {
fns.enter(extendedNode);
});
Expand Down Expand Up @@ -406,7 +404,7 @@ describe('JSMerger', () => {
babelTypes.isFunctionDeclaration.mockImplementationOnce(() => true);
babelTypes.isFunctionDeclaration.mockImplementationOnce(() => true);
babylon.parse.mockImplementationOnce(() => baseAST);
babelTraverse.mockImplementationOnce((_, fns) => {
babelTraverse.default.mockImplementationOnce((_, fns) => {
baseNodes.forEach((baseNode) => {
fns.enter(baseNode);
});
Expand Down Expand Up @@ -438,7 +436,7 @@ describe('JSMerger', () => {
babelTypes.isFunctionDeclaration.mockImplementationOnce(() => true);
babelTypes.isFunctionDeclaration.mockImplementationOnce(() => true);
babylon.parse.mockImplementationOnce(() => extendedAST);
babelTraverse.mockImplementationOnce((_, fns) => {
babelTraverse.default.mockImplementationOnce((_, fns) => {
extendedNodes.forEach((extendedNode) => {
fns.enter(extendedNode);
});
Expand Down
20 changes: 8 additions & 12 deletions tests/webpack.test.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
jest.mock('loader-utils');
jest.unmock('../src/webpack');

const loaderUtils = require('loader-utils');
const app = require('../src/index');

const svelteExtendWebpackLoader = require('../src/webpack');

describe('integrations:webpack', () => {
beforeEach(() => {
app.extend.mockReset();
loaderUtils.getOptions.mockReset();
});

it('should process a file', () => {
Expand All @@ -18,6 +15,7 @@ describe('integrations:webpack', () => {
const context = {
resourcePath: 'resource-path',
async: jest.fn(() => callback),
getOptions: jest.fn(),
};
const result = 'formatted!';
const fakePromise = {
Expand All @@ -32,8 +30,7 @@ describe('integrations:webpack', () => {
// When
svelteExtendWebpackLoader.bind(context)(source);
// Then
expect(loaderUtils.getOptions).toHaveBeenCalledTimes(1);
expect(loaderUtils.getOptions).toHaveBeenCalledWith(context);
expect(context.getOptions).toHaveBeenCalledTimes(1);
expect(context.async).toHaveBeenCalledTimes(1);
expect(app.extend).toHaveBeenCalledTimes(1);
expect(app.extend).toHaveBeenCalledWith(source, context.resourcePath, 0);
Expand All @@ -48,13 +45,13 @@ describe('integrations:webpack', () => {
it('should process a file with a custom max depth option', () => {
// Given
const allowedMaxDepth = 12;
loaderUtils.getOptions.mockImplementationOnce(() => ({
allowedMaxDepth,
}));
const callback = jest.fn();
const context = {
resourcePath: 'resource-path',
async: jest.fn(() => callback),
getOptions: jest.fn(() => ({
allowedMaxDepth,
})),
};
const result = 'formatted!';
const fakePromise = {
Expand All @@ -69,8 +66,7 @@ describe('integrations:webpack', () => {
// When
svelteExtendWebpackLoader.bind(context)(source);
// Then
expect(loaderUtils.getOptions).toHaveBeenCalledTimes(1);
expect(loaderUtils.getOptions).toHaveBeenCalledWith(context);
expect(context.getOptions).toHaveBeenCalledTimes(1);
expect(context.async).toHaveBeenCalledTimes(1);
expect(app.extend).toHaveBeenCalledTimes(1);
expect(app.extend).toHaveBeenCalledWith(
Expand All @@ -92,6 +88,7 @@ describe('integrations:webpack', () => {
const context = {
resourcePath: 'resource-path',
async: jest.fn(() => callback),
getOptions: jest.fn(),
};
const error = new Error('DAMN');
const fakePromise = {
Expand All @@ -105,8 +102,7 @@ describe('integrations:webpack', () => {
// When
svelteExtendWebpackLoader.bind(context)(source);
// Then
expect(loaderUtils.getOptions).toHaveBeenCalledTimes(1);
expect(loaderUtils.getOptions).toHaveBeenCalledWith(context);
expect(context.getOptions).toHaveBeenCalledTimes(1);
expect(context.async).toHaveBeenCalledTimes(1);
expect(app.extend).toHaveBeenCalledTimes(1);
expect(app.extend).toHaveBeenCalledWith(source, context.resourcePath, 0);
Expand Down

0 comments on commit deadcc5

Please sign in to comment.