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

Commit 97df490

Browse files
author
Dimitar Tachev
authored
Merge pull request #1093 from NativeScript/tachev/scoped-modules-only
feat: stop using the proxy `tns-core-modules` package when the `@nativescript/core` is available
2 parents 0c51911 + 7fd196e commit 97df490

6 files changed

+91
-23
lines changed

Diff for: index.js

+13
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,19 @@ const {
1010
Object.assign(exports, require("./plugins"));
1111
Object.assign(exports, require("./host/resolver"));
1212

13+
exports.hasRootLevelScopedModules = function ({ projectDir }) {
14+
let hasRootLevelScopedModules;
15+
try {
16+
const scopedModulesPackageName = '@nativescript/core';
17+
require.resolve(scopedModulesPackageName, { paths: [projectDir] });
18+
hasRootLevelScopedModules = true;
19+
} catch (e) {
20+
hasRootLevelScopedModules = false;
21+
}
22+
23+
return hasRootLevelScopedModules;
24+
}
25+
1326
exports.getAotEntryModule = function (appDirectory) {
1427
verifyEntryModuleDirectory(appDirectory);
1528

Diff for: templates/webpack.angular.js

+14-5
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,17 @@ module.exports = env => {
6060
const isAnySourceMapEnabled = !!sourceMap || !!hiddenSourceMap;
6161
const externals = nsWebpack.getConvertedExternals(env.externals);
6262
const appFullPath = resolve(projectRoot, appPath);
63+
const hasRootLevelScopedModules = nsWebpack.hasRootLevelScopedModules({ projectDir: projectRoot });
64+
let coreModulesPackageName = "tns-core-modules";
65+
const alias = {
66+
'~': appFullPath
67+
};
68+
69+
if (hasRootLevelScopedModules) {
70+
coreModulesPackageName = "@nativescript/core";
71+
alias["tns-core-modules"] = coreModulesPackageName;
72+
alias["nativescript-angular"] = "@nativescript/angular";
73+
}
6374
const appResourcesFullPath = resolve(projectRoot, appResourcesPath);
6475
const tsConfigName = "tsconfig.tns.json";
6576
const entryModule = `${nsWebpack.getEntryModule(appFullPath, platform)}.ts`;
@@ -141,14 +152,12 @@ module.exports = env => {
141152
extensions: [".ts", ".js", ".scss", ".css"],
142153
// Resolve {N} system modules from tns-core-modules
143154
modules: [
144-
resolve(__dirname, "node_modules/tns-core-modules"),
155+
resolve(__dirname, `node_modules/${coreModulesPackageName}`),
145156
resolve(__dirname, "node_modules"),
146-
"node_modules/tns-core-modules",
157+
`node_modules/${coreModulesPackageName}`,
147158
"node_modules",
148159
],
149-
alias: {
150-
'~': appFullPath
151-
},
160+
alias,
152161
symlinks: true
153162
},
154163
resolveLoader: {

Diff for: templates/webpack.config.spec.ts

+22-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import * as proxyquire from 'proxyquire';
22
import * as nsWebpackIndex from '../index';
33
import { join } from 'path';
4-
import { skipPartiallyEmittedExpressions } from 'typescript';
54
// With noCallThru enabled, `proxyquire` will not fall back to requiring the real module to populate properties that are not mocked.
65
// This allows us to mock packages that are not available in node_modules.
76
// In case you want to enable fallback for a specific object, just add `'@noCallThru': false`.
@@ -30,6 +29,7 @@ const nativeScriptDevWebpack = {
3029
PlatformFSPlugin: EmptyClass,
3130
getAppPath: () => 'app',
3231
getEntryModule: () => 'EntryModule',
32+
hasRootLevelScopedModules: () => false,
3333
getResolver: () => null,
3434
getConvertedExternals: nsWebpackIndex.getConvertedExternals,
3535
getSourceMapFilename: nsWebpackIndex.getSourceMapFilename,
@@ -358,6 +358,27 @@ describe('webpack.config.js', () => {
358358
expect(config.output.sourceMapFilename).toEqual(join("..", newSourceMapFolder, "[file].map"));
359359
});
360360
});
361+
362+
describe(`alias for webpack.${type}.js (${platform})`, () => {
363+
it('should add alias when @nativescript/core is at the root of node_modules', () => {
364+
nativeScriptDevWebpack.hasRootLevelScopedModules = () => true;
365+
const input = getInput({ platform });
366+
const config = webpackConfig(input);
367+
expect(config.resolve.alias['tns-core-modules']).toBe('@nativescript/core');
368+
if (type === 'angular') {
369+
expect(config.resolve.alias['nativescript-angular']).toBe('@nativescript/angular');
370+
}
371+
});
372+
it('shouldn\'t add alias when @nativescript/core is not at the root of node_modules', () => {
373+
nativeScriptDevWebpack.hasRootLevelScopedModules = () => false;
374+
const input = getInput({ platform });
375+
const config = webpackConfig(input);
376+
expect(config.resolve.alias['tns-core-modules']).toBeUndefined();
377+
if (type === 'angular') {
378+
expect(config.resolve.alias['nativescript-angular']).toBeUndefined();
379+
}
380+
});
381+
});
361382
});
362383
});
363384
});

Diff for: templates/webpack.javascript.js

+13-5
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,16 @@ module.exports = env => {
5353
const isAnySourceMapEnabled = !!sourceMap || !!hiddenSourceMap;
5454
const externals = nsWebpack.getConvertedExternals(env.externals);
5555
const appFullPath = resolve(projectRoot, appPath);
56+
const hasRootLevelScopedModules = nsWebpack.hasRootLevelScopedModules({ projectDir: projectRoot });
57+
let coreModulesPackageName = "tns-core-modules";
58+
const alias = {
59+
'~': appFullPath
60+
};
61+
62+
if (hasRootLevelScopedModules) {
63+
coreModulesPackageName = "@nativescript/core";
64+
alias["tns-core-modules"] = coreModulesPackageName;
65+
}
5666
const appResourcesFullPath = resolve(projectRoot, appResourcesPath);
5767

5868
const entryModule = nsWebpack.getEntryModule(appFullPath, platform);
@@ -99,14 +109,12 @@ module.exports = env => {
99109
extensions: [".js", ".scss", ".css"],
100110
// Resolve {N} system modules from tns-core-modules
101111
modules: [
102-
resolve(__dirname, "node_modules/tns-core-modules"),
112+
resolve(__dirname, `node_modules/${coreModulesPackageName}`),
103113
resolve(__dirname, "node_modules"),
104-
"node_modules/tns-core-modules",
114+
`node_modules/${coreModulesPackageName}`,
105115
"node_modules",
106116
],
107-
alias: {
108-
'~': appFullPath
109-
},
117+
alias,
110118
// resolve symlinks to symlinked modules
111119
symlinks: true
112120
},

Diff for: templates/webpack.typescript.js

+13-5
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@ module.exports = env => {
5656
const externals = nsWebpack.getConvertedExternals(env.externals);
5757

5858
const appFullPath = resolve(projectRoot, appPath);
59+
const hasRootLevelScopedModules = nsWebpack.hasRootLevelScopedModules({ projectDir: projectRoot });
60+
let coreModulesPackageName = "tns-core-modules";
61+
const alias = {
62+
'~': appFullPath
63+
};
64+
65+
if (hasRootLevelScopedModules) {
66+
coreModulesPackageName = "@nativescript/core";
67+
alias["tns-core-modules"] = coreModulesPackageName;
68+
}
5969
const appResourcesFullPath = resolve(projectRoot, appResourcesPath);
6070

6171
const entryModule = nsWebpack.getEntryModule(appFullPath, platform);
@@ -106,14 +116,12 @@ module.exports = env => {
106116
extensions: [".ts", ".js", ".scss", ".css"],
107117
// Resolve {N} system modules from tns-core-modules
108118
modules: [
109-
resolve(__dirname, "node_modules/tns-core-modules"),
119+
resolve(__dirname, `node_modules/${coreModulesPackageName}`),
110120
resolve(__dirname, "node_modules"),
111-
"node_modules/tns-core-modules",
121+
`node_modules/${coreModulesPackageName}`,
112122
"node_modules",
113123
],
114-
alias: {
115-
'~': appFullPath
116-
},
124+
alias,
117125
// resolve symlinks to symlinked modules
118126
symlinks: true
119127
},

Diff for: templates/webpack.vue.js

+16-7
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,19 @@ module.exports = env => {
5959
const mode = production ? "production" : "development"
6060

6161
const appFullPath = resolve(projectRoot, appPath);
62+
const hasRootLevelScopedModules = nsWebpack.hasRootLevelScopedModules({ projectDir: projectRoot });
63+
let coreModulesPackageName = "tns-core-modules";
64+
const alias = {
65+
'~': appFullPath,
66+
'@': appFullPath,
67+
'vue': 'nativescript-vue'
68+
};
69+
70+
if (hasRootLevelScopedModules) {
71+
coreModulesPackageName = "@nativescript/core";
72+
alias["tns-core-modules"] = coreModulesPackageName;
73+
}
74+
6275
const appResourcesFullPath = resolve(projectRoot, appResourcesPath);
6376

6477
const entryModule = nsWebpack.getEntryModule(appFullPath, platform);
@@ -106,16 +119,12 @@ module.exports = env => {
106119
extensions: [".vue", ".ts", ".js", ".scss", ".css"],
107120
// Resolve {N} system modules from tns-core-modules
108121
modules: [
109-
resolve(__dirname, "node_modules/tns-core-modules"),
122+
resolve(__dirname, `node_modules/${coreModulesPackageName}`),
110123
resolve(__dirname, "node_modules"),
111-
"node_modules/tns-core-modules",
124+
`node_modules/${coreModulesPackageName}`,
112125
"node_modules",
113126
],
114-
alias: {
115-
'~': appFullPath,
116-
'@': appFullPath,
117-
'vue': 'nativescript-vue'
118-
},
127+
alias,
119128
// resolve symlinks to symlinked modules
120129
symlinks: true,
121130
},

0 commit comments

Comments
 (0)