diff --git a/packages/build/src/build/neutrino/react.js b/packages/build/src/build/neutrino/react.js index 5001d02..dccc664 100644 --- a/packages/build/src/build/neutrino/react.js +++ b/packages/build/src/build/neutrino/react.js @@ -1,4 +1,4 @@ -const {dirname} = require('path'); +const {dirname, join} = require('path'); const react = require('@neutrinojs/react'); diff --git a/packages/core/src/build.js b/packages/core/src/build.js index 6bd8d79..2a1f12e 100644 --- a/packages/core/src/build.js +++ b/packages/core/src/build.js @@ -8,6 +8,7 @@ import { import Latus from './latus'; import R from './require'; +import root from './root'; const { LATUS_BABEL_CONFIG = require.resolve('@latus/build/build/.babelrc.js'), @@ -98,9 +99,16 @@ export default (latus) => (neutrino) => { .options({ source: source.join('\n'), }); - neutrino.config - .entry('index') - .add('@latus/core/start'); + // const entries = Array.from( + // neutrino.config + // .entryPoints.store.get('index') + // .store + // ); + // eslint-disable-next-line no-param-reassign + // neutrino.options.mains.index.entry = '@latus/core/start'; + // neutrino.config + // .entry('index') + // .add('@latus/core/start'); const mocha = R('@neutrinojs/mocha'); mocha()(neutrino); if (process.env.LATUS_LINTING) { @@ -132,14 +140,13 @@ export default (latus) => (neutrino) => { neutrino.config.externals(nodeExternals({ allowlist, })); - const entries = neutrino.config.entryPoints.store.get('index').store; + const entries = neutrino.config.entry('index'); if (entries.has(`${R.resolve('webpack/hot/poll')}?1000`)) { entries.delete(`${R.resolve('webpack/hot/poll')}?1000`); - const entriesArray = Array.from(entries); - entriesArray.unshift('webpack/hot/signal'); - // eslint-disable-next-line no-param-reassign - neutrino.config.entryPoints.store.get('index').store = new Set(entriesArray); + entries.add('webpack/hot/signal'); } + entries.delete(join(root, 'src', 'index')); + entries.add('@latus/core/start'); if (process.argv.find((arg) => '--start-server' === arg)) { neutrino.config .plugin('start-server') diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 7d7502b..46cf688 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -12,6 +12,7 @@ export {decorateWithLatus, gatherWithLatus, default as gather} from './gather'; export {default as Middleware} from './middleware'; export {default as Latus} from './latus'; export {default as require} from './require'; +export {default as root} from './root'; export * from './string'; export const Class = class {}; diff --git a/packages/core/src/latus.js b/packages/core/src/latus.js index cf123e5..54107b7 100644 --- a/packages/core/src/latus.js +++ b/packages/core/src/latus.js @@ -1,14 +1,16 @@ +import fs from 'fs'; import {join} from 'path'; import D from 'debug'; +import yaml from 'js-yaml'; import flatten from 'lodash.flatten'; import get from 'lodash.get'; import set from 'lodash.set'; import without from 'lodash.without'; import Middleware from './middleware'; -import readConfig from './read-config'; import R from './require'; +import root from './root'; const debug = D('@latus/core/latus'); @@ -56,7 +58,9 @@ export default class Latus { debug('latus config: %O', this.config); } - static create(config = readConfig()) { + static create() { + const path = join(root, 'latus.yml'); + const config = yaml.safeLoad(fs.readFileSync(path, 'utf8')); const paths = flatten( Object.keys(config).map((path) => [ this.runtimePath(path), @@ -221,18 +225,11 @@ export default class Latus { static runtimePath(path) { try { - const local = join(process.cwd(), 'src', path); - R.resolve(local); - return local; + R.resolve(path); + return path; } catch (error) { - try { - R.resolve(path); - return path; - } - catch (error) { - return ''; - } + return ''; } } diff --git a/packages/core/src/read-config.js b/packages/core/src/read-config.js deleted file mode 100644 index ece9c9a..0000000 --- a/packages/core/src/read-config.js +++ /dev/null @@ -1,8 +0,0 @@ -import fs from 'fs'; -import yaml from 'js-yaml'; - -const readConfig = (path = `${process.cwd()}/latus.yml`) => ( - yaml.safeLoad(fs.readFileSync(path, 'utf8')) -); - -export default readConfig; diff --git a/packages/core/src/root.js b/packages/core/src/root.js new file mode 100644 index 0000000..eb47e54 --- /dev/null +++ b/packages/core/src/root.js @@ -0,0 +1 @@ +export default process.env.LATUS_ROOT || process.cwd(); diff --git a/packages/db/src/docker.js b/packages/db/src/docker.js index a377963..f6ec9c4 100644 --- a/packages/db/src/docker.js +++ b/packages/db/src/docker.js @@ -1,5 +1,7 @@ import {spawn, spawnSync} from 'child_process'; +import {join} from 'path'; +import {root} from '@latus/core'; import mkdirp from 'mkdirp'; export default function createDockerContainer(latus) { @@ -24,7 +26,7 @@ export default function createDockerContainer(latus) { '-e', `MYSQL_ROOT_PASSWORD=${password}`, ]; if ('cached' === docker) { - const datadir = `${process.cwd()}/node_modules/.cache/@latus/db/docker`; + const datadir = join(root, 'node_modules', '.cache', '@latus', 'db', 'docker'); mkdirp.sync(datadir); args.push( '-v', diff --git a/packages/http/src/build/.neutrinorc.js b/packages/http/src/build/.neutrinorc.js index 706c779..09e4369 100644 --- a/packages/http/src/build/.neutrinorc.js +++ b/packages/http/src/build/.neutrinorc.js @@ -11,7 +11,7 @@ module.exports = (async () => { const latus = Latus.create(); const config = { use: [ - targets(), + targets(latus), web(), await virtual(latus), ], diff --git a/packages/http/src/build/neutrino/targets.js b/packages/http/src/build/neutrino/targets.js index d037ad5..8a2ae12 100644 --- a/packages/http/src/build/neutrino/targets.js +++ b/packages/http/src/build/neutrino/targets.js @@ -1,42 +1,29 @@ /* eslint-disable no-param-reassign */ -const {isAbsolute, join} = require('path'); +const {join} = require('path'); const fs = require('fs'); -const {require: R} = require('@latus/core'); -const {DefinePlugin} = require('webpack'); +const {require: R, root} = require('@latus/core'); +const {EnvironmentPlugin} = require('webpack'); -module.exports = () => (neutrino) => { - const copy = R('@neutrinojs/copy'); - copy({ - patterns: [{ - from: join(neutrino.options.root, 'src', 'assets'), - to: 'http', - }], - })(neutrino); +module.exports = (latus) => (neutrino) => { neutrino.config .plugin('environment') - .use(DefinePlugin, [{ - 'process.env.SIDE': JSON.stringify('client'), + .use(EnvironmentPlugin, [{ + SIDE: 'client', }]); neutrino.config.resolve.modules.merge([ - join(process.cwd(), 'node_modules'), + join(root, 'node_modules'), 'node_modules', ]); neutrino.options.appRoot = neutrino.options.root; neutrino.options.appSource = join(neutrino.options.appRoot, 'src'); - const root = join(__dirname, '..', '..'); - neutrino.options.root = fs.realpathSync(root); + neutrino.options.root = fs.realpathSync(join(__dirname, '..', '..')); neutrino.options.source = 'client'; neutrino.options.mains.index = 'entry'; neutrino.options.mains.tests = { entry: './client/tests', title: 'Mocha tests', }; - const output = 'build'; - neutrino.options.output = join( - isAbsolute(output) - ? output - : join(process.cwd(), output), - 'http', - ); + const {build} = latus.get('@latus/http/server'); + neutrino.options.output = join(root, build); }; diff --git a/packages/http/src/build/neutrino/web.js b/packages/http/src/build/neutrino/web.js index dd42dc2..3578133 100644 --- a/packages/http/src/build/neutrino/web.js +++ b/packages/http/src/build/neutrino/web.js @@ -1,4 +1,5 @@ -/* eslint-disable no-param-reassign */ +const {join} = require('path'); + const web = require('@neutrinojs/web'); const { @@ -18,7 +19,6 @@ module.exports = () => { template: `${neutrino.options.root}/client/index.ejs`, }, })(neutrino); - neutrino.config.module.rule('compile').include.add(`${process.cwd()}/src`); }; middleware.isWebMiddleware = true; return middleware; diff --git a/packages/http/src/http.js b/packages/http/src/http.js index 19966e4..4be6ede 100644 --- a/packages/http/src/http.js +++ b/packages/http/src/http.js @@ -2,7 +2,12 @@ import {createReadStream} from 'fs'; import {createServer, ServerResponse} from 'http'; import {dirname, join} from 'path'; -import {arrayFlatten, Latus, require as R} from '@latus/core'; +import { + arrayFlatten, + Latus, + require as R, + root, +} from '@latus/core'; import express from 'express'; // eslint-disable-next-line import/no-extraneous-dependencies import httpProxy from 'http-proxy'; @@ -42,7 +47,7 @@ export const createHttpServer = async (latus) => { routes.forEach(({method, path, handler}) => app[method](path, requestMiddleware, handler)); // Serve latus. app.get('/latus.config.js', requestMiddleware, configMiddleware(latus)); - app.use(express.static(join(process.cwd(), build))); + app.use(express.static(join(root, build))); // eslint-disable-next-line no-eval if ('production' !== eval('process.env.NODE_ENV')) { const middlewares = Object.keys(await clientPlugins(latus)) @@ -89,7 +94,7 @@ export const createHttpServer = async (latus) => { app.use(express.static(join(__dirname, 'client'))); app.get('*', async (req, res) => { res.setHeader('Content-Type', 'text/html; charset=UTF-8'); - const stream = createReadStream(join(process.cwd(), build, 'index.html')); + const stream = createReadStream(join(root, build, 'index.html')); stream.pipe(res); }); } diff --git a/packages/http/src/server.js b/packages/http/src/server.js index 727f13c..d81e7c3 100644 --- a/packages/http/src/server.js +++ b/packages/http/src/server.js @@ -1,14 +1,14 @@ import {spawn} from 'child_process'; import {join} from 'path'; -import {require as R} from '@latus/core'; +import {require as R, root} from '@latus/core'; import {createHttpServer} from './http'; const { - LATUS_EXCLUDE_BUILD = '', + LATUS_ONLY_BUILD = '', } = process.env; -const excludeBuilds = LATUS_EXCLUDE_BUILD.split(',').map((name) => name.trim()); +const onlyBuilds = LATUS_ONLY_BUILD.split(',').map((name) => name.trim()); export default { hooks: { @@ -29,8 +29,8 @@ export default { // eslint-disable-next-line no-param-reassign configs.http = R(join(__dirname, 'build/.neutrinorc.js')); } - else if (-1 === excludeBuilds.indexOf('http')) { - const binary = `$(npm --prefix ${process.cwd()} bin)/webpack-dev-server`; + else if (-1 !== onlyBuilds.indexOf('http')) { + const binary = `$(npm --prefix ${root} bin)/webpack-dev-server`; const config = `${__dirname}/build/webpack.config.js`; const options = { env: { @@ -46,7 +46,7 @@ export default { } }, '@latus/core/config': () => ({ - build: 'build/http', + build: join('build', 'http'), devPort: 32341, devPublic: undefined, host: '0.0.0.0', diff --git a/packages/react/src/build/http.js b/packages/react/src/build/http.js index a79fa95..32a04b2 100644 --- a/packages/react/src/build/http.js +++ b/packages/react/src/build/http.js @@ -1,21 +1,8 @@ const react = require('./react'); -module.exports = (config, latus) => { +module.exports = (config) => { const webIndex = config.use.findIndex((m) => m.isWebMiddleware); if (-1 !== webIndex) { - config.use.splice(webIndex, 1, react(latus)); + config.use.splice(webIndex, 1, react()); } - config.use.push((neutrino) => { - [ - 'components', - 'context', - 'fonts', - 'hooks', - 'images', - 'scss', - ].forEach((path) => { - neutrino.config.resolve.alias - .set(path, `${process.cwd()}/src/react/${path}`); - }); - }); }; diff --git a/packages/react/src/build/react.js b/packages/react/src/build/react.js index 3457ba9..2e7238d 100644 --- a/packages/react/src/build/react.js +++ b/packages/react/src/build/react.js @@ -1,8 +1,4 @@ -const { - dirname, - isAbsolute, - join, -} = require('path'); +const {dirname} = require('path'); const {require: R} = require('@latus/core'); const react = require('@neutrinojs/react'); @@ -13,7 +9,7 @@ const { LATUS_POSTCSS_CONFIG = resolve('@latus/build/build/postcss.config.js'), } = process.env; -module.exports = (latus) => (neutrino) => { +module.exports = () => (neutrino) => { react({ babel: { configFile: LATUS_BABEL_CONFIG, @@ -47,12 +43,4 @@ module.exports = (latus) => (neutrino) => { ], }, })(neutrino); - const {entry} = latus.get('@latus/react'); - neutrino.config.module - .rule('compile').include - .add( - isAbsolute(entry) - ? entry - : join(neutrino.options.appSource, entry), - ); }; diff --git a/packages/react/src/index.js b/packages/react/src/index.js index 9b5c356..9e91443 100644 --- a/packages/react/src/index.js +++ b/packages/react/src/index.js @@ -12,7 +12,6 @@ export default { hooks: { '@latus/core/config': () => ({ providers: [], - entry: './react', }), }, }; diff --git a/packages/react/src/server.js b/packages/react/src/server.js index 9a1e63e..9c8b270 100644 --- a/packages/react/src/server.js +++ b/packages/react/src/server.js @@ -2,13 +2,8 @@ const httpBuild = require('./build/http'); export default { hooks: { - '@latus/http/build': (config, latus) => { - httpBuild(config, latus); + '@latus/http/build': (config) => { + httpBuild(config); }, - '@latus/http/plugins': (req, { - config: {'@latus/react': {entry}}, - }) => ({ - [entry]: {}, - }), }, }; diff --git a/packages/redis/package.json b/packages/redis/package.json index 2c53925..356b565 100644 --- a/packages/redis/package.json +++ b/packages/redis/package.json @@ -22,6 +22,7 @@ "test.js.map" ], "dependencies": { + "@latus/core": "^2.0.0", "autoprefixer": "^9.8.6", "connect-redis": "^5.0.0", "debug": "4.3.1", diff --git a/packages/redis/src/docker.js b/packages/redis/src/docker.js index a2e0d8c..4abfb36 100644 --- a/packages/redis/src/docker.js +++ b/packages/redis/src/docker.js @@ -1,7 +1,8 @@ -import D from 'debug'; - import {spawn, spawnSync} from 'child_process'; +import {join} from 'path'; +import {root} from '@latus/core'; +import D from 'debug'; import mkdirp from 'mkdirp'; import createClient from './create-client'; @@ -23,7 +24,7 @@ export default async function createDockerContainer(latus) { '-p', `${port}:6379`, ]; if ('cached' === docker) { - const datadir = `${process.cwd()}/node_modules/.cache/@latus/redis/docker`; + const datadir = join(root, 'node_modules', '.cache', '@latus', 'redis', 'docker'); mkdirp.sync(datadir); args.push( '-v', diff --git a/packages/redis/yarn.lock b/packages/redis/yarn.lock index 8598ae3..be6d5bb 100644 --- a/packages/redis/yarn.lock +++ b/packages/redis/yarn.lock @@ -300,6 +300,20 @@ webpack "^4" webpack-cli "^3" +"@latus/core@^2.0.0": + version "2.0.0" + resolved "http://npm.cha0sdev/@latus%2fcore/-/core-2.0.0.tgz#12a0f3c11c9832a60e6726ea74ce0ae9b45e9faf" + integrity sha512-JMxgl8Qsvby2OKtzXEs7cjamvsgVxEbJXbjebsmDl+J9Cq5513/4Xpq37EYYvT6FEZpoHFoIkQsaG+89JQzTwg== + dependencies: + autoprefixer "^9.8.6" + debug "4.3.1" + js-yaml "3.14.0" + lodash.flatten "^4.4.0" + lodash.get "^4.4.2" + lodash.set "^4.3.2" + mkdirp "^1.0.4" + webpack-virtual-modules "^0.4.1" + "@neutrinojs/airbnb@^9.4.0": version "9.5.0" resolved "http://npm.cha0sdev/@neutrinojs%2fairbnb/-/airbnb-9.5.0.tgz#87cfc09c4237a2da632c80d7b91ad447a5e0b3f2" @@ -2794,6 +2808,14 @@ javascript-stringify@^2.0.1: resolved "http://npm.cha0sdev/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@3.14.0: + version "3.14.0" + resolved "http://npm.cha0sdev/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@4.0.0: version "4.0.0" resolved "http://npm.cha0sdev/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" @@ -2975,11 +2997,26 @@ lodash.clonedeep@^4.5.0: resolved "http://npm.cha0sdev/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "http://npm.cha0sdev/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "http://npm.cha0sdev/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + lodash.omit@^4.5.0: version "4.5.0" resolved "http://npm.cha0sdev/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= +lodash.set@^4.3.2: + version "4.3.2" + resolved "http://npm.cha0sdev/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= + lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: version "4.17.20" resolved "http://npm.cha0sdev/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" @@ -4837,6 +4874,11 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1: source-list-map "^2.0.0" source-map "~0.6.1" +webpack-virtual-modules@^0.4.1: + version "0.4.2" + resolved "http://npm.cha0sdev/webpack-virtual-modules/-/webpack-virtual-modules-0.4.2.tgz#68ce4479df7334a491b7a3f3bead47fe382947d9" + integrity sha512-OUsT1VZhArN8nY7g6mMlw91HWnXcNXsIQjsQ83WteF4ViZ6YXqF2sWKOTDIZ0H+PPiApQdszLdZIrD7NNlU0Yw== + webpack@^4: version "4.46.0" resolved "http://npm.cha0sdev/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542"