Skip to content

Commit dc575d9

Browse files
committed
Base functionality.
1 parent fdc6c54 commit dc575d9

File tree

8 files changed

+134
-0
lines changed

8 files changed

+134
-0
lines changed

.eslintrc.yml

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
extends: airbnb-base
2+
plugins:
3+
- html

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules
2+
*.log

lib/compiler.js

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
const _ = require('lodash');
2+
const yargs = require('yargs');
3+
const webpack = require('webpack');
4+
const nodeExternals = require('webpack-node-externals');
5+
const MemoryFileSystem = require('memory-fs');
6+
const { resolve } = require('path');
7+
8+
const componentExternals = _.curry((entry, context, request, done) => {
9+
if (request !== entry && !request.includes('!')) {
10+
done(null, `commonjs ${resolve(context, request)}`);
11+
} else {
12+
done();
13+
}
14+
});
15+
16+
const run = (config, entry) => {
17+
const filename = 'output.js';
18+
const conf = Object.assign({}, config, {
19+
entry,
20+
output: {
21+
libraryTarget: 'commonjs',
22+
filename,
23+
},
24+
target: 'node',
25+
// Externalize everything except the entry.
26+
externals: [nodeExternals(), componentExternals(entry)],
27+
// Make sure Vue thinks its running in a "server"
28+
plugins: [
29+
new webpack.DefinePlugin({
30+
'process.env.VUE_ENV': JSON.stringify('server'),
31+
}),
32+
].concat(config.plugins || []),
33+
});
34+
const compiler = webpack(conf);
35+
const fs = new MemoryFileSystem();
36+
compiler.outputFileSystem = fs;
37+
compiler.run((err, stats) => {
38+
if (err) throw err;
39+
fs.createReadStream(stats.compilation.assets[filename].existsAt, 'utf8').pipe(process.stdout);
40+
});
41+
};
42+
43+
const args = yargs.argv._;
44+
45+
run(require(args[0]), args[1]); // eslint-disable-line import/no-dynamic-require

lib/hook.js

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/* eslint-disable no-underscore-dangle */
2+
const execa = require('execa');
3+
const { resolve } = require('path');
4+
5+
module.exports = (configPath) => {
6+
require.extensions['.vue'] = (mod, filename) => {
7+
mod._compile(execa.sync(process.execPath, [
8+
resolve(__dirname, 'compiler'),
9+
configPath,
10+
filename,
11+
]).stdout, filename);
12+
};
13+
};

package.json

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"name": "vue-node",
3+
"version": "0.0.0",
4+
"description": "Load vue components in node.",
5+
"main": "./lib/hook.js",
6+
"scripts": {
7+
"test": "node test/index.test"
8+
},
9+
"engines": {
10+
"node": ">=6.0.0"
11+
},
12+
"author": "Copyright (c) 2017 Kenneth Powers <[email protected]> (http://knpw.rs)",
13+
"license": "MIT",
14+
"dependencies": {
15+
"execa": "^0.6.0",
16+
"lodash": "^4.17.4",
17+
"memory-fs": "^0.4.1",
18+
"webpack-node-externals": "^1.5.4",
19+
"yargs": "^6.6.0"
20+
},
21+
"peerDependencies": {
22+
"vue-loader": "^10.3.0",
23+
"webpack": "^2.2.1"
24+
},
25+
"devDependencies": {
26+
"css-loader": "^0.26.1",
27+
"eslint": "^3.15.0",
28+
"eslint-config-airbnb-base": "^11.1.0",
29+
"eslint-plugin-html": "^2.0.0",
30+
"eslint-plugin-import": "^2.2.0",
31+
"vue-loader": "^10.3.0",
32+
"vue-template-compiler": "^2.1.10",
33+
"webpack": "^2.2.1"
34+
}
35+
}

test/index.test.js

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const { join } = require('path');
2+
const hook = require('../lib/hook');
3+
4+
hook(join(__dirname, 'webpack.config.test.js'));
5+
6+
const Test = require('./test.vue');
7+
8+
console.log(Test._scopeId); // eslint-disable-line

test/test.vue

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<template>
2+
<h1>Hello, {{ name }}!</h1>
3+
</template>
4+
5+
<script>
6+
import _ from 'lodash';
7+
8+
export default {
9+
data() {
10+
return {
11+
name: _.capitalize('world'),
12+
};
13+
},
14+
};
15+
</script>
16+
17+
<style scoped>
18+
h1 {
19+
color: red;
20+
}
21+
</style>

test/webpack.config.test.js

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module.exports = {
2+
module: {
3+
rules: [{
4+
use: 'vue-loader',
5+
}],
6+
},
7+
};

0 commit comments

Comments
 (0)