Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

spinjs

Package Overview
Dependencies
Maintainers
1
Versions
225
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

spinjs - npm Package Compare versions

Comparing version 0.1.8 to 0.1.9

lib/Builder.d.ts

8

lib/configRc.d.ts

@@ -0,5 +1,9 @@

import { Builder } from "./Builder";
export default class ConfigRc {
options: any;
nodes: Object;
constructor();
builders: {
[x: string]: Builder;
};
plugins: Object[];
constructor(plugins: any);
}

@@ -13,21 +13,22 @@ "use strict";

var requireModule_1 = require("./requireModule");
var platform_1 = require("./platform");
var Stack_1 = require("./Stack");
var pkg = requireModule_1.default('./package.json');
var SPIN_CONFIG_NAME = '.spinrc';
var ConfigRc = (function () {
function ConfigRc() {
function ConfigRc(plugins) {
var config = fs.existsSync(SPIN_CONFIG_NAME) ?
JSON.parse(fs.readFileSync(SPIN_CONFIG_NAME).toString()) : pkg.spin;
var nodes = {};
for (var _i = 0, _a = Object.keys(config.nodes); _i < _a.length; _i++) {
var builders = {};
for (var _i = 0, _a = Object.keys(config.builders); _i < _a.length; _i++) {
var name = _a[_i];
var nodeVal = config.nodes[name];
var node = typeof nodeVal === 'object' ? __assign({}, nodeVal) : { features: nodeVal };
node.name = name;
node.platform = new platform_1.default(config.options.features, typeof node === 'object' ? node.features : node);
node.roles = node.roles || ['build', 'watch'];
nodes[node.name] = node;
var builderVal = config.builders[name];
var builder = (typeof builderVal === 'object' && builderVal.constructor !== Array) ? __assign({}, builderVal) : { stack: builderVal };
builder.name = name;
builder.stack = new Stack_1.default(config.options.stack, typeof builder === 'object' ? builder.stack : builder);
builder.roles = builder.roles || ['build', 'watch'];
builders[builder.name] = builder;
}
this.nodes = nodes;
this.builders = builders;
this.options = __assign({}, config.options);
this.plugins = plugins.concat((config.plugins || []).map(function (name) { return new (require(name)); }));
var options = this.options;

@@ -34,0 +35,0 @@ options.backendBuildDir = options.backendBuildDir || 'build/server';

@@ -1,2 +0,2 @@

declare const execute: (cmd: any, nodes: Object, options: any) => void;
declare const execute: (cmd: any, builders: Object, options: any) => void;
export default execute;

@@ -50,5 +50,5 @@ "use strict";

var webpack_sources_1 = require("webpack-sources");
var VirtualModules = require("webpack-virtual-modules");
var requireModule_1 = require("./requireModule");
var liveReloadMiddleware_1 = require("./react-native/liveReloadMiddleware");
var VirtualModules = requireModule_1.default('webpack-virtual-modules');
var expoPorts = {};

@@ -143,5 +143,5 @@ minilog.enable();

}());
function startClientWebpack(hasBackend, watch, node, options) {
function startClientWebpack(hasBackend, watch, builder, options) {
var webpack = requireModule_1.default('webpack');
var config = node.config;
var config = builder.config;
var logger = minilog("webpack-for-" + config.name);

@@ -168,6 +168,6 @@ try {

config.plugins.push(new webpack.NoEmitOnErrorsPlugin());
startWebpackDevServer(hasBackend, node, options, reporter, logger);
startWebpackDevServer(hasBackend, builder, options, reporter, logger);
}
else {
if (node.platform.target !== 'web') {
if (builder.stack.platform !== 'web') {
config.plugins.push(new MobileAssetsPlugin());

@@ -188,4 +188,4 @@ }

}
function startServerWebpack(watch, node, options) {
var config = node.config;
function startServerWebpack(watch, builder, options) {
var config = builder.config;
var logger = minilog("webpack-for-" + config.name);

@@ -261,10 +261,10 @@ try {

}
function openFrontend(node) {
function openFrontend(builder) {
var openurl = requireModule_1.default('openurl');
try {
if (node.platform.target === 'web' && node.openBrowser !== false) {
openurl.open("http://" + ip.address() + ":" + node.config.devServer.port);
if (builder.stack.hasAny('web') && builder.openBrowser !== false) {
openurl.open("http://" + ip.address() + ":" + builder.config.devServer.port);
}
else if (['android', 'ios'].indexOf(node.platform.target) >= 0) {
startExpoProject(node.config, node.platform.target);
else if (builder.stack.hasAny('react-native')) {
startExpoProject(builder.config, builder.stack.platform);
}

@@ -285,3 +285,3 @@ }

}
function startWebpackDevServer(hasBackend, node, options, reporter, logger) {
function startWebpackDevServer(hasBackend, builder, options, reporter, logger) {
var webpack = requireModule_1.default('webpack');

@@ -295,4 +295,4 @@ var connect = requireModule_1.default('connect');

var waitOn = requireModule_1.default('wait-on');
var config = node.config;
var platform = node.platform.target;
var config = builder.config;
var platform = builder.stack.platform;
var configOutputPath = config.output.path;

@@ -302,3 +302,3 @@ config.output.path = '/';

var vendorHashesJson, vendorSourceListMap, vendorSource, vendorMap;
if (options.webpackDll && node.dllConfig) {
if (options.webpackDll && builder.dllConfig) {
var name = "vendor_" + platform;

@@ -345,3 +345,3 @@ var jsonPath = path.join(options.dllBuildDir, name + "_dll.json");

});
if (options.webpackDll && node.dllConfig && platform !== 'web') {
if (options.webpackDll && builder.dllConfig && platform !== 'web') {
compiler.plugin('after-compile', function (compilation, callback) {

@@ -363,3 +363,3 @@ _.each(compilation.chunks, function (chunk) {

}
if (options.webpackDll && node.dllConfig && platform === 'web' && !hasBackend) {
if (options.webpackDll && builder.dllConfig && platform === 'web' && !hasBackend) {
compiler.plugin('after-compile', function (compilation, callback) {

@@ -397,3 +397,3 @@ compilation.assets[vendorHashesJson.name] = vendorSource;

frontendFirstStart = false;
openFrontend(node);
openFrontend(builder);
}

@@ -691,8 +691,8 @@ });

}
function startWebpack(targets, watch, node, options) {
if (node.platform.target === 'server') {
startServerWebpack(watch, node, options);
function startWebpack(platforms, watch, builder, options) {
if (builder.stack.platform === 'server') {
startServerWebpack(watch, builder, options);
}
else {
startClientWebpack(!!targets.server, watch, node, options);
startClientWebpack(!!platforms.server, watch, builder, options);
}

@@ -800,3 +800,3 @@ }

}
var execute = function (cmd, nodes, options) {
var execute = function (cmd, builders, options) {
if (cmd === 'exp') {

@@ -819,11 +819,11 @@ startExp(options);

var watch_1 = cmd === 'watch';
var targets_1 = {};
for (var name in nodes) {
var node = nodes[name];
var platform = node.platform;
targets_1[platform.target] = true;
if (platform.hasAny('ios')) {
var platforms_1 = {};
for (var name in builders) {
var builder = builders[name];
var stack = builder.stack;
platforms_1[stack.platform] = true;
if (stack.hasAny('react-native') && stack.hasAny('ios')) {
expoPlatforms.push('ios');
}
else if (platform.hasAny('android')) {
else if (stack.hasAny('react-native') && stack.hasAny('android')) {
expoPlatforms.push('android');

@@ -840,13 +840,13 @@ }

var _loop_1 = function (name) {
var node = nodes[name];
var platform = node.platform;
if (platform.hasAny(['dll', 'test']))
var builder = builders[name];
var stack = builder.stack;
if (stack.hasAny(['dll', 'test']))
return "continue";
var prepareDllPromise = (cmd === 'watch' && options.webpackDll && node.dllConfig) ?
buildDll(platform.target, node.dllConfig, options) : Promise.resolve();
var prepareDllPromise = (cmd === 'watch' && options.webpackDll && builder.dllConfig) ?
buildDll(stack.platform, builder.dllConfig, options) : Promise.resolve();
prepareDllPromise.then(function () {
return startWebpack(targets_1, watch_1, node, options);
return startWebpack(platforms_1, watch_1, builder, options);
});
};
for (var name in nodes) {
for (var name in builders) {
_loop_1(name);

@@ -853,0 +853,0 @@ }

@@ -1,2 +0,2 @@

declare const createConfig: (node: any, nodes: any, dev: any, opts: any, depPlatforms?: any) => any;
declare const createConfig: (builder: any, builders: any, dev: any, opts: any, depPlatforms?: any) => any;
export default createConfig;

@@ -30,34 +30,6 @@ "use strict";

};
var createBaseConfig = function (node, dev, options) {
var platform = node.platform;
var babelRule = {
loader: requireModule_1.default.resolve('babel-loader'),
options: {
cacheDirectory: dev,
presets: [
requireModule_1.default.resolve('babel-preset-react'),
[requireModule_1.default.resolve('babel-preset-es2015'), { 'modules': false }],
requireModule_1.default.resolve('babel-preset-stage-0')
],
plugins: [
requireModule_1.default.resolve('babel-plugin-transform-runtime'),
requireModule_1.default.resolve('babel-plugin-transform-decorators-legacy'),
requireModule_1.default.resolve('babel-plugin-transform-class-properties'),
[requireModule_1.default.resolve('babel-plugin-styled-components'), { 'ssr': options.ssr }],
].concat(dev && options.reactHotLoader ? [requireModule_1.default.resolve('react-hot-loader/babel')] : []),
only: ['*.js', '*.jsx'],
},
};
var reactNativeRule = {
loader: requireModule_1.default.resolve('babel-loader'),
options: {
cacheDirectory: dev,
presets: [requireModule_1.default.resolve('babel-preset-react-native')],
plugins: [
requireModule_1.default.resolve('haul/src/utils/fixRequireIssues'),
],
},
};
var createBaseConfig = function (builder, dev, options) {
var stack = builder.stack;
var baseConfig = {
name: node.name,
name: builder.name,
devtool: dev ? '#cheap-module-source-map' : '#source-map',

@@ -68,19 +40,6 @@ module: {

test: /\.jsx?$/,
exclude: platform.hasAny(['ios', 'android']) ?
exclude: (stack.hasAny('react-native')) ?
/node_modules\/(?!react-native|@expo|expo|lottie-react-native|haul|pretty-format|react-navigation)$/ :
/node_modules/,
use: [
(platform.hasAny(['ios', 'android']) ?
function (req) {
var result;
if (req.resource.indexOf('node_modules') >= 0) {
result = reactNativeRule;
}
else {
result = babelRule;
}
return result;
} :
babelRule),
].concat(options.persistGraphQL ?
use: [].concat(options.persistGraphQL ?
['persistgraphql-webpack-plugin/js-loader'] :

@@ -103,5 +62,5 @@ []),

resolve: {
extensions: platform.hasAny('server') ?
extensions: stack.hasAny('server') ?
[".web.js", ".web.jsx", '.js', '.jsx'] :
["." + platform.target + ".js", "." + platform.target + ".jsx", '.native.js', '.native.jsx', '.js', '.jsx'],
["." + stack.platform + ".js", "." + stack.platform + ".jsx", '.native.js', '.native.jsx', '.js', '.jsx'],
modules: [path.join(process.cwd(), 'node_modules'), 'node_modules'],

@@ -114,3 +73,3 @@ },

};
if (platform.hasAny(['web', 'server'])) {
if (stack.hasAny(['web', 'server'])) {
baseConfig.resolve.alias = {

@@ -134,3 +93,3 @@ 'react-native': 'react-native-web',

}
else if (platform.hasAny(['android', 'ios'])) {
else if (stack.hasAny('react-native')) {
baseConfig.module.rules = baseConfig.module.rules.concat([

@@ -141,3 +100,3 @@ {

loader: require.resolve('./react-native/assetLoader'),
query: { platform: platform.target, root: path.resolve('.'), bundle: false },
query: { platform: stack.platform, root: path.resolve('.'), bundle: false },
},

@@ -151,6 +110,6 @@ },

var ExtractTextPlugin;
var createPlugins = function (node, nodes, dev, options) {
var platform = node.platform;
var createPlugins = function (builder, builders, dev, options) {
var stack = builder.stack;
var webpack = requireModule_1.default('webpack');
var buildNodeEnv = dev ? (platform.hasAny('test') ? 'test' : 'development') : 'production';
var buildNodeEnv = dev ? (stack.hasAny('test') ? 'test' : 'development') : 'production';
if (!persistPlugins) {

@@ -182,3 +141,3 @@ var PersistGraphQLPlugin = requireModule_1.default('persistgraphql-webpack-plugin');

var backendUrl = options.backendUrl.replace('{ip}', ip.address());
if (platform.hasAny('server')) {
if (stack.hasAny('server')) {
plugins = plugins.concat([

@@ -204,3 +163,3 @@ new webpack.BannerPlugin({

__PERSIST_GQL__: options.persistGraphQL,
__BACKEND_URL__: (platform.target !== 'web' ||
__BACKEND_URL__: (stack.platform !== 'web' ||
url.parse(backendUrl).hostname !== 'localhost') ? "\"" + backendUrl + "\"" : false,

@@ -210,3 +169,3 @@ }),

]);
if (platform.hasAny('web')) {
if (stack.hasAny('web')) {
var ManifestPlugin = requireModule_1.default('webpack-manifest-plugin');

@@ -217,4 +176,4 @@ plugins.push(new ManifestPlugin({

var hasServer = false;
for (var name in nodes) {
if (nodes[name].platform.hasAny('server')) {
for (var name in builders) {
if (builders[name].stack.hasAny('server')) {
hasServer = true;

@@ -243,3 +202,3 @@ break;

}
else if (platform.hasAny(['android', 'ios'])) {
else if (stack.hasAny('react-native')) {
plugins.push(new webpack.SourceMapDevToolPlugin({

@@ -251,4 +210,4 @@ test: /\.(js|jsx|css|bundle)($|\?)/i,

}
if (platform.hasAny('dll')) {
var name = "vendor_" + node.parentName;
if (stack.hasAny('dll')) {
var name = "vendor_" + builder.parentName;
plugins = [

@@ -266,3 +225,3 @@ new webpack.DefinePlugin({

};
var getDepsForNode = function (node, depPlatforms) {
var getDepsForNode = function (builder, depPlatforms) {
var deps = [];

@@ -272,7 +231,7 @@ for (var _i = 0, _a = Object.keys(pkg.dependencies); _i < _a.length; _i++) {

var val = depPlatforms[key];
if (!val || (val.constructor === Array && val.indexOf(node.parentName) >= 0) || val === node.parentName) {
if (!val || (val.constructor === Array && val.indexOf(builder.parentName) >= 0) || val === builder.parentName) {
deps.push(key);
}
}
if (node.platform.hasAny(['android', 'ios'])) {
if (builder.stack.hasAny('react-native')) {
deps = deps.concat(require.resolve('./react-native/react-native-polyfill.js'));

@@ -282,43 +241,6 @@ }

};
var createCssPreprocessorRules = function (dev, platform) {
var createRule;
if (platform.hasAny('server')) {
createRule = function (prep, ext) { return ({
test: new RegExp("." + ext + "$"),
use: dev ? [
{ loader: 'isomorphic-style-loader' },
{ loader: 'css-loader', options: { sourceMap: true } },
{ loader: 'postcss-loader', options: { sourceMap: true } },
{ loader: prep + "-loader", options: { sourceMap: true } }
] :
[{ loader: 'ignore-loader' }],
}); };
}
else if (platform.hasAny('web')) {
createRule = function (prep, ext) { return ({
test: new RegExp("." + ext + "$"),
use: dev ? [
{ loader: 'style-loader' },
{ loader: 'css-loader', options: { sourceMap: true, importLoaders: 1 } },
{ loader: 'postcss-loader', options: { sourceMap: true } },
{ loader: prep + "-loader", options: { sourceMap: true } },
] : ExtractTextPlugin.extract({
fallback: 'style-loader',
use: ['css-loader', 'postcss-loader', prep + "-loader"],
}),
}); };
}
var rules = [];
if (createRule && platform.hasAny('sass')) {
rules.push(createRule('sass', 'scss'));
}
if (createRule && platform.hasAny('less')) {
rules.push(createRule('less', 'less'));
}
return rules;
};
var createConfig = function (node, nodes, dev, opts, depPlatforms) {
var platform = node.platform;
var createConfig = function (builder, builders, dev, opts, depPlatforms) {
var stack = builder.stack;
var options = __assign({}, opts);
if (platform.hasAny('test')) {
if (stack.hasAny('test')) {
options.ssr = false;

@@ -337,7 +259,7 @@ options.persistGraphQL = false;

var config;
if (platform.hasAny(['ios', 'android'])) {
if (stack.hasAny('react-native')) {
useBabel();
}
var plugins = createPlugins(node, nodes, dev, options);
if (platform.hasAny('server')) {
var plugins = createPlugins(builder, builders, dev, options);
if (stack.hasAny('server')) {
var nodeExternals = requireModule_1.default('webpack-node-externals');

@@ -347,3 +269,3 @@ var nodeExternalsFn_1 = nodeExternals({

});
config = __assign({}, createBaseConfig(node, dev, options), { entry: {
config = __assign({}, createBaseConfig(builder, dev, options), { entry: {
index: [

@@ -374,7 +296,7 @@ 'babel-polyfill',

}
else if (platform.hasAny('web')) {
else if (stack.hasAny('web')) {
var backendUrl = options.backendUrl.replace('{ip}', ip.address());
var _a = url.parse(backendUrl), protocol = _a.protocol, host = _a.host;
var backendBaseUrl = protocol + '//' + host;
config = __assign({}, createBaseConfig(node, dev, options), { entry: {
config = __assign({}, createBaseConfig(builder, dev, options), { entry: {
index: [

@@ -395,6 +317,6 @@ 'babel-polyfill',

}
else if (platform.hasAny(['android', 'ios'])) {
else if (stack.hasAny('react-native')) {
var AssetResolver_1 = requireModule_1.default('haul/src/resolvers/AssetResolver');
var HasteResolver = requireModule_1.default('haul/src/resolvers/HasteResolver');
config = __assign({}, createBaseConfig(node, dev, options), { entry: {
config = __assign({}, createBaseConfig(builder, dev, options), { entry: {
index: [

@@ -407,4 +329,4 @@ require.resolve('./react-native/react-native-polyfill.js'),

publicPath: '/',
path: path.resolve(path.join(options.frontendBuildDir, node.name)),
}, devServer: __assign({}, baseDevServerConfig, { hot: false, port: platform.hasAny('android') ? 3010 : 3020 }), plugins: plugins });
path: path.resolve(path.join(options.frontendBuildDir, builder.name)),
}, devServer: __assign({}, baseDevServerConfig, { hot: false, port: stack.hasAny('android') ? 3010 : 3020 }), plugins: plugins });
config.resolve.plugins = [

@@ -414,3 +336,3 @@ new HasteResolver({

}),
new AssetResolver_1({ platform: platform.target, test: mobileAssetTest }),
new AssetResolver_1({ platform: stack.platform, test: mobileAssetTest }),
];

@@ -420,9 +342,8 @@ config.resolve.mainFields = ['react-native', 'browser', 'main'];

else {
throw new Error("Unknown platform target: " + platform.target);
throw new Error("Unknown platform target: " + stack.platform);
}
config.module.rules = config.module.rules.concat(createCssPreprocessorRules(dev, platform));
if (platform.hasAny('dll')) {
var name = "vendor_" + node.parentName;
if (stack.hasAny('dll')) {
var name = "vendor_" + builder.parentName;
config = __assign({}, config, { devtool: '#cheap-module-source-map', entry: {
vendor: getDepsForNode(node, depPlatforms),
vendor: getDepsForNode(builder, depPlatforms),
}, output: {

@@ -429,0 +350,0 @@ filename: name + ".[hash]_dll.js",

@@ -11,4 +11,4 @@ "use strict";

}
executor_1.default(cmd, config.nodes, config.options);
executor_1.default(cmd, config.builders, config.options);
}
//# sourceMappingURL=index.js.map
declare const createConfig: (cmd: any) => {
nodes: {};
builders: {};
options: any;
};
export default createConfig;

@@ -15,16 +15,23 @@ "use strict";

var generator_1 = require("./generator");
var platform_1 = require("./platform");
var Stack_1 = require("./Stack");
var requireModule_1 = require("./requireModule");
var Spin_1 = require("./Spin");
var CssProcessorPlugin_1 = require("./plugins/CssProcessorPlugin");
var ES6Plugin_1 = require("./plugins/ES6Plugin");
var WEBPACK_OVERRIDES_NAME = 'webpack.overrides.js';
var createConfig = function (cmd) {
var nodes = {};
var config = new configRc_1.default();
var builders = {};
var plugins = [
new CssProcessorPlugin_1.default(),
new ES6Plugin_1.default()
];
var config = new configRc_1.default(plugins);
var options = config.options;
var spin = new Spin_1.default(process.argv, config.builders, config.options);
try {
for (var name in config.nodes) {
var node = config.nodes[name];
var platform = node.platform;
var dev = cmd === 'watch' || cmd === 'test';
if (node.roles.indexOf(cmd) < 0)
continue;
var _loop_1 = function (name) {
var builder = config.builders[name];
var stack = builder.stack;
if (builder.roles.indexOf(cmd) < 0)
return "continue";
var overrides = void 0;

@@ -38,17 +45,26 @@ var overridesConfig = options.overridesConfig || WEBPACK_OVERRIDES_NAME;

}
nodes[name] = __assign({}, node, { config: generator_1.default(node, config.nodes, dev, options) });
builders[name] = __assign({}, builder, { config: generator_1.default(builder, config.builders, spin.dev, options) });
config.plugins.forEach(function (plugin) {
builders[name].config = merge(builders[name].config, plugin.configure(builder, spin));
});
if (overrides[name]) {
nodes[name].config = merge(nodes[name].config, overrides[name]);
builders[name].config = merge(builders[name].config, overrides[name]);
}
if (options.webpackDll && !platform.hasAny('server')) {
var dllNode = __assign({}, node);
var dllNodeName = node.name + 'Dll';
dllNode.parentName = node.name;
if (options.webpackDll && !stack.hasAny('server')) {
var dllNode = __assign({}, builder);
var dllNodeName = builder.name + 'Dll';
dllNode.parentName = builder.name;
dllNode.name = dllNodeName;
dllNode.platform = new platform_1.default(dllNode.platform.features, 'dll');
nodes[name].dllConfig = generator_1.default(dllNode, config.nodes, dev, options, overrides.dependencyPlatforms || {});
dllNode.stack = new Stack_1.default(dllNode.stack.technologies, 'dll');
builders[name].dllConfig = generator_1.default(dllNode, config.builders, spin.dev, options, overrides.dependencyPlatforms || {});
config.plugins.forEach(function (plugin) {
builders[name].dllConfig = merge(builders[name].dllConfig, plugin.configure(builder, spin));
});
if (overrides[dllNodeName]) {
nodes[name].dllConfig = merge(nodes[name].dllConfig, overrides[dllNodeName]);
builders[name].dllConfig = merge(builders[name].dllConfig, overrides[dllNodeName]);
}
}
};
for (var name in config.builders) {
_loop_1(name);
}

@@ -59,5 +75,5 @@ }

}
return { nodes: nodes, options: options };
return { builders: builders, options: options };
};
exports.default = createConfig;
//# sourceMappingURL=spin.config.js.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var createConfig_1 = require("./createConfig");
var config = createConfig_1.default('test').nodes;
var config = createConfig_1.default('test').builders;
exports.default = config[Object.keys(config)[0]].config;
//# sourceMappingURL=webpack.config.js.map
{
"name": "spinjs",
"version": "0.1.8",
"version": "0.1.9",
"scripts": {

@@ -42,5 +42,4 @@ "compile": "tsc",

"webpack-merge": "^4.1.0",
"webpack-sources": "^1.0.1",
"webpack-virtual-modules": "^0.1.7"
"webpack-sources": "^1.0.1"
}
}
import * as fs from 'fs';
import requireModule from './requireModule';
import Platform from './platform';
import Stack from './Stack';
import { Builder } from "./Builder";
const pkg = requireModule('./package.json');

@@ -11,18 +12,21 @@

options: any;
nodes: Object;
builders: { [x: string]: Builder };
plugins: Object[];
constructor() {
constructor(plugins) {
const config = fs.existsSync(SPIN_CONFIG_NAME) ?
JSON.parse(fs.readFileSync(SPIN_CONFIG_NAME).toString()) : pkg.spin;
const nodes = {};
for (let name of Object.keys(config.nodes)) {
const nodeVal = config.nodes[name];
const node: any = typeof nodeVal === 'object' ? {...nodeVal} : {features: nodeVal};
node.name = name;
node.platform = new Platform(config.options.features, typeof node === 'object' ? node.features : node);
node.roles = node.roles || ['build', 'watch'];
nodes[node.name] = node;
const builders: { [x: string]: Builder } = {};
for (let name of Object.keys(config.builders)) {
const builderVal = config.builders[name];
const builder: any = (typeof builderVal === 'object' && builderVal.constructor !== Array) ?
{...builderVal} : {stack: builderVal};
builder.name = name;
builder.stack = new Stack(config.options.stack, typeof builder === 'object' ? builder.stack : builder);
builder.roles = builder.roles || ['build', 'watch'];
builders[builder.name] = builder;
}
this.nodes = nodes;
this.builders = builders;
this.options = {...config.options};
this.plugins = plugins.concat((config.plugins || []).map(name => new (require(name))));
const options: any = this.options;

@@ -29,0 +33,0 @@

@@ -14,7 +14,7 @@ import * as http from 'http';

import * as VirtualModules from 'webpack-virtual-modules';
import requireModule from './requireModule';
import liveReloadMiddleware from './react-native/liveReloadMiddleware';
const VirtualModules = requireModule('webpack-virtual-modules');
const expoPorts = {};

@@ -124,6 +124,6 @@

function startClientWebpack(hasBackend, watch, node, options) {
function startClientWebpack(hasBackend, watch, builder, options) {
const webpack = requireModule('webpack');
const config = node.config;
const config = builder.config;

@@ -148,5 +148,5 @@ const logger = minilog(`webpack-for-${config.name}`);

config.plugins.push(new webpack.NoEmitOnErrorsPlugin());
startWebpackDevServer(hasBackend, node, options, reporter, logger);
startWebpackDevServer(hasBackend, builder, options, reporter, logger);
} else {
if (node.platform.target !== 'web') {
if (builder.stack.platform !== 'web') {
config.plugins.push(new MobileAssetsPlugin());

@@ -171,4 +171,4 @@ }

function startServerWebpack(watch, node, options) {
const config = node.config;
function startServerWebpack(watch, builder, options) {
const config = builder.config;
const logger = minilog(`webpack-for-${config.name}`);

@@ -244,9 +244,9 @@

function openFrontend(node) {
function openFrontend(builder) {
const openurl = requireModule('openurl');
try {
if (node.platform.target === 'web' && node.openBrowser !== false) {
openurl.open(`http://${ip.address()}:${node.config.devServer.port}`);
} else if (['android', 'ios'].indexOf(node.platform.target) >= 0) {
startExpoProject(node.config, node.platform.target);
if (builder.stack.hasAny('web') && builder.openBrowser !== false) {
openurl.open(`http://${ip.address()}:${builder.config.devServer.port}`);
} else if (builder.stack.hasAny('react-native')) {
startExpoProject(builder.config, builder.stack.platform);
}

@@ -267,3 +267,3 @@ } catch (e) {

function startWebpackDevServer(hasBackend, node, options, reporter, logger) {
function startWebpackDevServer(hasBackend, builder, options, reporter, logger) {
const webpack = requireModule('webpack');

@@ -278,4 +278,4 @@ const connect = requireModule('connect');

const config = node.config;
const platform = node.platform.target;
const config = builder.config;
const platform = builder.stack.platform;

@@ -288,3 +288,3 @@ const configOutputPath = config.output.path;

let vendorHashesJson, vendorSourceListMap, vendorSource, vendorMap;
if (options.webpackDll && node.dllConfig) {
if (options.webpackDll && builder.dllConfig) {
const name = `vendor_${platform}`;

@@ -333,3 +333,3 @@ const jsonPath = path.join(options.dllBuildDir, `${name}_dll.json`);

});
if (options.webpackDll && node.dllConfig && platform !== 'web') {
if (options.webpackDll && builder.dllConfig && platform !== 'web') {
compiler.plugin('after-compile', (compilation, callback) => {

@@ -353,3 +353,3 @@ _.each(compilation.chunks, chunk => {

if (options.webpackDll && node.dllConfig && platform === 'web' && !hasBackend) {
if (options.webpackDll && builder.dllConfig && platform === 'web' && !hasBackend) {
compiler.plugin('after-compile', (compilation, callback) => {

@@ -389,3 +389,3 @@ compilation.assets[vendorHashesJson.name] = vendorSource;

frontendFirstStart = false;
openFrontend(node);
openFrontend(builder);
}

@@ -666,7 +666,7 @@ });

function startWebpack(targets, watch, node, options) {
if (node.platform.target === 'server') {
startServerWebpack(watch, node, options);
function startWebpack(platforms, watch, builder, options) {
if (builder.stack.platform === 'server') {
startServerWebpack(watch, builder, options);
} else {
startClientWebpack(!!targets.server, watch, node, options);
startClientWebpack(!!platforms.server, watch, builder, options);
}

@@ -744,3 +744,3 @@ }

const execute = (cmd, nodes: Object, options) => {
const execute = (cmd, builders: Object, options) => {
if (cmd === 'exp') {

@@ -762,10 +762,10 @@ startExp(options);

const watch = cmd === 'watch';
const targets = {};
for (let name in nodes) {
const node = nodes[name];
const platform = node.platform;
targets[platform.target] = true;
if (platform.hasAny('ios')) {
const platforms = {};
for (let name in builders) {
const builder = builders[name];
const stack = builder.stack;
platforms[stack.platform] = true;
if (stack.hasAny('react-native') && stack.hasAny('ios')) {
expoPlatforms.push('ios');
} else if (platform.hasAny('android')) {
} else if (stack.hasAny('react-native') && stack.hasAny('android')) {
expoPlatforms.push('android');

@@ -780,11 +780,11 @@ }

prepareExpoPromise.then(() => {
for (let name in nodes) {
const node = nodes[name];
const platform = node.platform;
if (platform.hasAny(['dll', 'test']))
for (let name in builders) {
const builder = builders[name];
const stack = builder.stack;
if (stack.hasAny(['dll', 'test']))
continue;
const prepareDllPromise: PromiseLike<any> = (cmd === 'watch' && options.webpackDll && node.dllConfig) ?
buildDll(platform.target, node.dllConfig, options) : Promise.resolve();
const prepareDllPromise: PromiseLike<any> = (cmd === 'watch' && options.webpackDll && builder.dllConfig) ?
buildDll(stack.platform, builder.dllConfig, options) : Promise.resolve();
prepareDllPromise.then(() =>
startWebpack(targets, watch, node, options));
startWebpack(platforms, watch, builder, options));
}

@@ -791,0 +791,0 @@ });

@@ -25,35 +25,7 @@ import * as path from 'path';

const createBaseConfig = (node, dev, options) => {
const platform = node.platform;
const babelRule = {
loader: requireModule.resolve('babel-loader'),
options: {
cacheDirectory: dev,
presets: [
requireModule.resolve('babel-preset-react'),
[requireModule.resolve('babel-preset-es2015'), {'modules': false}],
requireModule.resolve('babel-preset-stage-0')],
plugins: [
requireModule.resolve('babel-plugin-transform-runtime'),
requireModule.resolve('babel-plugin-transform-decorators-legacy'),
requireModule.resolve('babel-plugin-transform-class-properties'),
[requireModule.resolve('babel-plugin-styled-components'), {'ssr': options.ssr}],
].concat(dev && options.reactHotLoader ? [requireModule.resolve('react-hot-loader/babel')] : []),
only: ['*.js', '*.jsx'],
},
};
const createBaseConfig = (builder, dev, options) => {
const stack = builder.stack;
const reactNativeRule = {
loader: requireModule.resolve('babel-loader'),
options: {
cacheDirectory: dev,
presets: [requireModule.resolve('babel-preset-react-native')],
plugins: [
requireModule.resolve('haul/src/utils/fixRequireIssues'),
],
},
};
const baseConfig: any = {
name: node.name,
name: builder.name,
devtool: dev ? '#cheap-module-source-map' : '#source-map',

@@ -64,17 +36,6 @@ module: {

test: /\.jsx?$/,
exclude: platform.hasAny(['ios', 'android']) ?
exclude: (stack.hasAny('react-native')) ?
/node_modules\/(?!react-native|@expo|expo|lottie-react-native|haul|pretty-format|react-navigation)$/ :
/node_modules/,
use: [
(platform.hasAny(['ios', 'android']) ?
function (req) {
let result;
if (req.resource.indexOf('node_modules') >= 0) {
result = reactNativeRule;
} else {
result = babelRule;
}
return result;
} :
babelRule) as any,
].concat(

@@ -102,5 +63,5 @@ options.persistGraphQL ?

resolve: {
extensions: platform.hasAny('server') ?
extensions: stack.hasAny('server') ?
[`.web.js`, `.web.jsx`, '.js', '.jsx'] :
[`.${platform.target}.js`, `.${platform.target}.jsx`, '.native.js', '.native.jsx', '.js', '.jsx'],
[`.${stack.platform}.js`, `.${stack.platform}.jsx`, '.native.js', '.native.jsx', '.js', '.jsx'],
modules: [path.join(process.cwd(), 'node_modules'), 'node_modules'],

@@ -114,3 +75,3 @@ },

if (platform.hasAny(['web', 'server'])) {
if (stack.hasAny(['web', 'server'])) {
baseConfig.resolve.alias = {

@@ -133,3 +94,3 @@ 'react-native': 'react-native-web',

]);
} else if (platform.hasAny(['android', 'ios'])) {
} else if (stack.hasAny('react-native')) {
baseConfig.module.rules = baseConfig.module.rules.concat([

@@ -140,3 +101,3 @@ {

loader: require.resolve('./react-native/assetLoader'),
query: {platform: platform.target, root: path.resolve('.'), bundle: false},
query: {platform: stack.platform, root: path.resolve('.'), bundle: false},
},

@@ -152,6 +113,6 @@ },

const createPlugins = (node, nodes: Object, dev, options) => {
const platform = node.platform;
const createPlugins = (builder, builders: Object, dev, options) => {
const stack = builder.stack;
const webpack = requireModule('webpack');
const buildNodeEnv = dev ? (platform.hasAny('test') ? 'test' : 'development') : 'production';
const buildNodeEnv = dev ? (stack.hasAny('test') ? 'test' : 'development') : 'production';

@@ -187,3 +148,3 @@ if (!persistPlugins) {

if (platform.hasAny('server')) {
if (stack.hasAny('server')) {
plugins = plugins.concat([

@@ -209,3 +170,3 @@ new webpack.BannerPlugin({

__BACKEND_URL__: (
platform.target !== 'web' ||
stack.platform !== 'web' ||
url.parse(backendUrl).hostname !== 'localhost'

@@ -217,3 +178,3 @@ ) ? `"${backendUrl}"` : false,

if (platform.hasAny('web')) {
if (stack.hasAny('web')) {
const ManifestPlugin = requireModule('webpack-manifest-plugin');

@@ -224,4 +185,4 @@ plugins.push(new ManifestPlugin({

let hasServer = false;
for (let name in nodes) {
if (nodes[name].platform.hasAny('server')) {
for (let name in builders) {
if (builders[name].stack.hasAny('server')) {
hasServer = true;

@@ -250,3 +211,3 @@ break;

}
} else if (platform.hasAny(['android', 'ios'])) {
} else if (stack.hasAny('react-native')) {
plugins.push(new webpack.SourceMapDevToolPlugin({

@@ -259,4 +220,4 @@ test: /\.(js|jsx|css|bundle)($|\?)/i,

if (platform.hasAny('dll')) {
const name = `vendor_${node.parentName}`;
if (stack.hasAny('dll')) {
const name = `vendor_${builder.parentName}`;
plugins = [

@@ -275,11 +236,11 @@ new webpack.DefinePlugin({

const getDepsForNode = (node, depPlatforms) => {
const getDepsForNode = (builder, depPlatforms) => {
let deps = [];
for (let key of Object.keys(pkg.dependencies)) {
const val = depPlatforms[key];
if (!val || (val.constructor === Array && val.indexOf(node.parentName) >= 0) || val === node.parentName) {
if (!val || (val.constructor === Array && val.indexOf(builder.parentName) >= 0) || val === builder.parentName) {
deps.push(key);
}
}
if (node.platform.hasAny(['android', 'ios'])) {
if (builder.stack.hasAny('react-native')) {
deps = deps.concat(require.resolve('./react-native/react-native-polyfill.js'));

@@ -290,49 +251,8 @@ }

const createCssPreprocessorRules = (dev, platform): Array<Object> => {
let createRule;
const createConfig = (builder, builders, dev, opts, depPlatforms?) => {
const stack = builder.stack;
if (platform.hasAny('server')) {
createRule = (prep, ext) => ({
test: new RegExp(`\.${ext}$`),
use: dev ? [
{loader: 'isomorphic-style-loader'},
{loader: 'css-loader', options: {sourceMap: true}},
{loader: 'postcss-loader', options: {sourceMap: true}},
{loader: `${prep}-loader`, options: {sourceMap: true}}] :
[{loader: 'ignore-loader'}],
});
} else if (platform.hasAny('web')) {
createRule = (prep, ext) => ({
test: new RegExp(`\.${ext}$`),
use: dev ? [
{loader: 'style-loader'},
{loader: 'css-loader', options: {sourceMap: true, importLoaders: 1}},
{loader: 'postcss-loader', options: {sourceMap: true}},
{loader: `${prep}-loader`, options: {sourceMap: true}},
] : ExtractTextPlugin.extract({
fallback: 'style-loader',
use: ['css-loader', 'postcss-loader', `${prep}-loader`],
}),
});
}
const rules = [];
if (createRule && platform.hasAny('sass')) {
rules.push(createRule('sass', 'scss'));
}
if (createRule && platform.hasAny('less')) {
rules.push(createRule('less', 'less'));
}
return rules;
};
const createConfig = (node, nodes, dev, opts, depPlatforms?) => {
const platform = node.platform;
const options: any = {...opts};
if (platform.hasAny('test')) {
if (stack.hasAny('test')) {
options.ssr = false;

@@ -354,8 +274,8 @@ options.persistGraphQL = false;

if (platform.hasAny(['ios', 'android'])) {
if (stack.hasAny('react-native')) {
useBabel();
}
const plugins = createPlugins(node, nodes, dev, options);
if (platform.hasAny('server')) {
const plugins = createPlugins(builder, builders, dev, options);
if (stack.hasAny('server')) {
const nodeExternals = requireModule('webpack-node-externals');

@@ -366,3 +286,3 @@ const nodeExternalsFn = nodeExternals({

config = {
...createBaseConfig(node, dev, options),
...createBaseConfig(builder, dev, options),
entry: {

@@ -398,3 +318,3 @@ index: [

};
} else if (platform.hasAny('web')) {
} else if (stack.hasAny('web')) {
const backendUrl = options.backendUrl.replace('{ip}', ip.address());

@@ -405,3 +325,3 @@ const { protocol, host } = url.parse(backendUrl);

config = {
...createBaseConfig(node, dev, options),
...createBaseConfig(builder, dev, options),
entry: {

@@ -430,7 +350,7 @@ index: [

};
} else if (platform.hasAny(['android', 'ios'])) {
} else if (stack.hasAny('react-native')) {
const AssetResolver = requireModule('haul/src/resolvers/AssetResolver');
const HasteResolver = requireModule('haul/src/resolvers/HasteResolver');
config = {
...createBaseConfig(node, dev, options),
...createBaseConfig(builder, dev, options),
entry: {

@@ -445,3 +365,3 @@ index: [

publicPath: '/',
path: path.resolve(path.join(options.frontendBuildDir, node.name)),
path: path.resolve(path.join(options.frontendBuildDir, builder.name)),
},

@@ -451,3 +371,3 @@ devServer: {

hot: false,
port: platform.hasAny('android') ? 3010 : 3020,
port: stack.hasAny('android') ? 3010 : 3020,
},

@@ -460,12 +380,11 @@ plugins,

}),
new AssetResolver({platform: platform.target, test: mobileAssetTest}),
new AssetResolver({platform: stack.platform, test: mobileAssetTest}),
];
config.resolve.mainFields = ['react-native', 'browser', 'main'];
} else {
throw new Error(`Unknown platform target: ${platform.target}`);
throw new Error(`Unknown platform target: ${stack.platform}`);
}
config.module.rules = config.module.rules.concat(createCssPreprocessorRules(dev, platform));
if (platform.hasAny('dll')) {
const name = `vendor_${node.parentName}`;
if (stack.hasAny('dll')) {
const name = `vendor_${builder.parentName}`;
config = {

@@ -475,3 +394,3 @@ ...config,

entry: {
vendor: getDepsForNode(node, depPlatforms),
vendor: getDepsForNode(builder, depPlatforms),
},

@@ -478,0 +397,0 @@ output: {

@@ -10,3 +10,3 @@ import createConfig from './createConfig';

}
execute(cmd, config.nodes, config.options);
execute(cmd, config.builders, config.options);
}

@@ -6,4 +6,8 @@ import * as fs from 'fs';

import generateConfig from './generator';
import Platform from './platform';
import Stack from './Stack';
import requireModule from './requireModule';
import Spin from "./Spin";
import { SpinPlugin } from "./SpinPlugin";
import CssProcessorPlugin from "./plugins/CssProcessorPlugin";
import ES6Plugin from "./plugins/ES6Plugin";

@@ -13,12 +17,16 @@ const WEBPACK_OVERRIDES_NAME = 'webpack.overrides.js';

const createConfig = cmd => {
let nodes = {};
let builders = {};
const config = new ConfigRc();
const plugins = [
new CssProcessorPlugin(),
new ES6Plugin()
];
const config = new ConfigRc(plugins);
const options = config.options;
const spin = new Spin(process.argv, config.builders, config.options);
try {
for (let name in config.nodes) {
const node = config.nodes[name];
const platform = node.platform;
const dev = cmd === 'watch' || cmd === 'test';
if (node.roles.indexOf(cmd) < 0)
for (let name in config.builders) {
const builder = config.builders[name];
const stack = builder.stack;
if (builder.roles.indexOf(cmd) < 0)
continue;

@@ -32,15 +40,21 @@ let overrides;

}
nodes[name] = { ...node, config: generateConfig(node, config.nodes, dev, options) };
builders[name] = { ...builder, config: generateConfig(builder, config.builders, spin.dev, options) };
config.plugins.forEach((plugin: SpinPlugin) => {
builders[name].config = merge(builders[name].config, plugin.configure(builder, spin));
});
if (overrides[name]) {
nodes[name].config = merge(nodes[name].config, overrides[name]);
builders[name].config = merge(builders[name].config, overrides[name]);
}
if (options.webpackDll && !platform.hasAny('server')) {
const dllNode: any = {...node};
const dllNodeName = node.name + 'Dll';
dllNode.parentName = node.name;
if (options.webpackDll && !stack.hasAny('server')) {
const dllNode: any = {...builder};
const dllNodeName = builder.name + 'Dll';
dllNode.parentName = builder.name;
dllNode.name = dllNodeName;
dllNode.platform = new Platform(dllNode.platform.features, 'dll');
nodes[name].dllConfig = generateConfig(dllNode, config.nodes, dev, options, overrides.dependencyPlatforms || {});
dllNode.stack = new Stack(dllNode.stack.technologies, 'dll');
builders[name].dllConfig = generateConfig(dllNode, config.builders, spin.dev, options, overrides.dependencyPlatforms || {});
config.plugins.forEach((plugin: SpinPlugin) => {
builders[name].dllConfig = merge(builders[name].dllConfig, plugin.configure(builder, spin));
});
if (overrides[dllNodeName]) {
nodes[name].dllConfig = merge(nodes[name].dllConfig, overrides[dllNodeName]);
builders[name].dllConfig = merge(builders[name].dllConfig, overrides[dllNodeName]);
}

@@ -53,5 +67,5 @@ }

return { nodes, options };
return { builders, options };
};
export default createConfig;
import createConfig from './createConfig';
const config = createConfig('test').nodes;
const config = createConfig('test').builders;
export default config[Object.keys(config)[0]].config;

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc