Skip to content

Commit 4bbe85c

Browse files
feat!: migrate to oxc-parser and oxc-walker (#527)
* feat!: migrate to oxc-parser and oxc-walker * refactor: use destructuring for `oxc-parser` result * chore(deps): bump `oxc-transform` to 0.96.0 * fix: remove unused dependency --------- Co-authored-by: Bobbie Goede <[email protected]>
1 parent 7c7821c commit 4bbe85c

File tree

6 files changed

+318
-169
lines changed

6 files changed

+318
-169
lines changed

packages/bundle-utils/package.json

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,16 @@
2020
"dependencies": {
2121
"@intlify/message-compiler": "next",
2222
"@intlify/shared": "catalog:intlify",
23-
"acorn": "^8.8.2",
2423
"escodegen": "^2.1.0",
25-
"estree-walker": "^2.0.2",
2624
"jsonc-eslint-parser": "^2.3.0",
27-
"oxc-transform": "^0.95.0",
25+
"oxc-parser": "^0.96.0",
26+
"oxc-transform": "^0.96.0",
27+
"oxc-walker": "^0.5.2",
2828
"source-map-js": "^1.0.1",
2929
"yaml-eslint-parser": "^1.2.2"
3030
},
3131
"devDependencies": {
3232
"@types/escodegen": "^0.0.10",
33-
"@types/estree": "^1.0.0",
3433
"unbuild": "catalog:"
3534
},
3635
"engines": {

packages/bundle-utils/src/js.ts

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
*/
44

55
import { isBoolean, isNumber, isString } from '@intlify/shared'
6-
import { parse as parseJavaScript } from 'acorn'
76
import { generate as generateJavaScript } from 'escodegen'
8-
import { walk } from 'estree-walker'
7+
import { parseSync as parseJavaScript } from 'oxc-parser'
8+
import { walk } from 'oxc-walker'
99
import {
1010
createCodeGenerator,
1111
generateMessageFunction,
1212
generateResourceAst,
1313
mapLinesColumns
1414
} from './codegen'
1515

16-
import type { Node } from 'estree'
16+
import type { Node } from 'oxc-parser'
1717
import type { RawSourceMap } from 'source-map-js'
1818
import type { CodeGenerator, CodeGenFunction, CodeGenOptions, CodeGenResult } from './codegen'
1919

@@ -50,12 +50,11 @@ export function generate(
5050

5151
const _options = Object.assign({}, DEFAULT_OPTIONS, options, { source: value })
5252
const generator = createCodeGenerator(_options)
53-
const ast = parseJavaScript(value, {
54-
ecmaVersion: 'latest',
53+
54+
const { program: ast } = parseJavaScript(_options.filename ?? '', value, {
5555
sourceType: 'module',
56-
sourceFile: _options.filename,
57-
allowImportExportEverywhere: true
58-
}) as Node
56+
lang: 'js'
57+
})
5958

6059
const exportResult = scanAst(ast)
6160
if (!_options.allowDynamic) {
@@ -154,15 +153,9 @@ function _generate(
154153
// slice and reuse imports and top-level variable declarations as-is
155154
// NOTE: this prevents optimization/compilation of top-level variables, we may be able to add support for this
156155
walk(node, {
157-
/**
158-
* NOTE:
159-
* force cast to Node of `[email protected]`,
160-
* because `[email protected]` is not dual packages,
161-
* so it's support only esm only ...
162-
*/
163156
// @ts-ignore
164-
enter(node: Node, _parent) {
165-
if (_parent?.type != null) this.skip()
157+
enter(node, parent) {
158+
if (parent?.type != null) this.skip()
166159
switch (node.type) {
167160
case 'ExportDefaultDeclaration':
168161
this.skip()
@@ -201,7 +194,7 @@ function _generate(
201194
* so it's support only esm only ...
202195
*/
203196
// @ts-ignore
204-
enter(node: Node, parent: Node) {
197+
enter(node, parent) {
205198
// skip imports and top-level variable declarations
206199
if (parent?.type === 'Program') {
207200
switch (node.type) {
@@ -336,12 +329,6 @@ function _generate(
336329
break
337330
}
338331
},
339-
/**
340-
* NOTE:
341-
* force cast to Node of `[email protected]`,
342-
* because `[email protected]` is not dual packages,
343-
* so it's support only esm only ...
344-
*/
345332
// @ts-ignore
346333
leave(node: Node, parent: Node) {
347334
switch (node.type) {

packages/bundle-utils/src/ts.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* A wrapper for the js generator which transforms ts to js before generating
55
*/
66

7-
import { Node } from 'estree'
7+
import { Node } from 'oxc-parser'
88
import { transform } from 'oxc-transform'
99
import { CodeGenOptions, CodeGenResult } from './codegen'
1010
import { DEFAULT_OPTIONS, generate as generateJavaScript } from './js'

packages/bundle-utils/test/generator/__snapshots__/js.test.ts.snap

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,41 +17,41 @@ exports[`'allowDynamic' option > generate > map 1`] = `
1717
`;
1818

1919
exports[`'allowDynamic' option > no generate 1`] = `
20-
Node {
20+
{
2121
"body": [
22-
Node {
23-
"declaration": Node {
22+
{
23+
"declaration": {
2424
"async": true,
25-
"body": Node {
25+
"body": {
2626
"body": [
27-
Node {
27+
{
2828
"declarations": [
29-
Node {
29+
{
3030
"end": 115,
31-
"id": Node {
31+
"id": {
3232
"end": 62,
3333
"name": "json",
3434
"start": 58,
3535
"type": "Identifier",
3636
},
37-
"init": Node {
38-
"argument": Node {
37+
"init": {
38+
"argument": {
3939
"arguments": [
40-
Node {
40+
{
4141
"async": false,
42-
"body": Node {
42+
"body": {
4343
"arguments": [],
44-
"callee": Node {
44+
"callee": {
4545
"computed": false,
4646
"end": 112,
47-
"object": Node {
47+
"object": {
4848
"end": 107,
4949
"name": "response",
5050
"start": 99,
5151
"type": "Identifier",
5252
},
5353
"optional": false,
54-
"property": Node {
54+
"property": {
5555
"end": 112,
5656
"name": "json",
5757
"start": 108,
@@ -70,7 +70,7 @@ Node {
7070
"generator": false,
7171
"id": null,
7272
"params": [
73-
Node {
73+
{
7474
"end": 95,
7575
"name": "response",
7676
"start": 87,
@@ -81,19 +81,19 @@ Node {
8181
"type": "ArrowFunctionExpression",
8282
},
8383
],
84-
"callee": Node {
84+
"callee": {
8585
"computed": false,
8686
"end": 86,
87-
"object": Node {
87+
"object": {
8888
"arguments": [
89-
Node {
89+
{
9090
"end": 80,
9191
"name": "url",
9292
"start": 77,
9393
"type": "Identifier",
9494
},
9595
],
96-
"callee": Node {
96+
"callee": {
9797
"end": 76,
9898
"name": "fetch",
9999
"start": 71,
@@ -105,7 +105,7 @@ Node {
105105
"type": "CallExpression",
106106
},
107107
"optional": false,
108-
"property": Node {
108+
"property": {
109109
"end": 86,
110110
"name": "then",
111111
"start": 82,
@@ -132,12 +132,12 @@ Node {
132132
"start": 52,
133133
"type": "VariableDeclaration",
134134
},
135-
Node {
136-
"argument": Node {
135+
{
136+
"argument": {
137137
"end": 136,
138138
"properties": [
139-
Node {
140-
"argument": Node {
139+
{
140+
"argument": {
141141
"end": 134,
142142
"name": "json",
143143
"start": 130,
@@ -163,14 +163,14 @@ Node {
163163
"end": 138,
164164
"expression": false,
165165
"generator": false,
166-
"id": Node {
166+
"id": {
167167
"end": 42,
168168
"name": "loadResource",
169169
"start": 30,
170170
"type": "Identifier",
171171
},
172172
"params": [
173-
Node {
173+
{
174174
"end": 46,
175175
"name": "url",
176176
"start": 43,
@@ -186,6 +186,7 @@ Node {
186186
},
187187
],
188188
"end": 139,
189+
"hashbang": null,
189190
"sourceType": "module",
190191
"start": 0,
191192
"type": "Program",

packages/bundle-utils/test/utils.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { parse } from 'acorn'
21
import { promises as fs } from 'fs'
2+
import { parseSync } from 'oxc-parser'
33
import path from 'path'
44

55
export async function readFile(
@@ -14,13 +14,12 @@ export async function readFile(
1414
export function validateSyntax(code: string): boolean {
1515
let ret = false
1616
try {
17-
parse(code, {
18-
ecmaVersion: 'latest',
17+
parseSync('test.js', code, {
1918
sourceType: 'module'
2019
})
2120
ret = true
2221
} catch (e) {
23-
console.log(`invalid sytanx on \n${code}`)
22+
console.log(`invalid syntax on \n${code}`)
2423
console.error(e)
2524
}
2625
return ret

0 commit comments

Comments
 (0)