From 077f4b44377f24d65c7612087b1afe45cc27ae01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Zaera=20Avell=C3=B3n?= Date: Mon, 25 Oct 2021 12:05:58 +0200 Subject: [PATCH 1/6] docs(liferay-cli): update project's README --- .../js-toolkit/packages/liferay-cli/README.md | 227 +++++++++++++++++- 1 file changed, 226 insertions(+), 1 deletion(-) diff --git a/projects/js-toolkit/packages/liferay-cli/README.md b/projects/js-toolkit/packages/liferay-cli/README.md index 9867c27b1d..52d0c204b5 100644 --- a/projects/js-toolkit/packages/liferay-cli/README.md +++ b/projects/js-toolkit/packages/liferay-cli/README.md @@ -1,3 +1,228 @@ # @liferay/cli -This project hosts the Liferay JS Toolkit CLI Tool +This project hosts the Liferay JS Toolkit CLI Tool. + +Inspired by other frameworks, like React, Angular, or Vue.js, the Liferay JS +Toolkit is providing a unifying CLI tool to invoke all implemented features, +like project generation, build, deployment, etc. + +> 👀 Note that this tool still uses the JS Toolkit under the hood, so please +> refer to +> [its documentation](https://github.com/liferay/liferay-frontend-projects/blob/master/maintenance/projects/js-toolkit/docs/README.md) +> for more details on configuration and behavior. + +## Installation + +The `@liferay/cli` tool may be installed globally using `npm install -g` or +`yarn global add`, to make it available from the command line. + +However, if you don't want to mess with global installations, you can also run +it using `npx`. This ensures that you always use the latest version, and won't +install it locally. + +So, to run it, just type `npx @liferay/cli ...` in your command line and you are +good to go. + +Alternatively, if you decide to install it globally, simple invoke `liferay` +from the command line, which is the name of the +[binary provided by `@liferay/cli`](https://github.com/liferay/liferay-frontend-projects/blob/master/projects/js-toolkit/packages/liferay-cli/bin/liferay.js). + +## Available actions + +Currently, the `@liferay/cli` tool supports the following features: + +- [Project generation](#project-generation) +- [Project adaptation](#project-adaptation) +- [Project build](#project-build) +- [Project deployment](#project-deployment) +- [Project clean](#project-clean) + +## Project generation + +Project generation lets you create new projects for the main existing +frameworks: + +- [React](https://reactjs.org/) +- [Angular](https://angular.io/) +- [Vue.js](https://vuejs.org/) + +We try to always support the latest version of these frameworks but, given the +fast pace at which they evolve, there may be some lag between the time when a +framework's version is published and the time `@liferay/cli` supports it. + +> 👀 This feature is a replacement of the +> [older Yeoman Liferay JavaScript generator](https://github.com/liferay/liferay-frontend-projects/tree/master/maintenance/projects/js-toolkit/packages/generator-liferay-js) +> but it doesn't rely on Yeoman any more. + +### Usage + +```sh +$ liferay new my-project ↩ +``` + +The above command will start a wizard that will generate a project called +`my-project` in the current folder. Simply answer the questions you are asked, +and let the generator do its duties. + +Once the project is created, you may change to its folder and run +`npm|yarn install` to install the dependencies, then invoke the supported +actions (like `build`, `deploy`, etc.) with `npm|yarn run `. + +#### Target platform + +One of the key questions in the wizard is related to the platform you wish to +target. A target platform defines: + +- The set of rules to build the project +- The default dependencies of the project + +So, for example, when using +[`portal-7.4-ga1`](https://github.com/liferay/liferay-frontend-projects/tree/master/target-platforms/packages/portal-7.4-ga1) +you are saying that your project will be deployed to Liferay Portal CE 7.4 GA1 +and thus your project will have access to +[any JavaScript API available in that version](https://github.com/liferay/liferay-frontend-projects/blob/master/target-platforms/packages/portal-7.4-ga1/config.json#L21-L171) +(for instance, if you use React, the copy of `react` that comes bundled with +Liferay Portal will be used in your project, instead of referring to a new one, +local to the project). + +Note that, if you don't want to couple your project to any version of +Liferay Portal, you may choose to use the +[`portal-agnostic`](https://github.com/liferay/liferay-frontend-projects/tree/master/target-platforms/packages/portal-agnostic) +target platform. Choosing that platform your project will not be injected any of +the packages that come bundled with Liferay Portal. + +## Project adaptation + +Project adaptation lets you transform you native React, Angular and Vue.js +projects into Liferay widgets that you can deploy to your Liferay Portal +instance. + +We try to always support the latest version of the three frameworks mentioned +above but, given the fast pace at which they evolve, there may be some lag +between the time when a framework's version is published and the time +`@liferay/cli` supports it. + +> 👀 This feature is a replacement of the +> [older Yeoman Liferay JavaScript generator](https://github.com/liferay/liferay-frontend-projects/tree/master/maintenance/projects/js-toolkit/packages/generator-liferay-js) +> but it doesn't rely on Yeoman any more. +> +> Also note that adaptation is a best effort heuristic process so don't expect +> every native framework functionality to work when a project is adapted. +> +> This is mainly due to the fact that there's some mismatch between these +> frameworks' application model (they assume a SPA deployed as a single webapp) +> and the one of Liferay, that assumes that many unrelated portlets cooperate +> together to produce a single HTML page. + +### Usage + +In your native project's directory run: + +```sh +$ liferay adapt ↩ +``` + +The above command will start a wizard that will adapt your project to be +deployable to Liferay portal. + +Once the project is adapted you may use the `build:liferay`, `deploy:liferay`, +`clean:liferay`, etc. tasks to perform the same tasks you would do for a true +Liferay project (ie: one that had been generated with `liferay new`). + +Learn more about project adaptation in +[JS Toolkit's documentation on adaptation](https://github.com/liferay/liferay-frontend-projects/blob/master/maintenance/projects/js-toolkit/docs/How-to-adapt-most-popular-frameworks-projects.md#supported-projects). + +## Project build + +The `build` command will build your project and leave the resulting JAR file in +the `dist` directory. You may then deploy it to a Liferay Portal instance +copying the file by hand, or using the [Liferay deployment](#project-deployment) +feature. + +### Usage + +```sh +$ liferay build ↩ + +# or + +$ npm run build ↩ + +# or + +$ yarn build ↩ +``` + +Note that `npm|yarn run build` is an alias to `liferay build` (you can see that +by inspecting your project's `package.json` file). + +## Project deployment + +The `deploy` command will copy the JAR file created by the +[project build](#project-build), in the `dist` directory, to your local Liferay +Portal instance. + +The first time you run this task it will ask you for your Liferay Portal +directory and store your answer in a `.liferay.json` file in your project for +subsequent runs. + +### Usage + +```sh +$ liferay deploy ↩ + +# or + +$ npm run deploy ↩ + +# or + +$ yarn deploy ↩ +``` + +Note that `npm|yarn run deploy` is an alias to `liferay deploy` (you can see +that by inspecting your project's `package.json` file). + +## Project clean + +The `clean` command will delete the `build` and `dist` directories created by +[project build](#project-build) and [project deployment](#project-deployment) +tasks. + +### Usage + +```sh +$ liferay clean ↩ + +# or + +$ npm run clean ↩ + +# or + +$ yarn clean ↩ +``` + +Note that `npm|yarn run clean` is an alias to `liferay clean` (you can see +that by inspecting your project's `package.json` file). + +## Internal architecture + +The big majority of `@liferay/cli`'s source code is devoted to project +generation and adaptation, that is what previously was the Yeoman generator of +JS Toolkit. + +The rest of the commands (those used on generated/adapted projects) are simply +delegated to the selected target platform (see +[Target platform](#target-platform) above). + +That means that, in those cases the `liferay` command is simply a bridge that +looks inside your project's `node_modules` folder to locate the selected target +platform and invoke it to do its duties. + +This eases maintenance and evolution of `@liferay/cli` because we don't need to +maintain a huge monolyth of code targeting disparate targets. + +To gain more insights on target platforms and what they are intended for, you +may have a look at +[their project directory](https://github.com/liferay/liferay-frontend-projects/tree/master/target-platforms). From 3df15a32ead1e86f936fd971ac9942a008de4542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Zaera=20Avell=C3=B3n?= Date: Mon, 25 Oct 2021 13:54:04 +0200 Subject: [PATCH 2/6] docs(target-platforms): update project's README --- target-platforms/README.md | 76 +++++++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/target-platforms/README.md b/target-platforms/README.md index c004988738..be7d037258 100644 --- a/target-platforms/README.md +++ b/target-platforms/README.md @@ -1,4 +1,4 @@ -# liferay-target-platforms +# target-platforms This repository holds Target Platforms for the Liferay CE Portal and DXP products. @@ -9,21 +9,71 @@ A Target Platform is a single `npm` dependency that you may use in your JavaScript projects to have all needed dependencies and tools to deploy it in a specific release of Liferay CE Portal or DXP. -The Target Platform dependencies takes care of all configuration details for -you, so that you don't need to bother about dependency numbers or configuring -the parts of the build that can be inferred from the target version of Liferay -CE Portal/DXP. +The Target Platform takes care of all configuration details for you you, so +that you don't need to bother about dependency numbers or configuring the parts +of the build that can be inferred from the target version of Liferay CE +Portal/DXP. ## Supported Target Platforms -Right now we support the following platforms: +To view the list of supported target platforms browse +[the packages folder](./packages). + +All platform names describe the target product and version (for instance: +`portal-7.4-ga1` refers to Liferay CE Portal 7.4 GA1) except for some special +ones that are listed here: + +- `portal-adapt-angular-cli`: a special target platform that is used when + adapting native Angular projects for deployment to Liferay. +- `portal-adapt-create-react-app`: a special target platform that is used when + adapting native React projects for deployment to Liferay. +- `portal-adapt-vue-cli`: a special target platform that is used when adapting + native Vue.js projects for deployment to Liferay. +- `portal-agnostic`: a target platform to avoid coupling of the project with any + specific Liferay version. +- `portal-master`: an internal target platform used by this project to be able + to target current development version of Liferay Portal. ## How to use Target Platforms -Even though you can use Target Platforms alone, they are intended to be -pre-configured by tools like the -[JS Toolkit Generator](https://github.com/liferay/liferay-frontend-projects/blob/master/maintenance/projects/js-toolkit/docs/How-to-use-generator-liferay-js.md) -or -[Liferay Workspace](https://learn.liferay.com/dxp/latest/en/developing-applications/tooling/liferay-workspace/what-is-liferay-workspace.html) -so please refer to those tools' documentation on how to leverage Target -Platforms. +Target platforms are usually set as a npm dependency in projects created by the +[`@liferay/cli` tool](https://github.com/izaera/liferay-frontend-projects/blob/doc-toolkit-3/projects/js-toolkit/packages/liferay-cli). +They provide all dependencies needed to build, deploy and run the project when +targeting the selected platform. + +That means you don't need to do anything specific to use them. You just will +because `@liferay/cli` will inject them in your projects. + +### A note about contents of target platforms + +Among other things, target platforms contain: + +- The npm dependencies: for example + [these ones](https://github.com/izaera/liferay-frontend-projects/blob/doc-toolkit-3/target-platforms/packages/portal-7.4-ga1/package.json#L5-L131). +- The `liferay-npm-bundler` configuration used to build the project: for example + [this one](https://github.com/izaera/liferay-frontend-projects/blob/doc-toolkit-3/target-platforms/packages/portal-7.4-ga1/config.json). +- The `liferay.js` file that will be invoked by the `@liferay/cli` to delegate + its tasks to the target platform: for example + [this one](https://github.com/izaera/liferay-frontend-projects/blob/doc-toolkit-3/target-platforms/packages/portal-7.4-ga1/liferay.js). + +Note that `@liferay/cli` delegates tasks like `build`, `deploy`, etc. to the +aforementioned `liferay.js` scripts inside target platforms. This is a strategy +to make evolution and support of `@liferay/cli` easier. + +However, at the same time, most target platforms use the same code so, instead +of replicating it for each platform, we +["undo" the delegation referring to shared projects](https://github.com/izaera/liferay-frontend-projects/blob/doc-toolkit-3/target-platforms/packages/portal-7.4-ga1/liferay.js#L8) +that implement the logic for platforms of the same kind. + +Two examples of those shared projects are: + +- [portal-base](https://github.com/izaera/liferay-frontend-projects/tree/doc-toolkit-3/projects/js-toolkit/packages/portal-base): + contains logic to build projects targeting Liferay Portal. +- [portal-adapt-base](https://github.com/izaera/liferay-frontend-projects/tree/doc-toolkit-3/projects/js-toolkit/packages/portal-adapt-base): + contains logic to build adapted Angular, React and Vue.js projects. + +We may add or refactor these shared projects in the future, depending on how +the list of target platforms and types evolve but, thanks to the `@liferay/cli` +delegation and the `liferay.js` files contained inside target platforms, nobody +will ever be affected by those changes, as they will happen transparently to +the projects using the target platforms. From 4d782b3656c66a8b7484b57b4d1b9be69746e3a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Zaera=20Avell=C3=B3n?= Date: Mon, 25 Oct 2021 14:27:02 +0200 Subject: [PATCH 3/6] chore: update @liferay/cli version This is needed to do a proper product review of the tool. --- projects/js-toolkit/packages/liferay-cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/js-toolkit/packages/liferay-cli/package.json b/projects/js-toolkit/packages/liferay-cli/package.json index a3ea5871c4..e3228ea150 100644 --- a/projects/js-toolkit/packages/liferay-cli/package.json +++ b/projects/js-toolkit/packages/liferay-cli/package.json @@ -34,5 +34,5 @@ "preversion": "liferay-workspace-scripts ci", "test": "liferay-workspace-scripts test" }, - "version": "1.0.0-pre.2" + "version": "1.0.0" } From 5fa967620ae250723a1c2759dd4e0be973976e49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Zaera=20Avell=C3=B3n?= Date: Mon, 25 Oct 2021 14:40:44 +0200 Subject: [PATCH 4/6] fix(local-npm): don't fail if unpublish does not work It will be quite common that the package being published is not yet in the local npm registry, so ignore unpublish when it fails. --- support/packages/local-npm/lib/index.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/support/packages/local-npm/lib/index.js b/support/packages/local-npm/lib/index.js index bf34b3b81f..66b9ed4faa 100644 --- a/support/packages/local-npm/lib/index.js +++ b/support/packages/local-npm/lib/index.js @@ -94,7 +94,7 @@ function publish(projects) { console.log(` ${pkgId}`); - run('npm', 'unpublish', pkgId); + run('npm', 'unpublish', pkgId, {lenient: true}); run('yarn', 'cache', 'clean', pkgId); }); @@ -150,6 +150,7 @@ function registrySet(which) { function run(cmd, ...args) { let options = { + lenient: false, // set to true to ignore error return codes shell: true, stdio: 'pipe', }; @@ -171,7 +172,7 @@ function run(cmd, ...args) { process.exit(1); } - if (result.status !== 0) { + if (!options.lenient && result.status !== 0) { if (result.stdout) { console.error(result.stdout.toString()); console.error(result.stderr.toString()); From 98916aa191fd1e37fc1f0bc1e8352c68eeadeb36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Zaera=20Avell=C3=B3n?= Date: Mon, 25 Oct 2021 14:51:18 +0200 Subject: [PATCH 5/6] chore(liferay-cli): add missing dependency --- projects/js-toolkit/packages/liferay-cli/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/js-toolkit/packages/liferay-cli/package.json b/projects/js-toolkit/packages/liferay-cli/package.json index e3228ea150..67f57e319c 100644 --- a/projects/js-toolkit/packages/liferay-cli/package.json +++ b/projects/js-toolkit/packages/liferay-cli/package.json @@ -6,6 +6,7 @@ "dependencies": { "@liferay/js-toolkit-core": "^4.0.0", "inquirer": "^7.3.1", + "liferay-npm-build-tools-common": "^2.27.0", "resolve": "^1.8.1", "update-check": "^1.5.4", "yargs": "^14.0.0" From ad273699048c357121e8676145f5035fc467b746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Zaera=20Avell=C3=B3n?= Date: Tue, 26 Oct 2021 09:59:32 +0200 Subject: [PATCH 6/6] docs: wordsmith --- .../js-toolkit/packages/liferay-cli/README.md | 69 +++++++++---------- target-platforms/README.md | 22 +++--- 2 files changed, 44 insertions(+), 47 deletions(-) diff --git a/projects/js-toolkit/packages/liferay-cli/README.md b/projects/js-toolkit/packages/liferay-cli/README.md index 52d0c204b5..f61911fff4 100644 --- a/projects/js-toolkit/packages/liferay-cli/README.md +++ b/projects/js-toolkit/packages/liferay-cli/README.md @@ -3,8 +3,8 @@ This project hosts the Liferay JS Toolkit CLI Tool. Inspired by other frameworks, like React, Angular, or Vue.js, the Liferay JS -Toolkit is providing a unifying CLI tool to invoke all implemented features, -like project generation, build, deployment, etc. +Toolkit provides a CLI tool to invoke all implemented features, like project +generation, build, deployment, etc. > 👀 Note that this tool still uses the JS Toolkit under the hood, so please > refer to @@ -13,18 +13,15 @@ like project generation, build, deployment, etc. ## Installation -The `@liferay/cli` tool may be installed globally using `npm install -g` or -`yarn global add`, to make it available from the command line. +The `@liferay/cli` tool may be installed globally using `npm install -g @liferay/cli` or `yarn global add @liferay/cli`, to make it available from the +command line. However, if you don't want to mess with global installations, you can also run -it using `npx`. This ensures that you always use the latest version, and won't -install it locally. +it using `npx @liferay/cli ...`. This ensures that you always use the latest +version, and won't install it locally. -So, to run it, just type `npx @liferay/cli ...` in your command line and you are -good to go. - -Alternatively, if you decide to install it globally, simple invoke `liferay` -from the command line, which is the name of the +If you install globally, simple invoke `liferay` from the command line, which +is the name of the [binary provided by `@liferay/cli`](https://github.com/liferay/liferay-frontend-projects/blob/master/projects/js-toolkit/packages/liferay-cli/bin/liferay.js). ## Available actions @@ -39,17 +36,13 @@ Currently, the `@liferay/cli` tool supports the following features: ## Project generation -Project generation lets you create new projects for the main existing -frameworks: +Project generation lets you create new projects for the following +frameworks[^1]: - [React](https://reactjs.org/) - [Angular](https://angular.io/) - [Vue.js](https://vuejs.org/) -We try to always support the latest version of these frameworks but, given the -fast pace at which they evolve, there may be some lag between the time when a -framework's version is published and the time `@liferay/cli` supports it. - > 👀 This feature is a replacement of the > [older Yeoman Liferay JavaScript generator](https://github.com/liferay/liferay-frontend-projects/tree/master/maintenance/projects/js-toolkit/packages/generator-liferay-js) > but it doesn't rely on Yeoman any more. @@ -88,31 +81,18 @@ local to the project). Note that, if you don't want to couple your project to any version of Liferay Portal, you may choose to use the [`portal-agnostic`](https://github.com/liferay/liferay-frontend-projects/tree/master/target-platforms/packages/portal-agnostic) -target platform. Choosing that platform your project will not be injected any of -the packages that come bundled with Liferay Portal. +target platform. By choosing the agnostic platform your project will not be +injected with any of the packages that come bundled with Liferay Portal. ## Project adaptation Project adaptation lets you transform you native React, Angular and Vue.js -projects into Liferay widgets that you can deploy to your Liferay Portal -instance. - -We try to always support the latest version of the three frameworks mentioned -above but, given the fast pace at which they evolve, there may be some lag -between the time when a framework's version is published and the time -`@liferay/cli` supports it. +projects[^1] into Liferay widgets that you can deploy to your Liferay Portal +instance[^2]. > 👀 This feature is a replacement of the > [older Yeoman Liferay JavaScript generator](https://github.com/liferay/liferay-frontend-projects/tree/master/maintenance/projects/js-toolkit/packages/generator-liferay-js) > but it doesn't rely on Yeoman any more. -> -> Also note that adaptation is a best effort heuristic process so don't expect -> every native framework functionality to work when a project is adapted. -> -> This is mainly due to the fact that there's some mismatch between these -> frameworks' application model (they assume a SPA deployed as a single webapp) -> and the one of Liferay, that assumes that many unrelated portlets cooperate -> together to produce a single HTML page. ### Usage @@ -209,8 +189,8 @@ that by inspecting your project's `package.json` file). ## Internal architecture The big majority of `@liferay/cli`'s source code is devoted to project -generation and adaptation, that is what previously was the Yeoman generator of -JS Toolkit. +generation and adaptation, this what previously located in our Yeoman +generator. The rest of the commands (those used on generated/adapted projects) are simply delegated to the selected target platform (see @@ -221,8 +201,23 @@ looks inside your project's `node_modules` folder to locate the selected target platform and invoke it to do its duties. This eases maintenance and evolution of `@liferay/cli` because we don't need to -maintain a huge monolyth of code targeting disparate targets. +maintain a huge monolith of code targeting disparate targets. To gain more insights on target platforms and what they are intended for, you may have a look at [their project directory](https://github.com/liferay/liferay-frontend-projects/tree/master/target-platforms). + +--- + +[^1]: + We aim to support the latest version of these frameworks but, given the + fast pace at which they evolve, there may be some lag between the time when a + framework's version is published and the time `@liferay/cli` supports it. + +[^2]: + Note that adaptation is a best effort heuristic process so don't expect + every native framework functionality to work when a project is adapted. This + is mainly due to the fact that there's some mismatch between these + frameworks' application model (they assume a SPA deployed as a single webapp) + and the one of Liferay, that assumes that many unrelated portlets cooperate + together to produce a single HTML page. diff --git a/target-platforms/README.md b/target-platforms/README.md index be7d037258..cc4d001025 100644 --- a/target-platforms/README.md +++ b/target-platforms/README.md @@ -9,9 +9,9 @@ A Target Platform is a single `npm` dependency that you may use in your JavaScript projects to have all needed dependencies and tools to deploy it in a specific release of Liferay CE Portal or DXP. -The Target Platform takes care of all configuration details for you you, so -that you don't need to bother about dependency numbers or configuring the parts -of the build that can be inferred from the target version of Liferay CE +The Target Platform takes care of all configuration details for you, so that +you don't need to bother about dependency numbers or configuring the parts of +the build that can be inferred from the target version of Liferay CE Portal/DXP. ## Supported Target Platforms @@ -29,20 +29,21 @@ ones that are listed here: adapting native React projects for deployment to Liferay. - `portal-adapt-vue-cli`: a special target platform that is used when adapting native Vue.js projects for deployment to Liferay. -- `portal-agnostic`: a target platform to avoid coupling of the project with any +- `portal-agnostic`: a target platform to avoid coupling of the project with +- any specific Liferay version. - `portal-master`: an internal target platform used by this project to be able to target current development version of Liferay Portal. ## How to use Target Platforms -Target platforms are usually set as a npm dependency in projects created by the +Target platforms are provided as a npm dependency in projects created with the [`@liferay/cli` tool](https://github.com/izaera/liferay-frontend-projects/blob/doc-toolkit-3/projects/js-toolkit/packages/liferay-cli). They provide all dependencies needed to build, deploy and run the project when targeting the selected platform. -That means you don't need to do anything specific to use them. You just will -because `@liferay/cli` will inject them in your projects. +That means you don't need to do anything specific to use them. `@liferay/cli` +will inject all Liferay dependencies needed in your projects. ### A note about contents of target platforms @@ -50,7 +51,8 @@ Among other things, target platforms contain: - The npm dependencies: for example [these ones](https://github.com/izaera/liferay-frontend-projects/blob/doc-toolkit-3/target-platforms/packages/portal-7.4-ga1/package.json#L5-L131). -- The `liferay-npm-bundler` configuration used to build the project: for example +- The `liferay-npm-bundler` configuration used to build the project: for +- example [this one](https://github.com/izaera/liferay-frontend-projects/blob/doc-toolkit-3/target-platforms/packages/portal-7.4-ga1/config.json). - The `liferay.js` file that will be invoked by the `@liferay/cli` to delegate its tasks to the target platform: for example @@ -75,5 +77,5 @@ Two examples of those shared projects are: We may add or refactor these shared projects in the future, depending on how the list of target platforms and types evolve but, thanks to the `@liferay/cli` delegation and the `liferay.js` files contained inside target platforms, nobody -will ever be affected by those changes, as they will happen transparently to -the projects using the target platforms. +should be affected by those changes, as they will happen transparently to the +projects using the target platforms.