diff --git a/CHANGELOG.md b/CHANGELOG.md index 24614cbb36f..51c223ede75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +* Add `deno` as a valid value for `target` ([#2686](https://github.com/evanw/esbuild/issues/2686)) + + The `target` setting in esbuild allows you to enable or disable JavaScript syntax features for a given version of a set of target JavaScript VMs. Previously [Deno](https://deno.land/) was not one of the JavaScript VMs that esbuild supported with `target`, but it will now be supported starting from this release. For example, versions of Deno older than v1.2 don't support the new `||=` operator, so adding e.g. `--target=deno1.0` to esbuild now lets you tell esbuild to transpile `||=` to older JavaScript. + * Fix the `esbuild-wasm` package in Node v19 ([#2683](https://github.com/evanw/esbuild/issues/2683)) A recent change to Node v19 added a non-writable `crypto` property to the global object: https://github.com/nodejs/node/pull/44897. This conflicts with Go's WebAssembly shim code, which overwrites the global `crypto` property. As a result, all Go-based WebAssembly code that uses the built-in shim (including esbuild) is now broken on Node v19. This release of esbuild fixes the issue by reconfiguring the global `crypto` property to be writable before invoking Go's WebAssembly shim code. diff --git a/internal/compat/js_table.go b/internal/compat/js_table.go index cf0f0db1df2..4615a9ab695 100644 --- a/internal/compat/js_table.go +++ b/internal/compat/js_table.go @@ -6,6 +6,7 @@ type Engine uint8 const ( Chrome Engine = iota + Deno Edge ES Firefox @@ -22,6 +23,8 @@ func (e Engine) String() string { switch e { case Chrome: return "chrome" + case Deno: + return "deno" case Edge: return "edge" case ES: @@ -227,6 +230,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ArraySpread: { Chrome: {{start: v{46, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{13, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{36, 0, 0}}}, @@ -238,6 +242,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, Arrow: { Chrome: {{start: v{49, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{13, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{45, 0, 0}}}, @@ -248,6 +253,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, AsyncAwait: { Chrome: {{start: v{55, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{15, 0, 0}}}, ES: {{start: v{2017, 0, 0}}}, Firefox: {{start: v{52, 0, 0}}}, @@ -258,6 +264,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, AsyncGenerator: { Chrome: {{start: v{63, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{79, 0, 0}}}, ES: {{start: v{2018, 0, 0}}}, Firefox: {{start: v{57, 0, 0}}}, @@ -268,9 +275,11 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, Bigint: { Chrome: {{start: v{67, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{79, 0, 0}}}, ES: {{start: v{2020, 0, 0}}}, Firefox: {{start: v{68, 0, 0}}}, + Hermes: {{start: v{0, 12, 0}}}, IOS: {{start: v{14, 0, 0}}}, Node: {{start: v{10, 4, 0}}}, Opera: {{start: v{54, 0, 0}}}, @@ -279,6 +288,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, Class: { Chrome: {{start: v{49, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{13, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{45, 0, 0}}}, @@ -289,6 +299,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ClassField: { Chrome: {{start: v{73, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{79, 0, 0}}}, ES: {{start: v{2022, 0, 0}}}, Firefox: {{start: v{69, 0, 0}}}, @@ -299,6 +310,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ClassPrivateAccessor: { Chrome: {{start: v{84, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{84, 0, 0}}}, ES: {{start: v{2022, 0, 0}}}, Firefox: {{start: v{90, 0, 0}}}, @@ -309,6 +321,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ClassPrivateBrandCheck: { Chrome: {{start: v{91, 0, 0}}}, + Deno: {{start: v{1, 9, 0}}}, Edge: {{start: v{91, 0, 0}}}, ES: {{start: v{2022, 0, 0}}}, Firefox: {{start: v{90, 0, 0}}}, @@ -319,6 +332,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ClassPrivateField: { Chrome: {{start: v{84, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{84, 0, 0}}}, ES: {{start: v{2022, 0, 0}}}, Firefox: {{start: v{90, 0, 0}}}, @@ -329,6 +343,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ClassPrivateMethod: { Chrome: {{start: v{84, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{84, 0, 0}}}, ES: {{start: v{2022, 0, 0}}}, Firefox: {{start: v{90, 0, 0}}}, @@ -339,6 +354,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ClassPrivateStaticAccessor: { Chrome: {{start: v{84, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{84, 0, 0}}}, ES: {{start: v{2022, 0, 0}}}, Firefox: {{start: v{90, 0, 0}}}, @@ -349,6 +365,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ClassPrivateStaticField: { Chrome: {{start: v{74, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{79, 0, 0}}}, ES: {{start: v{2022, 0, 0}}}, Firefox: {{start: v{90, 0, 0}}}, @@ -359,6 +376,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ClassPrivateStaticMethod: { Chrome: {{start: v{84, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{84, 0, 0}}}, ES: {{start: v{2022, 0, 0}}}, Firefox: {{start: v{90, 0, 0}}}, @@ -377,6 +395,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ClassStaticField: { Chrome: {{start: v{73, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{79, 0, 0}}}, ES: {{start: v{2022, 0, 0}}}, Firefox: {{start: v{75, 0, 0}}}, @@ -387,6 +406,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ConstAndLet: { Chrome: {{start: v{49, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{14, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{51, 0, 0}}}, @@ -397,6 +417,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, DefaultArgument: { Chrome: {{start: v{49, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{14, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{53, 0, 0}}}, @@ -407,6 +428,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, Destructuring: { Chrome: {{start: v{51, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{18, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{53, 0, 0}}}, @@ -428,6 +450,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ExponentOperator: { Chrome: {{start: v{52, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{14, 0, 0}}}, ES: {{start: v{2016, 0, 0}}}, Firefox: {{start: v{52, 0, 0}}}, @@ -448,6 +471,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ForAwait: { Chrome: {{start: v{63, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{79, 0, 0}}}, ES: {{start: v{2018, 0, 0}}}, Firefox: {{start: v{57, 0, 0}}}, @@ -458,6 +482,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ForOf: { Chrome: {{start: v{51, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{15, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{53, 0, 0}}}, @@ -469,6 +494,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, Generator: { Chrome: {{start: v{50, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{13, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{53, 0, 0}}}, @@ -479,6 +505,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, Hashbang: { Chrome: {{start: v{74, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{79, 0, 0}}}, Firefox: {{start: v{67, 0, 0}}}, IOS: {{start: v{13, 4, 0}}}, @@ -502,6 +529,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, LogicalAssignment: { Chrome: {{start: v{85, 0, 0}}}, + Deno: {{start: v{1, 2, 0}}}, Edge: {{start: v{85, 0, 0}}}, ES: {{start: v{2021, 0, 0}}}, Firefox: {{start: v{79, 0, 0}}}, @@ -513,6 +541,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, NestedRestBinding: { Chrome: {{start: v{49, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{14, 0, 0}}}, ES: {{start: v{2016, 0, 0}}}, Firefox: {{start: v{47, 0, 0}}}, @@ -524,6 +553,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, NewTarget: { Chrome: {{start: v{46, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{14, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{41, 0, 0}}}, @@ -541,6 +571,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, NullishCoalescing: { Chrome: {{start: v{80, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{80, 0, 0}}}, ES: {{start: v{2020, 0, 0}}}, Firefox: {{start: v{72, 0, 0}}}, @@ -552,6 +583,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ObjectAccessors: { Chrome: {{start: v{5, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{12, 0, 0}}}, ES: {{start: v{5, 0, 0}}}, Firefox: {{start: v{2, 0, 0}}}, @@ -565,6 +597,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ObjectExtensions: { Chrome: {{start: v{44, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{12, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{34, 0, 0}}}, @@ -576,6 +609,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, ObjectRestSpread: { Chrome: {{start: v{60, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{79, 0, 0}}}, ES: {{start: v{2018, 0, 0}}}, Firefox: {{start: v{55, 0, 0}}}, @@ -587,9 +621,11 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, OptionalCatchBinding: { Chrome: {{start: v{66, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{79, 0, 0}}}, ES: {{start: v{2019, 0, 0}}}, Firefox: {{start: v{58, 0, 0}}}, + Hermes: {{start: v{0, 12, 0}}}, IOS: {{start: v{11, 3, 0}}}, Node: {{start: v{10, 0, 0}}}, Opera: {{start: v{53, 0, 0}}}, @@ -597,6 +633,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, OptionalChain: { Chrome: {{start: v{91, 0, 0}}}, + Deno: {{start: v{1, 9, 0}}}, Edge: {{start: v{91, 0, 0}}}, ES: {{start: v{2020, 0, 0}}}, Firefox: {{start: v{74, 0, 0}}}, @@ -607,6 +644,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, RegexpDotAllFlag: { Chrome: {{start: v{62, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{79, 0, 0}}}, ES: {{start: v{2018, 0, 0}}}, Firefox: {{start: v{78, 0, 0}}}, @@ -618,6 +656,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, RegexpLookbehindAssertions: { Chrome: {{start: v{62, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{79, 0, 0}}}, ES: {{start: v{2018, 0, 0}}}, Firefox: {{start: v{78, 0, 0}}}, @@ -636,6 +675,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, RegexpNamedCaptureGroups: { Chrome: {{start: v{64, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{79, 0, 0}}}, ES: {{start: v{2018, 0, 0}}}, Firefox: {{start: v{78, 0, 0}}}, @@ -646,6 +686,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, RegexpStickyAndUnicodeFlags: { Chrome: {{start: v{50, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{13, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{46, 0, 0}}}, @@ -657,6 +698,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, RegexpUnicodePropertyEscapes: { Chrome: {{start: v{64, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{79, 0, 0}}}, ES: {{start: v{2018, 0, 0}}}, Firefox: {{start: v{78, 0, 0}}}, @@ -667,6 +709,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, RestArgument: { Chrome: {{start: v{47, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{12, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{43, 0, 0}}}, @@ -677,6 +720,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, TemplateLiteral: { Chrome: {{start: v{41, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{13, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{34, 0, 0}}}, @@ -707,6 +751,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{ }, UnicodeEscapes: { Chrome: {{start: v{44, 0, 0}}}, + Deno: {{start: v{1, 0, 0}}}, Edge: {{start: v{12, 0, 0}}}, ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{53, 0, 0}}}, diff --git a/pkg/api/api_js_table.go b/pkg/api/api_js_table.go index 458bbcd55ba..f55ce9138f3 100644 --- a/pkg/api/api_js_table.go +++ b/pkg/api/api_js_table.go @@ -15,6 +15,7 @@ const ( EngineNode EngineOpera EngineSafari + EngineDeno EngineHermes EngineRhino ) @@ -37,6 +38,8 @@ func convertEngineName(engine EngineName) compat.Engine { return compat.Opera case EngineSafari: return compat.Safari + case EngineDeno: + return compat.Deno case EngineHermes: return compat.Hermes case EngineRhino: diff --git a/pkg/cli/cli_js_table.go b/pkg/cli/cli_js_table.go index 2d95253bd29..6807ea5eae5 100644 --- a/pkg/cli/cli_js_table.go +++ b/pkg/cli/cli_js_table.go @@ -6,6 +6,7 @@ import "github.com/evanw/esbuild/pkg/api" var validEngines = map[string]api.EngineName{ "chrome": api.EngineChrome, + "deno": api.EngineDeno, "edge": api.EngineEdge, "firefox": api.EngineFirefox, "hermes": api.EngineHermes, diff --git a/scripts/compat-table.js b/scripts/compat-table.js index 525454ef334..9e2c717ee96 100644 --- a/scripts/compat-table.js +++ b/scripts/compat-table.js @@ -97,6 +97,7 @@ const engines = [ 'safari', // Uncommon JavaScript runtimes + 'deno', 'hermes', 'rhino', ]