Skip to content
This repository was archived by the owner on Aug 7, 2021. It is now read-only.

feat: stop using the proxy tns-core-modules package when the @nativescript/core is available #1093

Merged
merged 2 commits into from
Nov 21, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,19 @@ const {
Object.assign(exports, require("./plugins"));
Object.assign(exports, require("./host/resolver"));

exports.hasRootLevelScopedModules = function ({ projectDir }) {
let hasRootLevelScopedModules;
try {
const scopedModulesPackageName = '@nativescript/core';
require.resolve(scopedModulesPackageName, { paths: [projectDir] });
hasRootLevelScopedModules = true;
} catch (e) {
hasRootLevelScopedModules = false;
}

return hasRootLevelScopedModules;
}

exports.getAotEntryModule = function (appDirectory) {
verifyEntryModuleDirectory(appDirectory);

Expand Down
19 changes: 14 additions & 5 deletions templates/webpack.angular.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,17 @@ module.exports = env => {
const isAnySourceMapEnabled = !!sourceMap || !!hiddenSourceMap;
const externals = nsWebpack.getConvertedExternals(env.externals);
const appFullPath = resolve(projectRoot, appPath);
const hasRootLevelScopedModules = nsWebpack.hasRootLevelScopedModules({ projectDir: projectRoot });
let coreModulesPackageName = "tns-core-modules";
const alias = {
'~': appFullPath
};

if (hasRootLevelScopedModules) {
coreModulesPackageName = "@nativescript/core";
alias["tns-core-modules"] = coreModulesPackageName;
alias["nativescript-angular"] = "@nativescript/angular";
}
const appResourcesFullPath = resolve(projectRoot, appResourcesPath);
const tsConfigName = "tsconfig.tns.json";
const entryModule = `${nsWebpack.getEntryModule(appFullPath, platform)}.ts`;
Expand Down Expand Up @@ -141,14 +152,12 @@ module.exports = env => {
extensions: [".ts", ".js", ".scss", ".css"],
// Resolve {N} system modules from tns-core-modules
modules: [
resolve(__dirname, "node_modules/tns-core-modules"),
resolve(__dirname, `node_modules/${coreModulesPackageName}`),
resolve(__dirname, "node_modules"),
"node_modules/tns-core-modules",
`node_modules/${coreModulesPackageName}`,
"node_modules",
],
alias: {
'~': appFullPath
},
alias,
symlinks: true
},
resolveLoader: {
Expand Down
23 changes: 22 additions & 1 deletion templates/webpack.config.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import * as proxyquire from 'proxyquire';
import * as nsWebpackIndex from '../index';
import { join } from 'path';
import { skipPartiallyEmittedExpressions } from 'typescript';
// With noCallThru enabled, `proxyquire` will not fall back to requiring the real module to populate properties that are not mocked.
// This allows us to mock packages that are not available in node_modules.
// In case you want to enable fallback for a specific object, just add `'@noCallThru': false`.
Expand Down Expand Up @@ -30,6 +29,7 @@ const nativeScriptDevWebpack = {
PlatformFSPlugin: EmptyClass,
getAppPath: () => 'app',
getEntryModule: () => 'EntryModule',
hasRootLevelScopedModules: () => false,
getResolver: () => null,
getConvertedExternals: nsWebpackIndex.getConvertedExternals,
getSourceMapFilename: nsWebpackIndex.getSourceMapFilename,
Expand Down Expand Up @@ -358,6 +358,27 @@ describe('webpack.config.js', () => {
expect(config.output.sourceMapFilename).toEqual(join("..", newSourceMapFolder, "[file].map"));
});
});

describe(`alias for webpack.${type}.js (${platform})`, () => {
it('should add alias when @nativescript/core is at the root of node_modules', () => {
nativeScriptDevWebpack.hasRootLevelScopedModules = () => true;
const input = getInput({ platform });
const config = webpackConfig(input);
expect(config.resolve.alias['tns-core-modules']).toBe('@nativescript/core');
if (type === 'angular') {
expect(config.resolve.alias['nativescript-angular']).toBe('@nativescript/angular');
}
});
it('shouldn\'t add alias when @nativescript/core is not at the root of node_modules', () => {
nativeScriptDevWebpack.hasRootLevelScopedModules = () => false;
const input = getInput({ platform });
const config = webpackConfig(input);
expect(config.resolve.alias['tns-core-modules']).toBeUndefined();
if (type === 'angular') {
expect(config.resolve.alias['nativescript-angular']).toBeUndefined();
}
});
});
});
});
});
18 changes: 13 additions & 5 deletions templates/webpack.javascript.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,16 @@ module.exports = env => {
const isAnySourceMapEnabled = !!sourceMap || !!hiddenSourceMap;
const externals = nsWebpack.getConvertedExternals(env.externals);
const appFullPath = resolve(projectRoot, appPath);
const hasRootLevelScopedModules = nsWebpack.hasRootLevelScopedModules({ projectDir: projectRoot });
let coreModulesPackageName = "tns-core-modules";
const alias = {
'~': appFullPath
};

if (hasRootLevelScopedModules) {
coreModulesPackageName = "@nativescript/core";
alias["tns-core-modules"] = coreModulesPackageName;
}
const appResourcesFullPath = resolve(projectRoot, appResourcesPath);

const entryModule = nsWebpack.getEntryModule(appFullPath, platform);
Expand Down Expand Up @@ -99,14 +109,12 @@ module.exports = env => {
extensions: [".js", ".scss", ".css"],
// Resolve {N} system modules from tns-core-modules
modules: [
resolve(__dirname, "node_modules/tns-core-modules"),
resolve(__dirname, `node_modules/${coreModulesPackageName}`),
resolve(__dirname, "node_modules"),
"node_modules/tns-core-modules",
`node_modules/${coreModulesPackageName}`,
"node_modules",
],
alias: {
'~': appFullPath
},
alias,
// resolve symlinks to symlinked modules
symlinks: true
},
Expand Down
18 changes: 13 additions & 5 deletions templates/webpack.typescript.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,16 @@ module.exports = env => {
const externals = nsWebpack.getConvertedExternals(env.externals);

const appFullPath = resolve(projectRoot, appPath);
const hasRootLevelScopedModules = nsWebpack.hasRootLevelScopedModules({ projectDir: projectRoot });
let coreModulesPackageName = "tns-core-modules";
const alias = {
'~': appFullPath
};

if (hasRootLevelScopedModules) {
coreModulesPackageName = "@nativescript/core";
alias["tns-core-modules"] = coreModulesPackageName;
}
const appResourcesFullPath = resolve(projectRoot, appResourcesPath);

const entryModule = nsWebpack.getEntryModule(appFullPath, platform);
Expand Down Expand Up @@ -106,14 +116,12 @@ module.exports = env => {
extensions: [".ts", ".js", ".scss", ".css"],
// Resolve {N} system modules from tns-core-modules
modules: [
resolve(__dirname, "node_modules/tns-core-modules"),
resolve(__dirname, `node_modules/${coreModulesPackageName}`),
resolve(__dirname, "node_modules"),
"node_modules/tns-core-modules",
`node_modules/${coreModulesPackageName}`,
"node_modules",
],
alias: {
'~': appFullPath
},
alias,
// resolve symlinks to symlinked modules
symlinks: true
},
Expand Down
23 changes: 16 additions & 7 deletions templates/webpack.vue.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,19 @@ module.exports = env => {
const mode = production ? "production" : "development"

const appFullPath = resolve(projectRoot, appPath);
const hasRootLevelScopedModules = nsWebpack.hasRootLevelScopedModules({ projectDir: projectRoot });
let coreModulesPackageName = "tns-core-modules";
const alias = {
'~': appFullPath,
'@': appFullPath,
'vue': 'nativescript-vue'
};

if (hasRootLevelScopedModules) {
coreModulesPackageName = "@nativescript/core";
alias["tns-core-modules"] = coreModulesPackageName;
}

const appResourcesFullPath = resolve(projectRoot, appResourcesPath);

const entryModule = nsWebpack.getEntryModule(appFullPath, platform);
Expand Down Expand Up @@ -106,16 +119,12 @@ module.exports = env => {
extensions: [".vue", ".ts", ".js", ".scss", ".css"],
// Resolve {N} system modules from tns-core-modules
modules: [
resolve(__dirname, "node_modules/tns-core-modules"),
resolve(__dirname, `node_modules/${coreModulesPackageName}`),
resolve(__dirname, "node_modules"),
"node_modules/tns-core-modules",
`node_modules/${coreModulesPackageName}`,
"node_modules",
],
alias: {
'~': appFullPath,
'@': appFullPath,
'vue': 'nativescript-vue'
},
alias,
// resolve symlinks to symlinked modules
symlinks: true,
},
Expand Down