diff --git a/.circleci/config.yml b/.circleci/config.yml index 3a8c114ef..e38b27842 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -385,8 +385,8 @@ jobs: name: Build packages command: pnpm release:build - run: - name: Are the types wrong? - command: pnpm -r test:package-types + name: Verify built packages + command: pnpm -r test:package workflows: version: 2 diff --git a/.eslintignore b/.eslintignore index 33a8784be..a4241d9fb 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,6 +2,7 @@ .nyc_output /coverage /docs/.next +/docs/data/**/*.js /docs/export /docs/src/app/playground/ /packages/react/**/*.min.* diff --git a/.eslintrc.js b/.eslintrc.js index f655e5267..aa15c8c38 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,5 +1,4 @@ const baseline = require('@mui/monorepo/.eslintrc'); -const path = require('path'); const OneLevelImportMessage = [ 'Prefer one level nested imports to avoid bundling everything in dev mode or breaking CJS/ESM split.', @@ -17,8 +16,8 @@ module.exports = { ...baseline, settings: { 'import/resolver': { - webpack: { - config: path.join(__dirname, './webpackBaseConfig.js'), + typescript: { + project: ['docs/tsconfig.json', 'packages/*/tsconfig.test.json'], }, }, }, diff --git a/babel.config.js b/babel.config.js index f274e49e9..b40a57e41 100644 --- a/babel.config.js +++ b/babel.config.js @@ -12,7 +12,6 @@ module.exports = function getBabelConfig(api) { const useESModules = !api.env(['node']); const defaultAlias = { - '@base-ui-components/react': resolveAliasPath('./packages/react/src'), docs: resolveAliasPath('./docs'), test: resolveAliasPath('./test'), '@mui-internal/api-docs-builder': resolveAliasPath( diff --git a/docs/data/api/no-ssr.json b/docs/data/api/no-ssr.json index 34117978a..fb1512cca 100644 --- a/docs/data/api/no-ssr.json +++ b/docs/data/api/no-ssr.json @@ -5,12 +5,12 @@ "fallback": { "type": { "name": "node" }, "default": "null" } }, "name": "NoSsr", - "imports": ["import { NoSsr } from '@base-ui-components/react/no-ssr';"], + "imports": ["import { NoSsr } from '@base-ui-components/react/unstable-no-ssr';"], "classes": [], "spread": false, "themeDefaultProps": null, "muiName": "NoSsr", - "filename": "/packages/react/src/no-ssr/NoSsr.tsx", + "filename": "/packages/react/src/unstable-no-ssr/NoSsr.tsx", "inheritance": null, "demos": "", "cssComponent": false diff --git a/docs/data/components/no-ssr/FrameDeferring.js b/docs/data/components/no-ssr/FrameDeferring.js index b998824fd..1bc0ef959 100644 --- a/docs/data/components/no-ssr/FrameDeferring.js +++ b/docs/data/components/no-ssr/FrameDeferring.js @@ -1,6 +1,6 @@ 'use client'; import * as React from 'react'; -import { NoSsr } from '@base-ui-components/react/no-ssr'; +import { NoSsr } from '@base-ui-components/react/unstable-no-ssr'; import { Box } from '@mui/system'; function LargeTree() { diff --git a/docs/data/components/no-ssr/FrameDeferring.tsx b/docs/data/components/no-ssr/FrameDeferring.tsx index 344d28bc4..069758808 100644 --- a/docs/data/components/no-ssr/FrameDeferring.tsx +++ b/docs/data/components/no-ssr/FrameDeferring.tsx @@ -1,6 +1,6 @@ 'use client'; import * as React from 'react'; -import { NoSsr } from '@base-ui-components/react/no-ssr'; +import { NoSsr } from '@base-ui-components/react/unstable-no-ssr'; import { Box } from '@mui/system'; function LargeTree(): any { diff --git a/docs/data/components/no-ssr/SimpleNoSsr.js b/docs/data/components/no-ssr/SimpleNoSsr.js index b5b6fe611..253b29771 100644 --- a/docs/data/components/no-ssr/SimpleNoSsr.js +++ b/docs/data/components/no-ssr/SimpleNoSsr.js @@ -1,6 +1,6 @@ 'use client'; import * as React from 'react'; -import { NoSsr } from '@base-ui-components/react/no-ssr'; +import { NoSsr } from '@base-ui-components/react/unstable-no-ssr'; import { Box } from '@mui/system'; export default function SimpleNoSsr() { diff --git a/docs/data/components/no-ssr/SimpleNoSsr.tsx b/docs/data/components/no-ssr/SimpleNoSsr.tsx index b5b6fe611..253b29771 100644 --- a/docs/data/components/no-ssr/SimpleNoSsr.tsx +++ b/docs/data/components/no-ssr/SimpleNoSsr.tsx @@ -1,6 +1,6 @@ 'use client'; import * as React from 'react'; -import { NoSsr } from '@base-ui-components/react/no-ssr'; +import { NoSsr } from '@base-ui-components/react/unstable-no-ssr'; import { Box } from '@mui/system'; export default function SimpleNoSsr() { diff --git a/docs/src/app/experiments/slider-marks.tsx b/docs/src/app/experiments/slider-marks.tsx deleted file mode 100644 index 889602b76..000000000 --- a/docs/src/app/experiments/slider-marks.tsx +++ /dev/null @@ -1,263 +0,0 @@ -'use client'; -import * as React from 'react'; -import { Slider } from '@base-ui-components/react/slider'; -import { useSliderRootContext } from '../../../../packages/react/src/slider/root/SliderRootContext'; - -const STOPS = [ - { - value: 0, - label: '0°C', - }, - { - value: 25, - label: '25°C', - }, - { - value: 50, - label: '50°C', - }, - { - value: 75, - label: '75°C', - }, - { - value: 100, - label: '100°C', - }, -]; - -function getSliderThumbAriaValueText(value: number) { - return `${value}°C`; -} - -// for "inverted track", the track/rail can be styled with CSS but a prop is needed to flip the "mark active" state -function MarkWithLabel(props: { - index: number; - value: number; - label: string; - inverted?: boolean; -}) { - const { index, value, label, inverted = false } = props; - const { direction, values } = useSliderRootContext(); - const isRtl = direction === 'rtl'; - const isFilled = inverted ? value >= values[0] : values[0] >= value; - return ( - - - - - ); -} - -export default function App() { - return ( -
- -
LTR
- - - - {STOPS.map((mark, index) => ( - - ))} - - - - -
- - -
RTL
- - - - {STOPS.map((mark, index) => ( - - ))} - - - - -
- -
- ); -} - -function BrandingStyles() { - return ( - - ); -} diff --git a/docs/src/app/experiments/slider-tooltip.tsx b/docs/src/app/experiments/slider-tooltip.tsx deleted file mode 100644 index 3da111496..000000000 --- a/docs/src/app/experiments/slider-tooltip.tsx +++ /dev/null @@ -1,239 +0,0 @@ -'use client'; -import * as React from 'react'; -import { useTheme } from '@mui/system'; -import { Slider } from '@base-ui-components/react/slider'; -import { Tooltip } from '@base-ui-components/react/tooltip'; -import { useSliderRootContext } from '../../../../packages/react/src/slider/root/SliderRootContext'; - -function useIsDarkMode() { - const theme = useTheme(); - return theme.palette.mode === 'dark'; -} - -// making a Material/Joy style slider with Slider + Tooltip -export default function App() { - const [valueLabelOpen, setValueLabelOpen] = React.useState(false); - - const handleGlobalPointerUp = () => { - if (valueLabelOpen) { - setValueLabelOpen(false); - } - }; - - return ( -
- - - - - {Array.from(Array(10), (_, x) => x).map((v) => { - return ; - })} - - { - if (!valueLabelOpen) { - setValueLabelOpen(true); - } - }} - onBlur={() => { - if (valueLabelOpen) { - setValueLabelOpen(false); - } - }} - onPointerOver={() => { - if (!valueLabelOpen) { - setValueLabelOpen(true); - } - }} - onPointerLeave={(event) => { - if (event.buttons !== 1) { - setValueLabelOpen(false); - } else { - document.addEventListener('pointerup', handleGlobalPointerUp, { - once: true, - }); - } - }} - > - - - - - - - - - - - - - -
- ); -} - -const SliderMark = React.forwardRef(function SliderMark( - props: any, - ref: React.ForwardedRef, -) { - const { index, style, ...otherProps } = props; - const { percentageValues } = useSliderRootContext(); - const isFilled = percentageValues[0] >= index * 10; - return ( - - ); -}); - -function Styles() { - // Replace this with your app logic for determining dark mode - const isDarkMode = useIsDarkMode(); - return ( - - ); -} diff --git a/docs/src/blocks/GoogleAnalytics.tsx b/docs/src/blocks/GoogleAnalytics.tsx index f9b2e9c9e..5b777822e 100644 --- a/docs/src/blocks/GoogleAnalytics.tsx +++ b/docs/src/blocks/GoogleAnalytics.tsx @@ -1,6 +1,6 @@ 'use client'; import * as React from 'react'; -import { useMediaQuery } from '@base-ui-components/react/use-media-query'; +import { useMediaQuery } from '@base-ui-components/react/unstable-use-media-query'; import { useEnhancedEffect } from '@base-ui-components/react/utils'; let boundDataGaListener = false; diff --git a/docs/src/components/SideNav.tsx b/docs/src/components/SideNav.tsx index 0f948a2bf..80f1afb35 100644 --- a/docs/src/components/SideNav.tsx +++ b/docs/src/components/SideNav.tsx @@ -3,10 +3,8 @@ import * as React from 'react'; import clsx from 'clsx'; import NextLink from 'next/link'; import { usePathname } from 'next/navigation'; -import { ScrollArea } from '@base-ui-components/react/scroll-area'; +import { ScrollArea, SCROLL_TIMEOUT } from '@base-ui-components/react/scroll-area'; import scrollIntoView from 'scroll-into-view-if-needed'; -// eslint-disable-next-line no-restricted-imports -import { SCROLL_TIMEOUT } from '@base-ui-components/react/scroll-area/constants'; interface SideNavContextValue { /** diff --git a/docs/src/components/reference/ReferenceTablePopover.tsx b/docs/src/components/reference/ReferenceTablePopover.tsx index 8ef7db362..8a8000536 100644 --- a/docs/src/components/reference/ReferenceTablePopover.tsx +++ b/docs/src/components/reference/ReferenceTablePopover.tsx @@ -1,7 +1,7 @@ 'use client'; import { Popover } from '@base-ui-components/react/popover'; import * as React from 'react'; -import { useMediaQuery } from '@base-ui-components/react/use-media-query'; +import { useMediaQuery } from '@base-ui-components/react/unstable-use-media-query'; import { GhostButton } from '../GhostButton'; import { Popup } from '../Popup'; diff --git a/package.json b/package.json index b96b7f45c..ce868d824 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "test:karma": "cross-env NODE_ENV=test karma start test/karma.conf.js", "test:karma:profile": "cross-env NODE_ENV=test karma start test/karma.conf.profile.js", "test:regressions": "cross-env NODE_ENV=production pnpm test:regressions:build && concurrently --success first --kill-others \"pnpm test:regressions:run\" \"pnpm test:regressions:server\"", - "test:regressions:build": "webpack --config test/regressions/webpack.config.js", + "test:regressions:build": "pnpm release:build && webpack --config test/regressions/webpack.config.js", "test:regressions:dev": "concurrently \"pnpm test:regressions:build --watch\" \"pnpm test:regressions:server\"", "test:regressions:run": "mocha --config test/regressions/.mocharc.js --delay 'test/regressions/**/*.test.js'", "test:regressions:server": "serve test/regressions -p 5001", @@ -116,7 +116,7 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", "eslint-config-prettier": "^9.1.0", - "eslint-import-resolver-webpack": "^0.13.9", + "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-babel": "^5.3.1", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.31.0", diff --git a/packages/react/package.json b/packages/react/package.json index 739c1e45e..f0e2e8815 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -26,27 +26,47 @@ "url": "https://opencollective.com/mui-org" }, "exports": { - ".": { - "import": "./src/index.ts" - }, - "./utils": { - "import": "./src/utils/index.ts" - }, - "./*": { - "import": "./src/*/index.ts" - } + ".": "./src/index.ts", + "./accordion": "./src/accordion/index.ts", + "./alert-dialog": "./src/alert-dialog/index.ts", + "./checkbox": "./src/checkbox/index.ts", + "./checkbox-group": "./src/checkbox-group/index.ts", + "./collapsible": "./src/collapsible/index.ts", + "./dialog": "./src/dialog/index.ts", + "./field": "./src/field/index.ts", + "./fieldset": "./src/fieldset/index.ts", + "./form": "./src/form/index.ts", + "./menu": "./src/menu/index.ts", + "./number-field": "./src/number-field/index.ts", + "./popover": "./src/popover/index.ts", + "./preview-card": "./src/preview-card/index.ts", + "./progress": "./src/progress/index.ts", + "./radio": "./src/radio/index.ts", + "./radio-group": "./src/radio-group/index.ts", + "./scroll-area": "./src/scroll-area/index.ts", + "./select": "./src/select/index.ts", + "./separator": "./src/separator/index.ts", + "./slider": "./src/slider/index.ts", + "./switch": "./src/switch/index.ts", + "./tabs": "./src/tabs/index.ts", + "./text-input": "./src/text-input/index.ts", + "./tooltip": "./src/tooltip/index.ts", + "./unstable-no-ssr": "./src/unstable-no-ssr/index.ts", + "./unstable-use-media-query": "./src/unstable-use-media-query/index.ts", + "./utils": "./src/utils/index.ts" }, "imports": { "#test-utils": "./test/index.ts" }, "type": "commonjs", "scripts": { - "build": "pnpm build:node && pnpm build:stable && pnpm build:types && pnpm build:copy-files", + "build": "pnpm build:node && pnpm build:stable && pnpm build:types && pnpm build:copy-files && pnpm build:manifest", "build:node": "node ../../scripts/build.mjs node", "build:stable": "node ../../scripts/build.mjs stable", "build:copy-files": "node ../../scripts/copyFiles.mjs", "build:types": "tsx ../../scripts/buildTypes.mjs --project tsconfig.build.json --copy build/cjs", - "test:package-types": "attw --pack ./build --include-entrypoints ./accordion ./menu ./tooltip", + "build:manifest": "tsx ./scripts/createPackageManifest.mts", + "test:package": "publint ./build && attw --pack ./build", "prebuild": "rimraf --glob build build-tests \"*.tsbuildinfo\"", "release": "pnpm build && pnpm publish", "test": "cd ../../ && cross-env NODE_ENV=test mocha 'packages/react/**/*.test.{js,ts,tsx}'", @@ -74,7 +94,9 @@ "@types/sinon": "^17.0.3", "@types/use-sync-external-store": "^0.0.6", "chai": "^4.5.0", + "fs-extra": "^11.2.0", "lodash": "^4.17.21", + "publint": "^0.2.12", "react": "19.0.0-rc-fb9a90fa48-20240614", "react-dom": "19.0.0-rc-fb9a90fa48-20240614", "sinon": "^19.0.2", diff --git a/packages/react/scripts/createPackageManifest.mts b/packages/react/scripts/createPackageManifest.mts new file mode 100644 index 000000000..4125cefac --- /dev/null +++ b/packages/react/scripts/createPackageManifest.mts @@ -0,0 +1,64 @@ +/* eslint-disable no-console */ +import path from 'node:path'; +import fse from 'fs-extra'; +import { fileURLToPath } from 'node:url'; + +const CURRENT_DIR = path.dirname(fileURLToPath(import.meta.url)); +const PROJECT_ROOT = path.resolve(CURRENT_DIR, '..'); +const PROJECT_BUILD_DIR = path.join(PROJECT_ROOT, './build'); + +type TransformedExports = Record< + string, + Record<'require' | 'import', Record<'types' | 'default', string>> +>; + +export async function createPackageManifest() { + const packageData = await fse.readFile(path.resolve(PROJECT_ROOT, './package.json'), 'utf8'); + const { imports, exports, nyc, scripts, devDependencies, workspaces, ...otherPackageData } = + JSON.parse(packageData); + + const newPackageData = { + ...otherPackageData, + private: false, + main: './cjs/index.js', + module: './esm/index.js', + // The following `types` and `typesVersions` fields ensure compatibility with TypeScript's `node` moduleResolution strategy. + // https://github.com/andrewbranch/example-subpath-exports-ts-compat/tree/main/examples/node_modules/types-versions-wildcards + types: 'index', + typesVersions: { + '*': { + index: ['./cjs/index.d.ts'], + '*': ['./cjs/*/index.d.ts'], + }, + }, + exports: retargetExports(exports), + }; + + const targetPath = path.resolve(PROJECT_BUILD_DIR, './package.json'); + + await fse.writeFile(targetPath, JSON.stringify(newPackageData, null, 2), 'utf8'); + console.log(`Created package.json in ${targetPath}`); +} + +function retargetExports(originalExports: Record) { + const subpaths = Object.keys(originalExports); + const transformed: TransformedExports = {}; + + for (const subpath of subpaths) { + const originalPath = originalExports[subpath]; + transformed[subpath] = { + require: { + types: originalPath.replace('/src/', '/cjs/').replace(/\.tsx?$/, '.d.ts'), + default: originalPath.replace('/src/', '/cjs/').replace(/\.tsx?$/, '.js'), + }, + import: { + types: originalPath.replace('/src/', '/esm/').replace(/\.tsx?$/, '.d.ts'), + default: originalPath.replace('/src/', '/esm/').replace(/\.tsx?$/, '.js'), + }, + }; + } + + return transformed; +} + +await createPackageManifest(); diff --git a/packages/react/src/scroll-area/index.ts b/packages/react/src/scroll-area/index.ts index 0b92c3a71..f14fa70e9 100644 --- a/packages/react/src/scroll-area/index.ts +++ b/packages/react/src/scroll-area/index.ts @@ -1 +1,2 @@ export * as ScrollArea from './index.parts'; +export * from './constants'; diff --git a/packages/react/src/no-ssr/NoSsr.test.tsx b/packages/react/src/unstable-no-ssr/NoSsr.test.tsx similarity index 95% rename from packages/react/src/no-ssr/NoSsr.test.tsx rename to packages/react/src/unstable-no-ssr/NoSsr.test.tsx index a36c45fc9..da1fdc353 100644 --- a/packages/react/src/no-ssr/NoSsr.test.tsx +++ b/packages/react/src/unstable-no-ssr/NoSsr.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { createRenderer } from '@mui/internal-test-utils'; -import { NoSsr } from '@base-ui-components/react/no-ssr'; +import { NoSsr } from '.'; describe('', () => { const { render, renderToString } = createRenderer(); diff --git a/packages/react/src/no-ssr/NoSsr.tsx b/packages/react/src/unstable-no-ssr/NoSsr.tsx similarity index 100% rename from packages/react/src/no-ssr/NoSsr.tsx rename to packages/react/src/unstable-no-ssr/NoSsr.tsx diff --git a/packages/react/src/no-ssr/NoSsr.types.ts b/packages/react/src/unstable-no-ssr/NoSsr.types.ts similarity index 100% rename from packages/react/src/no-ssr/NoSsr.types.ts rename to packages/react/src/unstable-no-ssr/NoSsr.types.ts diff --git a/packages/react/src/no-ssr/index.ts b/packages/react/src/unstable-no-ssr/index.ts similarity index 100% rename from packages/react/src/no-ssr/index.ts rename to packages/react/src/unstable-no-ssr/index.ts diff --git a/packages/react/src/use-media-query/index.ts b/packages/react/src/unstable-use-media-query/index.ts similarity index 100% rename from packages/react/src/use-media-query/index.ts rename to packages/react/src/unstable-use-media-query/index.ts diff --git a/packages/react/src/use-button/useButton.test.tsx b/packages/react/src/use-button/useButton.test.tsx index 726212033..17d06f961 100644 --- a/packages/react/src/use-button/useButton.test.tsx +++ b/packages/react/src/use-button/useButton.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { createRenderer } from '@mui/internal-test-utils'; import { expect } from 'chai'; -import { useButton } from '@base-ui-components/react/use-button'; +import { useButton } from '.'; describe('useButton', () => { const { render } = createRenderer(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ea588fc6..94701a01e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -166,19 +166,19 @@ importers: version: 8.57.1 eslint-config-airbnb: specifier: ^19.0.4 - version: 19.0.4(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1) + version: 19.0.4(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1) eslint-config-airbnb-base: specifier: ^15.0.0 - version: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1))(eslint@8.57.1) + version: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1))(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: ^18.0.0 - version: 18.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1))(eslint@8.57.1) + version: 18.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1))(eslint@8.57.1) eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.1) - eslint-import-resolver-webpack: - specifier: ^0.13.9 - version: 0.13.9(eslint-plugin-import@2.31.0)(webpack@5.94.0(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.94.0))) + eslint-import-resolver-typescript: + specifier: ^3.6.3 + version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-plugin-babel: specifier: ^5.3.1 version: 5.3.1(eslint@8.57.1) @@ -187,7 +187,7 @@ importers: version: 1.3.2(eslint@8.57.1) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1) + version: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-jsx-a11y: specifier: ^6.10.2 version: 6.10.2(eslint@8.57.1) @@ -673,9 +673,15 @@ importers: chai: specifier: ^4.5.0 version: 4.5.0 + fs-extra: + specifier: ^11.2.0 + version: 11.2.0 lodash: specifier: ^4.17.21 version: 4.17.21 + publint: + specifier: ^0.2.12 + version: 0.2.12 react: specifier: 19.0.0-rc-fb9a90fa48-20240614 version: 19.0.0-rc-fb9a90fa48-20240614 @@ -2398,6 +2404,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + '@npmcli/agent@2.2.2': resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} engines: {node: ^16.14.0 || >=18.0.0} @@ -4711,10 +4721,6 @@ packages: resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} engines: {node: '>=10.2.0'} - enhanced-resolve@0.9.1: - resolution: {integrity: sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==} - engines: {node: '>=0.6'} - enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} @@ -4866,12 +4872,18 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-webpack@0.13.9: - resolution: {integrity: sha512-yGngeefNiHXau2yzKKs2BNON4HLpxBabY40BGL/vUSKZtqzjlVsTTZm57jhHULhm+mJEwKsEIIN3NXup5AiiBQ==} - engines: {node: '>= 6'} + eslint-import-resolver-typescript@3.6.3: + resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint-plugin-import: '>=1.4.0' - webpack: '>=1.11.0' + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true eslint-module-utils@2.12.0: resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} @@ -5410,8 +5422,8 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} git-config-path@1.0.1: resolution: {integrity: sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==} @@ -5766,6 +5778,10 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore-walk@5.0.1: + resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + ignore-walk@6.0.4: resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -5819,10 +5835,6 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - interpret@3.1.1: resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} engines: {node: '>=10.13.0'} @@ -5870,6 +5882,9 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} + is-bun-module@1.2.1: + resolution: {integrity: sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -6752,9 +6767,6 @@ packages: memfs-or-file-map-to-github-branch@1.2.1: resolution: {integrity: sha512-I/hQzJ2a/pCGR8fkSQ9l5Yx+FQ4e7X6blNHyWBm2ojeFLT3GVzGkTj7xnyWpdclrr7Nq4dmx3xrvu70m3ypzAQ==} - memory-fs@0.2.0: - resolution: {integrity: sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==} - meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} @@ -7190,6 +7202,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npm-bundled@2.0.1: + resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + npm-bundled@3.0.0: resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -7198,6 +7214,10 @@ packages: resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-normalize-package-bin@2.0.0: + resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + npm-normalize-package-bin@3.0.1: resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -7206,6 +7226,11 @@ packages: resolution: {integrity: sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==} engines: {node: ^16.14.0 || >=18.0.0} + npm-packlist@5.1.3: + resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + npm-packlist@8.0.2: resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -7599,8 +7624,8 @@ packages: pause-stream@0.0.11: resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -7920,6 +7945,11 @@ packages: psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + publint@0.2.12: + resolution: {integrity: sha512-YNeUtCVeM4j9nDiTT2OPczmlyzOkIXNtdDZnSuajAxS/nZ6j3t7Vs9SUB4euQNddiltIwu7Tdd3s+hr08fAsMw==} + engines: {node: '>=16'} + hasBin: true + punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -7933,6 +7963,7 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qjobs@1.2.0: @@ -8318,6 +8349,10 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + safe-array-concat@1.1.2: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} @@ -8792,10 +8827,6 @@ packages: tailwindcss@4.0.0-beta.2: resolution: {integrity: sha512-uZ+vgVsy6i18Glc3XYMkTq7dl4GsU4m8X8qRTVlU4+g8Uit7g+wttwfDCl3p+ZOq5KCB09th9XgVDx1zFLCeHA==} - tapable@0.1.10: - resolution: {integrity: sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==} - engines: {node: '>=0.6'} - tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -9710,7 +9741,7 @@ snapshots: dependencies: '@babel/helper-validator-identifier': 7.25.9 js-tokens: 4.0.0 - picocolors: 1.1.0 + picocolors: 1.1.1 '@babel/compat-data@7.26.2': {} @@ -11448,6 +11479,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@nolyfill/is-core-module@1.0.39': {} + '@npmcli/agent@2.2.2': dependencies: agent-base: 7.1.1 @@ -14119,12 +14152,6 @@ snapshots: - supports-color - utf-8-validate - enhanced-resolve@0.9.1: - dependencies: - graceful-fs: 4.2.11 - memory-fs: 0.2.0 - tapable: 0.1.10 - enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 @@ -14333,29 +14360,29 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1))(eslint@8.57.1): + eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1))(eslint@8.57.1): dependencies: confusing-browser-globals: 1.0.11 eslint: 8.57.1 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) object.assign: 4.1.5 object.entries: 1.1.8 semver: 6.3.1 - eslint-config-airbnb-typescript@18.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1))(eslint@8.57.1): + eslint-config-airbnb-typescript@18.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1))(eslint@8.57.1): dependencies: '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1))(eslint@8.57.1) + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - eslint-plugin-import - eslint-config-airbnb@19.0.4(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1): + eslint-config-airbnb@19.0.4(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1) + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.2(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) @@ -14374,31 +14401,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-webpack@0.13.9(eslint-plugin-import@2.31.0)(webpack@5.94.0(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.94.0))): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: - debug: 3.2.7 - enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1) - find-root: 1.1.0 - hasown: 2.0.2 - interpret: 1.4.0 - is-core-module: 2.15.1 - is-regex: 1.1.4 - lodash: 4.17.21 - resolve: 2.0.0-next.5 - semver: 5.7.2 - webpack: 5.94.0(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.94.0)) + '@nolyfill/is-core-module': 1.0.39 + debug: 4.3.7(supports-color@8.1.1) + enhanced-resolve: 5.17.1 + eslint: 8.57.1 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) + fast-glob: 3.3.2 + get-tsconfig: 4.8.1 + is-bun-module: 1.2.1 + is-glob: 4.0.3 + optionalDependencies: + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.9(eslint-plugin-import@2.31.0)(webpack@5.94.0(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.94.0))))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-webpack: 0.13.9(eslint-plugin-import@2.31.0)(webpack@5.94.0(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.94.0))) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -14415,7 +14444,7 @@ snapshots: lodash.snakecase: 4.1.1 lodash.upperfirst: 4.3.1 - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -14426,7 +14455,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.9(eslint-plugin-import@2.31.0)(webpack@5.94.0(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.94.0))))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -15115,7 +15144,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.4 - get-tsconfig@4.7.3: + get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -15603,6 +15632,10 @@ snapshots: ieee754@1.2.1: {} + ignore-walk@5.0.1: + dependencies: + minimatch: 5.1.6 + ignore-walk@6.0.4: dependencies: minimatch: 9.0.4 @@ -15672,8 +15705,6 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 - interpret@1.4.0: {} - interpret@3.1.1: {} ip-address@9.0.5: @@ -15721,6 +15752,10 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-bun-module@1.2.1: + dependencies: + semver: 7.6.3 + is-callable@1.2.7: {} is-ci@3.0.1: @@ -16835,8 +16870,6 @@ snapshots: transitivePeerDependencies: - encoding - memory-fs@0.2.0: {} - meow@13.2.0: {} meow@8.1.2: @@ -17468,6 +17501,10 @@ snapshots: normalize-path@3.0.0: {} + npm-bundled@2.0.1: + dependencies: + npm-normalize-package-bin: 2.0.0 + npm-bundled@3.0.0: dependencies: npm-normalize-package-bin: 3.0.1 @@ -17476,6 +17513,8 @@ snapshots: dependencies: semver: 7.6.3 + npm-normalize-package-bin@2.0.0: {} + npm-normalize-package-bin@3.0.1: {} npm-package-arg@11.0.2: @@ -17485,6 +17524,13 @@ snapshots: semver: 7.6.3 validate-npm-package-name: 5.0.1 + npm-packlist@5.1.3: + dependencies: + glob: 8.1.0 + ignore-walk: 5.0.1 + npm-bundled: 2.0.1 + npm-normalize-package-bin: 2.0.0 + npm-packlist@8.0.2: dependencies: ignore-walk: 6.0.4 @@ -17981,7 +18027,7 @@ snapshots: dependencies: through: 2.3.8 - picocolors@1.1.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -18103,19 +18149,19 @@ snapshots: postcss@8.4.31: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 postcss@8.4.38: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} @@ -18153,7 +18199,7 @@ snapshots: find-up: 5.0.0 ignore: 5.3.2 mri: 1.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 picomatch: 3.0.1 prettier: 3.3.3 tslib: 2.6.2 @@ -18217,6 +18263,12 @@ snapshots: psl@1.9.0: {} + publint@0.2.12: + dependencies: + npm-packlist: 5.1.3 + picocolors: 1.1.1 + sade: 1.8.1 + punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -18722,6 +18774,10 @@ snapshots: dependencies: tslib: 2.6.2 + sade@1.8.1: + dependencies: + mri: 1.2.0 + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 @@ -19286,7 +19342,7 @@ snapshots: meow: 13.2.0 micromatch: 4.0.8 normalize-path: 3.0.0 - picocolors: 1.1.0 + picocolors: 1.1.1 postcss: 8.4.47 postcss-resolve-nested-selector: 0.1.1 postcss-safe-parser: 7.0.0(postcss@8.4.47) @@ -19364,8 +19420,6 @@ snapshots: tailwindcss@4.0.0-beta.2: {} - tapable@0.1.10: {} - tapable@2.2.1: {} tar-stream@2.2.0: @@ -19545,7 +19599,7 @@ snapshots: tsx@4.8.2: dependencies: esbuild: 0.20.2 - get-tsconfig: 4.7.3 + get-tsconfig: 4.8.1 optionalDependencies: fsevents: 2.3.3 @@ -19751,7 +19805,7 @@ snapshots: dependencies: browserslist: 4.24.0 escalade: 3.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 update-check@1.5.4: dependencies: @@ -19938,7 +19992,7 @@ snapshots: gzip-size: 6.0.0 html-escaper: 2.0.2 opener: 1.5.2 - picocolors: 1.1.0 + picocolors: 1.1.1 sirv: 2.0.4 ws: 7.5.9 transitivePeerDependencies: diff --git a/scripts/copyFiles.mjs b/scripts/copyFiles.mjs index a59613526..8e5577d07 100644 --- a/scripts/copyFiles.mjs +++ b/scripts/copyFiles.mjs @@ -1,11 +1,7 @@ /* eslint-disable no-console */ import path from 'path'; -import { - createPackageFile, - includeFileInBuild, - prepend, - typescriptCopy, -} from './copyFilesUtils.mjs'; +import fse from 'fs-extra'; +import { includeFileInBuild, prepend, typescriptCopy } from './copyFilesUtils.mjs'; const packagePath = process.cwd(); const buildPath = path.join(packagePath, './build'); @@ -21,7 +17,7 @@ async function addLicense(packageData) { */ `; await Promise.all( - ['./index.js', './node/index.js'].map(async (file) => { + ['./cjs/index.js', './esm/index.js'].map(async (file) => { try { await prepend(path.resolve(buildPath, file), license); } catch (err) { @@ -41,8 +37,6 @@ async function run() { // TypeScript await typescriptCopy({ from: srcPath, to: buildPath }); - const packageData = await createPackageFile(); - await Promise.all( ['./README.md', '../../CHANGELOG.md', '../../LICENSE', ...extraFiles].map(async (file) => { const [sourcePath, targetPath] = file.split(':'); @@ -50,6 +44,8 @@ async function run() { }), ); + const packageFile = await fse.readFile(path.resolve(packagePath, './package.json'), 'utf8'); + const packageData = JSON.parse(packageFile); await addLicense(packageData); } catch (err) { console.error(err); diff --git a/scripts/copyFilesUtils.mjs b/scripts/copyFilesUtils.mjs index eedf1a06d..f5181dfb4 100644 --- a/scripts/copyFilesUtils.mjs +++ b/scripts/copyFilesUtils.mjs @@ -1,5 +1,5 @@ /* eslint-disable no-console */ -import path from 'path'; +import path from 'node:path'; import fse from 'fs-extra'; import glob from 'fast-glob'; @@ -21,65 +21,6 @@ export async function includeFileInBuild(file, target = path.basename(file)) { console.log(`Copied ${sourcePath} to ${targetPath}`); } -/** - * Puts a package.json into every immediate child directory of rootDir. - * That package.json contains information about esm for bundlers so that imports - * like import Typography from '@mui/material/Typography' are tree-shakeable. - * - * It also tests that an this import can be used in TypeScript by checking - * if an index.d.ts is present at that path. - * @param {object} param0 - * @param {string} param0.from - * @param {string} param0.to - */ -export async function createModulePackages({ from, to }) { - const directoryPackages = glob.sync('*/index.{js,ts,tsx}', { cwd: from }).map(path.dirname); - - await Promise.all( - directoryPackages.map(async (directoryPackage) => { - const packageJsonPath = path.join(to, directoryPackage, 'package.json'); - const topLevelPathImportsAreCommonJSModules = await fse.pathExists( - path.resolve(path.dirname(packageJsonPath), '../esm'), - ); - - const packageJson = { - sideEffects: false, - module: topLevelPathImportsAreCommonJSModules - ? path.posix.join('../esm', directoryPackage, 'index.js') - : './index.js', - main: topLevelPathImportsAreCommonJSModules - ? './index.js' - : path.posix.join('../node', directoryPackage, 'index.js'), - types: './index.d.ts', - }; - - const [typingsEntryExist, moduleEntryExists, mainEntryExists] = await Promise.all([ - fse.pathExists(path.resolve(path.dirname(packageJsonPath), packageJson.types)), - fse.pathExists(path.resolve(path.dirname(packageJsonPath), packageJson.module)), - fse.pathExists(path.resolve(path.dirname(packageJsonPath), packageJson.main)), - fse.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2)), - ]); - - const manifestErrorMessages = []; - if (!typingsEntryExist) { - manifestErrorMessages.push(`'types' entry '${packageJson.types}' does not exist`); - } - if (!moduleEntryExists) { - manifestErrorMessages.push(`'module' entry '${packageJson.module}' does not exist`); - } - if (!mainEntryExists) { - manifestErrorMessages.push(`'main' entry '${packageJson.main}' does not exist`); - } - if (manifestErrorMessages.length > 0) { - // TODO: AggregateError - throw new Error(`${packageJsonPath}:\n${manifestErrorMessages.join('\n')}`); - } - - return packageJsonPath; - }), - ); -} - export async function typescriptCopy({ from, to }) { if (!(await fse.pathExists(to))) { console.warn(`path ${to} does not exists`); @@ -91,70 +32,6 @@ export async function typescriptCopy({ from, to }) { return Promise.all(cmds); } -export async function createPackageFile() { - const packageData = await fse.readFile(path.resolve(packagePath, './package.json'), 'utf8'); - const { imports, exports, nyc, scripts, devDependencies, workspaces, ...packageDataOther } = - JSON.parse(packageData); - - const newPackageData = { - ...packageDataOther, - private: false, - main: './cjs/index.js', - module: './esm/index.js', - types: 'index', - typesVersions: { - '*': { - index: ['./cjs/index.d.ts'], - '*': ['./cjs/*/index.d.ts'], - }, - }, - exports: { - '.': { - require: { - types: './cjs/index.d.ts', - default: './cjs/index.js', - }, - import: { - types: './esm/index.d.ts', - default: './esm/index.js', - }, - }, - './utils': { - require: { - types: './cjs/utils/index.d.ts', - default: './cjs/utils/index.js', - }, - import: { - types: './esm/utils/index.d.ts', - default: './esm/utils/index.js', - }, - }, - './*': { - require: { - types: './cjs/*/index.d.ts', - default: './cjs/*/index.js', - }, - import: { - types: './esm/*/index.d.ts', - default: './esm/*/index.js', - }, - }, - }, - }; - - const typeDefinitionsFilePath = path.resolve(buildPath, './index.d.ts'); - if (await fse.pathExists(typeDefinitionsFilePath)) { - newPackageData.types = './index.d.ts'; - } - - const targetPath = path.resolve(buildPath, './package.json'); - - await fse.writeFile(targetPath, JSON.stringify(newPackageData, null, 2), 'utf8'); - console.log(`Created package.json in ${targetPath}`); - - return newPackageData; -} - export async function prepend(file, string) { const data = await fse.readFile(file, 'utf8'); await fse.writeFile(file, string + data, 'utf8'); diff --git a/test/e2e/webpack.config.js b/test/e2e/webpack.config.js index dd10685c6..e93871619 100644 --- a/test/e2e/webpack.config.js +++ b/test/e2e/webpack.config.js @@ -1,9 +1,7 @@ const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); -const webpackBaseConfig = require('../../webpackBaseConfig'); module.exports = { - ...webpackBaseConfig, entry: path.resolve(__dirname, 'index.js'), mode: process.env.NODE_ENV || 'development', optimization: { @@ -22,7 +20,6 @@ module.exports = { }), ], module: { - ...webpackBaseConfig.module, rules: [ { test: /\.(js|ts|tsx)$/, diff --git a/test/regressions/webpack.config.js b/test/regressions/webpack.config.js index 301dab27e..b95743617 100644 --- a/test/regressions/webpack.config.js +++ b/test/regressions/webpack.config.js @@ -1,10 +1,8 @@ const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const webpack = require('webpack'); -const webpackBaseConfig = require('../../webpackBaseConfig'); module.exports = { - ...webpackBaseConfig, entry: path.resolve(__dirname, 'index.js'), mode: process.env.NODE_ENV || 'development', optimization: { @@ -79,7 +77,6 @@ module.exports = { ], }, resolve: { - ...webpackBaseConfig.resolve, fallback: { // Exclude polyfill and treat 'fs' as an empty module since it is not required. next -> gzip-size relies on it. fs: false, diff --git a/webpackBaseConfig.js b/webpackBaseConfig.js deleted file mode 100644 index 8c2b2217e..000000000 --- a/webpackBaseConfig.js +++ /dev/null @@ -1,21 +0,0 @@ -const path = require('path'); - -// WARNING: Use this module only as an inspiration. -// Cherry-pick the parts you need and inline them in the webpack.config you need. -// This module isn't used to build the documentation. We use Next.js for that. -// This module is used by the visual regression tests to run the demos and by eslint-plugin-import. -module.exports = { - context: path.resolve(__dirname), - resolve: { - modules: [__dirname, 'node_modules'], - alias: { - '@base-ui-components/react': path.resolve(__dirname, './packages/react/src'), - '@mui-internal/api-docs-builder': path.resolve( - __dirname, - './node_modules/@mui/monorepo/packages/api-docs-builder', - ), - docs: path.resolve(__dirname, './docs'), - }, - extensions: ['.js', '.ts', '.tsx', '.d.ts'], - }, -};