diff --git a/lib/compiler.js b/lib/compiler.js index 6398436c..f87cc46b 100644 --- a/lib/compiler.js +++ b/lib/compiler.js @@ -5,6 +5,7 @@ const { existsSync } = require("fs"); const readline = require("readline"); const { messages } = require("../plugins/WatchStateLoggerPlugin"); +const { getWebpackConfigPath, setWebpackConfigPath } = require("../projectHelpers"); const { buildEnvData, debuggingEnabled, getUpdatedEmittedFiles } = require("./utils"); let hasBeenInvoked = false; @@ -51,10 +52,14 @@ exports.runWebpackCompiler = function runWebpackCompiler(config, $projectData, $ const envData = buildEnvData($projectData, platform, env); const envParams = buildEnvCommandLineParams(config, envData, $logger); + if ($projectData.nsConfig && $projectData.nsConfig.webpackConfig) { + setWebpackConfigPath($projectData.nsConfig.webpackConfig); + } + const args = [ "--preserve-symlinks", pathResolve(projectDir, "node_modules", "webpack", "bin", "webpack.js"), - `--config=${pathResolve(projectDir, "webpack.config.js")}`, + `--config=${pathResolve(projectDir, getWebpackConfigPath())}`, ...(config.watch ? ["--watch"] : []), ...envParams, ].filter(a => !!a); diff --git a/projectFilesManager.js b/projectFilesManager.js index 1a3855d4..d9712b2a 100644 --- a/projectFilesManager.js +++ b/projectFilesManager.js @@ -1,9 +1,11 @@ const path = require("path"); const fs = require("fs"); -const { isTypeScript, isAngular, isVue } = require("./projectHelpers"); +const { getNsConfigPath, getWebpackConfigPath, isTypeScript, isAngular, isVue, setWebpackConfigPath } = require("./projectHelpers"); function addProjectFiles(projectDir) { + const nsConfig = getNsConfigPath() ? JSON.parse(fs.readFileSync(getNsConfigPath())) : undefined; + setWebpackConfigPath(nsConfig && nsConfig.webpackConfig ? nsConfig.webpackConfig : undefined); const projectTemplates = getProjectTemplates(projectDir); Object.keys(projectTemplates).forEach(function(templateName) { const templateDestination = projectTemplates[templateName]; @@ -52,12 +54,17 @@ function copyTemplate(templateName, destinationPath) { if (!fs.existsSync(destinationPath)) { console.info(`Creating file: ${destinationPath}`); const content = fs.readFileSync(templateName, "utf8"); + const destinationDir = path.dirname(destinationPath); + if (!fs.existsSync(destinationDir)) { + fs.mkdirSync(destinationDir, { recursive: true }) + } + fs.writeFileSync(destinationPath, content); } } function getProjectTemplates(projectDir) { - const WEBPACK_CONFIG_NAME = "webpack.config.js"; + const WEBPACK_CONFIG_NAME = getWebpackConfigPath(); const TSCONFIG_TNS_NAME = "tsconfig.tns.json"; let templates; diff --git a/projectHelpers.js b/projectHelpers.js index ed1ffbf4..920b38e6 100644 --- a/projectHelpers.js +++ b/projectHelpers.js @@ -8,6 +8,8 @@ const PROJECT_DATA_GETTERS = { appResourcesPath: "getAppResourcesRelativeDirectoryPath", }; +let webpackConfigPath = 'webpack.config.js'; + const isTypeScript = ({ projectDir, packageJson } = {}) => { packageJson = packageJson || getPackageJson(projectDir); @@ -96,13 +98,32 @@ function convertSlashesInPath(modulePath) { return modulePath; } +function setWebpackConfigPath(path) { + if (path) { + webpackConfigPath = path; + } +} + +function getNsConfigPath() { + const nsConfigPath = resolve(getProjectDir(__dirname), "nsconfig.json"); + if (fs.existsSync(nsConfigPath)) { + return nsConfigPath; + } +} + +function getWebpackConfigPath() { + return webpackConfigPath; +} + const isWindows = process.platform.startsWith("win32"); module.exports = { getAppPathFromProjectData, getAppResourcesPathFromProjectData, + getNsConfigPath, getPackageJson, getProjectDir, + getWebpackConfigPath, isAndroid, isIos, isAngular, @@ -112,4 +133,5 @@ module.exports = { convertSlashesInPath, getIndentationCharacter, safeGet, + setWebpackConfigPath, }; \ No newline at end of file diff --git a/templates/webpack.angular.js b/templates/webpack.angular.js index aa1b9ee3..16932da5 100644 --- a/templates/webpack.angular.js +++ b/templates/webpack.angular.js @@ -7,6 +7,7 @@ const { nsReplaceBootstrap } = require("nativescript-dev-webpack/transformers/ns const { nsReplaceLazyLoader } = require("nativescript-dev-webpack/transformers/ns-replace-lazy-loader"); const { nsSupportHmrNg } = require("nativescript-dev-webpack/transformers/ns-support-hmr-ng"); const { getMainModulePath } = require("nativescript-dev-webpack/utils/ast-utils"); +const hook = require("nativescript-hook")(__dirname); const CleanWebpackPlugin = require("clean-webpack-plugin"); const CopyWebpackPlugin = require("copy-webpack-plugin"); const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer"); @@ -28,7 +29,7 @@ module.exports = env => { } const AngularCompilerPlugin = getAngularCompilerPlugin(platform); - const projectRoot = __dirname; + const projectRoot = hook.findProjectDir(__dirname) || __dirname; // Default destination inside platforms//... const dist = resolve(projectRoot, nsWebpack.getAppPath(platform, projectRoot)); @@ -56,7 +57,7 @@ module.exports = env => { const externals = nsWebpack.getConvertedExternals(env.externals); const appFullPath = resolve(projectRoot, appPath); const appResourcesFullPath = resolve(projectRoot, appResourcesPath); - const tsConfigName = "tsconfig.tns.json"; + const tsConfigName = relative(__dirname, join(projectRoot, 'tsconfig.tns.json')); const entryModule = `${nsWebpack.getEntryModule(appFullPath, platform)}.ts`; const entryPath = `.${sep}${entryModule}`; const entries = { bundle: entryPath }; diff --git a/templates/webpack.config.spec.ts b/templates/webpack.config.spec.ts index 155e7859..2b7285e4 100644 --- a/templates/webpack.config.spec.ts +++ b/templates/webpack.config.spec.ts @@ -47,6 +47,7 @@ const webpackConfigAngular = proxyquire('./webpack.angular', { 'nativescript-dev-webpack/transformers/ns-support-hmr-ng': { nsSupportHmrNg: () => { return FakeHmrTransformerFlag } }, 'nativescript-dev-webpack/utils/ast-utils': { getMainModulePath: () => { return "fakePath"; } }, 'nativescript-dev-webpack/plugins/NativeScriptAngularCompilerPlugin': { getAngularCompilerPlugin: () => { return AngularCompilerStub; } }, + 'nativescript-hook': (dir) => { return { findProjectDir: (dir) => dir } }, '@ngtools/webpack': { AngularCompilerPlugin: AngularCompilerStub }, diff --git a/templates/webpack.javascript.js b/templates/webpack.javascript.js index baf83484..7a66df5f 100644 --- a/templates/webpack.javascript.js +++ b/templates/webpack.javascript.js @@ -3,6 +3,7 @@ const { join, relative, resolve, sep } = require("path"); const webpack = require("webpack"); const nsWebpack = require("nativescript-dev-webpack"); const nativescriptTarget = require("nativescript-dev-webpack/nativescript-target"); +const hook = require("nativescript-hook")(__dirname); const CleanWebpackPlugin = require("clean-webpack-plugin"); const CopyWebpackPlugin = require("copy-webpack-plugin"); const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer"); @@ -23,7 +24,7 @@ module.exports = env => { } const platforms = ["ios", "android"]; - const projectRoot = __dirname; + const projectRoot = hook.findProjectDir(__dirname) || __dirname; // Default destination inside platforms//... const dist = resolve(projectRoot, nsWebpack.getAppPath(platform, projectRoot)); diff --git a/templates/webpack.typescript.js b/templates/webpack.typescript.js index 4a3bc35a..e0e1c9a9 100644 --- a/templates/webpack.typescript.js +++ b/templates/webpack.typescript.js @@ -3,6 +3,7 @@ const { join, relative, resolve, sep } = require("path"); const webpack = require("webpack"); const nsWebpack = require("nativescript-dev-webpack"); const nativescriptTarget = require("nativescript-dev-webpack/nativescript-target"); +const hook = require("nativescript-hook")(__dirname); const CleanWebpackPlugin = require("clean-webpack-plugin"); const CopyWebpackPlugin = require("copy-webpack-plugin"); const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); @@ -24,7 +25,7 @@ module.exports = env => { } const platforms = ["ios", "android"]; - const projectRoot = __dirname; + const projectRoot = hook.findProjectDir(__dirname) || __dirname; // Default destination inside platforms//... const dist = resolve(projectRoot, nsWebpack.getAppPath(platform, projectRoot)); diff --git a/templates/webpack.vue.js b/templates/webpack.vue.js index 66f13fa3..464ab7fa 100644 --- a/templates/webpack.vue.js +++ b/templates/webpack.vue.js @@ -11,6 +11,7 @@ const NsVueTemplateCompiler = require("nativescript-vue-template-compiler"); const nsWebpack = require("nativescript-dev-webpack"); const nativescriptTarget = require("nativescript-dev-webpack/nativescript-target"); +const hook = require("nativescript-hook")(__dirname); const { NativeScriptWorkerPlugin } = require("nativescript-worker-loader/NativeScriptWorkerPlugin"); const hashSalt = Date.now().toString(); @@ -27,7 +28,7 @@ module.exports = env => { } const platforms = ["ios", "android"]; - const projectRoot = __dirname; + const projectRoot = hook.findProjectDir(__dirname) || __dirname; // Default destination inside platforms//... const dist = resolve(projectRoot, nsWebpack.getAppPath(platform, projectRoot));