From d7cc6cccfa8ddb42d9dfa0241d17211647aee719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Wed, 5 Jul 2023 19:33:13 +0200 Subject: [PATCH] Add transform support for optional chaining assignment --- packages/babel-helpers/src/helpers.ts | 6 ++ .../.npmignore | 3 + .../README.md | 19 ++++ .../package.json | 56 +++++++++++ .../src/index.ts | 53 +++++++++++ .../assumption-noDocumentAll/basic/input.js | 1 + .../assumption-noDocumentAll/basic/output.js | 2 + .../assumption-noDocumentAll/call/input.js | 1 + .../assumption-noDocumentAll/call/output.js | 2 + .../assumption-noDocumentAll/options.json | 6 ++ .../parenthesized/exec.js | 13 +++ .../parenthesized/input.js | 2 + .../parenthesized/output.js | 3 + .../assumption-pureGetters/call/input.js | 1 + .../assumption-pureGetters/call/output.js | 2 + .../assumption-pureGetters/options.json | 6 ++ .../test/fixtures/general/basic/exec.js | 38 ++++++++ .../test/fixtures/general/basic/input.js | 1 + .../test/fixtures/general/basic/output.js | 2 + .../test/fixtures/general/call/input.js | 1 + .../test/fixtures/general/call/output.js | 2 + .../fixtures/general/parenthesized/exec.js | 13 +++ .../fixtures/general/parenthesized/input.js | 2 + .../fixtures/general/parenthesized/output.js | 3 + .../test/fixtures/general/plus-eq/exec.js | 6 ++ .../test/fixtures/general/plus-eq/input.js | 1 + .../test/fixtures/general/plus-eq/output.js | 2 + .../invalid/optional-call-lhs/input.js | 1 + .../invalid/optional-call-lhs/options.json | 3 + .../invalid/unary-inc-postfix/input.js | 1 + .../invalid/unary-inc-postfix/options.json | 3 + .../invalid/unary-inc-prefix/input.js | 1 + .../invalid/unary-inc-prefix/options.json | 3 + .../test/fixtures/options.json | 3 + .../test/index.js | 3 + .../test/package.json | 1 + .../test/util.skip-bundled.js | 92 +++++++++++++++++++ .../.npmignore | 3 + .../README.md | 19 ++++ .../package.json | 55 +++++++++++ .../src/index.ts | 13 +++ .../src/index.ts | 4 +- .../lhs-assignment-read-and-update/input.js | 1 - .../options.json | 3 - .../fixtures/general/lhs-assignment/input.js | 1 - .../general/lhs-assignment/options.json | 3 - .../test/fixtures/general/lhs-update/input.js | 1 - .../fixtures/general/lhs-update/options.json | 3 - packages/babel-runtime-corejs2/package.json | 9 ++ packages/babel-runtime-corejs3/package.json | 9 ++ packages/babel-runtime/package.json | 9 ++ .../src/ast-types/generated/index.ts | 3 + packages/babel-types/src/definitions/core.ts | 2 +- .../src/validators/generated/index.ts | 1 + tsconfig.json | 8 ++ yarn.lock | 25 +++++ 56 files changed, 515 insertions(+), 15 deletions(-) create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/.npmignore create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/README.md create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/package.json create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/src/index.ts create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/basic/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/basic/output.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/call/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/call/output.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/parenthesized/exec.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/parenthesized/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/parenthesized/output.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-pureGetters/call/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-pureGetters/call/output.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-pureGetters/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/basic/exec.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/basic/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/basic/output.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/call/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/call/output.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/parenthesized/exec.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/parenthesized/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/parenthesized/output.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/plus-eq/exec.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/plus-eq/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/plus-eq/output.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/optional-call-lhs/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/optional-call-lhs/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-postfix/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-postfix/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-prefix/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-prefix/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/index.js create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/package.json create mode 100644 packages/babel-plugin-proposal-optional-chaining-assign/test/util.skip-bundled.js create mode 100644 packages/babel-plugin-syntax-optional-chaining-assign/.npmignore create mode 100644 packages/babel-plugin-syntax-optional-chaining-assign/README.md create mode 100644 packages/babel-plugin-syntax-optional-chaining-assign/package.json create mode 100644 packages/babel-plugin-syntax-optional-chaining-assign/src/index.ts delete mode 100644 packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/input.js delete mode 100644 packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/options.json delete mode 100644 packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment/input.js delete mode 100644 packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment/options.json delete mode 100644 packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-update/input.js delete mode 100644 packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-update/options.json diff --git a/packages/babel-helpers/src/helpers.ts b/packages/babel-helpers/src/helpers.ts index c93baf4b7efd..2187cf2f3c51 100644 --- a/packages/babel-helpers/src/helpers.ts +++ b/packages/babel-helpers/src/helpers.ts @@ -1884,3 +1884,9 @@ helpers.identity = helper("7.17.0")` return x; } `; + +helpers.nullishReceiverError = helper("7.22.6")` + export default function _nullishReceiverError(r) { + throw new TypeError("Cannot set property of null or undefined."); + } +`; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/.npmignore b/packages/babel-plugin-proposal-optional-chaining-assign/.npmignore new file mode 100644 index 000000000000..f9806945836e --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/.npmignore @@ -0,0 +1,3 @@ +src +test +*.log diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/README.md b/packages/babel-plugin-proposal-optional-chaining-assign/README.md new file mode 100644 index 000000000000..41cdc2b60474 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/README.md @@ -0,0 +1,19 @@ +# @babel/plugin-transform-optional-chaining + +> Transform optional chaining operators into a series of nil checks + +See our website [@babel/plugin-transform-optional-chaining](https://babeljs.io/docs/babel-plugin-transform-optional-chaining) for more information. + +## Install + +Using npm: + +```sh +npm install --save-dev @babel/plugin-transform-optional-chaining +``` + +or using yarn: + +```sh +yarn add @babel/plugin-transform-optional-chaining --dev +``` diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/package.json b/packages/babel-plugin-proposal-optional-chaining-assign/package.json new file mode 100644 index 000000000000..93e0fad10dd5 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/package.json @@ -0,0 +1,56 @@ +{ + "name": "@babel/plugin-proposal-optional-chaining-assign", + "version": "7.22.5", + "description": "Transform optional chaining on the left-hand side of assignment expressions", + "repository": { + "type": "git", + "url": "https://github.com/babel/babel.git", + "directory": "packages/babel-plugin-proposal-optional-chaining-assign" + }, + "homepage": "https://babel.dev/docs/en/next/babel-plugin-proposal-optional-chaining-assign", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "main": "./lib/index.js", + "keywords": [ + "babel-plugin" + ], + "dependencies": { + "@babel/helper-plugin-utils": "workspace:^", + "@babel/helper-skip-transparent-expression-wrappers": "workspace:^", + "@babel/plugin-syntax-optional-chaining-assign": "workspace:^", + "@babel/plugin-transform-optional-chaining": "workspace:^" + }, + "peerDependencies": { + "@babel/core": "^7.22.5" + }, + "devDependencies": { + "@babel/helper-plugin-test-runner": "workspace:^" + }, + "engines": { + "node": ">=6.9.0" + }, + "author": "The Babel Team (https://babel.dev/team)", + "conditions": { + "BABEL_8_BREAKING": [ + { + "engines": { + "node": "^16.20.0 || ^18.16.0 || >=20.0.0" + } + }, + {} + ], + "USE_ESM": [ + { + "type": "module" + }, + null + ] + }, + "exports": { + ".": "./lib/index.js", + "./package.json": "./package.json" + }, + "type": "commonjs" +} diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/src/index.ts b/packages/babel-plugin-proposal-optional-chaining-assign/src/index.ts new file mode 100644 index 000000000000..7ce2a87b0dff --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/src/index.ts @@ -0,0 +1,53 @@ +import { declare } from "@babel/helper-plugin-utils"; +import syntaxOptionalChainingAssign from "@babel/plugin-syntax-optional-chaining-assign"; +import type { NodePath } from "@babel/traverse"; +import type * as t from "@babel/types"; +import { skipTransparentExprWrappers } from "@babel/helper-skip-transparent-expression-wrappers"; +import { transformOptionalChain } from "@babel/plugin-transform-optional-chaining"; + +export default declare(api => { + api.assertVersion("^7.22.5"); + + const assumptions = { + noDocumentAll: api.assumption("noDocumentAll") ?? false, + pureGetters: api.assumption("pureGetters") ?? false, + }; + + const { types: t } = api; + + return { + name: "transform-optional-chaining-assign", + inherits: syntaxOptionalChainingAssign, + + visitor: { + AssignmentExpression(path, state) { + let lhs = path.get("left"); + if (!lhs.isExpression()) return; + const isParenthesized = + lhs.node.extra?.parenthesized || + t.isParenthesizedExpression(lhs.node); + + lhs = skipTransparentExprWrappers(lhs) as NodePath< + t.LVal & t.Expression + >; + if (!lhs.isOptionalMemberExpression()) return; + + let ifNullish: t.Expression = path.scope.buildUndefinedNode(); + if (isParenthesized) { + ifNullish = t.callExpression( + state.addHelper("nullishReceiverError"), + [], + ); + if (path.node.operator === "=") { + ifNullish = t.sequenceExpression([ + t.cloneNode(path.node.right), + ifNullish, + ]); + } + } + + transformOptionalChain(lhs, assumptions, path, ifNullish); + }, + }, + }; +}); diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/basic/input.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/basic/input.js new file mode 100644 index 000000000000..df09504a3b67 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/basic/input.js @@ -0,0 +1 @@ +a.b?.c.d?.e.f = g; \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/basic/output.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/basic/output.js new file mode 100644 index 000000000000..f2db1e3f8cf4 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/basic/output.js @@ -0,0 +1,2 @@ +var _a$b; +(_a$b = a.b) == null || (_a$b = _a$b.c.d) == null ? void 0 : _a$b.e.f = g; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/call/input.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/call/input.js new file mode 100644 index 000000000000..cb0e2f0872cd --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/call/input.js @@ -0,0 +1 @@ +a.b?.c.d?.().e.f = g; \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/call/output.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/call/output.js new file mode 100644 index 000000000000..58a05e18fd91 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/call/output.js @@ -0,0 +1,2 @@ +var _a$b, _a$b$c$d, _a$b$c; +(_a$b = a.b) == null || (_a$b$c$d = (_a$b$c = _a$b.c).d) == null ? void 0 : _a$b$c$d.call(_a$b$c).e.f = g; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/options.json b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/options.json new file mode 100644 index 000000000000..782e0dc7360b --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/options.json @@ -0,0 +1,6 @@ +{ + "assumptions": { + "noDocumentAll": true + }, + "plugins": ["proposal-optional-chaining-assign"] +} diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/parenthesized/exec.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/parenthesized/exec.js new file mode 100644 index 000000000000..3ea875580145 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/parenthesized/exec.js @@ -0,0 +1,13 @@ +let a = null; + +let evaluated = false; +expect(() => { + (a?.b) = (evaluated = true); +}).toThrow(TypeError); +//expect(evaluated).toBe(true); + +evaluated = false; +expect(() => { + (a?.b) += (evaluated = true); +}).toThrow(TypeError); +expect(evaluated).toBe(false); diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/parenthesized/input.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/parenthesized/input.js new file mode 100644 index 000000000000..f354ad32e4c3 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/parenthesized/input.js @@ -0,0 +1,2 @@ +(a?.b) = c; +(a?.b) += c; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/parenthesized/output.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/parenthesized/output.js new file mode 100644 index 000000000000..354193932ddd --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-noDocumentAll/parenthesized/output.js @@ -0,0 +1,3 @@ +var _a, _a2; +(_a = a) == null ? (c, babelHelpers.nullishReceiverError()) : _a.b = c; +(_a2 = a) == null ? babelHelpers.nullishReceiverError() : _a2.b += c; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-pureGetters/call/input.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-pureGetters/call/input.js new file mode 100644 index 000000000000..cb0e2f0872cd --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-pureGetters/call/input.js @@ -0,0 +1 @@ +a.b?.c.d?.().e.f = g; \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-pureGetters/call/output.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-pureGetters/call/output.js new file mode 100644 index 000000000000..c5c7594e5c41 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-pureGetters/call/output.js @@ -0,0 +1,2 @@ +var _a$b; +(_a$b = a.b) === null || _a$b === void 0 || _a$b.c.d === null || _a$b.c.d === void 0 ? void 0 : _a$b.c.d().e.f = g; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-pureGetters/options.json b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-pureGetters/options.json new file mode 100644 index 000000000000..0d7bc064c0c0 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/assumption-pureGetters/options.json @@ -0,0 +1,6 @@ +{ + "assumptions": { + "pureGetters": true + }, + "plugins": ["proposal-optional-chaining-assign"] +} diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/basic/exec.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/basic/exec.js new file mode 100644 index 000000000000..cc77520afd08 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/basic/exec.js @@ -0,0 +1,38 @@ +let a = null; + +function never(i) { + throw new Error("This should not be evaluated " + i); +} + +expect(() => { + a.b?.c.d?.e.f = never(1); +}).toThrow(TypeError); + +a = { b: null }; +expect(() => { + a.b?.c.d?.e.f = never(2); +}).not.toThrow(); + +a = { b: { c: null } }; +expect(() => { + a.b?.c.d?.e.f = never(3); +}).toThrow(TypeError); + +a = { b: { c: { d: null } } }; +expect(() => { + a.b?.c.d?.e.f = never(4); +}).not.toThrow(); + +a = { b: { c: { d: { e: null } } } }; +let evaluated = false; +expect(() => { + a.b?.c.d?.e.f = (evaluated = true); +}).toThrow(TypeError); +expect(evaluated).toBe(true); + +a = { b: { c: { d: { e: {} } } } }; +let g = {}; +expect(() => { + a.b?.c.d?.e.f = g; +}).not.toThrow(); +expect(a.b.c.d.e.f).toBe(g); diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/basic/input.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/basic/input.js new file mode 100644 index 000000000000..df09504a3b67 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/basic/input.js @@ -0,0 +1 @@ +a.b?.c.d?.e.f = g; \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/basic/output.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/basic/output.js new file mode 100644 index 000000000000..c97be9ee4f52 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/basic/output.js @@ -0,0 +1,2 @@ +var _a$b; +(_a$b = a.b) === null || _a$b === void 0 || (_a$b = _a$b.c.d) === null || _a$b === void 0 ? void 0 : _a$b.e.f = g; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/call/input.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/call/input.js new file mode 100644 index 000000000000..cb0e2f0872cd --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/call/input.js @@ -0,0 +1 @@ +a.b?.c.d?.().e.f = g; \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/call/output.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/call/output.js new file mode 100644 index 000000000000..736ef71929a8 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/call/output.js @@ -0,0 +1,2 @@ +var _a$b, _a$b$c$d, _a$b$c; +(_a$b = a.b) === null || _a$b === void 0 || (_a$b$c$d = (_a$b$c = _a$b.c).d) === null || _a$b$c$d === void 0 ? void 0 : _a$b$c$d.call(_a$b$c).e.f = g; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/parenthesized/exec.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/parenthesized/exec.js new file mode 100644 index 000000000000..3ea875580145 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/parenthesized/exec.js @@ -0,0 +1,13 @@ +let a = null; + +let evaluated = false; +expect(() => { + (a?.b) = (evaluated = true); +}).toThrow(TypeError); +//expect(evaluated).toBe(true); + +evaluated = false; +expect(() => { + (a?.b) += (evaluated = true); +}).toThrow(TypeError); +expect(evaluated).toBe(false); diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/parenthesized/input.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/parenthesized/input.js new file mode 100644 index 000000000000..f354ad32e4c3 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/parenthesized/input.js @@ -0,0 +1,2 @@ +(a?.b) = c; +(a?.b) += c; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/parenthesized/output.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/parenthesized/output.js new file mode 100644 index 000000000000..8bbd98e76b38 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/parenthesized/output.js @@ -0,0 +1,3 @@ +var _a, _a2; +(_a = a) === null || _a === void 0 ? (c, babelHelpers.nullishReceiverError()) : _a.b = c; +(_a2 = a) === null || _a2 === void 0 ? babelHelpers.nullishReceiverError() : _a2.b += c; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/plus-eq/exec.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/plus-eq/exec.js new file mode 100644 index 000000000000..591f13b173b6 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/plus-eq/exec.js @@ -0,0 +1,6 @@ +let obj = null; +expect(obj?.x += 3).toBe(undefined); + +obj = { x: 1 }; +expect(obj?.x += 3).toBe(4); +expect(obj.x).toBe(4); diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/plus-eq/input.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/plus-eq/input.js new file mode 100644 index 000000000000..7fd123892dd4 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/plus-eq/input.js @@ -0,0 +1 @@ +a?.b.c?.d.e += 3; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/plus-eq/output.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/plus-eq/output.js new file mode 100644 index 000000000000..d929b1a71bde --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/general/plus-eq/output.js @@ -0,0 +1,2 @@ +var _a; +(_a = a) === null || _a === void 0 || (_a = _a.b.c) === null || _a === void 0 ? void 0 : _a.d.e += 3; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/optional-call-lhs/input.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/optional-call-lhs/input.js new file mode 100644 index 000000000000..51ce904b624a --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/optional-call-lhs/input.js @@ -0,0 +1 @@ +a?.() = b; \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/optional-call-lhs/options.json b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/optional-call-lhs/options.json new file mode 100644 index 000000000000..4653803c74a5 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/optional-call-lhs/options.json @@ -0,0 +1,3 @@ +{ + "throws": "a" +} diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-postfix/input.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-postfix/input.js new file mode 100644 index 000000000000..72c17bb988f6 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-postfix/input.js @@ -0,0 +1 @@ +++a?.b; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-postfix/options.json b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-postfix/options.json new file mode 100644 index 000000000000..4653803c74a5 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-postfix/options.json @@ -0,0 +1,3 @@ +{ + "throws": "a" +} diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-prefix/input.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-prefix/input.js new file mode 100644 index 000000000000..72c17bb988f6 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-prefix/input.js @@ -0,0 +1 @@ +++a?.b; diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-prefix/options.json b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-prefix/options.json new file mode 100644 index 000000000000..4653803c74a5 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/invalid/unary-inc-prefix/options.json @@ -0,0 +1,3 @@ +{ + "throws": "a" +} diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/options.json b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/options.json new file mode 100644 index 000000000000..59eec052df58 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/fixtures/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-optional-chaining-assign"] +} diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/index.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/index.js new file mode 100644 index 000000000000..21a55ce6b5e7 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/index.js @@ -0,0 +1,3 @@ +import runner from "@babel/helper-plugin-test-runner"; + +runner(import.meta.url); diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/package.json b/packages/babel-plugin-proposal-optional-chaining-assign/test/package.json new file mode 100644 index 000000000000..5ffd9800b97c --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/package.json @@ -0,0 +1 @@ +{ "type": "module" } diff --git a/packages/babel-plugin-proposal-optional-chaining-assign/test/util.skip-bundled.js b/packages/babel-plugin-proposal-optional-chaining-assign/test/util.skip-bundled.js new file mode 100644 index 000000000000..01638d6bb79a --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining-assign/test/util.skip-bundled.js @@ -0,0 +1,92 @@ +import { willPathCastToBoolean } from "../lib/util.js"; +import { parseSync, traverse } from "@babel/core"; + +function getPath(input, parserOpts) { + let targetPath; + traverse( + parseSync(input, { + parserOpts, + filename: "example.js", + configFile: false, + }), + { + OptionalMemberExpression(path) { + targetPath = path; + path.stop(); + }, + noScope: true, + }, + ); + return targetPath; +} + +describe("willPathCastToBoolean", () => { + const positiveCases = [ + "if(a?.b) {}", + "while(a?.b) {}", + "a?.b ? 0 : 1", + "for(;a?.b;);", + "while(a?.b);", + "do {} while (a?.b)", + "!a?.b", + "if(a && a?.b) {}", + "if(a?.b && a) {}", + "while(a || a?.b) {}", + "while(a?.b || a) {}", + "for(; a ?? a?.b ;);", + "do {} while (0, a?.b)", + "(a?.b, 0)", + "!(a && ( b || ( c ?? ( a?.b && d ) ) ) )", + + // parenthesized + "!((a?.b), 0)", + "((a?.b)) ? 0 : 1", + "while( (a || ((a?.b) && c) ) );", + ]; + + const negativeCases = [ + "() => a?.b", + "for(; a?.b ?? a;);", + "a?.b && a", + "a && a?.b", + "() => a?.b || a", + "() => a || a?.b", + "a?.b()", + "a = a?.b && null", + + // parenthesized + "(a?.b)", + ]; + + describe("default parser options", () => { + test.each(positiveCases)( + "willPathCastToBoolean(a?.b in %p) should return true", + input => { + expect(willPathCastToBoolean(getPath(input))).toBe(true); + }, + ); + test.each(negativeCases)( + "willPathCastToBoolean(a?.b in %p) should return false", + input => { + expect(willPathCastToBoolean(getPath(input))).toBe(false); + }, + ); + }); + + describe("createParenthesizedExpressions", () => { + test.each(positiveCases)( + "willPathCastToBoolean(a?.b in %p with { createParenthesizedExpressions: true }) should return true", + input => { + const parserOpts = { createParenthesizedExpressions: true }; + expect(willPathCastToBoolean(getPath(input, parserOpts))).toBe(true); + }, + ); + test.each(negativeCases)( + "willPathCastToBoolean(a?.b in %p with { createParenthesizedExpressions: true }) should return false", + input => { + const parserOpts = { createParenthesizedExpressions: true }; + expect(willPathCastToBoolean(getPath(input, parserOpts))).toBe(false); + }, + ); + }); +}); diff --git a/packages/babel-plugin-syntax-optional-chaining-assign/.npmignore b/packages/babel-plugin-syntax-optional-chaining-assign/.npmignore new file mode 100644 index 000000000000..f9806945836e --- /dev/null +++ b/packages/babel-plugin-syntax-optional-chaining-assign/.npmignore @@ -0,0 +1,3 @@ +src +test +*.log diff --git a/packages/babel-plugin-syntax-optional-chaining-assign/README.md b/packages/babel-plugin-syntax-optional-chaining-assign/README.md new file mode 100644 index 000000000000..d4f133cf0b8c --- /dev/null +++ b/packages/babel-plugin-syntax-optional-chaining-assign/README.md @@ -0,0 +1,19 @@ +# @babel/plugin-syntax-function-bind + +> Allow parsing of function bind + +See our website [@babel/plugin-syntax-function-bind](https://babeljs.io/docs/babel-plugin-syntax-function-bind) for more information. + +## Install + +Using npm: + +```sh +npm install --save-dev @babel/plugin-syntax-function-bind +``` + +or using yarn: + +```sh +yarn add @babel/plugin-syntax-function-bind --dev +``` diff --git a/packages/babel-plugin-syntax-optional-chaining-assign/package.json b/packages/babel-plugin-syntax-optional-chaining-assign/package.json new file mode 100644 index 000000000000..e1d5afc26358 --- /dev/null +++ b/packages/babel-plugin-syntax-optional-chaining-assign/package.json @@ -0,0 +1,55 @@ +{ + "name": "@babel/plugin-syntax-optional-chaining-assign", + "version": "7.22.5", + "description": "Allow parsing of optional chaining on the left-hand side of assignment expressions", + "repository": { + "type": "git", + "url": "https://github.com/babel/babel.git", + "directory": "packages/babel-plugin-syntax-optional-chaining-assign" + }, + "homepage": "https://babel.dev/docs/en/next/babel-plugin-syntax-optional-chaining-assign", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "main": "./lib/index.js", + "keywords": [ + "babel-plugin" + ], + "dependencies": { + "@babel/helper-plugin-utils": "workspace:^" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "devDependencies": { + "@babel/core": "workspace:^" + }, + "engines": { + "node": ">=6.9.0" + }, + "author": "The Babel Team (https://babel.dev/team)", + "conditions": { + "BABEL_8_BREAKING": [ + { + "engines": { + "node": "^16.20.0 || ^18.16.0 || >=20.0.0" + } + }, + { + "exports": null + } + ], + "USE_ESM": [ + { + "type": "module" + }, + null + ] + }, + "exports": { + ".": "./lib/index.js", + "./package.json": "./package.json" + }, + "type": "commonjs" +} diff --git a/packages/babel-plugin-syntax-optional-chaining-assign/src/index.ts b/packages/babel-plugin-syntax-optional-chaining-assign/src/index.ts new file mode 100644 index 000000000000..e0b2db0f4e47 --- /dev/null +++ b/packages/babel-plugin-syntax-optional-chaining-assign/src/index.ts @@ -0,0 +1,13 @@ +import { declare } from "@babel/helper-plugin-utils"; + +export default declare(api => { + api.assertVersion(7); + + return { + name: "syntax-optional-chaining-assign", + + manipulateOptions(opts, parserOpts) { + parserOpts.plugins.push("optionalChainingAssign"); + }, + }; +}); diff --git a/packages/babel-plugin-transform-optional-chaining/src/index.ts b/packages/babel-plugin-transform-optional-chaining/src/index.ts index f571eb1a7528..81735c1266bf 100644 --- a/packages/babel-plugin-transform-optional-chaining/src/index.ts +++ b/packages/babel-plugin-transform-optional-chaining/src/index.ts @@ -1,6 +1,6 @@ import { declare } from "@babel/helper-plugin-utils"; import syntaxOptionalChaining from "@babel/plugin-syntax-optional-chaining"; -import { transform } from "./transform"; +import { transform, transformOptionalChain } from "./transform"; import type { NodePath } from "@babel/traverse"; import type * as t from "@babel/types"; @@ -28,4 +28,4 @@ export default declare((api, options: Options) => { }; }); -export { transform }; +export { transform, transformOptionalChain }; diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/input.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/input.js deleted file mode 100644 index 86f4ccc69b4b..000000000000 --- a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/input.js +++ /dev/null @@ -1 +0,0 @@ -a?.b += 1 diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/options.json b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/options.json deleted file mode 100644 index ea37454d9b87..000000000000 --- a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Invalid left-hand side in assignment expression" -} diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment/input.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment/input.js deleted file mode 100644 index bf7a81758e69..000000000000 --- a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment/input.js +++ /dev/null @@ -1 +0,0 @@ -a?.b = 42 diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment/options.json b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment/options.json deleted file mode 100644 index ea37454d9b87..000000000000 --- a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-assignment/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Invalid left-hand side in assignment expression" -} diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-update/input.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-update/input.js deleted file mode 100644 index 5a451b8587c5..000000000000 --- a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-update/input.js +++ /dev/null @@ -1 +0,0 @@ -a?.b++ diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-update/options.json b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-update/options.json deleted file mode 100644 index 0153e85a5e1c..000000000000 --- a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/lhs-update/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Invalid left-hand side in postfix operation" -} diff --git a/packages/babel-runtime-corejs2/package.json b/packages/babel-runtime-corejs2/package.json index 0c9724cfb118..2ba2dbd33036 100644 --- a/packages/babel-runtime-corejs2/package.json +++ b/packages/babel-runtime-corejs2/package.json @@ -945,6 +945,15 @@ "./helpers/identity.js" ], "./helpers/esm/identity": "./helpers/esm/identity.js", + "./helpers/nullishReceiverError": [ + { + "node": "./helpers/nullishReceiverError.js", + "import": "./helpers/esm/nullishReceiverError.js", + "default": "./helpers/nullishReceiverError.js" + }, + "./helpers/nullishReceiverError.js" + ], + "./helpers/esm/nullishReceiverError": "./helpers/esm/nullishReceiverError.js", "./package": "./package.json", "./package.json": "./package.json", "./regenerator": "./regenerator/index.js", diff --git a/packages/babel-runtime-corejs3/package.json b/packages/babel-runtime-corejs3/package.json index f702cf082716..6d330c6efe37 100644 --- a/packages/babel-runtime-corejs3/package.json +++ b/packages/babel-runtime-corejs3/package.json @@ -944,6 +944,15 @@ "./helpers/identity.js" ], "./helpers/esm/identity": "./helpers/esm/identity.js", + "./helpers/nullishReceiverError": [ + { + "node": "./helpers/nullishReceiverError.js", + "import": "./helpers/esm/nullishReceiverError.js", + "default": "./helpers/nullishReceiverError.js" + }, + "./helpers/nullishReceiverError.js" + ], + "./helpers/esm/nullishReceiverError": "./helpers/esm/nullishReceiverError.js", "./package": "./package.json", "./package.json": "./package.json", "./regenerator": "./regenerator/index.js", diff --git a/packages/babel-runtime/package.json b/packages/babel-runtime/package.json index ae2235a05376..d707a07ac662 100644 --- a/packages/babel-runtime/package.json +++ b/packages/babel-runtime/package.json @@ -944,6 +944,15 @@ "./helpers/identity.js" ], "./helpers/esm/identity": "./helpers/esm/identity.js", + "./helpers/nullishReceiverError": [ + { + "node": "./helpers/nullishReceiverError.js", + "import": "./helpers/esm/nullishReceiverError.js", + "default": "./helpers/nullishReceiverError.js" + }, + "./helpers/nullishReceiverError.js" + ], + "./helpers/esm/nullishReceiverError": "./helpers/esm/nullishReceiverError.js", "./package": "./package.json", "./package.json": "./package.json", "./regenerator": "./regenerator/index.js", diff --git a/packages/babel-types/src/ast-types/generated/index.ts b/packages/babel-types/src/ast-types/generated/index.ts index cbacd6ec2a43..e014483a9c32 100644 --- a/packages/babel-types/src/ast-types/generated/index.ts +++ b/packages/babel-types/src/ast-types/generated/index.ts @@ -2405,6 +2405,7 @@ export type LVal = | AssignmentPattern | ArrayPattern | ObjectPattern + | OptionalMemberExpression | TSParameterProperty | TSAsExpression | TSSatisfiesExpression @@ -5786,6 +5787,7 @@ export interface ParentMaps { | UnionTypeAnnotation; OptionalMemberExpression: | ArrayExpression + | ArrayPattern | ArrowFunctionExpression | AssignmentExpression | AssignmentPattern @@ -5821,6 +5823,7 @@ export interface ParentMaps { | ParenthesizedExpression | PipelineBareFunction | PipelineTopicExpression + | RestElement | ReturnStatement | SequenceExpression | SpreadElement diff --git a/packages/babel-types/src/definitions/core.ts b/packages/babel-types/src/definitions/core.ts index 5ff8984d1c7e..8e43d3a8e2ab 100644 --- a/packages/babel-types/src/definitions/core.ts +++ b/packages/babel-types/src/definitions/core.ts @@ -2150,7 +2150,7 @@ defineType("ExportNamespaceSpecifier", { defineType("OptionalMemberExpression", { builder: ["object", "property", "computed", "optional"], visitor: ["object", "property"], - aliases: ["Expression"], + aliases: ["Expression", "LVal"], fields: { object: { validate: assertNodeType("Expression"), diff --git a/packages/babel-types/src/validators/generated/index.ts b/packages/babel-types/src/validators/generated/index.ts index 0933f7fa883d..faf2734bf136 100644 --- a/packages/babel-types/src/validators/generated/index.ts +++ b/packages/babel-types/src/validators/generated/index.ts @@ -3162,6 +3162,7 @@ export function isLVal( case "AssignmentPattern": case "ArrayPattern": case "ObjectPattern": + case "OptionalMemberExpression": case "TSParameterProperty": case "TSAsExpression": case "TSSatisfiesExpression": diff --git a/tsconfig.json b/tsconfig.json index b2a6d0dc8f5f..4b77fe8dc8d9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -51,6 +51,7 @@ "./packages/babel-plugin-proposal-function-bind/src/**/*.ts", "./packages/babel-plugin-proposal-function-sent/src/**/*.ts", "./packages/babel-plugin-proposal-import-attributes-to-assertions/src/**/*.ts", + "./packages/babel-plugin-proposal-optional-chaining-assign/src/**/*.ts", "./packages/babel-plugin-proposal-partial-application/src/**/*.ts", "./packages/babel-plugin-proposal-pipeline-operator/src/**/*.ts", "./packages/babel-plugin-proposal-record-and-tuple/src/**/*.ts", @@ -71,6 +72,7 @@ "./packages/babel-plugin-syntax-import-reflection/src/**/*.ts", "./packages/babel-plugin-syntax-jsx/src/**/*.ts", "./packages/babel-plugin-syntax-module-blocks/src/**/*.ts", + "./packages/babel-plugin-syntax-optional-chaining-assign/src/**/*.ts", "./packages/babel-plugin-syntax-partial-application/src/**/*.ts", "./packages/babel-plugin-syntax-pipeline-operator/src/**/*.ts", "./packages/babel-plugin-syntax-record-and-tuple/src/**/*.ts", @@ -323,6 +325,9 @@ "@babel/plugin-proposal-import-attributes-to-assertions": [ "./packages/babel-plugin-proposal-import-attributes-to-assertions/src" ], + "@babel/plugin-proposal-optional-chaining-assign": [ + "./packages/babel-plugin-proposal-optional-chaining-assign/src" + ], "@babel/plugin-proposal-partial-application": [ "./packages/babel-plugin-proposal-partial-application/src" ], @@ -383,6 +388,9 @@ "@babel/plugin-syntax-module-blocks": [ "./packages/babel-plugin-syntax-module-blocks/src" ], + "@babel/plugin-syntax-optional-chaining-assign": [ + "./packages/babel-plugin-syntax-optional-chaining-assign/src" + ], "@babel/plugin-syntax-partial-application": [ "./packages/babel-plugin-syntax-partial-application/src" ], diff --git a/yarn.lock b/yarn.lock index 599e79777c8b..cf9b1a888ad4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1375,6 +1375,20 @@ __metadata: languageName: unknown linkType: soft +"@babel/plugin-proposal-optional-chaining-assign@workspace:packages/babel-plugin-proposal-optional-chaining-assign": + version: 0.0.0-use.local + resolution: "@babel/plugin-proposal-optional-chaining-assign@workspace:packages/babel-plugin-proposal-optional-chaining-assign" + dependencies: + "@babel/helper-plugin-test-runner": "workspace:^" + "@babel/helper-plugin-utils": "workspace:^" + "@babel/helper-skip-transparent-expression-wrappers": "workspace:^" + "@babel/plugin-syntax-optional-chaining-assign": "workspace:^" + "@babel/plugin-transform-optional-chaining": "workspace:^" + peerDependencies: + "@babel/core": ^7.22.5 + languageName: unknown + linkType: soft + "@babel/plugin-proposal-partial-application@workspace:packages/babel-plugin-proposal-partial-application": version: 0.0.0-use.local resolution: "@babel/plugin-proposal-partial-application@workspace:packages/babel-plugin-proposal-partial-application" @@ -1823,6 +1837,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-optional-chaining-assign@workspace:^, @babel/plugin-syntax-optional-chaining-assign@workspace:packages/babel-plugin-syntax-optional-chaining-assign": + version: 0.0.0-use.local + resolution: "@babel/plugin-syntax-optional-chaining-assign@workspace:packages/babel-plugin-syntax-optional-chaining-assign" + dependencies: + "@babel/core": "workspace:^" + "@babel/helper-plugin-utils": "workspace:^" + peerDependencies: + "@babel/core": ^7.0.0-0 + languageName: unknown + linkType: soft + "@babel/plugin-syntax-optional-chaining@npm:^7.8.3": version: 7.8.3 resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3"