Skip to content

Commit

Permalink
feat: add support for converting optional chaining to regular chaining (
Browse files Browse the repository at this point in the history
#3891)

* feat: add support for converting optional chaining to regular chaining

* chore: linting fixes
  • Loading branch information
feywind authored Jan 26, 2023
1 parent 5cb4f73 commit f8414ac
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 2 deletions.
2 changes: 1 addition & 1 deletion packages/typeless-sample-bot/__snapshots__/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion packages/typeless-sample-bot/src/samples.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import path from 'node:path';
import {typescript as presetTypescript} from './preset-loader.js';
import importToRequire from './transforms/import-to-require.js';
import nullCoalescing from './transforms/null-coalescing.js';
import optionalChaining from './transforms/optional-chaining.js';
import {addComments} from './transforms/add-comments.js';

// Converts an async iterable into an array of the same type.
Expand Down Expand Up @@ -85,7 +86,7 @@ export async function* filterByContents(
// the transform process.
const babelConfig = {
presets: [[presetTypescript, {}]],
plugins: [[importToRequire], [nullCoalescing]],
plugins: [[importToRequire], [nullCoalescing], [optionalChaining]],
parserOpts: {} as babel.ParserOptions,
generatorOpts: {
// Ensures that Babel keeps newlines so that comments end up
Expand Down
48 changes: 48 additions & 0 deletions packages/typeless-sample-bot/src/transforms/optional-chaining.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import * as Babel from '@babel/types';
import {NodePathSingle, VisitorPlugin} from './babel.js';

// Because optional chaining is still a proposal in many versions of Node,
// go ahead and convert it to plain '.'. It should work in TypeScript.
export default function optionalChaining(): VisitorPlugin {
return {
visitor: {
OptionalCallExpression(path: NodePathSingle) {
const node = path.node as Babel.OptionalCallExpression;
path.replaceWith(Babel.callExpression(node.callee, node.arguments));
},
OptionalMemberExpression(path: NodePathSingle) {
const node = path.node as Babel.OptionalMemberExpression;
path.replaceWith(
Babel.memberExpression(
node.object,
node.property,
node.computed,
node.optional
)
);
},
LogicalExpression(path: NodePathSingle) {
const node = path.node as Babel.LogicalExpression;
if (node.operator === '??') {
path.replaceWith(
Babel.logicalExpression('||', node.left, node.right)
);
}
},
},
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ function listenForAvroRecords(subscriptionNameOrId: string, timeout: number) {
subscription.removeListener('message', messageHandler);
console.log(`${messageCount} message(s) received.`);
}, timeout * 1000);

use?.optional?.chaining?.();
}
// [END pubsub_subscribe_avro_records]

Expand Down

0 comments on commit f8414ac

Please sign in to comment.