Skip to content

Commit 144dbe3

Browse files
restlessbitgregberge
authored andcommitted
feat: add parcel plugin (#235)
Closes #215
1 parent e3009cb commit 144dbe3

File tree

12 files changed

+1925
-78
lines changed

12 files changed

+1925
-78
lines changed

jest.config.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module.exports = {
2+
watchPathIgnorePatterns: ['__fixtures__', '__fixtures__build__'],
3+
rootDir: 'packages',
4+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
src/
2+
.*

packages/parcel-plugin-svgr/README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# @svgr/parcel-plugin-svgr
2+
3+
Parcel plugin for SVGR.
4+
5+
```
6+
npm install @svgr/parcel-plugin-svgr
7+
```
8+
9+
## Usage
10+
11+
In your code:
12+
13+
```js
14+
import Star from './star.svg'
15+
16+
const App = () => (
17+
<div>
18+
<Star />
19+
</div>
20+
)
21+
```
22+
23+
## License
24+
25+
MIT
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
{
2+
"name": "@svgr/parcel-plugin-svgr",
3+
"description": "SVGR Parcel plugin.",
4+
"version": "4.0.4",
5+
"main": "lib/index.js",
6+
"repository": "git@github.com:smooth-code/svgr.git",
7+
"author": "Mario Pabon <me@mariopabon.com>",
8+
"publishConfig": {
9+
"access": "public"
10+
},
11+
"keywords": [
12+
"svgr",
13+
"svg",
14+
"react",
15+
"parcel",
16+
"parcel-plugin"
17+
],
18+
"engines": {
19+
"node": ">=8"
20+
},
21+
"license": "MIT",
22+
"scripts": {
23+
"prebuild": "rm -rf lib/",
24+
"build": "babel --config-file ../../babel.config.js -d lib --ignore \"**/*.test.js\" src",
25+
"prepublishOnly": "yarn run build"
26+
},
27+
"peerDependencies": {
28+
"parcel-bundler": "^1.10.0"
29+
},
30+
"dependencies": {
31+
"@babel/core": "^7.1.6",
32+
"@babel/plugin-transform-react-constant-elements": "^7.0.0",
33+
"@babel/preset-env": "^7.1.6",
34+
"@babel/preset-react": "^7.0.0",
35+
"@svgr/core": "^4.0.3",
36+
"@svgr/plugin-jsx": "^4.0.3",
37+
"@svgr/plugin-svgo": "^4.0.3"
38+
},
39+
"devDependencies": {
40+
"parcel-bundler": "^1.10.3"
41+
}
42+
}
Lines changed: 13 additions & 0 deletions
Loading
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`parcel plugin should convert file 1`] = `
4+
Array [
5+
Object {
6+
"js": "\\"use strict\\";
7+
8+
Object.defineProperty(exports, \\"__esModule\\", {
9+
value: true
10+
});
11+
exports.default = void 0;
12+
13+
var _react = _interopRequireDefault(require(\\"react\\"));
14+
15+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16+
17+
function _extends() {
18+
_extends = Object.assign || function (target) {
19+
for (var i = 1; i < arguments.length; i++) {
20+
var source = arguments[i];
21+
22+
for (var key in source) {
23+
if (Object.prototype.hasOwnProperty.call(source, key)) {
24+
target[key] = source[key];
25+
}
26+
}
27+
}
28+
29+
return target;
30+
};
31+
32+
return _extends.apply(this, arguments);
33+
}
34+
35+
var _ref =
36+
/*#__PURE__*/
37+
_react.default.createElement(\\"g\\", {
38+
stroke: \\"#063855\\",
39+
strokeWidth: 2,
40+
fill: \\"none\\",
41+
fillRule: \\"evenodd\\",
42+
strokeLinecap: \\"square\\"
43+
}, _react.default.createElement(\\"path\\", {
44+
d: \\"M51 37L37 51M51 51L37 37\\"
45+
}));
46+
47+
var SvgIcon = function SvgIcon(props) {
48+
return _react.default.createElement(\\"svg\\", _extends({
49+
width: 88,
50+
height: 88
51+
}, props), _ref);
52+
};
53+
54+
var _default = SvgIcon;
55+
exports.default = _default;",
56+
"map": undefined,
57+
},
58+
]
59+
`;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { Asset } from 'parcel-bundler'
2+
import { transformAsync, createConfigItem } from '@babel/core'
3+
import svgo from '@svgr/plugin-svgo'
4+
import jsx from '@svgr/plugin-jsx'
5+
import convert from '@svgr/core'
6+
import presetReact from '@babel/preset-react'
7+
import presetEnv from '@babel/preset-env'
8+
import pluginTransformReactConstantElements from '@babel/plugin-transform-react-constant-elements'
9+
10+
const babelOptions = {
11+
babelrc: false,
12+
configFile: false,
13+
presets: [
14+
createConfigItem(presetReact, { type: 'preset' }),
15+
createConfigItem([presetEnv, { modules: false }], { type: 'preset' }),
16+
],
17+
plugins: [createConfigItem(pluginTransformReactConstantElements)],
18+
}
19+
20+
class ReactSVGAsset extends Asset {
21+
type = 'js'
22+
23+
async parse(contents) {
24+
const code = await convert(
25+
contents,
26+
{},
27+
{
28+
caller: {
29+
name: '@svgr/parcel',
30+
defaultPlugins: [svgo, jsx],
31+
},
32+
filePath: this.name,
33+
},
34+
)
35+
36+
const { code: babelCode } = await transformAsync(code, babelOptions)
37+
38+
return babelCode
39+
}
40+
41+
async generate() {
42+
return [{ type: 'js', value: this.ast }]
43+
}
44+
}
45+
46+
module.exports = ReactSVGAsset
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// Parcel requires that plugins be exported with `module.exports`.
2+
// It won't be able to load the plugin if it is exported with "export default plugin" and then transpiled.
3+
module.exports = function svgrParcelPlugin(bundler) {
4+
// Parcel requires that the asset be passed in as a module path.
5+
bundler.addAssetType('svg', require.resolve('./asset'))
6+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import Bundler from 'parcel-bundler'
2+
import path from 'path'
3+
import plugin from '.'
4+
5+
const getCode = bundle =>
6+
Array.from(bundle.assets)
7+
.filter(asset => asset.id === 'icon.svg')
8+
.map(asset => asset.generated)
9+
10+
describe('parcel plugin', () => {
11+
it('should convert file', async () => {
12+
const bundler = new Bundler(path.join(__dirname, '__fixtures__/icon.svg'), {
13+
outDir: path.join(__dirname, '../../../__fixtures_build__/parcel'),
14+
cache: false,
15+
detailedReport: false,
16+
hmr: false,
17+
logLevel: 0,
18+
target: 'node',
19+
watch: false,
20+
})
21+
22+
plugin(bundler)
23+
24+
const bundle = await bundler.bundle()
25+
const code = getCode(bundle)
26+
expect(code).toMatchSnapshot()
27+
})
28+
})

packages/rollup/src/index.js

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import fs from 'fs'
22
import convert from '@svgr/core'
33
import { createFilter } from 'rollup-pluginutils'
4-
import { transform as babelTransform, createConfigItem } from '@babel/core'
4+
import { transformAsync, createConfigItem } from '@babel/core'
55
import svgo from '@svgr/plugin-svgo'
66
import jsx from '@svgr/plugin-jsx'
77
import presetReact from '@babel/preset-react'
@@ -53,17 +53,8 @@ function svgrPlugin(options = {}) {
5353
},
5454
})
5555

56-
const pBabelTransform = async code =>
57-
new Promise((resolve, reject) => {
58-
babelTransform(code, babelOptions, (err, result) => {
59-
if (err) reject(err)
60-
else resolve(result.code)
61-
})
62-
})
63-
6456
if (babel) {
65-
const code = await pBabelTransform(jsCode)
66-
57+
const { code } = await transformAsync(jsCode, babelOptions)
6758
return { code, map: { mappings: '' } }
6859
}
6960

0 commit comments

Comments
 (0)