Sqlite3, electron, webpack: cannot find module abi_crosswalk.json - node.js

I'm trying to make sqlite3 work in electron in combination with webpack, babel and react.
These are the dependencies in package.json:
"devDependencies": {
"babel-core": "^6.7.0",
"babel-loader": "^6.2.4",
"babel-preset-es2015": "^6.6.0",
"babel-preset-react": "^6.5.0",
"css-loader": "^0.23.1",
"electron-packager": "^5.2.1",
"electron-prebuilt": "^0.36.8",
"electron-rebuild": "^1.1.3",
"node-sass": "^3.4.2",
"react": "^0.14.7",
"react-dom": "^0.14.7",
"sass-loader": "^3.1.2",
"style-loader": "^0.13.0",
"webpack": "^1.12.14",
"webpack-dev-server": "1.14.0"
},
"dependencies": {
"sqlite3": "^3.1.1"
}
After running npm install, I ran ./node_modules/.bin/electron-rebuild as described in the documentation.
This is my webpack.config.js:
var webpack = require('webpack');
module.exports = {
context: __dirname + '/src',
entry: './entry.js',
target: 'electron',
output: {
filename: 'bundle.js',
path: __dirname + '/build',
publicPath: 'http://localhost:8080/build/'
},
module: {
loaders: [{
test: /\.js$/,
loader: 'babel',
exclude: /node_modules/,
query: {
presets: ['es2015', 'react']
}
}, {
test: /\.scss$/,
loader: 'style-loader!css-loader!sass-loader'
}]
}
};
When I add var sqlite3 = require('sqlite3').verbose(); to my code and try to run this, I'll get the following error messages:
`Uncaught Error: Cannot find module "./abi_crosswalk.json"`
./~/sqlite3/~/node-pre-gyp/package.json
Module parse failed: .../node_modules/sqlite3/node_modules/node-pre-gyp/package.json Line 2: Unexpected token :
You may need an appropriate loader to handle this file type.
| {
| "name": "node-pre-gyp",
| "description": "Node.js native addon binary install tool",
| "version": "0.6.14",
# ./~/sqlite3/~/node-pre-gyp/lib/node-pre-gyp.js 60:16-37
And in consequence, a bunch of modules can't be found.
Can anyone help me with this?
Edit: This is the code in bundle.js that results in the package.json error mentioned in the comments.
function(module, exports, __webpack_require__) {
"use strict";
var versioning = __webpack_require__(310);
var existsSync = __webpack_require__(19).existsSync || __webpack_require__(273).existsSync;
var path = __webpack_require__(273);
module.exports = exports;
exports.usage = 'Finds the require path for the node-pre-gyp installed module';
exports.validate = function(package_json) {
versioning.validate_config(package_json);
};
exports.find = function(package_json_path,opts) {
if (!existsSync(package_json_path)) {
throw new Error("package.json does not exist at " + package_json_path);
}
var package_json = __webpack_require__(1133)(package_json_path);
versioning.validate_config(package_json);
opts = opts || {};
if (!opts.module_root) opts.module_root = path.dirname(package_json_path);
var meta = versioning.evaluate(package_json,opts);
return meta.module;
};
/***/ },

It seems like var sqlite3 = require('sqlite3').verbose(); only works in the main process, but not in any render processes. Problem solved.

After npm install, try this: ./node_modules/.bin/electron-rebuild -w sqlite3 -p.
First, you should install sqlite3 and electron-rebuild .

Related

ModuleBuildError: Module build failed: TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type undefined

I am using vuetify version 1.5 and I am upgrade it to the latest version 2.3.10. When I try to run the webpack server, it is giving me this error. I have added yarn add sass -D but couldn't resolve this issue. Please help me resolve this.
ModuleBuildError: Module build failed: TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type undefined
at assertPath (path.js:39:11)
at Object.join (path.js:1155:7)
at getSassOptions (/Users/Documents/weather/node_modules/sass-loader/dist/utils.js:160:37)
at Object.loader (/Users/Documents/weather/node_modules/sass-loader/dist/index.js:36:49)
at runLoaders (/Users/Documents/weather/node_modules/webpack/lib/NormalModule.js:195:19)
at /Users/Documents/weather/node_modules/loader-runner/lib/LoaderRunner.js:364:11
at /Users/Documents/weather/node_modules/loader-runner/lib/LoaderRunner.js:230:18
at runSyncOrAsync (/Users/Documents/weather/node_modules/loader-runner/lib/LoaderRunner.js:143:3)
at iterateNormalLoaders (/Users/Documents/weather/node_modules/loader-runner/lib/LoaderRunner.js:229:2)
at /Users/Documents/weather/node_modules/loader-runner/lib/LoaderRunner.js:202:4
at /Users/Documents/weather/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:70:14
at process._tickCallback (internal/process/next_tick.js:61:11)
Below is the package.json file please help me find what is causing this issue
{
"name": "weather",
"private": true,
"engines": {
"node": "^10.0.0",
"yarn": "^1.21.1"
},
"dependencies": {
"#rails/webpacker": "^3.2.0",
"axios": "^0.17.1",
"babel-polyfill": "^6.26.0",
"coffee-loader": "^0.9.0",
"coffeescript": "1.12.7",
"es6-promise": "^4.2.2",
"file-saver": "^2.0.1",
"pdfjs-dist": "2.0.550",
"sass-loader": "^10.0.1",
"scroll-into-view-if-needed": "^2.2.14",
"urijs": "^1.19.1",
"vue": "^2.5.18",
"vue-ads-table-tree": "^2.3.2",
"vue-analytics": "^5.9.0",
"vue-awesome": "^2.3.4",
"vue-material": "^1.0.0-beta-7",
"vue-moment": "^4.0.0-0",
"vue-quill-editor": "^3.0.6",
"vue-router": "^3.0.1",
"vue-signature-pad": "^1.1.17",
"vue-spinner": "^1.0.3",
"vue-star-rating": "^1.6.0",
"vue-template-compiler": "^2.5.18",
"vue-truncate-collapsed": "^1.3.0",
"vue2-google-maps": "^0.8.11",
"vuescroll": "^4.6.5",
"vuetify": "^2.3.10",
"yarn": "^1.22.5"
},
"devDependencies": {
"caniuse-lite": "^1.0.30000855",
"css-loader": "^0.28.11",
"jshint": "^2.9.5",
"jshint-loader": "^0.8.4",
"sass": "^1.26.10",
"vue-loader": "^13.6.2",
"webpack-dev-server": "^2.9.7"
},
"scripts": {
"client": "./bin/webpack-dev-server",
"server": "bundle exec rails s",
"start": "./bin/webpack-dev-server"
}
}
I am using yarn to add the packages.
Update 1
const { environment } = require('#rails/webpacker')
const coffee = require('./loaders/coffee');
const vue = require('./loaders/vue')
environment.loaders.append('coffee', coffee);
environment.loaders.append('vue', vue)
environment.loaders.append('jshint', {
test: /\.js$/, // include .js files
enforce: "pre", // preload the jshint loader
exclude: /node_modules/, // exclude any and all files in the node_modules folder
use: [{
loader: "jshint-loader"
}]
});
environment.loaders.append('signature_pad', {
test: /\.js?$/,
include: [/node_modules\/signature_pad/],
use: [{
loader: 'babel-loader',
options: {
cacheDirectory: true,
presets: [['env', { 'modules': false, 'targets': { 'node': 4 } }]]
}
}],
});
const resolver = {
resolve: {
alias: {
'vue$': 'vue/dist/vue.js'
}
}
};
environment.config.merge(resolver);
module.exports = environment;
vue.js
const { dev_server: devServer } = require('#rails/webpacker').config
const isProduction = process.env.NODE_ENV === 'production'
const inDevServer = process.argv.find(v => v.includes('webpack-dev-server'))
const extractCSS = !(inDevServer && (devServer && devServer.hmr)) || isProduction
module.exports = {
test: /\.vue(\.erb)?$/,
use: [{
loader: 'vue-loader',
options: { extractCSS }
}]
}
Error2
Module build failed: ModuleBuildError: Module build failed: TypeError: loaderContext.getResolve is not a function
at getWebpackImporter (/Users/Documents/weather/node_modules/sass-loader/dist/utils.js:278:37)
at Object.loader (/Users/Documents/weather/node_modules/sass-loader/dist/index.js:42:61)
at runLoaders (/Users/Documents/weather/node_modules/webpack/lib/NormalModule.js:195:19)
at /Users/Documents/weather/node_modules/loader-runner/lib/LoaderRunner.js:364:11
at /Users/Documents/weather/node_modules/loader-runner/lib/LoaderRunner.js:230:18
extractCSS can cause this kind of problems. I would try to disable it and if it works - then try to debug it from that point.
Your version of the sass-loader is relatively new. I would try to downgrade it to version 9.0.3. I had some problems with version 10 recently and that may be your case.
The last thing I see - your configuration files seems to be missing VueLoaderPlugin. I would add it to you environment file, but I don't think this is the root of the problem.
const { VueLoaderPlugin } = require('vue-loader')
// ...
environment.plugins.prepend('VueLoaderPlugin', new VueLoaderPlugin())
environment.loaders.prepend('vue', vue)
// ...

How to build (Webpack) the Node Js project using PUG Engine?

I am stuck to build the node js project using webpack and I am using pug engine for front end.
My Project Structure:
bin
controller
- csv.controller.js
public
- stylesheets
- javascript
- images
routes
- csv.route.js
- index.route.js
views
- layouts
-- layout.pug
-index.pug
app.js
Package.json File
{
"name": "csv",
"version": "0.0.0",
"private": true,
"scripts": {
"build": "webpack --mode=production",
"build:dev": "webpack --mode=development",
"start":"nodemon ./app.js",
"start:dev": "webpack-dev-server --mode=development"
},
"dependencies": {
"body-parser": "^1.19.0",
"compression": "^1.7.4",
"cookie-parser": "~1.4.4",
"csv-parser": "^2.3.1",
"csv-writer": "^1.5.0",
"debug": "~2.6.9",
"express": "^4.17.1",
"express-fileupload": "^1.1.6-alpha.5",
"fast-csv": "^3.4.0",
"http-errors": "~1.6.3",
"morgan": "^1.9.1",
"multer": "^1.4.2",
"npm-check-updates": "^3.1.23",
"request": "^2.88.0"
},
"devDependencies": {
"#babel/core": "^7.6.2",
"#babel/preset-env": "^7.6.2",
"babel-loader": "^8.0.6",
"clean-webpack-plugin": "^3.0.0",
"css-loader": "^3.2.0",
"extract-text-webpack-plugin": "^3.0.2",
"file-loader": "^4.2.0",
"html-webpack-plugin": "^3.2.0",
"mini-css-extract-plugin": "^0.8.0",
"pug": "^2.0.4",
"pug-loader": "^2.4.0",
"style-loader": "^1.0.0",
"webpack": "^4.40.2",
"webpack-cli": "^3.3.9",
"webpack-dev-server": "^3.8.1",
"webpack-merge": "^4.2.2"
}
}
Actually what I want, after build, A dist folder contain a build.js or whatever its name and all public folder assets in the same directory. I tried with some below codes to build the project.
Webpack.config.js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const config = {
entry: {
app: "./app.js"
},
target: "node",
output: {
path: path.resolve(__dirname, "dist"),
filename: "[name].bundle.js"
},
devServer: {
port: 3000
},
plugins: [
new HtmlWebpackPlugin({
template: "./views/index.pug"
})
],
module: {
rules: [
{
test: /\.pug$/,
use: ["pug-loader"]
},
{
test: /\.css$/,
use: ["style-loader", "css-loader"]
},
{
test: /\.(png|svg|jpg|gif)$/,
use: ["file-loader"]
},
{
test: [/.js$/],
exclude: /(node_modules)/,
use: {
loader: "babel-loader",
options: {
presets: ["#babel/preset-env"]
}
}
},
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: "css-loader"
})
}
]
}
};
module.exports = (env, argv) => {
if (argv.mode === "development") {
}
if (argv.mode === "production") {
}
return config;
};
I know this question is old, but just in case somebody is looking for an answer.
You need another Webpack config for app.js, which is express entry point.
Call it webpack.server.js or webpack.server.config.js or whatever convenient. Make sure to include webpack-node-externals:
https://www.npmjs.com/package/webpack-node-externals
It may look something like this:
//webpack.server.js
const path = require('path');
const webpack = require('webpack');
const nodeExternals = require('webpack-node-externals');
module.exports = {
return ({
entry: {
app: ./src/server/app.js,
},
output: {
path: path.join(__dirname, 'dist'),
publicPath: '/',
filename: '[name].js',
},
target: 'node',
node: {
__dirname: false,
__filename: false,
},
externals: [nodeExternals()],
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
},
},
],
},
});
};
Also use webpack-dev-middleware in your app.js.
See the below link:
https://webpack.js.org/guides/development/
In package.json include a script that looks something like this:
"server:dev": "webpack --config webpack.config.js && webpack --mode development --config webpack.server.js && node ./dist/app.js",
In your webpack.config.js make the entry point the js file that imports your front-end assets..
That is your stylesheets and any other js codes..
Not sure what css framework you are using.
But, I am using tailwindcss and I have a js entry point file that imports tailwindcss and my other js codes.
So essentially you may need two webpack config files one for the front-end and one for the express server.
Hope I am making sense.

How to Prevent Webpack Error after npm Install?

I was working on a project, and everything was going good, until I did npm install.
Then, Webpack throws the following error:
new ForkCheckerPlugin(),
^
TypeError: ForkCheckerPlugin is not a constructor
at makeWebpackConfig (/home/nsanz/Documentos/git/tachology/webpack.make.js:252:9)
at Object.exports.default (/home/nsanz/Documentos/git/tachology/server/config/express.js:86:27)
at Object.<anonymous> (/home/nsanz/Documentos/git/tachology/server/app.js:28:1)
at Module._compile (module.js:570:32)
at loader (/home/nsanz/Documentos/git/tachology/node_modules/babel-register/lib/node.js:144:5)
at Object.require.extensions.(anonymous function) [as .js] (/home/nsanz/Documentos/git/tachology/node_modules/babel-register/lib/node.js:154:7)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/home/nsanz/Documentos/git/tachology/server/index.js:12:28)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:389:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:504:3
My package.json looks like:
{
"name": "tachology",
"version": "0.0.0",
"main": "server/index.js",
"dependencies": {
...
},
"devDependencies": {
"angular-mocks": "~1.6.0",
"autoprefixer": "^7.1.2",
"babel-core": "^6.6.5",
"babel-eslint": "^7.2.3",
"babel-register": "^6.6.5",
"browser-sync": "^2.8.0",
"bs-fullscreen-message": "^1.0.0",
"babel-plugin-transform-class-properties": "^6.6.0",
"babel-plugin-transform-runtime": "^6.6.0",
"babel-preset-es2015": "^6.6.0",
"eslint": "^4.3.0",
"del": "^3.0.0",
"gulp": "^3.9.1",
"gulp-babel": "^6.1.2",
"gulp-env": "^0.4.0",
"gulp-eslint": "^4.0.0",
"gulp-imagemin": "^3.0.1",
"gulp-inject": "^4.0.0",
"gulp-istanbul": "^1.1.1",
"gulp-istanbul-enforcer": "^1.0.3",
"gulp-load-plugins": "^1.0.0-rc.1",
"gulp-mocha": "^4.3.1",
"gulp-node-inspector": "^0.2.0",
"gulp-plumber": "^1.0.1",
"gulp-protractor": "^4.1.0",
"gulp-rev": "^8.0.0",
"gulp-rev-replace": "^0.4.2",
"gulp-sort": "^2.0.0",
"gulp-sourcemaps": "^2.6.0",
"gulp-util": "^3.0.5",
"gulp-watch": "^4.3.5",
"gulp-stylint": "^4.0.0",
"grunt": "^1.0.1",
"grunt-build-control": "^0.7.0",
"isparta": "^4.0.0",
"nodemon": "^1.3.7",
"run-sequence": "^2.1.0",
"lazypipe": "^1.0.1",
"webpack": "^3.4.1",
"webpack-dev-middleware": "^1.5.1",
"webpack-stream": "^3.2.0",
"extract-text-webpack-plugin": "^3.0.0",
"html-webpack-plugin": "^2.16.0",
"html-webpack-harddisk-plugin": "~0.1.0",
"pug-html-loader": "^1.0.8",
"awesome-typescript-loader": "3.2.1",
"ng-annotate-loader": "~0.6.1",
"babel-loader": "^7.1.1",
"css-loader": "^0.28.4",
"file-loader": "^0.11.2",
"imports-loader": "^0.7.1",
"isparta-instrumenter-loader": "^1.0.0",
"isparta-loader": "^2.0.0",
"istanbul-instrumenter-loader": "^2.0.0",
"null-loader": "^0.1.1",
"postcss-loader": "^2.0.6",
"raw-loader": "^0.5.1",
"style-loader": "^0.18.2",
"node-sass": "^4.5.3",
"sass-loader": "^6.0.6",
"karma-webpack": "^2.0.4",
"through2": "^2.0.1",
"open": "~0.0.4",
"istanbul": "1.1.0-alpha.1",
"chai": "^4.1.0",
"sinon": "^2.4.1",
"chai-as-promised": "^7.1.1",
"chai-things": "^0.2.0",
"karma": "~1.7.0",
"karma-firefox-launcher": "^1.0.0",
"karma-script-launcher": "^1.0.0",
"karma-coverage": "^1.0.0",
"karma-chrome-launcher": "^2.0.0",
"karma-phantomjs-launcher": "~1.0.0",
"karma-spec-reporter": "~0.0.20",
"karma-sourcemap-loader": "~0.3.7",
"sinon-chai": "^2.8.0",
"mocha": "^3.0.2",
"jasmine-core": "^2.3.4",
"karma-jasmine": "^1.0.2",
"jasmine-spec-reporter": "^4.1.1",
"phantomjs-prebuilt": "^2.1.4",
"proxyquire": "^1.0.1",
"strip-ansi": "^4.0.0",
"supertest": "^3.0.0"
},
"engines": {
"node": "^6.2.2",
"npm": "^3.9.5"
},
"scripts": {
"test": "gulp test",
"update-webdriver": "node node_modules/protractor/bin/webdriver-manager update",
"start": "node server"
},
"private": true
}
The webpacke.make.json file:
'use strict';
/*eslint-env node*/
var webpack = require('webpack');
var autoprefixer = require('autoprefixer');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var HtmlWebpackHarddiskPlugin = require('html-webpack-harddisk-plugin');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var CommonsChunkPlugin = webpack.optimize.CommonsChunkPlugin;
var fs = require('fs');
var path = require('path');
var ForkCheckerPlugin = require('awesome-typescript-loader').ForkCheckerPlugin;
module.exports = function makeWebpackConfig(options) {
/**
* Environment type
* BUILD is for generating minified builds
* TEST is for generating test builds
*/
var BUILD = !!options.BUILD;
var TEST = !!options.TEST;
var E2E = !!options.E2E;
var DEV = !!options.DEV;
/**
* Config
* Reference: http://webpack.github.io/docs/configuration.html
* This is the object where all configuration gets set
*/
var config = {};
/**
* Entry
* Reference: http://webpack.github.io/docs/configuration.html#entry
* Should be an empty object if it's generating a test build
* Karma will set this when it's a test build
*/
if(TEST) {
config.entry = {};
} else {
config.entry = {
app: './client/app/app.js',
polyfills: './client/polyfills.js',
vendor: [
'angular',
'angular-animate',
'angular-aria',
'angular-cookies',
'angular-resource',
'angular-sanitize',
'angular-ui-router',
'lodash'
]
};
}
/**
* Output
* Reference: http://webpack.github.io/docs/configuration.html#output
* Should be an empty object if it's generating a test build
* Karma will handle setting it up for you when it's a test build
*/
if(TEST) {
config.output = {};
} else {
config.output = {
// Absolute output directory
path: BUILD ? path.join(__dirname, '/dist/client/') : path.join(__dirname, '/.tmp/'),
// Output path from the view of the page
// Uses webpack-dev-server in development
publicPath: BUILD || DEV || E2E ? '/' : `http://localhost:${8080}/`,
//publicPath: BUILD ? '/' : 'http://localhost:' + env.port + '/',
// Filename for entry points
// Only adds hash in build mode
filename: BUILD ? '[name].[hash].js' : '[name].bundle.js',
// Filename for non-entry points
// Only adds hash in build mode
chunkFilename: BUILD ? '[name].[hash].js' : '[name].bundle.js'
};
}
if(TEST) {
config.resolve = {
modulesDirectories: [
'node_modules'
],
extensions: ['', '.js', '.ts']
};
}
/**
* Devtool
* Reference: http://webpack.github.io/docs/configuration.html#devtool
* Type of sourcemap to use per build type
*/
if(TEST) {
config.devtool = 'inline-source-map';
} else if(BUILD || DEV) {
config.devtool = 'source-map';
} else {
config.devtool = 'eval';
}
/**
* Loaders
* Reference: http://webpack.github.io/docs/configuration.html#module-loaders
* List: http://webpack.github.io/docs/list-of-loaders.html
* This handles most of the magic responsible for converting modules
*/
config.sassLoader = {
outputStyle: 'compressed',
precision: 10,
sourceComments: false
};
config.babel = {
shouldPrintComment(commentContents) {
// keep `/*#ngInject*/`
return /#ngInject/.test(commentContents);
}
}
// Initialize module
config.module = {
preLoaders: [],
loaders: [{
// JS LOADER
// Reference: https://github.com/babel/babel-loader
// Transpile .js files using babel-loader
// Compiles ES6 and ES7 into ES5 code
test: /\.js$/,
loader: 'babel',
include: [
path.resolve(__dirname, 'client/'),
path.resolve(__dirname, 'node_modules/lodash-es/')
]
}, {
// TS LOADER
// Reference: https://github.com/s-panferov/awesome-typescript-loader
// Transpile .ts files using awesome-typescript-loader
test: /\.ts$/,
loader: 'awesome-typescript-loader',
query: {
tsconfig: path.resolve(__dirname, 'tsconfig.client.json')
},
include: [
path.resolve(__dirname, 'client/')
]
}, {
// ASSET LOADER
// Reference: https://github.com/webpack/file-loader
// Copy png, jpg, jpeg, gif, svg, woff, woff2, ttf, eot files to output
// Rename the file using the asset hash
// Pass along the updated reference to your code
// You can add here any file extension you want to get copied to your output
test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot)([\?]?.*)$/,
loader: 'file'
}, {
// Pug HTML LOADER
// Reference: https://github.com/willyelm/pug-html-loader
// Allow loading Pug throw js
test: /\.(jade|pug)$/,
loaders: ['pug-html']
}, {
// CSS LOADER
// Reference: https://github.com/webpack/css-loader
// Allow loading css through js
//
// Reference: https://github.com/postcss/postcss-loader
// Postprocess your css with PostCSS plugins
test: /\.css$/,
loader: !TEST
// Reference: https://github.com/webpack/extract-text-webpack-plugin
// Extract css files in production builds
//
// Reference: https://github.com/webpack/style-loader
// Use style-loader in development for hot-loading
? ExtractTextPlugin.extract('style', 'css!postcss')
// Reference: https://github.com/webpack/null-loader
// Skip loading css in test mode
: 'null'
}, {
// SASS LOADER
// Reference: https://github.com/jtangelder/sass-loader
test: /\.(scss|sass)$/,
loaders: ['style', 'css', 'sass'],
include: [
path.resolve(__dirname, 'node_modules/bootstrap-sass/assets/stylesheets/*.scss'),
path.resolve(__dirname, 'client/app/app.scss')
]
}]
};
config.module.postLoaders = [{
test: /\.js$/,
loader: 'ng-annotate?single_quotes'
}];
// ISPARTA INSTRUMENTER LOADER
// Reference: https://github.com/ColCh/isparta-instrumenter-loader
// Instrument JS files with Isparta for subsequent code coverage reporting
// Skips node_modules and spec files
if(TEST) {
config.module.preLoaders.push({
//delays coverage til after tests are run, fixing transpiled source coverage error
test: /\.js$/,
exclude: /(node_modules|spec\.js|mock\.js)/,
loader: 'isparta-instrumenter',
query: {
babel: {
// optional: ['runtime', 'es7.classProperties', 'es7.decorators']
}
}
});
}
/**
* PostCSS
* Reference: https://github.com/postcss/autoprefixer-core
* Add vendor prefixes to your css
*/
config.postcss = [
autoprefixer({
browsers: ['last 2 version']
})
];
/**
* Plugins
* Reference: http://webpack.github.io/docs/configuration.html#plugins
* List: http://webpack.github.io/docs/list-of-plugins.html
*/
config.plugins = [
/*
* Plugin: ForkCheckerPlugin
* Description: Do type checking in a separate process, so webpack don't need to wait.
*
* See: https://github.com/s-panferov/awesome-typescript-loader#forkchecker-boolean-defaultfalse
*/
new ForkCheckerPlugin(),
// Reference: https://github.com/webpack/extract-text-webpack-plugin
// Extract css files
// Disabled when in test mode or not in build mode
new ExtractTextPlugin('[name].[hash].css', {
disable: !BUILD || TEST
})
];
if(!TEST) {
config.plugins.push(new CommonsChunkPlugin({
name: 'vendor',
// filename: "vendor.js"
// (Give the chunk a different name)
minChunks: Infinity
// (with more entries, this ensures that no other module
// goes into the vendor chunk)
}));
}
// Skip rendering index.html in test mode
// Reference: https://github.com/ampedandwired/html-webpack-plugin
// Render index.html
let htmlConfig = {
template: 'client/_index.html',
filename: '../client/index.html',
alwaysWriteToDisk: true
}
config.plugins.push(
new HtmlWebpackPlugin(htmlConfig),
new HtmlWebpackHarddiskPlugin()
);
// Add build specific plugins
if(BUILD) {
config.plugins.push(
// Reference: http://webpack.github.io/docs/list-of-plugins.html#noerrorsplugin
// Only emit files when there are no errors
new webpack.NoErrorsPlugin(),
// Reference: http://webpack.github.io/docs/list-of-plugins.html#dedupeplugin
// Dedupe modules in the output
new webpack.optimize.DedupePlugin(),
// Reference: http://webpack.github.io/docs/list-of-plugins.html#uglifyjsplugin
// Minify all javascript, switch loaders to minimizing mode
new webpack.optimize.UglifyJsPlugin({
mangle: false,
output: {
comments: false
},
compress: {
warnings: false
}
}),
// Reference: https://webpack.github.io/docs/list-of-plugins.html#defineplugin
// Define free global variables
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
})
);
}
if(DEV) {
config.plugins.push(
// Reference: https://webpack.github.io/docs/list-of-plugins.html#defineplugin
// Define free global variables
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"development"'
}
})
);
}
config.cache = DEV;
if(TEST) {
config.stats = {
colors: true,
reasons: true
};
config.debug = false;
}
/**
* Dev server configuration
* Reference: http://webpack.github.io/docs/configuration.html#devserver
* Reference: http://webpack.github.io/docs/webpack-dev-server.html
*/
config.devServer = {
contentBase: './client/',
stats: {
modules: false,
cached: false,
colors: true,
chunk: false
}
};
config.node = {
global: 'window',
process: true,
crypto: 'empty',
clearImmediate: false,
setImmediate: false
};
return config;
};
I've tried downgrading Webpack to version 1.15.0, removing the node_modules folder and installing it again, but I still get the same error.
What is it going wrong?
Update:
Just in case it helps, when I do npm install, the Webpack module is shown like this UNMET PEER DEPENDENCY webpack#3.4.1.
I get the following error when downgrading awesome-typescript-loader to 2.2.4:
WebpackOptionsValidationError(webpackOptionsValidationErrors);
^
WebpackOptionsValidationError: Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
- configuration has an unknown property 'postcss'. These properties are valid:
object { amd?, bail?, cache?, context?, dependencies?, devServer?, devtool?, entry, externals?, loader?, module?, name?, node?, output?, performance?, plugins?, profile?, recordsInputPath?, recordsOutputPath?, recordsPath?, resolve?, resolveLoader?, stats?, target?, watch?, watchOptions? }
For typos: please correct them.
For loader options: webpack 2 no longer allows custom properties in configuration.
Loaders should be updated to allow passing options via loader options in module.rules.
Until loaders are updated one can use the LoaderOptionsPlugin to pass these options to the loader:
plugins: [
new webpack.LoaderOptionsPlugin({
// test: /\.xxx$/, // may apply this only for some modules
options: {
postcss: ...
}
})
]
- configuration.module has an unknown property 'postLoaders'. These properties are valid:
object { exprContextCritical?, exprContextRecursive?, exprContextRegExp?, exprContextRequest?, loaders?, noParse?, rules?, unknownContextCritical?, unknownContextRecursive?, unknownContextRegExp?, unknownContextRequest?, unsafeCache?, wrappedContextCritical?, wrappedContextRecursive?, wrappedContextRegExp?, strictExportPresence?, strictThisContextOnImports? }
Options affecting the normal modules (`NormalModuleFactory`).
- configuration.node should be one of these:
false | object { Buffer?, __dirname?, __filename?, console?, global?, process?, ... }
Include polyfills or mocks for various node stuff.
Details:
* configuration.node should be false
* configuration.node.global should be a boolean.
Update 2:
It seems downgrading webpack#2.1.0-beta.22 solved my problem. But now, I am getting another error:
/home/nsanz/Documentos/git/tachology/node_modules/extract-text-webpack-plugin/node_modules/async/dist/async.js:1003
iteratee(coll[index], index, onlyOnce(iteratorCallback));
^
TypeError: chunk.sortModules is not a function
Update 3:
After installing extract-text-webpack-plugin#2.1.2, I get this new error:
/home/nsanz/Documentos/git/tachology/node_modules/extract-text-webpack-plugin/index.js:187
throw new Error("Breaking change: extract now only takes a single argument. Either an options " +
^
Error: Breaking change: extract now only takes a single argument. Either an options object *or* the loader(s).
Example: if your old code looked like this:
ExtractTextPlugin.extract('style-loader', 'css-loader')
You would change it to:
ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' })
The available options are:
use: string | object | loader[]
fallback: string | object | loader[]
publicPath: string
Update 4:
After fixing another ExtractTextPlugin error, I receive a new error (I find this one through different pug files):
ERROR in ./client/app/main/main.pug
Module parse failed: /home/nsanz/Documentos/git/tachology/node_modules/pug-html-loader/lib/index.js!/home/nsanz/Documentos/git/tachology/client/app/main/main.pug Unexpected token (1:0)
You may need an appropriate loader to handle this file type.
| <div class="uk-section uk-section-default main"><div class="uk-container" ng-show="$ctrl.Auth.hasRoleSync('driver')"><div class="uk-flex"><div class="uk-width-1-3"><div class="test-upload uk-placeholder uk-text-center"><span uk-icon="icon: cloud-upload; ratio: 3"></span><br/><span class="uk-text-middle uk-margin-small-left uk-margin-small-right">Arrastra los ficheros o</span><div class="uk-form-custom"><input type="file" multiple="multiple" enctype="multipart/form-data" ng-model="$ctrl.upload"/><span class="uk-link">pulsa aquí</span></div></div><progress class="uk-progress" id="progressbar" value="0" max="100" hidden="hidden"></progress></div><div class="uk-width-2-3 uk-margin-left"><table class="uk-table uk-table-hover uk-table-striped uk-table-small uk-table-justify" id="files"><thead><tr><th class="uk-table-shrink">#</th><th class="uk-table-expand">Nombre del Fichero</th><th class="uk-table-expand"><form class="uk-search uk-search-default uk-width-1-1"><span class="uk-search-icon"></span><input class="uk-search-input" type="search" placeholder="Buscar..." ng-model="search.filename"/></form></th></tr></thead><tbody><tr class="uk-text-center empty-msg" ng-hide="$ctrl.fileList.length !== 0"><td colspan="3">No se encuentra ningún fichero, subir uno nuevo.</td></tr><tr ng-repeat="file in $ctrl.fileList | filter:search"><td>{{$index + 1}}</td><td class="uk-table-link"><a class="uk-link-reset" ng-click="$ctrl.parseFile(file)">{{file.filename}}</a></td><td class="uk-text-right"><i class="uk-icon-link download" uk-icon="icon: cloud-download" ng-click="$ctrl.downloadFile(file)"></i><i class="uk-icon-link uk-margin-left trash" uk-icon="icon: trash" ng-click="$ctrl.deleteFile(file)"></i></td></tr></tbody></table></div></div></div><div class="uk-container" ng-hide="$ctrl.Auth.hasRoleSync('driver')"><div class="uk-flex uk-flex-around uk-flex-stretch"><div class="uk-width-1-3 uk-card uk-card-default uk-card-hover uk-card-body main-button" ng-click="$ctrl.go('/conductores')"><div class="uk-text-center"><span uk-icon="icon: users; ratio: 4"></span><h3 class="uk-card-title">CONDUCTORES</h3></div></div><div class="uk-width-1-3 uk-card uk-card-default uk-card-hover uk-card-body uk-margin-left main-button" ng-click="$ctrl.go('/vehiculos')"><div class="uk-text-center"><span class="fa fa-car"></span><h3 class="uk-card-title">VEHÍCULOS</h3></div></div><div class="uk-width-1-3 uk-card uk-card-default uk-card-hover uk-card-body uk-margin-left main-button" ng-click="$ctrl.go('/informes')"><div class="uk-text-center"><span uk-icon="icon: list; ratio: 4"></span><h3 class="uk-card-title">INFORMES</h3></div></div></div></div></div>
# ./client/app/main/main.component.js 140:12-33
# ./client/app/app.js
In your devDependencies, try downgrading this:
awesome-typescript-loader": "3.2.1"
to this:
awesome-typescript-loader": "2.2.4"
If it still doesn't work, we'll find another solution.
EDIT
After the last question update, this is my advice. Delete the next line in webpack.make.json:
config.plugins = [
/*...*/
new ForkCheckerPlugin(), // <-- Delete this line
The reason for this is that it seems that forking is built-in for Webpack >= 3.0.0
EDIT 2
Seems like Webpack 3.4.1 is causing you troubles, because you are relying on some old dependencies. Do the following:
npm uninstall webpack --save-dev
then:
npm install webpack#2.1.0-beta.22 --save-dev
Hopefully this will work now!
If it still doesn't work, try re-incorporating the new ForkCheckerPlugin() statement (this time using webpack 2.1.0)
EDIT 3
It seems to work now with webpack 2.1.0-beta.22, but you got another error.
This error happened because extract-text-webpack-plugin is not of the same major version as webpack is (3.x.x vs 2.x.x). Do this:
npm uninstall --save-dev extract-text-webpack-plugin
then this:
npm install --save-dev extract-text-webpack-plugin#2.1.2
EDIT 4
This new error is a bit easier to solve. It comes explained in your error logs. In your webpack.make.js change the line:
ExtractTextPlugin.extract('style', 'css!postcss')
To:
ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' })
EDIT 5
Things are getting interesting. I'd recommend changing this (inside of webpack.make.js):
}, {
// Pug HTML LOADER
// Reference: https://github.com/willyelm/pug-html-loader
// Allow loading Pug throw js
test: /\.(jade|pug)$/,
loaders: ['pug-html']
}, {
to this:
}, {
// Pug HTML LOADER
// Reference: https://github.com/willyelm/pug-html-loader
// Allow loading Pug throw js
test: /\.(jade|pug)$/,
loaders: ['pug-html-loader']
}, {
I also encountered the same error. My steps to resolve the issue:
I deleted the whole repo
downloaded the code again
npm install
Issue resolved for me

Module build failed: Error: Plugin 0 specified in "base" provided an invalid property of "definitions"

I am unsuccessfully trying to get webpack to package a production build of my react/redux app. The build succeeds normally, but as soon as I add a webpack plugin to switch the environment as detailed here: https://stackoverflow.com/a/30061249/7114096 (this is linked in the warning logged by redux as I am running a minified dev version) , it falls down.
webpack.config.js:
'use strict';
var webpack = require('webpack');
var path = require('path');
var BUILD_DIR = path.resolve(__dirname, 'web/bundles/frontend/build/react');
var APP_DIR = path.resolve(__dirname, 'web/bundles/frontend/src/react');
var config = {
entry: ['babel-polyfill', APP_DIR + '/search.js'],
output: {
path: BUILD_DIR,
filename: 'search.js'
},
module : {
loaders : [
{
test : /\.js?/,
include : APP_DIR,
loader : 'babel',
query: {
presets: ['react','es2015'],
plugins: [
new webpack.DefinePlugin({
'process.env': {
'NODE_ENV': JSON.stringify('development')
}
}),
"transform-object-rest-spread"
]
}
}
]
}
};
module.exports = config;
package.json:
"babel-cli": "^6.16.0",
"babel-core": "^6.18.2",
"babel-loader": "^6.2.5",
"babel-plugin-transform-object-rest-spread": "^6.16.0",
"babel-polyfill": "^6.16.0",
"babel-preset-es2015": "^6.16.0",
"babel-preset-node5": "^11.1.0",
"babel-preset-react": "^6.16.0",
"bower": "^1.7.9",
"bower-update-all": "^0.1.2",
"csswring": "^5.1.0",
"gulp": "^3.9.1",
"gulp-autoprefixer": "^3.1.0",
"gulp-babel": "^6.1.2",
"gulp-browserify": "^0.5.1",
"gulp-clean-css": "^2.0.11",
"gulp-compass": "^2.1.0",
"gulp-concat": "^2.6.0",
"gulp-imagemin": "^3.0.2",
"gulp-minify": "0.0.12",
"gulp-plumber": "^1.1.0",
"gulp-postcss": "^6.1.1",
"gulp-rename": "^1.2.2",
"gulp-sourcemaps": "^1.6.0",
"gulp-util": "^3.0.7",
"gulp-webpack": "^1.5.0",
"merge-stream": "^1.0.0",
"path": "^0.12.7",
"postcss-cssnext": "^2.7.0",
"react": "^15.3.2",
"react-bootstrap": "^0.30.5",
"react-dom": "^15.3.2",
"react-redux": "^4.4.5",
"redux": "^3.6.0",
"redux-saga": "^0.12.0",
"require-dir": "^0.3.0",
"webpack": "^1.13.3"
And finally the error:
ERROR in ./web/bundles/frontend/src/react/search.js
Module build failed: Error: Plugin 0 specified in "base" provided an invalid property of "definitions"
at Plugin.init (C:\xampp\htdocs\test\node_modules\babel-core\lib\transformation\plugin.js:131:13)
at Function.normalisePlugin (C:\xampp\htdocs\test\node_modules\babel-core\lib\transformation\file\options\option-manager.js:148:12)
at C:\xampp\htdocs\test\node_modules\babel-core\lib\transformation\file\options\option-manager.js:180:30
at Array.map (native)
at Function.normalisePlugins (C:\xampp\htdocs\test\node_modules\babel-core\lib\transformation\file\options\option-manager.js:154:20)
at OptionManager.mergeOptions (C:\xampp\htdocs\test\node_modules\babel-core\lib\transformation\file\options\option-manager.js:229:36)
at OptionManager.init (C:\xampp\htdocs\test\node_modules\babel-core\lib\transformation\file\options\option-manager.js:374:12)
at File.initOptions (C:\xampp\htdocs\test\node_modules\babel-core\lib\transformation\file\index.js:216:65)
at new File (C:\xampp\htdocs\test\node_modules\babel-core\lib\transformation\file\index.js:139:24)
at Pipeline.transform (C:\xampp\htdocs\test\node_modules\babel-core\lib\transformation\pipeline.js:46:16)
at transpile (C:\xampp\htdocs\test\node_modules\babel-loader\index.js:38:20)
at Object.module.exports (C:\xampp\htdocs\test\node_modules\babel-loader\index.js:131:12)
# multi main
Any thoughts?
I think you have your plugins defined at the wrong place. Webpack plugin should not be defined inside the loaders
var webpack = require('webpack');
var path = require('path');
var BUILD_DIR = path.resolve(__dirname, 'web/bundles/frontend/build/react');
var APP_DIR = path.resolve(__dirname, 'web/bundles/frontend/src/react');
var config = {
entry: ['babel-polyfill', APP_DIR + '/search.js'],
output: {
path: BUILD_DIR,
filename: 'search.js'
},
module : {
loaders : [
{
test : /\.js?/,
include : APP_DIR,
loader : 'babel',
query: {
presets: ['react','es2015'],
plugins: ["transform-object-rest-spread"]
}
}
]
},
plugins: [
new webpack.DefinePlugin({
'process.env': {
'NODE_ENV': JSON.stringify('development')
}
})
]
};
module.exports = config;

Heroku Deploys Completely Different App

When I deploy it to heroku it shows a completely different site
than what it shows when I run 'npm run start'.
Why is this happening?
I am running React + Webpack + Express. The site it shows is the site I used as my starter package so I am guessing there is a line of code baked into the site that misdirects Heroku. I just cannot find it. This is my repo: https://github.com/adamskriger/calendar/
This is my webpack.config.js.
const path = require('path');
const merge = require('webpack-merge');
const webpack = require('webpack');
const NpmInstallPlugin = require('npm-install-webpack-plugin');
const TARGET = process.env.npm_lifecycle_event;
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanPlugin = require('clean-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const pkg = require('./package.json');
const PATHS = {
app: path.join(__dirname, 'app'),
build: path.join(__dirname, 'build')
};
process.env.BABEL_ENV = TARGET;
const common = {
entry: {
app: PATHS.app
},
// Add resolve.extensions
// '' is needed to allow imports without an extension
// note the .'s before the extension as it will fail to load without them
resolve: {
extensions: ['', '.js', '.jsx', '.json']
},
output: {
path: PATHS.build,
filename: 'bundle.js'
},
module: {
loaders: [
{
// Test expects a RegExp! Notethe slashes!
test: /\.css$/,
loaders: ['style', 'css'],
//Include accepts either a path or an array of paths
include: PATHS.app
},
//set up JSX. This accepts js too thanks to RegExp
{
test: /\.(js|jsx)$/,
//enable caching for improved performance during development
//It uses default OS directory by default. If you need something more custom,
//pass a path to it. ie: babel?cacheDirectory=<path>
loaders: [
'babel?cacheDirectory,presets[]=es2015'
],
//parse only app files Without this it will go thru the entire project.
//beside being slow this will likely result in an error
include: PATHS.app
}
]
}
};
// Default configuration. We will return this if
// Webpack is called outside of npm.
if(TARGET === 'start' || !TARGET){
module.exports = merge(common, {
devtool: 'eval-source-map',
devServer: {
contentBase: PATHS.build,
//enable history API fallback so HTML5 HISTORY API based
// routing works. This is a good default that will come in handy in more
// complicated setups.
historyApiFallback: true,
hot: true,
inline: true,
progress: true,
//display only errors to reduce output amount
stats: 'errors only',
//Parse host and port from env so this is easy to customize
host: process.env.HOST,
port: process.env.PORT
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new NpmInstallPlugin({
save: true //--save
})
]
});
}
if(TARGET === 'build' || TARGET === 'stats') {
module.exports = merge(common, {
entry: {
vendor: Object.keys(pkg.dependencies).filter(function(v) {
return v !== 'alt-utils';
}),
style: PATHS.style
},
output: {
path: PATHS.build,
// Output using entry name
filename: '[name].[chunkhash].js',
chunkFilename: '[chunkhash].js'
},
module: {
loaders: [
// Extract CSS during build
{
test: /\.css$/,
loader: ExtractTextPlugin.extract('style', 'css'),
include: PATHS.app
}
]
},
plugins: [
new CleanPlugin([PATHS.build]),
// Output extracted CSS to a file
new ExtractTextPlugin('[name].[chunkhash].css'),
// Extract vendor and manifest files
new webpack.optimize.CommonsChunkPlugin({
names: ['vendor', 'manifest']
}),
// Setting DefinePlugin affects React library size!
new webpack.DefinePlugin({
'process.env.NODE_ENV': '"production"'
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
})
]
});
}
This is my package.json:
{
"name": "Portfolio",
"version": "1.0.0",
"description": "Portfolio Site",
"main": "server.js",
"scripts": {
"build": "webpack",
"start": "webpack-dev-server"
},
"author": "Adam Kriger",
"license": "ISC",
"devDependencies": {
"babel-core": "^6.7.7",
"babel-loader": "^6.2.4",
"babel-preset-es2015": "^6.6.0",
"babel-preset-react": "^6.5.0",
"babel-preset-react-hmre": "^1.1.1",
"css-loader": "^0.23.1",
"npm-install-webpack-plugin": "^3.0.0",
"style-loader": "^0.13.1",
"webpack": "^1.13.0",
"webpack-dev-server": "^1.14.1",
"webpack-merge": "^0.12.0"
},
"dependencies": {
"alt": "^0.18.4",
"alt-container": "^1.0.2",
"alt-utils": "^1.0.0",
"babel-core": "^6.7.7",
"babel-loader": "^6.2.4",
"babel-preset-es2015": "^6.6.0",
"babel-preset-react": "^6.5.0",
"babel-preset-react-hmre": "^1.1.1",
"babel-preset-survivejs-kanban": "^0.3.3",
"body-parser": "^1.15.0",
"bootstrap": "^3.3.6",
"classnames": "^2.2.5",
"clean-webpack-plugin": "^0.1.9",
"components": "^0.1.0",
"css-loader": "^0.23.1",
"express": "^4.13.4",
"extract-text-webpack-plugin": "^1.0.1",
"firebase": "^2.4.2",
"html-webpack-plugin": "^2.16.0",
"json-loader": "^0.5.4",
"moment": "^2.13.0",
"morgan": "^1.7.0",
"node-uuid": "^1.4.7",
"npm-install-webpack-plugin": "^3.0.0",
"react": "^15.0.1",
"react-dom": "^15.0.2",
"react-router": "^2.4.0",
"reactfire": "^0.7.0",
"style-loader": "^0.13.1",
"webpack": "^1.13.0",
"webpack-dev-server": "^1.14.1",
"webpack-merge": "^0.12.0"
}
}
When you deploy on heroku, it looks for your compiled build because it's node environment is set to "production". It is most likely that you still have your older version build inside your where you decided you wanted webpack to send it. In your case its where this is:
build: path.join(__dirname, 'build')
So that's where your old website is at. I would delete everything in here and do another compile. Then commit and push to heroku again.

Resources