From d84dcc55c79fad833faabfba3e75ba1ac5f9525d Mon Sep 17 00:00:00 2001 From: Titani Labaj <39532947+tlabaj@users.noreply.github.com> Date: Fri, 14 Jul 2023 11:02:24 -0400 Subject: [PATCH] Revert "fix(build): transform icons and react core dependencies imports (#9298)" This reverts commit 5c2ad3559c61c97aac74ba97102c73eeefe4a53f. --- package.json | 1 - .../CHANGELOG.md | 0 packages/transformer-cjs-imports/index.js | 38 +++++ .../package.json | 4 +- packages/transformer-dynamic-imports/index.ts | 130 ------------------ packages/tsconfig.base.json | 2 +- yarn.lock | 91 +----------- 7 files changed, 42 insertions(+), 224 deletions(-) rename packages/{transformer-dynamic-imports => transformer-cjs-imports}/CHANGELOG.md (100%) create mode 100644 packages/transformer-cjs-imports/index.js rename packages/{transformer-dynamic-imports => transformer-cjs-imports}/package.json (79%) delete mode 100644 packages/transformer-dynamic-imports/index.ts diff --git a/package.json b/package.json index 5a5f08786d7..e1f84a23319 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,6 @@ "react": "^18", "react-dom": "^18", "surge": "^0.23.1", - "ts-node": "^10.9.1", "ts-patch": "^2.1.0", "typescript": "^4.7.4" }, diff --git a/packages/transformer-dynamic-imports/CHANGELOG.md b/packages/transformer-cjs-imports/CHANGELOG.md similarity index 100% rename from packages/transformer-dynamic-imports/CHANGELOG.md rename to packages/transformer-cjs-imports/CHANGELOG.md diff --git a/packages/transformer-cjs-imports/index.js b/packages/transformer-cjs-imports/index.js new file mode 100644 index 00000000000..905f1122108 --- /dev/null +++ b/packages/transformer-cjs-imports/index.js @@ -0,0 +1,38 @@ +// https://levelup.gitconnected.com/writing-typescript-custom-ast-transformer-part-2-5322c2b1660e +const ts = require('typescript'); + +/** + * We import `@patternfly/react-[tokens,icons]/dist/esm` to avoid parsing massive modules. + * HOWEVER we would like for the CJS output to reference `@patternfly/react-[]/dist/cjs` + * for better tree-shaking and smaller bundlers. + * A large offender of this is Tooltip's Popover helper. + * + * @param {object} context TS context + */ +function transformerCJSImports(context) { + // Only transform for CJS build + // ESM: module = 5, CJS: module = 1 + if (context.getCompilerOptions().module !== 1) { + return node => node; + } + /** + * If a node is an import, change its moduleSpecifier + * Otherwise iterate over all its childern. + * + * @param {object} node TS Node + */ + function visit(node) { + if (ts.isImportDeclaration(node) && /@patternfly\/.*\/dist\/esm/.test(node.moduleSpecifier.text)) { + const newNode = ts.getMutableClone(node); + const newPath = node.moduleSpecifier.text.replace(/dist\/esm/, 'dist/js'); + newNode.moduleSpecifier = ts.createStringLiteral(newPath, true); + return newNode; + } + return ts.visitEachChild(node, child => visit(child), context); + } + return node => ts.visitNode(node, visit); +} + +module.exports = () => ({ + before: transformerCJSImports +}); diff --git a/packages/transformer-dynamic-imports/package.json b/packages/transformer-cjs-imports/package.json similarity index 79% rename from packages/transformer-dynamic-imports/package.json rename to packages/transformer-cjs-imports/package.json index 0ba28dd076f..1764855e3c8 100644 --- a/packages/transformer-dynamic-imports/package.json +++ b/packages/transformer-cjs-imports/package.json @@ -1,9 +1,9 @@ { - "name": "transformer-dynamic-imports", + "name": "transformer-cjs-imports", "private": true, "version": "4.79.4-alpha.2", "description": "Transform CJS imports to ESM in typescript depending on module target.", - "main": "index.ts", + "main": "index.js", "author": "Red Hat", "license": "MIT", "peerDependencies": { diff --git a/packages/transformer-dynamic-imports/index.ts b/packages/transformer-dynamic-imports/index.ts deleted file mode 100644 index 27719880e3d..00000000000 --- a/packages/transformer-dynamic-imports/index.ts +++ /dev/null @@ -1,130 +0,0 @@ -// https://levelup.gitconnected.com/writing-typescript-custom-ast-transformer-part-2-5322c2b1660e -import * as ts from 'typescript'; -import path from 'path' -import glob from 'glob' - -const PACKAGES_ROOT = path.resolve(process.cwd(), 'packages') - -function reactCoreTag(strings, nameBinding) { - return `${PACKAGES_ROOT}/react-core/src/**/${nameBinding}.ts*`} - -const COMPONENTS_CACHE: { - [nameBinding: string]: string -} = { - ButtonProps: 'components/Button', - ButtonVariant: 'components/Button', - EmptyStateVariant: 'components/EmptyState', - getResizeObserver: 'helpers/resizeObserver', - PopoverProps: 'components/Popover', - TooltipPosition: 'components/Tooltip', - useOUIAProps: 'helpers/OUIA/ouia', - OUIAProps: 'helpers/OUIA/ouia', - getDefaultOUIAId: 'helpers/OUIA/ouia', - handleArrows: 'helpers/KeyboardHandler', - setTabIndex: 'helpers/KeyboardHandler', -} - -function findComponentModule(nameBinding: string) { - let modulePath = COMPONENTS_CACHE[nameBinding] - if(modulePath) { - return modulePath - } - - const sourceGlob = reactCoreTag`${nameBinding}` - const sourceFile = glob.sync(sourceGlob) - if(sourceFile.length < 1) { - throw new Error(`Unable to find source file for module ${nameBinding}! The module likely does not have unique file as is included within another file. Please add the entry into the modules mapper!`) - } - const moduleSource: string[] = sourceFile[0].split('react-core/src').pop()?.split('/') || [] - moduleSource?.pop() - modulePath = moduleSource?.join('/').replace(/^\//, '') - COMPONENTS_CACHE[nameBinding] = modulePath - return modulePath - -} - -function camelToDash(str: string) { - return str.replace(/([A-Z])/g, (g) => `-${g[0].toLowerCase()}`).replace(/^-/, ''); -} - -function createIconDynamicImports(nodeFactory: ts.NodeFactory, iconNames: string[]) { - const imports = iconNames.map(icon => nodeFactory.createImportDeclaration( - undefined, - undefined, - nodeFactory.createImportClause(false, nodeFactory.createIdentifier(icon), undefined), - nodeFactory.createStringLiteral(`@patternfly/react-icons/dist/dynamic/icons/${camelToDash(icon)}`)) - ) - return imports -} - -function createDynamicReactCoreImports(nodeFactory: ts.NodeFactory, node: ts.ImportDeclaration) { - const importNames: string[] = [] - const importNodes: ts.ImportDeclaration[] = [] - // get all named imports - node.importClause?.namedBindings?.forEachChild(node => { - importNames.push(node.getFullText().trim()) - }) - importNames.forEach(nameBinding =>{ - const importPartial = findComponentModule(nameBinding) - const importNode = nodeFactory.createImportDeclaration( - undefined, - undefined, - nodeFactory.createImportClause(false, undefined, nodeFactory.createNamedImports( - [nodeFactory.createImportSpecifier(false, undefined, nodeFactory.createIdentifier(nameBinding))] - )), - nodeFactory.createStringLiteral(`@patternfly/react-core/dist/dynamic/${importPartial}`) - ) - importNodes.push(importNode) - }) - return importNodes -} - - -const transformer:ts.TransformerFactory = context => sourceFile => { - /** @type { import("typescript").Visitor } */ - function visitor(node) { - const { factory } = context - // handles relative imports import {foo} from '@patternfly/react-icons' - // the regex has extra '$ condition - if(ts.isImportDeclaration(node) && /@patternfly\/react-(core|icons)'$/.test(node.moduleSpecifier.getText())) { - if(node.moduleSpecifier.getText().includes('react-icons')) { - const importNames: string[] = [] - // get all named imports - node.importClause?.namedBindings?.forEachChild(node => { - importNames.push(node.getFullText().trim()) - }) - // create new icon import nodes - return createIconDynamicImports(factory, importNames) - } - - if(node.moduleSpecifier.getText().includes('react-core')) { - return createDynamicReactCoreImports(factory, node) - } - - return node - } - - // handle absolute icons import paths - if(ts.isImportDeclaration(node) && /@patternfly\/react-icons/.test(node.moduleSpecifier.getText())) { - if (ts.isImportDeclaration(node) && /@patternfly\/.*\/dist\/esm/.test(node.moduleSpecifier.getText())) { - return factory.updateImportDeclaration( - node, - node.decorators, - node.modifiers, - node.importClause, - factory.createStringLiteral( - node.moduleSpecifier.getFullText().replace(/"/g, '').replace(/'/g, '').replace(/dist\/esm/, 'dist/dynamic').trim(), - true - ), - undefined - ) - } - - } - return ts.visitEachChild(node, visitor, context); - - } - return ts.visitNode(sourceFile, visitor); - } - -module.exports = transformer diff --git a/packages/tsconfig.base.json b/packages/tsconfig.base.json index 69190bbc4ef..8b1bd94e118 100644 --- a/packages/tsconfig.base.json +++ b/packages/tsconfig.base.json @@ -19,7 +19,7 @@ "strictNullChecks": false, "isolatedModules": true, "plugins": [ - { "transform": "transformer-dynamic-imports/index.ts", "type": "raw" } + { "transform": "transformer-cjs-imports" } ] }, "exclude": [ diff --git a/yarn.lock b/yarn.lock index 01a38302970..676eb683e25 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2575,13 +2575,6 @@ resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - "@cypress/request@^2.88.6": version "2.88.6" resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.6.tgz" @@ -2947,11 +2940,6 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -2975,14 +2963,6 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping@^0.3.14": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" @@ -4270,26 +4250,6 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - "@types/anymatch@*": version "1.3.1" resolved "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz" @@ -5358,7 +5318,7 @@ acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" -acorn-walk@^8.0.0, acorn-walk@^8.1.1: +acorn-walk@^8.0.0: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== @@ -5638,11 +5598,6 @@ are-we-there-yet@^3.0.0: delegates "^1.0.0" readable-stream "^3.6.0" -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" @@ -7758,11 +7713,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - cross-fetch@3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" @@ -8387,11 +8337,6 @@ diff-sequences@^29.4.3: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" @@ -13461,11 +13406,6 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6: version "10.2.1" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" @@ -18477,25 +18417,6 @@ ts-loader@^8.3.0: micromatch "^4.0.0" semver "^7.3.4" -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - ts-patch@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ts-patch/-/ts-patch-2.1.0.tgz#b4ba3e3f029144d7c4c6566916ebd5a453f070f5" @@ -19053,11 +18974,6 @@ uuid@^8.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - v8-compile-cache@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -20132,11 +20048,6 @@ ylru@^1.2.0: version "1.2.1" resolved "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz" -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"