Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PlopJS 3 #293

Merged
merged 15 commits into from
Nov 27, 2021
Merged

PlopJS 3 #293

merged 15 commits into from
Nov 27, 2021

Conversation

crutchcorn
Copy link
Member

This is the changelog that will be present for Plop 3 in the releases tab.

I am extremely confident in the changes we've made here, but I'm waiting until the weekend to launch, given holidays around this time in the US.

This version is already published under the alpha tag on NPM, if you'd like to test (let us know!):

https://www.npmjs.com/package/plop/v/3.0.0-alpha.1


The first major release of plop since 2018 is here!

We've got a massive feature in this release: ESM Support. Read further to find out more!

Breaking Changes

  • Node 8 and 10 support has been dropped
    • Node 12 and 14 must be match ^12.20.0 and ^14.13.1 respectively

Wrapper CLI Breaking Changes

This section doesn't apply to users of the plop CLI command, only those that are using plop as a library in their own generator tool.

  • Plop wrapper CLIs must be ESM to import plop (see below to learn more)
  • Liftoff has been upgraded from 1 to 4 and as a result, the Plop object API has changed. Instead of:
Plop.launch({
  cwd: argv.cwd,
  configPath: path.join(__dirname, 'plopfile.js'),
  require: argv.require,
  completion: argv.completion
}, env => run(env, undefined, true));

You need to do:

import { dirname } from "node:path";

import { fileURLToPath } from "node:url";

const __dirname = dirname(fileURLToPath(import.meta.url));

Plop.prepare({
  cwd: argv.cwd,
  configPath: path.join(__dirname, 'plopfile.js'),
  preload: argv.preload || [],
  completion: argv.completion
}, env => Plop.execute(env, run));

Features

ESM Support

The major feature of this release is support for ESM modules (#260)

This means that instead of:

module.exports = (plop) => {
	// ...
}

You can now have the following code in your plopfile:

export default (plop) => {
	// ...
}

Going forward, plopfiles must either be:

  • An ESM .mjs file with type: "module" in package.json
  • An ESM .js file with type: "module" in package.json
  • A CommonJS .cjs file with type: "module" in package.json
  • A CommonJS .js file with type: "commonjs" in package.json

Any of these file extensions will be recognized and accepted with the default plopfile name, just like before.

If you want to learn more about ESM usage in a library, here's some further reading provided by Sindre Sorhus.

These limitations will also be present for plop wrapper CLIs, so it's encouraged to read the above if you're doing so.

Bug Fixes

Internal Changes

The plop CLI itself now has a solid end-to-end tests. While this isn't done, it is very functional today. These tests have enabled us to be confident that this release should work for 99% of users without having to change much if anything at all on their end.

We even wrote our own testing library to support this

Admittedly, we have a low coverage rate, but are testing against most of the big stuff today. We welcome and encourage pull requests adding more tests to increase that rate.

We've also added CI to run those end-to-end tests against every PR against the main branch.

Looking Ahead

While this release is fun, there's more that we want to do internally sometime in the near future.

Namely:

  • Simplify node-plop tests
  • Migrate node-plop to use jest instead of ava
  • Move node-plop to monorepo in the plop repo
  • Add commit hooks and autogenerated changelog to node-plop and plop
  • Rename branches from master to main
  • Add TS example tests to plop

@crutchcorn crutchcorn mentioned this pull request Nov 26, 2021
@@ -470,32 +477,26 @@ Your `index.js` file should look like the following:

```javascript
#!/usr/bin/env node
const path = require('path');
import path from "node:path";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should narrow your engines support to node versions that support the node protocol if not changing this on build.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe I already have narrowed this properly, but will make sure to double-check :)

@evelynhathaway
Copy link
Member

Looks great, just one comment to check but you may have that narrowed right

@crutchcorn crutchcorn merged commit c24e09b into master Nov 27, 2021
@crutchcorn crutchcorn deleted the esm branch November 27, 2021 20:19
@bung87
Copy link

bung87 commented Dec 25, 2021

Plop.execute(env, run) will introduce

(alias) const run: (env: Liftoff.LiftoffEnv, _: any, passArgsBeforeDashes: boolean) => Promise<void>
import run
Argument of type '(env: LiftoffEnv, _: any, passArgsBeforeDashes: boolean) => Promise<void>' is not assignable to parameter of type '(this: Liftoff, env: LiftoffEnv, argv: string[]) => void'.ts(2345)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants