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

Commit

Permalink
feat(hooks): improve hooks handling (#961)
Browse files Browse the repository at this point in the history
* fix(preuninstall): add preuninstall script to remove old hooks

During migration from one version to another or when the plugin is removed from application we need to remove its hooks. This is usually done in preuninstall script, however, it was missing until now. This causes several issues when the version is updated as old hooks remain, but they may not be valid anymore.

* fix(postinstall): remove old hooks

As in 1.0.0 and CLI 6.0 we've changed the way nativescript-dev-webpack interacts with CLI, we need to remove hooks from previous nativescript-dev-webpack versions and use new ones. Usually this should happen with preuninstall script of the old version that removes the hooks. However, our current live version does not have such logic, so implement this in the postinstall of the current version.
This way we try to ensure the current plugin will work correctly.

* feat(hooks): add before-checkForChanges hook

Add before-checkForChanges hook to prevent users from using the current version of the plugin with CLI 5.x.x or older. These two versions are incompatible, so add an error in case older CLI is used.
  • Loading branch information
rosen-vladimirov authored Jul 2, 2019
1 parent aba0313 commit f558607
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 2 deletions.
16 changes: 16 additions & 0 deletions lib/before-checkForChanges.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
module.exports = function ($staticConfig, hookArgs) {
const majorVersionMatch = ($staticConfig.version || '').match(/^(\d+)\./);
const majorVersion = majorVersionMatch && majorVersionMatch[1] && +majorVersionMatch[1];
if (majorVersion && majorVersion < 6) {
// check if we are using the bundle workflow or the legacy one.
const isUsingBundleWorkflow = hookArgs &&
hookArgs.checkForChangesOpts &&
hookArgs.checkForChangesOpts.projectChangesOptions &&
hookArgs.checkForChangesOpts.projectChangesOptions.bundle;

if (isUsingBundleWorkflow) {
const packageJsonData = require("../package.json")
throw new Error(`The current version of ${packageJsonData.name} (${packageJsonData.version}) is not compatible with the used CLI: ${$staticConfig.version}. Please upgrade your NativeScript CLI version (npm i -g nativescript).`);
}
}
}
6 changes: 6 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@
"type": "after-prepare",
"script": "lib/after-prepare.js",
"inject": true
},
{
"type": "before-checkForChanges",
"script": "lib/before-checkForChanges.js",
"inject": true
}
]
},
Expand All @@ -24,6 +29,7 @@
},
"scripts": {
"postinstall": "node postinstall.js",
"preuninstall": "node preuninstall.js",
"postpack": "rm -rf node_modules",
"prepare": "tsc && npm run jasmine",
"test": "npm run prepare && npm run jasmine",
Expand Down
39 changes: 37 additions & 2 deletions postinstall.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,55 @@
"use strict";

const { dirname } = require("path");
const hook = require("nativescript-hook")(__dirname);

const { compareProjectFiles } = require("./projectFilesManager");
const { getProjectDir } = require("./projectHelpers");
const path = require("path");
const fs = require("fs");

const projectDir = getProjectDir();

// This method is introduced as in version 1.0.0 of nativescript-dev-webpack (compatible and required for NativeScript 6.0.0)
// we have changed a lot of hooks and old ones are incompatible. This should be automatically handled with preuninstall script of the old version.
// However, old versions of nativescript-dev-webpack do not have such logic, so remove them manually on postinstall of the current version.
// This logic can be removed later, once most of the projects are migrated to 1.0.0 of the package or later.
// These new versions have preuninstall script that will automatically handle this case.
function removeOldHooks() {
const oldHooks = [
"before-prepareJSApp",
"before-cleanApp",
"before-watch",
"after-watch",
"before-watchPatterns",
"before-shouldPrepare",
"after-prepare",
"before-preview-sync"
];

const hooksDir = path.join(projectDir, "hooks");
const pkgName = require("./package.json").name;
const filename = `${pkgName}.js`;
oldHooks.forEach(hookName => {
const hookPath = path.join(hooksDir, hookName, filename);

try {
if (fs.existsSync(hookPath)) {
fs.unlinkSync(hookPath);
}
} catch (err) {
console.warn(`${pkgName} postinstall task: unable to delete hook ${hookPath}. Error is: ${err}`);
}
});
}

if (projectDir) {
compareProjectFiles(projectDir);

removeOldHooks();
hook.postinstall();
const installer = require("./installer");
installer.install();
} else {
// We are installing dev dependencies for the nativescript-dev-webpack plugin.
console.log("Skipping postinstall artifacts! We assumed the nativescript-dev-webpack is installing devDependencies");
}

11 changes: 11 additions & 0 deletions preuninstall.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
"use strict";

const hook = require("nativescript-hook")(__dirname);

const { getProjectDir } = require("./projectHelpers");

const projectDir = getProjectDir();

if (projectDir) {
hook.preuninstall();
}

0 comments on commit f558607

Please sign in to comment.