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

Commit fd52211

Browse files
committed
refactor: get app directory from CLI
1 parent d8a17a6 commit fd52211

16 files changed

+304
-109
lines changed

Diff for: index.js

+38-18
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
const path = require("path");
22
const { existsSync } = require("fs");
33

4-
const { getPackageJson, getProjectDir, isAngular, resolveAndroidAppPath } = require("./projectHelpers");
4+
const {
5+
getPackageJson,
6+
getProjectDir,
7+
isAngular,
8+
isAndroid,
9+
isIos,
10+
resolveAndroidAppPath,
11+
} = require("./projectHelpers");
512

613
const PROJECT_DIR = getProjectDir();
714
const APP_DIR = path.join(PROJECT_DIR, "app");
@@ -12,23 +19,39 @@ if (isAngular({ projectDir: PROJECT_DIR })) {
1219
Object.assign(exports, require('./plugins/angular'));
1320
}
1421

15-
exports.getEntryModule = function () {
16-
const maybePackageJsonEntry = getPackageJsonEntry();
17-
if (!maybePackageJsonEntry) {
18-
throw new Error("app/package.json must contain a `main` attribute.");
22+
exports.getAotEntryModule = function (appDirectory = APP_DIR) {
23+
const entry = getPackageJsonEntry(appDirectory);
24+
const aotEntry = `${entry}.aot.ts`;
25+
26+
const aotEntryPath = path.resolve(appDirectory, aotEntry);
27+
if (!existsSync(aotEntryPath)) {
28+
throw new Error(`For ahead-of-time compilation you need to have an entry module ` +
29+
`at ${aotEntryPath} that bootstraps the app with a static platform instead of dynamic one!`)
1930
}
2031

21-
const maybeAotEntry = getAotEntry(maybePackageJsonEntry);
22-
return maybeAotEntry || maybePackageJsonEntry;
32+
return aotEntry;
33+
}
34+
35+
exports.getEntryModule = function (appDirectory = APP_DIR) {
36+
const entry = getPackageJsonEntry(appDirectory);
37+
38+
const tsEntryPath = path.resolve(appDirectory, `${entry}.ts`);
39+
const jsEntryPath = path.resolve(appDirectory, `${entry}.js`);
40+
if (!existsSync(tsEntryPath) && !existsSync(jsEntryPath)) {
41+
throw new Error(`The entry module ${entry} specified in ` +
42+
`${appDirectory}/package.json doesn't exist!`)
43+
}
44+
45+
return entry;
2346
};
2447

2548
exports.getAppPath = platform => {
26-
if (/ios/i.test(platform)) {
49+
if (isIos(platform)) {
2750
const appName = path.basename(PROJECT_DIR);
2851
const sanitizedName = sanitize(appName);
2952

3053
return `platforms/ios/${sanitizedName}/app`;
31-
} else if (/android/i.test(platform)) {
54+
} else if (isAndroid(platform)) {
3255
return resolveAndroidAppPath(PROJECT_DIR);
3356
} else {
3457
throw new Error(`Invalid platform: ${platform}`);
@@ -40,16 +63,13 @@ const sanitize = name => name
4063
.filter(char => /[a-zA-Z0-9]/.test(char))
4164
.join("");
4265

43-
function getPackageJsonEntry() {
44-
const packageJsonSource = getPackageJson(APP_DIR);
66+
function getPackageJsonEntry(appDirectory) {
67+
const packageJsonSource = getPackageJson(appDirectory);
4568
const entry = packageJsonSource.main;
4669

47-
return entry ? entry.replace(/\.js$/i, "") : null;
48-
}
49-
50-
function getAotEntry(entry) {
51-
const aotEntry = `${entry}.aot.ts`;
52-
const aotEntryPath = path.join(APP_DIR, aotEntry);
70+
if (!entry) {
71+
throw new Error(`${appDirectory}/package.json must contain a 'main' attribute!`);
72+
}
5373

54-
return existsSync(aotEntryPath) ? aotEntry : null;
74+
return entry.replace(/\.js$/i, "");
5575
}

Diff for: installer.js

+9-10
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,27 @@
1-
const path = require("path");
2-
const fs = require("fs");
3-
41
const helpers = require("./projectHelpers");
52
const projectFilesManager = require("./projectFilesManager");
63
const dependencyManager = require("./dependencyManager");
74

8-
const PROJECT_DIR = helpers.getProjectDir();
9-
const APP_DIR = path.resolve(PROJECT_DIR, "app");
10-
115
function install() {
12-
const packageJson = helpers.getPackageJson(PROJECT_DIR);
6+
const projectDir = helpers.getProjectDir();
7+
const appPath = helpers.getAppPath();
8+
const packageJson = helpers.getPackageJson(projectDir);
139

14-
projectFilesManager.addProjectFiles(PROJECT_DIR, APP_DIR);
10+
projectFilesManager.addProjectFiles(projectDir, appPath);
1511

1612
const postinstallOptions = dependencyManager.addProjectDeps(packageJson);
1713
packageJson.devDependencies = postinstallOptions.deps;
1814

19-
helpers.writePackageJson(packageJson, PROJECT_DIR);
15+
helpers.writePackageJson(packageJson, projectDir);
2016

2117
dependencyManager.showHelperMessages(postinstallOptions);
2218
}
2319

2420
function uninstall() {
25-
projectFilesManager.removeProjectFiles(PROJECT_DIR, APP_DIR);
21+
const projectDir = helpers.getProjectDir();
22+
const appPath = helpers.getAppPath();
23+
projectFilesManager.removeProjectFiles(projectDir, appPath);
24+
2625
console.log("NativeScript Webpack removed!");
2726
}
2827

Diff for: lib/after-prepare.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
const snapshotGenerator = require("../snapshot/android/project-snapshot-generator");
2-
const utils = require("./utils");
1+
const { installSnapshotArtefacts } = require("../snapshot/android/project-snapshot-generator");
2+
const { shouldSnapshot } = require("./utils");
33

4-
module.exports = function ($mobileHelper, $projectData, hookArgs) {
4+
module.exports = function ($projectData, hookArgs) {
55
const env = hookArgs.env || {};
66
const shouldSnapshotOptions = {
77
platform: hookArgs.platform,
88
bundle: hookArgs.appFilesUpdaterOptions.bundle,
99
release: hookArgs.appFilesUpdaterOptions.release
1010
};
1111

12-
if (env.snapshot && utils.shouldSnapshot($mobileHelper, shouldSnapshotOptions)) {
13-
snapshotGenerator.installSnapshotArtefacts($projectData.projectDir);
12+
if (env.snapshot && shouldSnapshot(shouldSnapshotOptions)) {
13+
installSnapshotArtefacts($projectData.projectDir);
1414
}
1515
}

Diff for: lib/before-cleanApp.js

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
const ProjectSnapshotGenerator = require("../snapshot/android/project-snapshot-generator");
2-
module.exports = function ($mobileHelper, hookArgs) {
3-
if ($mobileHelper.isAndroidPlatform(hookArgs.platformInfo.platform)) {
4-
ProjectSnapshotGenerator.cleanSnapshotArtefacts(hookArgs.platformInfo.projectData.projectDir);
5-
}
1+
const { cleanSnapshotArtefacts } = require("../snapshot/android/project-snapshot-generator");
2+
const { isAndroid } = require("../projectHelpers");
3+
4+
module.exports = function (hookArgs) {
5+
if (isAndroid(hookArgs.platformInfo.platform)) {
6+
cleanSnapshotArtefacts(hookArgs.platformInfo.projectData.projectDir);
7+
}
68
}

Diff for: lib/before-prepareJS.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const { runWebpackCompiler } = require("./compiler");
22

3-
module.exports = function ($mobileHelper, $projectData, $logger, hookArgs) {
3+
module.exports = function ($projectData, $logger, hookArgs) {
44
const env = hookArgs.config.env || {};
55
const platform = hookArgs.config.platform;
66
const appFilesUpdaterOptions = hookArgs.config.appFilesUpdaterOptions;
@@ -10,6 +10,6 @@ module.exports = function ($mobileHelper, $projectData, $logger, hookArgs) {
1010
bundle: appFilesUpdaterOptions.bundle,
1111
release: appFilesUpdaterOptions.release,
1212
};
13-
const result = config.bundle && runWebpackCompiler.bind(runWebpackCompiler, config, $mobileHelper, $projectData, $logger, hookArgs);
13+
const result = config.bundle && runWebpackCompiler.bind(runWebpackCompiler, config, $projectData, $logger, hookArgs);
1414
return result;
1515
}

Diff for: lib/before-watch.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const { runWebpackCompiler } = require("./compiler");
22

3-
module.exports = function ($mobileHelper, $projectData, $logger, hookArgs) {
3+
module.exports = function ($projectData, $logger, hookArgs) {
44
if (hookArgs.config) {
55
const appFilesUpdaterOptions = hookArgs.config.appFilesUpdaterOptions;
66
if (appFilesUpdaterOptions.bundle) {
@@ -15,7 +15,7 @@ module.exports = function ($mobileHelper, $projectData, $logger, hookArgs) {
1515
watch: true
1616
};
1717

18-
return runWebpackCompiler(config, $mobileHelper, $projectData, $logger, hookArgs);
18+
return runWebpackCompiler(config, $projectData, $logger, hookArgs);
1919
}));
2020
}
2121
}

Diff for: lib/before-watchPatterns.js

+11-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
const { basename } = require("path");
2-
const { buildEnvData, getCompilationContext } = require("./utils");
2+
const {
3+
buildEnvData,
4+
getCompilationContext,
5+
setProcessInitDirectory,
6+
} = require("./utils");
37

4-
module.exports = function (hookArgs) {
8+
module.exports = function ($projectData, hookArgs) {
59
const { liveSyncData } = hookArgs;
610
if (!liveSyncData || !liveSyncData.bundle) {
711
return;
812
}
913

14+
setProcessInitDirectory($projectData.projectDir);
1015
const { platforms } = hookArgs;
1116
const { env } = liveSyncData;
1217
return (args, originalMethod) => {
@@ -16,7 +21,7 @@ module.exports = function (hookArgs) {
1621
}
1722

1823
const compilationContexts = platforms.map(platform =>
19-
getContext(platform, env));
24+
getContext($projectData, platform, env));
2025

2126
const ignorePatterns = compilationContexts.map(
2227
context => `!${context}`
@@ -27,7 +32,7 @@ module.exports = function (hookArgs) {
2732
};
2833
}
2934

30-
function getContext(platform, env) {
31-
const fullEnvData = buildEnvData(platform, env);
32-
return getCompilationContext(fullEnvData);
35+
function getContext($projectData, platform, env) {
36+
const fullEnvData = buildEnvData($projectData, platform, env);
37+
return getCompilationContext($projectData.projectDir, fullEnvData);
3338
}

Diff for: lib/compiler.js

+45-22
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,21 @@ const { spawn } = require("child_process");
33
const { join, resolve: pathResolve } = require("path");
44
const { existsSync } = require("fs");
55
const readline = require("readline");
6+
67
const { messages } = require("../plugins/WatchStateLoggerPlugin");
8+
const { safeGet } = require("../projectHelpers");
79
const { buildEnvData, getCompilationContext } = require("./utils");
810

911
let hasBeenInvoked = false;
1012

1113
let webpackProcess = null;
1214
let hasLoggedSnapshotWarningMessage = false;
1315

14-
function logdSnapshotWarningMessage($logger) {
15-
if (!hasLoggedSnapshotWarningMessage) {
16-
$logger.warn("Stripping the snapshot flag. Bear in mind that snapshot is only available in release builds and is NOT available on Windows systems.");
17-
}
18-
}
19-
2016
exports.getWebpackProcess = function getWebpackProcess() {
2117
return webpackProcess;
2218
}
2319

24-
exports.runWebpackCompiler = function runWebpackCompiler(config, $mobileHelper, $projectData, $logger, hookArgs) {
20+
exports.runWebpackCompiler = function runWebpackCompiler(config, $projectData, $logger, hookArgs) {
2521
if (config.bundle) {
2622
return new Promise(function (resolveBase, rejectBase) {
2723
if (webpackProcess) {
@@ -42,19 +38,15 @@ exports.runWebpackCompiler = function runWebpackCompiler(config, $mobileHelper,
4238

4339
console.log(`Running webpack for ${config.platform}...`);
4440

45-
const envData = buildEnvData(config.platform, config.env);
46-
const envFlagNames = Object.keys(envData);
47-
48-
const snapshotEnvIndex = envFlagNames.indexOf("snapshot");
49-
if (snapshotEnvIndex !== -1 && !utils.shouldSnapshot($mobileHelper, config)) {
50-
logdSnapshotWarningMessage($logger);
51-
envFlagNames.splice(snapshotEnvIndex, 1);
52-
}
41+
const projectDir = getProjectDir($projectData);
42+
const { platform, env } = config;
43+
const envData = buildEnvData($projectData, platform, env);
44+
const envParams = buildEnvCommandLineParams(config, envData, $logger);
5345

5446
// Adding `npm i source-map-support --save-dev` in an app will make source maps work
5547
// and stack traces will point to .ts if .ts files and proper source maps exist.
5648
let sourceMapSupportArgs = [];
57-
const appSourceMapSupportInstallPath = pathResolve($projectData.projectDir, "node_modules", "source-map-support", "register.js");
49+
const appSourceMapSupportInstallPath = pathResolve(projectDir, "node_modules", "source-map-support", "register.js");
5850
const devDepSourceMapSupportInstallPath = pathResolve(__dirname, "..", "node_modules", "source-map-support", "register.js");
5951
if (existsSync(appSourceMapSupportInstallPath)) {
6052
sourceMapSupportArgs = ["--require", appSourceMapSupportInstallPath];
@@ -65,19 +57,19 @@ exports.runWebpackCompiler = function runWebpackCompiler(config, $mobileHelper,
6557
const args = [
6658
"--preserve-symlinks",
6759
...sourceMapSupportArgs,
68-
join($projectData.projectDir, "node_modules", "webpack", "bin", "webpack.js"),
69-
"--config=webpack.config.js",
60+
pathResolve(projectDir, "node_modules", "webpack", "bin", "webpack.js"),
61+
`--config=${pathResolve(projectDir, "webpack.config.js")}`,
7062
"--progress",
7163
...(config.watch ? ["--watch"] : []),
72-
...envFlagNames.map(item => `--env.${item}`),
64+
...envParams,
7365
].filter(a => !!a);
7466

7567
const childProcess = spawn("node", args, {
7668
// Watch opens IPC so we don't mess with the stdin/out/err.
7769
// These will notify us for the webpack compilation states.
7870
// Enables `childProcess.on("message", msg => ...)` kind of communication.
7971
stdio: config.watch ? ["inherit", "inherit", "inherit", "ipc"] : "inherit",
80-
cwd: $projectData.projectDir
72+
cwd: projectDir
8173
});
8274

8375
let isFirstWebpackWatchCompilation = true;
@@ -94,10 +86,10 @@ exports.runWebpackCompiler = function runWebpackCompiler(config, $mobileHelper,
9486
}
9587

9688
if (hookArgs.filesToSync && hookArgs.startSyncFilesTimeout) {
97-
const compilationContext = getCompilationContext(envData);
89+
const compilationContext = getCompilationContext(projectDir, envData);
9890
hookArgs.filesToSync.push(
9991
...message.emittedFiles.map(
100-
emittedFile => join($projectData.projectDir, compilationContext, emittedFile)
92+
emittedFile => join(projectDir, compilationContext, emittedFile)
10193
)
10294
);
10395
hookArgs.startSyncFilesTimeout();
@@ -128,3 +120,34 @@ exports.runWebpackCompiler = function runWebpackCompiler(config, $mobileHelper,
128120
});
129121
}
130122
}
123+
124+
function buildEnvCommandLineParams(config, envData, $logger) {
125+
const envFlagNames = Object.keys(envData);
126+
const snapshotEnvIndex = envFlagNames.indexOf("snapshot");
127+
if (snapshotEnvIndex > -1 && !utils.shouldSnapshot(config)) {
128+
logSnapshotWarningMessage($logger);
129+
envFlagNames.splice(snapshotEnvIndex, 1);
130+
}
131+
132+
return envFlagNames.map(item => `--env.${item}=${envData[item]}`);
133+
}
134+
135+
function logSnapshotWarningMessage($logger) {
136+
if (!hasLoggedSnapshotWarningMessage) {
137+
$logger.warn("Stripping the snapshot flag. " +
138+
"Bear in mind that snapshot is only available in release builds and " +
139+
"is NOT available on Windows systems.");
140+
141+
hasLoggedSnapshotWarningMessage = true;
142+
}
143+
}
144+
145+
function getProjectDir($projectData) {
146+
const projectDir = safeGet($projectData, "projectDir");
147+
if (!projectDir) {
148+
throw new Error("Cannot find project dir in project data!");
149+
}
150+
151+
return projectDir;
152+
}
153+

0 commit comments

Comments
 (0)