This repository has been archived by the owner on Aug 7, 2021. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 49
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(hooks): improve hooks handling (#961)
* 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
1 parent
aba0313
commit f558607
Showing
4 changed files
with
70 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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).`); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"); | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} |