Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add .js file extension to built output + unwrap folder import/export to support native ESM within browser #30770

Merged
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -0,0 +1,7 @@
{
"type": "prerelease",
"comment": "feat: enable .js extension addition and directory import/export unwrapping in build output",
"packageName": "@fluentui/tokens",
"email": "martinhochel@microsoft.com",
"dependentChangeType": "patch"
}
8 changes: 4 additions & 4 deletions package.json
Expand Up @@ -120,8 +120,8 @@
"@storybook/manager-webpack5": "6.5.15",
"@storybook/react": "6.5.15",
"@storybook/theming": "6.5.15",
"@swc/cli": "0.1.62",
"@swc/core": "1.3.87",
"@swc/cli": "0.1.65",
"@swc/core": "1.4.7",
ling1726 marked this conversation as resolved.
Show resolved Hide resolved
"@swc/helpers": "0.5.1",
"@testing-library/dom": "8.11.3",
"@testing-library/jest-dom": "5.16.5",
Expand Down Expand Up @@ -319,8 +319,8 @@
"storywright": "0.0.26-beta.1",
"strip-ansi": "6.0.0",
"style-loader": "2.0.0",
"swc-loader": "0.2.3",
"swc-plugin-de-indent-template-literal": "1.0.0",
"swc-loader": "0.2.4",
"swc-plugin-de-indent-template-literal": "1.4.0",
"syncpack": "10.6.1",
"tachometer": "0.7.0",
"terser": "5.28.1",
Expand Down
1 change: 1 addition & 0 deletions packages/tokens/.swcrc
Expand Up @@ -10,6 +10,7 @@
"/**/*.test.tsx"
],
"jsc": {
"baseUrl": ".",
"parser": {
"syntax": "typescript",
"tsx": true,
Expand Down
1 change: 1 addition & 0 deletions scripts/tasks/src/swc/index.ts
@@ -0,0 +1 @@
export { swc } from './swc';
20 changes: 12 additions & 8 deletions scripts/tasks/src/swc.ts → scripts/tasks/src/swc/swc.ts
Expand Up @@ -2,15 +2,15 @@ import fs from 'fs';
import path from 'path';

import { transform } from '@swc/core';
import type { Options as SwcOptions } from '@swc/core';
import glob from 'glob';
import * as match from 'micromatch';
import * as micromatch from 'micromatch';

type Options = SwcOptions & { module: { type: 'es6' | 'commonjs' | 'amd' }; outputPath: string };
import { Options } from './types';
import { addJsExtensionToImports } from './utils';

async function swcTransform(options: Options) {
const { outputPath, module } = options;
const packageRoot = process.cwd();
const { outputPath, module, root: packageRoot = process.cwd() } = options;

const sourceRootDirName = module.type === 'es6' ? 'src' : 'lib';

let sourceFiles: string[] = [];
Expand All @@ -24,11 +24,12 @@ async function swcTransform(options: Options) {
}

const swcConfig = JSON.parse(fs.readFileSync(path.resolve(packageRoot, '.swcrc'), 'utf-8'));
const enableResolveFully = Boolean(swcConfig.jsc.baseUrl);
const tsFileExtensionRegex = /\.(tsx|ts)$/;

for (const fileName of sourceFiles) {
const srcFilePath = path.resolve(packageRoot, fileName);
const isFileExcluded = match.isMatch(srcFilePath, swcConfig.exclude, { contains: true });
const isFileExcluded = micromatch.isMatch(srcFilePath, swcConfig.exclude, { contains: true });

if (isFileExcluded) {
continue;
Expand All @@ -38,16 +39,19 @@ async function swcTransform(options: Options) {

const result = await transform(sourceCode, {
filename: fileName,
module: { type: module.type },
module: { type: module.type, resolveFully: enableResolveFully },
sourceFileName: path.basename(fileName),
outputPath,
});

// Strip @jsx comments, see https://github.com/microsoft/fluentui/issues/29126
const resultCode = result.code
let resultCode = result.code
.replace('/** @jsxRuntime automatic */', '')
.replace('/** @jsxImportSource @fluentui/react-jsx-runtime */', '');

// Remove after swc implement proper js extension addition https://github.com/microsoft/fluentui/issues/30634
resultCode = enableResolveFully ? addJsExtensionToImports(resultCode, module.type) : resultCode;

const compiledFilePath = path.resolve(packageRoot, fileName.replace(`${sourceRootDirName}`, outputPath));

//Create directory folder for new compiled file(s) to live in.
Expand Down
10 changes: 10 additions & 0 deletions scripts/tasks/src/swc/types.ts
@@ -0,0 +1,10 @@
import { type Options as SwcOptions } from '@swc/core';

declare module '@swc/core' {
interface BaseModuleConfig {
resolveFully?: boolean;
Hotell marked this conversation as resolved.
Show resolved Hide resolved
}
}

export type Options = Omit<SwcOptions, 'module' | 'outputPath'> &
Required<Pick<SwcOptions, 'module' | 'outputPath'>> & { root?: string };
59 changes: 59 additions & 0 deletions scripts/tasks/src/swc/utils.spec.ts
@@ -0,0 +1,59 @@
import { stripIndents } from '@nx/devkit';

import { addJsExtensionToImports } from './utils';

describe(`utils`, () => {
describe(`#addJsExtensionToImports`, () => {
it(`should not transform anything if non supported module type is specified`, () => {
const code = stripIndents`
export { themeToTokensObject } from './themeToTokensObject';
`;

let actual = addJsExtensionToImports(code, 'umd');

expect(actual).toEqual(code);

actual = addJsExtensionToImports(code, 'amd');

expect(actual).toEqual(code);

actual = addJsExtensionToImports(code, 'systemjs');

expect(actual).toEqual(code);
});

it(`should add .js extensions for esm`, () => {
const code = stripIndents`
export { themeToTokensObject } from './themeToTokensObject';
export { tokens } from './tokens';
export { typographyStyles } from './global/index.js';
`;

const actual = addJsExtensionToImports(code, 'es6');
const expected = stripIndents`
export { themeToTokensObject } from './themeToTokensObject.js';
export { tokens } from './tokens.js';
export { typographyStyles } from './global/index.js';
`;

expect(actual).toEqual(expected);
});

it(`should add .js extensions for commonjs`, () => {
const code = stripIndents`
const _themeToTokensObject = require("./themeToTokensObject");
const _tokens = require("./tokens");
const _index2 = require("./global/index.js");
`;

const actual = addJsExtensionToImports(code, 'commonjs');
const expected = stripIndents`
const _themeToTokensObject = require("./themeToTokensObject.js");
const _tokens = require("./tokens.js");
const _index2 = require("./global/index.js");
`;

expect(actual).toEqual(expected);
});
});
});
20 changes: 20 additions & 0 deletions scripts/tasks/src/swc/utils.ts
@@ -0,0 +1,20 @@
import { type Options } from './types';

const importPaths = {
es6: /from\s+["']([^"']+)["']/g,
commonjs: /require\(["']([^"']+)["']\)/g,
};
export function addJsExtensionToImports(code: string, type: Options['module']['type'] = 'es6') {
if (!(type === 'es6' || type === 'commonjs')) {
return code;
}

const regex = importPaths[type];

return code.replace(regex, (match, importPath) => {
if (importPath.endsWith('.js')) {
return match;
}
return match.replace(importPath, importPath + '.js');
});
}
161 changes: 84 additions & 77 deletions yarn.lock
Expand Up @@ -4496,85 +4496,92 @@
regenerator-runtime "^0.13.7"
resolve-from "^5.0.0"

"@swc/cli@0.1.62":
version "0.1.62"
resolved "https://registry.yarnpkg.com/@swc/cli/-/cli-0.1.62.tgz#6442fde2fcf75175a300fb4fcf30f8c60bbb3ab3"
integrity sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==
"@swc/cli@0.1.65":
version "0.1.65"
resolved "https://registry.yarnpkg.com/@swc/cli/-/cli-0.1.65.tgz#bb51ce6f088a78ac99a07507c15a8d74c9336ecb"
integrity sha512-4NcgsvJVHhA7trDnMmkGLLvWMHu2kSy+qHx6QwRhhJhdiYdNUrhdp+ERxen73sYtaeEOYeLJcWrQ60nzKi6rpg==
dependencies:
"@mole-inc/bin-wrapper" "^8.0.1"
commander "^7.1.0"
fast-glob "^3.2.5"
minimatch "^9.0.3"
semver "^7.3.8"
slash "3.0.0"
source-map "^0.7.3"

"@swc/core-darwin-arm64@1.3.87":
version "1.3.87"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.87.tgz#0547ec3297424ff89de503a07509646f48519e2a"
integrity sha512-/LxLjPat1LA9CXS7Cn2M4MIqwNOoDF4KjcikPkO08H54rd6WubhaJnr0sLDjms3adRr+pmcCL0yfsUBTX//85A==

"@swc/core-darwin-x64@1.3.87":
version "1.3.87"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.87.tgz#cbbe47ce93d7893db1649d6b16b0be187d12438b"
integrity sha512-hjSQNcW9BN8gEz3UQZ7Ye80ymbkFHLkUDeEek4lorRyq6S+uxvbL1f1mJAZnFPBpove7AXusykIalWMPvyOR2A==

"@swc/core-linux-arm-gnueabihf@1.3.87":
version "1.3.87"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.87.tgz#b1c066f49232caacde9300dd12c2a4d13b495d30"
integrity sha512-JVyNIO3tGLPSQ59rJXeKaykTpPhRNozB+7PtYMvMcxpUbYGpEzWxTPkFAX2KKPvl0ejBdA0GW5OXeuPMvTwE0w==

"@swc/core-linux-arm64-gnu@1.3.87":
version "1.3.87"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.87.tgz#36c2c7ea1ec0622858e16fa16a706922c12cb4ac"
integrity sha512-gLdZKIoql5vjrNjrwwsiS7d3vOAIzYUWqN97iGCSscQOg0MgYbfUnSTO4UEvH4BYlwRNlHepfTZ7ALoG8areUQ==

"@swc/core-linux-arm64-musl@1.3.87":
version "1.3.87"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.87.tgz#b7f34b2dd352a2f71aecd1c093452cfa9d5f8983"
integrity sha512-WQ5tirVBiU8lUODQ25dt8JRCZHyRDInBe4fkGuxzImMa017zYPWa2WxrKK8LdDF7DzrAITlGl9VeoeE/l0WJbw==

"@swc/core-linux-x64-gnu@1.3.87":
version "1.3.87"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.87.tgz#42a9fff0212893b0868e048686443dac148f4e9f"
integrity sha512-/vQSH7ZKOuT1It9GzpJ9UFnsOP/dQr1VLUrKQFBlHp9owIWNb2oUrZdNla+KhljCIIahh0JfQ08sycKeycCNzQ==

"@swc/core-linux-x64-musl@1.3.87":
version "1.3.87"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.87.tgz#b21a089d785895eb71fbcfe695ccfc454b70017f"
integrity sha512-C1NUeISJDyMlIk4919bjcpHvjyjzbkjW7v53gUdN41Y4BPlEk7UKcLez7UHMjdMGA/o9721SLqYVp4/NrQErUw==

"@swc/core-win32-arm64-msvc@1.3.87":
version "1.3.87"
resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.87.tgz#c32366a5782cb1fd2a7484c34fd879cefbb883e4"
integrity sha512-AE7JKDJ0OsV9LsYGFfYKMTkGNfsy1au4RT5jT1rxr5MTOsmMD7P2mgiRF8drgc1WX3uOJbTHQfgdVTYroAGfdA==

"@swc/core-win32-ia32-msvc@1.3.87":
version "1.3.87"
resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.87.tgz#c2e0de986c733c6fbeecdf99330c5b6260560974"
integrity sha512-2V+5uvisaTPXd5lvTujNLNlEC2LPo07gEUQVGdKGsbhtLAYAggVXBnHjxU1TkuyA6NlciMS59tPKW+L2u2KpTw==

"@swc/core-win32-x64-msvc@1.3.87":
version "1.3.87"
resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.87.tgz#24b5b50814062fb3cee0945ee5c09da2313b7f0c"
integrity sha512-2Xak7TidlRuNQamLZC3fEOdUCmMiBzD2BW8+Dnn29f4odzamgAFfeYJ/PnqN7jdTWOINLn95tex4JBm3Pm11HQ==

"@swc/core@1.3.87":
version "1.3.87"
resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.87.tgz#b84cffd0d03f49e04b165088bc733a43ac59281e"
integrity sha512-u33Mi/EBvb+g/xpYKyxODB5XvKYqISmy81J+lhFS/Oahja0PbJWZdKEGwSQEFvBecp6E+PfaTOLPOoF1EWcRrw==
dependencies:
"@swc/types" "^0.1.4"
"@swc/core-darwin-arm64@1.4.7":
version "1.4.7"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.7.tgz#158c7d1a5d1aa0d1e57f24f7a58fa23389d4b666"
integrity sha512-IhfP2Mrrh9WcdlBJQbPNBhfdOhW/SC910SiuzvxaLgJmzq1tw6TVDNUz4Zf85TbK5uzgR0emtPc9hTGxynl57A==

"@swc/core-darwin-x64@1.4.7":
version "1.4.7"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.4.7.tgz#4a7a9a935d1a23402d45a1602026e4f677983776"
integrity sha512-MO01pnxJDS6st5IiqyTnAOz9kpAPP/O4lzEUH9E80XdXBzwptS5hNTM0egBlqueWDFrPM26RI81JLtyTU7kR8w==

"@swc/core-linux-arm-gnueabihf@1.4.7":
version "1.4.7"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.7.tgz#54f80af37fae84676d50f729312bd5ff384a8c42"
integrity sha512-+cDaXW6PZqGhXIq9C4xE+/QuyUsLkXf8d8uSXep+rZYDl4YHS9Fi7HpZQnqLX6al/iVhwe3VnxHMGw50gxcr/g==

"@swc/core-linux-arm64-gnu@1.4.7":
version "1.4.7"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.7.tgz#0f0a47b6e6d2d5404c755a73ba52a71240763500"
integrity sha512-RNnVHRKhEtA3pM34wgb3Vumf5M6/XlWzFdkHEMZIkOKyNSUhZiv8X3tsEK+n1rZQWIDkvlw4YyHtB8vK18WdCA==

"@swc/core-linux-arm64-musl@1.4.7":
version "1.4.7"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.7.tgz#baafa993ae121f43162a00fdb774b8456c0079bc"
integrity sha512-p7Xm4Pib02d1SFS9XXMoOcCTDIkFWMspspptPX00VcjAdZYnXWujWGuD2W+KN1gq5syHB1g3TsYs9LP2dGsKqw==

"@swc/core-linux-x64-gnu@1.4.7":
version "1.4.7"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.7.tgz#88cfbc497c997aff209b57115d9cbaf597393ff9"
integrity sha512-ViI5jy03cFYPETsye1J+oPbHE4v8oIDN34qebzvgHUlNKOXfc1ig0Zha5oQnKp3zj1rmjcSLIMqK++WR021G5A==

"@swc/core-linux-x64-musl@1.4.7":
version "1.4.7"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.7.tgz#12f6277d3f7167a698a5c87d0796dd810f8eb273"
integrity sha512-Nf3Axcx/ILl7XE44eidNNPF39rg/KIeqg2545vrOXJG02iu7pEjZuu8wm6w+23BpP4COjZJymlg9LzPT1ZBD5Q==

"@swc/core-win32-arm64-msvc@1.4.7":
version "1.4.7"
resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.7.tgz#591ea5067d3ee0d1f45b313dde2b8d8fb6be5eb2"
integrity sha512-MFkJEaC59AO2HpndmHhCkaj8NJus5etjMtBphOe9em7jmmfdQ7mLenKHbZ/CspHNl8yNPO9Qzpa/at2838x+RQ==

"@swc/core-win32-ia32-msvc@1.4.7":
version "1.4.7"
resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.7.tgz#bc603df8aff3a21d4f9f2b834e751d3ec1bf45ef"
integrity sha512-nwrfERocUei9sxqd6URrWcEC3KDcTBD+beMerB9idvuzy4rcm5k1O1ClUlZ9pJOZn+vMN1tqZjLze4hJMT9STQ==

"@swc/core-win32-x64-msvc@1.4.7":
version "1.4.7"
resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.7.tgz#b4683ad864591e127f865fd1fbca2cfbae9e672a"
integrity sha512-d5T8Z/axAml8FTA+T9RS2mwJDNIbSSz5jcEiWaGuKVDIoSZib2HpMvnMydOGsIrmjfS1Z4ZhdAawivPhAZ3M8Q==

"@swc/core@1.4.7":
version "1.4.7"
resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.4.7.tgz#94ac45187fa2fdbd6cbb34dbda089c174ec64c1d"
integrity sha512-I7a9sUxB+z+UCf6KudqrQH/RgLal/S+E+t4uBdbggycLyJe7WvBgPrQlcN5UpEuD9YC2PJ0CN6kgD6ARStg+pg==
dependencies:
"@swc/counter" "^0.1.2"
"@swc/types" "^0.1.5"
optionalDependencies:
"@swc/core-darwin-arm64" "1.3.87"
"@swc/core-darwin-x64" "1.3.87"
"@swc/core-linux-arm-gnueabihf" "1.3.87"
"@swc/core-linux-arm64-gnu" "1.3.87"
"@swc/core-linux-arm64-musl" "1.3.87"
"@swc/core-linux-x64-gnu" "1.3.87"
"@swc/core-linux-x64-musl" "1.3.87"
"@swc/core-win32-arm64-msvc" "1.3.87"
"@swc/core-win32-ia32-msvc" "1.3.87"
"@swc/core-win32-x64-msvc" "1.3.87"
"@swc/core-darwin-arm64" "1.4.7"
"@swc/core-darwin-x64" "1.4.7"
"@swc/core-linux-arm-gnueabihf" "1.4.7"
"@swc/core-linux-arm64-gnu" "1.4.7"
"@swc/core-linux-arm64-musl" "1.4.7"
"@swc/core-linux-x64-gnu" "1.4.7"
"@swc/core-linux-x64-musl" "1.4.7"
"@swc/core-win32-arm64-msvc" "1.4.7"
"@swc/core-win32-ia32-msvc" "1.4.7"
"@swc/core-win32-x64-msvc" "1.4.7"

"@swc/counter@^0.1.2":
version "0.1.3"
resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9"
integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==

"@swc/helpers@0.5.1", "@swc/helpers@^0.5.1":
version "0.5.1"
Expand All @@ -4583,7 +4590,7 @@
dependencies:
tslib "^2.4.0"

"@swc/types@^0.1.4":
"@swc/types@^0.1.5":
version "0.1.5"
resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.5.tgz#043b731d4f56a79b4897a3de1af35e75d56bc63a"
integrity sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==
Expand Down Expand Up @@ -17659,7 +17666,7 @@ minimatch@9.0.1:
dependencies:
brace-expansion "^2.0.1"

minimatch@9.0.3:
minimatch@9.0.3, minimatch@^9.0.3:
version "9.0.3"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825"
integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
Expand Down Expand Up @@ -22813,15 +22820,15 @@ swap-case@^1.1.0:
lower-case "^1.1.1"
upper-case "^1.1.1"

swc-loader@0.2.3, swc-loader@^0.1.15, swc-loader@^0.2.3:
swc-loader@0.2.4, swc-loader@^0.1.15, swc-loader@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/swc-loader/-/swc-loader-0.2.3.tgz#6792f1c2e4c9ae9bf9b933b3e010210e270c186d"
integrity sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==

swc-plugin-de-indent-template-literal@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/swc-plugin-de-indent-template-literal/-/swc-plugin-de-indent-template-literal-1.0.0.tgz#ec0fc840f5b10b8631aaa20c71b04cac56db223e"
integrity sha512-Qb4G8h8hKlwWYFCJUVbmiELRmjzBM1hPmJh5+p0GiY/b6imGSIuEWV2zBAYcQyNvR2DI2MJ3OxJC2SCT9Ld7lA==
swc-plugin-de-indent-template-literal@1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/swc-plugin-de-indent-template-literal/-/swc-plugin-de-indent-template-literal-1.4.0.tgz#c03e8f9fbd9a4a982f067b634a9bf5a045ce6e17"
integrity sha512-CuZ44v2ObBcULusfoPm2JXhV+egYB8KoZZNQ8KfPXbOY90wevDTCK+Qhi9pbuzDtZuyUGKcauZ9C3BM7QgOFNw==

symbol-tree@^3.2.4:
version "3.2.4"
Expand Down