npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@rsbuild/plugin-check-syntax

v1.2.0

Published

An Rsbuild plugin to check the syntax compatibility of output files.

Downloads

22,505

Readme

@rsbuild/plugin-check-syntax

An Rsbuild plugin to check the syntax compatibility of output files.

This plugin tries to find incompatible syntax in the output files with the current browserslist value. If any incompatible syntax is found, it will print detailed information to the terminal and abort the build.

Usage

Install:

npm add @rsbuild/plugin-check-syntax -D

Add plugin to your rsbuild.config.ts:

// rsbuild.config.ts
import { pluginCheckSyntax } from "@rsbuild/plugin-check-syntax";

export default {
  plugins: [pluginCheckSyntax()],
};

Enable Detection

After registering the Check Syntax plugin, Rsbuild will perform syntax checking after production builds.

When Rsbuild detects incompatible advanced syntax in the build artifacts, it will print the error logs in the terminal and exit the current build process.

Error Logs

The format of the error logs is as follows, including the source file, artifact location, error reason, and source code:

error   [@rsbuild/plugin-check-syntax] Find some syntax that does not match "ecmaVersion <= 2015":

  Error 1
  source:  /node_modules/foo/index.js:1:0
  output:  /dist/static/js/main.3f7a4d7e.js:2:39400
  reason:  Unexpected token (1:178)
  code:
     9 |
    10 | var b = 2;
    11 |
  > 12 | console.log(() => {
    13 |   return a + b;
    14 | });
    15 |

Currently, syntax checking is implemented based on AST parser. Each time it performs a check, it can only identify the first incompatible syntax found in the file. If there are multiple incompatible syntaxes in the file, you need to fix the detected syntax and re-run the check.

If the corresponding source location is not shown in the log, try setting output.minify to false and rebuild again.

Note that displaying source code information depends on the source map file. You can configure the output.sourceMap option to generate source map files during production builds.

export default {
  output: {
    sourceMap: {
      js:
        process.env.NODE_ENV === "production"
          ? "source-map"
          : "cheap-module-source-map",
    },
  },
};

Solutions

If a syntax error is detected, you can handle it in the following ways:

  • If you want to downgrade this syntax to ensure good code compatibility, you can compile the specified module through the source.include config.
  • If you don't want to downgrade the syntax, you can adjust the project's browserslist to match the syntax, or set the ecmaVersion option.
  • If you don't want to check the syntax of specified files, you can use the exclude option to exclude the files to be checked.

Take /node_modules/foo/index.js as an example, you can add it to source.include to compile it:

// rsbuild.config.ts
export default {
  source: {
    include: [/node_modules[\\/]foo[\\/]/],
  },
};

Options

targets

  • Type: string[]
  • Default: The browserslist configuration of the current project

targets is the target browser range, its value is a standard browserslist. Check Syntax plugin will by default read the current project's browserslist configuration, so you usually don't need to manually configure the targets option.

Rsbuild will read the value of targets and automatically deduce the minimum ECMAScript syntax version that can be used in the build artifacts, such as ES5 or ES2015.

  • Example:

For example, if the target browsers to be compatible with in the project are Chrome 53 and later versions, you can add the following configuration:

pluginCheckSyntax({
  targets: ["chrome >= 53"],
});

Rsbuild will deduce that the ECMAScript syntax version that can be used with chrome >= 53 is ES2015. When the build artifacts contain ES2016 or higher syntax, it triggers syntax error prompts.

If you want to learn more about how to use browserslist, please refer to "Browserslist".

ecmaVersion

  • Type: 3 | 5 | 6 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 'latest'
  • Default: Automatically analyzed based on targets

ecmaVersion represents the minimum ECMAScript syntax version that can be used in the build artifact.

If ecmaVersion is not set, Check Syntax plugin will infer the ECMAScript version based on targets. Currently, the supported inference range is es5 ~ es2018.

  • Example:

For example, if the minimum ECMAScript syntax version that can be used in the build artifacts is ES2020, you can add the following configuration:

pluginCheckSyntax({
  ecmaVersion: 2020,
});

At this time, the build artifacts can include all syntax supported by ES2020, such as optional chaining.

exclude

  • Type: RegExp | RegExp[]
  • Default: undefined

exclude is used to exclude a portion of source files during detection. You can pass in one or more regular expressions to match the paths of source files. Files that match the regular expression will be ignored and will not trigger syntax checking.

  • Example:

For example, to ignore files under the node_modules/foo directory:

pluginCheckSyntax({
  exclude: /node_modules\/foo/,
});

excludeOutput

  • Type: RegExp | RegExp[]
  • Default: undefined

excludeOutput is used to exclude a portion of output files before detection. You can pass in one or more regular expressions to match the paths of output files. Files that match the regular expression will be ignored and will not trigger syntax checking.

  • Example:

For example, to ignore files under the dist/js directory:

pluginCheckSyntax({
  excludeOutput: /dist\/js/,
});

excludeErrorLogs

  • Type: ('source' | 'output' | 'reason' | 'code')[]
  • Default: []

excludeErrorLogs is used to ignore specified syntax error messages after detection. You can pass in one or more error message types to ignore.

  • Example:

For example, to ignore the reason and code displayed in the terminal.

pluginCheckSyntax({
  excludeErrorLogs: ["reason", "code"],
});

Limitations

  1. Check Syntax plugin only checks incompatible syntax in the outputs and cannot detect missing polyfills.
  2. Check Syntax plugin's detection may be inaccurate in certain cases due to the limitations of AST parser. Check Syntax is implemented based on Acorn, which targets a specific ECMA version, such as ES2018. On the other hand, SWC can target specific syntax during compilation, such as ES2018's Object Spread. This difference means that using the same browserslist configuration, SWC's compiled output is correct, but Check Syntax may still fail detection.

License

MIT.