Skip to content

Commit 89bca84

Browse files
just-be-devCompuIves
authored andcommitted
Add .pug file support generally and for .vue file templates (codesandbox#443)
* Add pug file assets * Adding first pass pug library... things are broken, I just wanted to push my progress * Update worker to use browserified-pug * Add pug as loader in vue-loader * Make recommended changes to hopefully connect all the missing pieces.
1 parent 434345a commit 89bca84

File tree

9 files changed

+111
-1
lines changed

9 files changed

+111
-1
lines changed

packages/app/src/sandbox/eval/presets/vue-cli/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import vueSelector from '../../transpilers/vue/selector';
1919
import vueStyleLoader from '../../transpilers/vue/style-loader';
2020
import cssLoader from '../../transpilers/vue/css-loader';
2121
import base64Transpiler from '../../transpilers/base64';
22+
import pugTranspiler from '../../transpilers/pug';
2223

2324
import Preset from '../';
2425

@@ -166,6 +167,7 @@ export default function initialize() {
166167
{ transpiler: noopTranspiler },
167168
]);
168169
vuePreset.registerTranspiler(() => true, [{ transpiler: rawTranspiler }]);
170+
vuePreset.registerTranspiler((m) => m.path.endsWith('pug'), [{ transpiler: pugTranspiler }]);
169171

170172
return vuePreset;
171173
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// @flow
2+
import PugWorker from 'worker-loader?name=pug-transpiler.[hash].worker.js!./pug-worker.js';
3+
4+
import WorkerTranspiler from '../worker-transpiler';
5+
import { type LoaderContext } from '../../transpiled-module';
6+
7+
class PugTranspiler extends WorkerTranspiler {
8+
worker: Worker;
9+
10+
constructor() {
11+
super('pug-loader', PugWorker, 1);
12+
13+
this.cacheable = false;
14+
}
15+
16+
doTranspilation(code: string, loaderContext: LoaderContext) {
17+
return new Promise((resolve, reject) => {
18+
const path = loaderContext.path;
19+
20+
this.queueTask(
21+
{
22+
code,
23+
path,
24+
},
25+
loaderContext,
26+
(err, data) => {
27+
if (err) {
28+
loaderContext.emitError(err);
29+
30+
return reject(err);
31+
}
32+
33+
return resolve(data);
34+
}
35+
);
36+
});
37+
}
38+
}
39+
40+
const transpiler = new PugTranspiler();
41+
42+
export { PugTranspiler };
43+
44+
export default transpiler;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { buildWorkerError } from '../utils/worker-error-handler';
2+
3+
self.importScripts(['/static/js/browserified-pug.0.1.0.min.js']);
4+
self.postMessage('ready');
5+
6+
7+
self.addEventListener('message', event => {
8+
const { code, path } = event.data;
9+
10+
// register a custom importer callback
11+
pug.render(code, { filename: path }, (err, html) => {
12+
13+
if (err) {
14+
return self.postMessage({
15+
type: 'error',
16+
error: buildWorkerError(err)
17+
});
18+
}
19+
20+
return self.postMessage({
21+
type: 'compiled',
22+
transpiledCode: html,
23+
});
24+
25+
});
26+
27+
});

packages/app/src/sandbox/eval/transpilers/vue/loader.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ export default function(content: string, loaderContext: LoaderContext) {
115115
stylus: ['vue-style-loader', 'css-loader', 'stylus-loader'],
116116
ts: ['ts-loader'],
117117
typescript: ['ts-loader'],
118+
pug: ['pug-loader'],
118119
};
119120

120121
const loaders = Object.assign({}, defaultLoaders, codeSandboxLoaders);

packages/app/static/js/browserified-pug.0.1.0.min.js

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/homepage/src/screens/home/Frameworks/icons.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { fadeIn } from '../../../utils/animation';
66
import babelSvg from './babel.png';
77
import cssSvg from './css.png';
88
import htmlSvg from './html.png';
9+
import pugSvg from './pug.png';
910
import imageSvg from './image.png';
1011
import lessSvg from './less.png';
1112
import scssSvg from './scss.png';
@@ -39,5 +40,6 @@ export const less = { svg: lessSvg, title: 'less', extension: 'less' };
3940
export const stylus = { svg: stylusSvg, title: 'stylus', extension: 'styl' };
4041
export const image = { svg: imageSvg, title: 'image', extension: 'png' };
4142
export const html = { svg: htmlSvg, title: 'html', extension: 'html' };
43+
export const pug = { svg: pugSvg, title: 'pug', extension: 'pug' };
4244
export const cssGlobal = { svg: cssSvg, title: 'css', extension: 'css' };
4345
export const vue = { svg: vueSvg, title: 'vue', extension: 'vue' };

packages/homepage/src/screens/home/Frameworks/index.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import FileType, {
2222
stylus,
2323
image,
2424
html,
25+
pug,
2526
cssGlobal,
2627
vue,
2728
} from './icons';
@@ -197,7 +198,19 @@ const TEMPLATE_SUPPORT = {
197198
css: ['Global'],
198199
},
199200
'vue-cli': {
200-
loaders: [js, ts, html, vue, scss, sass, less, stylus, cssGlobal, image],
201+
loaders: [
202+
js,
203+
ts,
204+
html,
205+
vue,
206+
scss,
207+
sass,
208+
less,
209+
stylus,
210+
pug,
211+
cssGlobal,
212+
image,
213+
],
201214
css: ['Global', 'Scoped', 'Modules'],
202215
},
203216
'preact-cli': {
1.56 KB
Loading
Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)