diff --git a/change/@ni-nimble-react-87afa7f5-520c-4a7f-b04b-a3b510dc0f43.json b/change/@ni-nimble-react-87afa7f5-520c-4a7f-b04b-a3b510dc0f43.json new file mode 100644 index 0000000000..ae4858f06f --- /dev/null +++ b/change/@ni-nimble-react-87afa7f5-520c-4a7f-b04b-a3b510dc0f43.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "Switch to package exports", + "packageName": "@ni/nimble-react", + "email": "rajsite@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/change/@ni-ok-react-75f3e0c4-573f-4603-a3f5-dd12c50a7dcb.json b/change/@ni-ok-react-75f3e0c4-573f-4603-a3f5-dd12c50a7dcb.json new file mode 100644 index 0000000000..bd412f6300 --- /dev/null +++ b/change/@ni-ok-react-75f3e0c4-573f-4603-a3f5-dd12c50a7dcb.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "Switch to package exports", + "packageName": "@ni/ok-react", + "email": "rajsite@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/change/@ni-spright-react-f4aefe44-b717-4641-9803-312fbc4d9ddf.json b/change/@ni-spright-react-f4aefe44-b717-4641-9803-312fbc4d9ddf.json new file mode 100644 index 0000000000..d3b9b47f6b --- /dev/null +++ b/change/@ni-spright-react-f4aefe44-b717-4641-9803-312fbc4d9ddf.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "Switch to package exports", + "packageName": "@ni/spright-react", + "email": "rajsite@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-workspace/nimble-react/.npmignore b/packages/react-workspace/nimble-react/.npmignore index 8529ba2a33..d1f6f6d931 100644 --- a/packages/react-workspace/nimble-react/.npmignore +++ b/packages/react-workspace/nimble-react/.npmignore @@ -1,4 +1,5 @@ * +!/styles/* !/dist/*.* !/dist/esm/** /dist/esm/**/tests diff --git a/packages/react-workspace/nimble-react/build/generate-icons/source/index.js b/packages/react-workspace/nimble-react/build/generate-icons.mjs similarity index 85% rename from packages/react-workspace/nimble-react/build/generate-icons/source/index.js rename to packages/react-workspace/nimble-react/build/generate-icons.mjs index 60af163b9a..d0e346f7bd 100644 --- a/packages/react-workspace/nimble-react/build/generate-icons/source/index.js +++ b/packages/react-workspace/nimble-react/build/generate-icons.mjs @@ -2,10 +2,9 @@ * Build script for generating React wrappers for Nimble icon components. */ import { pascalCase, spinalCase } from '@ni/fast-web-utilities'; -import * as icons from '@ni/nimble-tokens/dist/icons/js'; - -const fs = require('fs'); -const path = require('path'); +import * as icons from '@ni/nimble-tokens/dist/icons/js/index.js'; +import * as path from 'node:path'; +import * as fs from 'node:fs'; const trimSizeFromName = text => { // Remove dimensions from icon name, e.g. "add16X16" -> "add" @@ -15,7 +14,7 @@ const trimSizeFromName = text => { const generatedFilePrefix = `// AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY // See generation source in nimble-react/build/generate-icons\n`; -const iconsDirectory = path.resolve(__dirname, '../../../src/icons'); +const iconsDirectory = path.resolve(import.meta.dirname, '../src/icons'); if (fs.existsSync(iconsDirectory)) { console.log(`Deleting existing icons directory "${iconsDirectory}"`); @@ -49,4 +48,4 @@ export const Nimble${className} = wrap(${className});`; encoding: 'utf-8' }); } -console.log(`Finshed writing ${fileCount} icon react wrapper files`); +console.log(`Finished writing ${fileCount} icon react wrapper files`); diff --git a/packages/react-workspace/nimble-react/build/generate-icons/rollup.config.js b/packages/react-workspace/nimble-react/build/generate-icons/rollup.config.js deleted file mode 100644 index 89a182bd41..0000000000 --- a/packages/react-workspace/nimble-react/build/generate-icons/rollup.config.js +++ /dev/null @@ -1,12 +0,0 @@ -import { nodeResolve } from '@rollup/plugin-node-resolve'; - -const path = require('path'); - -export default { - input: path.resolve(__dirname, 'source/index.js'), - output: { - file: path.resolve(__dirname, 'dist/index.js'), - format: 'cjs' - }, - plugins: [nodeResolve()] -}; diff --git a/packages/react-workspace/nimble-react/eslint.config.mjs b/packages/react-workspace/nimble-react/eslint.config.mjs index a16fca345f..ae6c76e9a1 100644 --- a/packages/react-workspace/nimble-react/eslint.config.mjs +++ b/packages/react-workspace/nimble-react/eslint.config.mjs @@ -1,20 +1,16 @@ import { defineConfig, globalIgnores } from 'eslint/config'; -import { lintNimbleConfig, javascriptNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble'; +import { javascriptConfig, importNodeEsmConfig } from '@ni/eslint-config-javascript'; +import { lintNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble'; export default defineConfig([ globalIgnores(['**/dist/']), lintNimbleConfig, { - files: ['**/*.js', '**/*.cjs'], - extends: javascriptNimbleConfig, + files: ['build/**/*.mjs'], + extends: [javascriptConfig, importNodeEsmConfig], rules: { // Configuration scripts will not be in published package and are allowed to use devDependencies 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], - }, - }, - { - files: ['**/build/**/*.js'], - rules: { // Build scripts should give verbose logging 'no-console': 'off', // Rollup config files use default exports diff --git a/packages/react-workspace/nimble-react/package.json b/packages/react-workspace/nimble-react/package.json index a0c9d1d2b0..28ba6a078c 100644 --- a/packages/react-workspace/nimble-react/package.json +++ b/packages/react-workspace/nimble-react/package.json @@ -7,11 +7,32 @@ "nimble", "react" ], + "type": "module", + "exports": { + "./package.json": "./package.json", + "./styles/*": "./styles/*", + "./icons/*": { + "types": "./dist/esm/icons/*.d.ts", + "import": "./dist/esm/icons/*.js" + }, + "./*": { + "types": "./dist/esm/*.d.ts", + "import": "./dist/esm/*/index.js" + } + }, + "typesVersions": { + "*": { + "icons/*": [ + "dist/esm/icons/*.d.ts" + ], + "*": [ + "dist/esm/*/index.d.ts" + ] + } + }, "scripts": { "build": "npm run build:icons && npm run build:components", - "build:icons": "npm run build:icons:bundle && npm run build:icons:run", - "build:icons:bundle": "rollup --bundleConfigAsCjs --config build/generate-icons/rollup.config.js", - "build:icons:run": "node build/generate-icons/dist/index.js", + "build:icons": "node build/generate-icons.mjs", "build:components": "tsc -p ./tsconfig.json", "lint": "eslint .", "format": "eslint . --fix", @@ -32,8 +53,6 @@ "@ni/fast-web-utilities": "^10.0.0", "@ni/nimble-components": "^34.10.3", "@ni/nimble-tokens": "^8.13.6", - "@rollup/plugin-node-resolve": "^16.0.0", - "rollup": "^4.12.0", "typescript": "~5.8.3" }, "peerDependencies": { diff --git a/packages/react-workspace/nimble-react/src/utilities/react-wrapper/index.ts b/packages/react-workspace/nimble-react/src/utilities/react-wrapper.ts similarity index 100% rename from packages/react-workspace/nimble-react/src/utilities/react-wrapper/index.ts rename to packages/react-workspace/nimble-react/src/utilities/react-wrapper.ts diff --git a/packages/react-workspace/nimble-react/tsconfig.json b/packages/react-workspace/nimble-react/tsconfig.json index 428c889a36..2d8a6fa0a0 100644 --- a/packages/react-workspace/nimble-react/tsconfig.json +++ b/packages/react-workspace/nimble-react/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "declaration": true, "esModuleInterop": true, - "moduleResolution": "node", + "moduleResolution": "bundler", "outDir": "dist/esm", "strict": true, "experimentalDecorators": true, diff --git a/packages/react-workspace/ok-react/eslint.config.mjs b/packages/react-workspace/ok-react/eslint.config.mjs index b83cb81ca1..bf08d6e015 100644 --- a/packages/react-workspace/ok-react/eslint.config.mjs +++ b/packages/react-workspace/ok-react/eslint.config.mjs @@ -1,17 +1,9 @@ import { defineConfig, globalIgnores } from 'eslint/config'; -import { lintNimbleConfig, javascriptNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble'; +import { lintNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble'; export default defineConfig([ globalIgnores(['**/dist/']), lintNimbleConfig, - { - files: ['**/*.js', '**/*.cjs'], - extends: javascriptNimbleConfig, - rules: { - // Configuration scripts will not be in published package and are allowed to use devDependencies - 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], - } - }, { files: ['**/*.ts'], extends: typescriptNimbleConfig, diff --git a/packages/react-workspace/ok-react/package.json b/packages/react-workspace/ok-react/package.json index f75375b883..bcd0f7f5ef 100644 --- a/packages/react-workspace/ok-react/package.json +++ b/packages/react-workspace/ok-react/package.json @@ -7,6 +7,21 @@ "ok", "react" ], + "type": "module", + "exports": { + "./package.json": "./package.json", + "./*": { + "types": "./dist/esm/*.d.ts", + "import": "./dist/esm/*/index.js" + } + }, + "typesVersions": { + "*": { + "*": [ + "dist/esm/*/index.d.ts" + ] + } + }, "scripts": { "build": "tsc -p ./tsconfig.json", "lint": "eslint .", diff --git a/packages/react-workspace/ok-react/src/utilities/react-wrapper/index.ts b/packages/react-workspace/ok-react/src/utilities/react-wrapper.ts similarity index 100% rename from packages/react-workspace/ok-react/src/utilities/react-wrapper/index.ts rename to packages/react-workspace/ok-react/src/utilities/react-wrapper.ts diff --git a/packages/react-workspace/ok-react/tsconfig.json b/packages/react-workspace/ok-react/tsconfig.json index 428c889a36..2d8a6fa0a0 100644 --- a/packages/react-workspace/ok-react/tsconfig.json +++ b/packages/react-workspace/ok-react/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "declaration": true, "esModuleInterop": true, - "moduleResolution": "node", + "moduleResolution": "bundler", "outDir": "dist/esm", "strict": true, "experimentalDecorators": true, diff --git a/packages/react-workspace/react-client-app/.npmignore b/packages/react-workspace/react-client-app/.npmignore new file mode 100644 index 0000000000..f275676171 --- /dev/null +++ b/packages/react-workspace/react-client-app/.npmignore @@ -0,0 +1,2 @@ +* +!/dist/*.* diff --git a/packages/react-workspace/react-client-app/eslint.config.mjs b/packages/react-workspace/react-client-app/eslint.config.mjs index 6a3ab28eb1..863983589b 100644 --- a/packages/react-workspace/react-client-app/eslint.config.mjs +++ b/packages/react-workspace/react-client-app/eslint.config.mjs @@ -2,17 +2,22 @@ import react from 'eslint-plugin-react'; import reactHooks from 'eslint-plugin-react-hooks'; import reactRefresh from 'eslint-plugin-react-refresh'; import { defineConfig, globalIgnores } from 'eslint/config'; -import { lintNimbleConfig, javascriptNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble'; +import { javascriptConfig, importNodeEsmConfig } from '@ni/eslint-config-javascript'; +import { lintNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble'; export default defineConfig([ globalIgnores(['**/dist/']), lintNimbleConfig, { - files: ['**/*.js', '**/*.cjs'], - extends: javascriptNimbleConfig, + files: ['vite.config.mjs'], + extends: [javascriptConfig, importNodeEsmConfig], rules: { // Configuration scripts will not be in published package and are allowed to use devDependencies 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], + // Build scripts should give verbose logging + 'no-console': 'off', + // Rollup config files use default exports + 'import/no-default-export': 'off', }, }, { @@ -30,7 +35,7 @@ export default defineConfig([ ], languageOptions: { parserOptions: { - project: './tsconfig.app.json', + project: './tsconfig.json', tsconfigRootDir: import.meta.dirname, ecmaFeatures: { jsx: true, @@ -58,19 +63,5 @@ export default defineConfig([ '@typescript-eslint/strict-boolean-expressions': 'off', 'no-alert': 'off', }, - }, - { - files: ['**/vite.config.ts'], - languageOptions: { - parserOptions: { - project: './tsconfig.node.json', - tsconfigRootDir: import.meta.dirname, - }, - }, - rules: { - // Configuration scripts will not be in published package and are allowed to use devDependencies - 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], - 'import/no-default-export': 'off', - }, } ]); diff --git a/packages/react-workspace/react-client-app/package.json b/packages/react-workspace/react-client-app/package.json index 178258d2dd..6492f0018a 100644 --- a/packages/react-workspace/react-client-app/package.json +++ b/packages/react-workspace/react-client-app/package.json @@ -6,6 +6,7 @@ "scripts": { "start": "vite", "build": "tsc -b && vite build", + "test": "tsc -p ./tsconfig.legacy.json", "lint": "eslint .", "format": "eslint . --fix", "pack": "npm pack" diff --git a/packages/react-workspace/react-client-app/src/components/App.tsx b/packages/react-workspace/react-client-app/src/components/App.tsx index 100788004f..eaa41a315a 100644 --- a/packages/react-workspace/react-client-app/src/components/App.tsx +++ b/packages/react-workspace/react-client-app/src/components/App.tsx @@ -1,70 +1,70 @@ -import { NimbleThemeProvider, Theme } from '@ni/nimble-react/dist/esm/theme-provider'; -import { NimbleAnchor } from '@ni/nimble-react/dist/esm/anchor'; -import { NimbleButton } from '@ni/nimble-react/dist/esm/button'; -import { NimbleBanner } from '@ni/nimble-react/dist/esm/banner'; -import { NimbleBreadcrumb } from '@ni/nimble-react/dist/esm/breadcrumb'; -import { NimbleBreadcrumbItem } from '@ni/nimble-react/dist/esm/breadcrumb-item'; -import { NimbleToggleButton } from '@ni/nimble-react/dist/esm/toggle-button'; -import { NimbleAnchorButton } from '@ni/nimble-react/dist/esm/anchor-button'; -import { NimbleCard } from '@ni/nimble-react/dist/esm/card'; -import { NimbleNumberField } from '@ni/nimble-react/dist/esm/number-field'; -import { NimbleSelect, type Select, type SelectChangeEvent, type SelectFilterInputEvent } from '@ni/nimble-react/dist/esm/select'; -import { NimbleListOption } from '@ni/nimble-react/dist/esm/list-option'; -import { NimbleListOptionGroup } from '@ni/nimble-react/dist/esm/list-option-group'; -import { NimbleCardButton } from '@ni/nimble-react/dist/esm/card-button'; -import { NimbleCheckbox } from '@ni/nimble-react/dist/esm/checkbox'; -import { NimbleRadioGroup } from '@ni/nimble-react/dist/esm/radio-group'; -import { NimbleRadio } from '@ni/nimble-react/dist/esm/radio'; -import { NimbleTextField } from '@ni/nimble-react/dist/esm/text-field'; -import { NimbleDialog, type Dialog, type DialogRef, DialogUserDismissed } from '@ni/nimble-react/dist/esm/dialog'; -import { NimbleDrawer, type Drawer, type DrawerRef, DrawerUserDismissed, DrawerLocation } from '@ni/nimble-react/dist/esm/drawer'; -import { NimbleMenu } from '@ni/nimble-react/dist/esm/menu'; -import { NimbleMenuItem, type MenuItemChangeEvent } from '@ni/nimble-react/dist/esm/menu-item'; -import { NimbleAnchorMenuItem } from '@ni/nimble-react/dist/esm/anchor-menu-item'; -import { NimbleMenuButton } from '@ni/nimble-react/dist/esm/menu-button'; -import { NimbleIconAdd } from '@ni/nimble-react/dist/esm/icons/add'; -import { NimbleIconCheck } from '@ni/nimble-react/dist/esm/icons/check'; -import { NimbleIconXmarkCheck } from '@ni/nimble-react/dist/esm/icons/xmark-check'; -import { NimbleSpinner } from '@ni/nimble-react/dist/esm/spinner'; -import { NimbleSwitch } from '@ni/nimble-react/dist/esm/switch'; -import { NimbleTable, type Table, type TableRowExpandToggleEvent, type TableRecord, type TableSetRecordHierarchyOptions, type TableRef } from '@ni/nimble-react/dist/esm/table'; -import { NimbleTableColumnText } from '@ni/nimble-react/dist/esm/table-column/text'; -import { NimbleTableColumnAnchor } from '@ni/nimble-react/dist/esm/table-column/anchor'; -import { NimbleTableColumnDateText } from '@ni/nimble-react/dist/esm/table-column/date-text'; -import { NimbleTableColumnMapping } from '@ni/nimble-react/dist/esm/table-column/mapping'; -import { NimbleMappingText } from '@ni/nimble-react/dist/esm/mapping/text'; -import { NimbleMappingIcon } from '@ni/nimble-react/dist/esm/mapping/icon'; -import { NimbleMappingSpinner } from '@ni/nimble-react/dist/esm/mapping/spinner'; -import { NimbleMappingEmpty } from '@ni/nimble-react/dist/esm/mapping/empty'; -import { NimbleTableColumnNumberText } from '@ni/nimble-react/dist/esm/table-column/number-text'; -import { NimbleTableColumnDurationText } from '@ni/nimble-react/dist/esm/table-column/duration-text'; -import { NimbleTableColumnMenuButton, type TableColumnMenuButtonBeforeToggleEvent } from '@ni/nimble-react/dist/esm/table-column/menu-button'; -import { NimbleTabs } from '@ni/nimble-react/dist/esm/tabs'; -import { NimbleTab } from '@ni/nimble-react/dist/esm/tab'; -import { NimbleTabsToolbar } from '@ni/nimble-react/dist/esm/tabs-toolbar'; -import { NimbleTabPanel } from '@ni/nimble-react/dist/esm/tab-panel'; -import { NimbleAnchorTabs } from '@ni/nimble-react/dist/esm/anchor-tabs'; -import { NimbleAnchorTab } from '@ni/nimble-react/dist/esm/anchor-tab'; -import { NimbleTextArea } from '@ni/nimble-react/dist/esm/text-area'; -import { NimbleToolbar } from '@ni/nimble-react/dist/esm/toolbar'; -import { NimbleTooltip } from '@ni/nimble-react/dist/esm/tooltip'; -import { NimbleTreeView } from '@ni/nimble-react/dist/esm/tree-view'; -import { NimbleTreeItem } from '@ni/nimble-react/dist/esm/tree-item'; -import { NimbleAnchorTreeItem } from '@ni/nimble-react/dist/esm/anchor-tree-item'; -import { NimbleCombobox } from '@ni/nimble-react/dist/esm/combobox'; -import { NimbleRichTextEditor, type RichTextEditor } from '@ni/nimble-react/dist/esm/rich-text/editor'; -import { NimbleRichTextMentionUsers } from '@ni/nimble-react/dist/esm/rich-text-mention/users'; -import { NimbleMappingUser } from '@ni/nimble-react/dist/esm/mapping/user'; -import { NimbleRichTextViewer } from '@ni/nimble-react/dist/esm/rich-text/viewer'; -import { SprightChatConversation } from '@ni/spright-react/dist/esm/chat/conversation'; -import { SprightChatInput } from '@ni/spright-react/dist/esm/chat/input'; -import { SprightChatMessage } from '@ni/spright-react/dist/esm/chat/message'; -import { NimbleIconCopyText } from '@ni/nimble-react/dist/esm/icons/copy-text'; -import { NimbleIconWebviCustom } from '@ni/nimble-react/dist/esm/icons/webvi-custom'; +import { NimbleThemeProvider, Theme } from '@ni/nimble-react/theme-provider'; +import { NimbleAnchor } from '@ni/nimble-react/anchor'; +import { NimbleButton } from '@ni/nimble-react/button'; +import { NimbleBanner } from '@ni/nimble-react/banner'; +import { NimbleBreadcrumb } from '@ni/nimble-react/breadcrumb'; +import { NimbleBreadcrumbItem } from '@ni/nimble-react/breadcrumb-item'; +import { NimbleToggleButton } from '@ni/nimble-react/toggle-button'; +import { NimbleAnchorButton } from '@ni/nimble-react/anchor-button'; +import { NimbleCard } from '@ni/nimble-react/card'; +import { NimbleNumberField } from '@ni/nimble-react/number-field'; +import { NimbleSelect, type Select, type SelectChangeEvent, type SelectFilterInputEvent } from '@ni/nimble-react/select'; +import { NimbleListOption } from '@ni/nimble-react/list-option'; +import { NimbleListOptionGroup } from '@ni/nimble-react/list-option-group'; +import { NimbleCardButton } from '@ni/nimble-react/card-button'; +import { NimbleCheckbox } from '@ni/nimble-react/checkbox'; +import { NimbleRadioGroup } from '@ni/nimble-react/radio-group'; +import { NimbleRadio } from '@ni/nimble-react/radio'; +import { NimbleTextField } from '@ni/nimble-react/text-field'; +import { NimbleDialog, type Dialog, type DialogRef, DialogUserDismissed } from '@ni/nimble-react/dialog'; +import { NimbleDrawer, type Drawer, type DrawerRef, DrawerUserDismissed, DrawerLocation } from '@ni/nimble-react/drawer'; +import { NimbleMenu } from '@ni/nimble-react/menu'; +import { NimbleMenuItem, type MenuItemChangeEvent } from '@ni/nimble-react/menu-item'; +import { NimbleAnchorMenuItem } from '@ni/nimble-react/anchor-menu-item'; +import { NimbleMenuButton } from '@ni/nimble-react/menu-button'; +import { NimbleIconAdd } from '@ni/nimble-react/icons/add'; +import { NimbleIconCheck } from '@ni/nimble-react/icons/check'; +import { NimbleIconXmarkCheck } from '@ni/nimble-react/icons/xmark-check'; +import { NimbleSpinner } from '@ni/nimble-react/spinner'; +import { NimbleSwitch } from '@ni/nimble-react/switch'; +import { NimbleTable, type Table, type TableRef, type TableRowExpandToggleEvent, type TableRecord, type TableSetRecordHierarchyOptions } from '@ni/nimble-react/table'; +import { NimbleTableColumnText } from '@ni/nimble-react/table-column/text'; +import { NimbleTableColumnAnchor } from '@ni/nimble-react/table-column/anchor'; +import { NimbleTableColumnDateText } from '@ni/nimble-react/table-column/date-text'; +import { NimbleTableColumnMapping } from '@ni/nimble-react/table-column/mapping'; +import { NimbleMappingText } from '@ni/nimble-react/mapping/text'; +import { NimbleMappingIcon } from '@ni/nimble-react/mapping/icon'; +import { NimbleMappingSpinner } from '@ni/nimble-react/mapping/spinner'; +import { NimbleMappingEmpty } from '@ni/nimble-react/mapping/empty'; +import { NimbleTableColumnNumberText } from '@ni/nimble-react/table-column/number-text'; +import { NimbleTableColumnDurationText } from '@ni/nimble-react/table-column/duration-text'; +import { NimbleTableColumnMenuButton, type TableColumnMenuButtonBeforeToggleEvent } from '@ni/nimble-react/table-column/menu-button'; +import { NimbleTabs } from '@ni/nimble-react/tabs'; +import { NimbleTab } from '@ni/nimble-react/tab'; +import { NimbleTabsToolbar } from '@ni/nimble-react/tabs-toolbar'; +import { NimbleTabPanel } from '@ni/nimble-react/tab-panel'; +import { NimbleAnchorTabs } from '@ni/nimble-react/anchor-tabs'; +import { NimbleAnchorTab } from '@ni/nimble-react/anchor-tab'; +import { NimbleTextArea } from '@ni/nimble-react/text-area'; +import { NimbleToolbar } from '@ni/nimble-react/toolbar'; +import { NimbleTooltip } from '@ni/nimble-react/tooltip'; +import { NimbleTreeView } from '@ni/nimble-react/tree-view'; +import { NimbleTreeItem } from '@ni/nimble-react/tree-item'; +import { NimbleAnchorTreeItem } from '@ni/nimble-react/anchor-tree-item'; +import { NimbleCombobox } from '@ni/nimble-react/combobox'; +import { NimbleRichTextEditor, type RichTextEditor } from '@ni/nimble-react/rich-text/editor'; +import { NimbleRichTextMentionUsers } from '@ni/nimble-react/rich-text-mention/users'; +import { NimbleMappingUser } from '@ni/nimble-react/mapping/user'; +import { NimbleRichTextViewer } from '@ni/nimble-react/rich-text/viewer'; +import { SprightChatConversation } from '@ni/spright-react/chat/conversation'; +import { SprightChatInput } from '@ni/spright-react/chat/input'; +import { SprightChatMessage } from '@ni/spright-react/chat/message'; +import { NimbleIconCopyText } from '@ni/nimble-react/icons/copy-text'; +import { NimbleIconWebviCustom } from '@ni/nimble-react/icons/webvi-custom'; -import { SprightRectangle } from '@ni/spright-react/dist/esm/rectangle'; +import { SprightRectangle } from '@ni/spright-react/rectangle'; -import { OkButton } from '@ni/ok-react/dist/esm/button'; +import { OkButton } from '@ni/ok-react/button'; import './App.scss'; import { useRef, useState, useEffect } from 'react'; diff --git a/packages/react-workspace/react-client-app/src/vite-env.d.ts b/packages/react-workspace/react-client-app/src/vite-env.d.ts deleted file mode 100644 index 11f02fe2a0..0000000000 --- a/packages/react-workspace/react-client-app/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/packages/react-workspace/react-client-app/tsconfig.app.json b/packages/react-workspace/react-client-app/tsconfig.app.json deleted file mode 100644 index caccfaa78f..0000000000 --- a/packages/react-workspace/react-client-app/tsconfig.app.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "esModuleInterop": true, - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "moduleDetection": "force", - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "incremental": true, - - "paths": { - "@ni/nimble-react/dist/esm/*": [ - "../../react-workspace/nimble-react/src/*" - ], - "@ni/spright-react/dist/esm/*": [ - "../../react-workspace/spright-react/src/*" - ], - "@ni/ok-react/dist/esm/*": ["../../react-workspace/ok-react/src/*"] - } - }, - "include": ["src"] -} diff --git a/packages/react-workspace/react-client-app/tsconfig.json b/packages/react-workspace/react-client-app/tsconfig.json index 1ffef600d9..20f3cfcf6a 100644 --- a/packages/react-workspace/react-client-app/tsconfig.json +++ b/packages/react-workspace/react-client-app/tsconfig.json @@ -1,7 +1,17 @@ { - "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] + "compilerOptions": { + "declaration": true, + "esModuleInterop": true, + "moduleResolution": "bundler", + "noEmit": true, + "strict": true, + "experimentalDecorators": true, + "target": "ES2020", + "module": "ES2020", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "verbatimModuleSyntax": true, + "jsx": "react-jsx", + "incremental": true, + }, + "include": ["src"] } diff --git a/packages/react-workspace/react-client-app/tsconfig.legacy.json b/packages/react-workspace/react-client-app/tsconfig.legacy.json new file mode 100644 index 0000000000..9c8341db73 --- /dev/null +++ b/packages/react-workspace/react-client-app/tsconfig.legacy.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "moduleResolution": "node", + "incremental": false, + } +} diff --git a/packages/react-workspace/react-client-app/tsconfig.node.json b/packages/react-workspace/react-client-app/tsconfig.node.json deleted file mode 100644 index 9dedef6a40..0000000000 --- a/packages/react-workspace/react-client-app/tsconfig.node.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", - "target": "ES2022", - "lib": ["ES2023"], - "module": "ESNext", - "esModuleInterop": true, - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "moduleDetection": "force", - "noEmit": true, - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "incremental": true - }, - "include": ["vite.config.ts"] -} diff --git a/packages/react-workspace/react-client-app/vite.config.mjs b/packages/react-workspace/react-client-app/vite.config.mjs new file mode 100644 index 0000000000..6226785634 --- /dev/null +++ b/packages/react-workspace/react-client-app/vite.config.mjs @@ -0,0 +1,10 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; + +export default defineConfig({ + plugins: [react()], + base: './', + build: { + chunkSizeWarningLimit: 5 * 1024 * 1024 + } +}); diff --git a/packages/react-workspace/react-client-app/vite.config.ts b/packages/react-workspace/react-client-app/vite.config.ts deleted file mode 100644 index 0e0f738449..0000000000 --- a/packages/react-workspace/react-client-app/vite.config.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react-swc'; - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], - base: './', - resolve: { - alias: [ - { - find: '@ni/nimble-react/dist/esm', - replacement: '@ni/nimble-react/src' - }, - { - find: '@ni/spright-react/dist/esm', - replacement: '@ni/spright-react/src' - }, - { - find: '@ni/ok-react/dist/esm', - replacement: '@ni/ok-react/src' - }, - ] - }, - build: { - chunkSizeWarningLimit: 5 * 1024 * 1024 - } -}); diff --git a/packages/react-workspace/spright-react/eslint.config.mjs b/packages/react-workspace/spright-react/eslint.config.mjs index b37973743f..eabd8cb8df 100644 --- a/packages/react-workspace/spright-react/eslint.config.mjs +++ b/packages/react-workspace/spright-react/eslint.config.mjs @@ -1,17 +1,9 @@ import { defineConfig, globalIgnores } from 'eslint/config'; -import { lintNimbleConfig, javascriptNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble'; +import { lintNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble'; export default defineConfig([ globalIgnores(['**/dist/']), lintNimbleConfig, - { - files: ['**/*.js', '**/*.cjs'], - extends: javascriptNimbleConfig, - rules: { - // Configuration scripts will not be in published package and are allowed to use devDependencies - 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], - }, - }, { files: ['**/*.ts'], extends: typescriptNimbleConfig, diff --git a/packages/react-workspace/spright-react/package.json b/packages/react-workspace/spright-react/package.json index 13080e0132..992243ffc2 100644 --- a/packages/react-workspace/spright-react/package.json +++ b/packages/react-workspace/spright-react/package.json @@ -7,6 +7,21 @@ "spright", "react" ], + "type": "module", + "exports": { + "./package.json": "./package.json", + "./*": { + "types": "./dist/esm/*.d.ts", + "import": "./dist/esm/*/index.js" + } + }, + "typesVersions": { + "*": { + "*": [ + "dist/esm/*/index.d.ts" + ] + } + }, "scripts": { "build": "tsc -p ./tsconfig.json", "lint": "eslint .", diff --git a/packages/react-workspace/spright-react/src/utilities/react-wrapper/index.ts b/packages/react-workspace/spright-react/src/utilities/react-wrapper.ts similarity index 100% rename from packages/react-workspace/spright-react/src/utilities/react-wrapper/index.ts rename to packages/react-workspace/spright-react/src/utilities/react-wrapper.ts diff --git a/packages/react-workspace/spright-react/tsconfig.json b/packages/react-workspace/spright-react/tsconfig.json index 428c889a36..2d8a6fa0a0 100644 --- a/packages/react-workspace/spright-react/tsconfig.json +++ b/packages/react-workspace/spright-react/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "declaration": true, "esModuleInterop": true, - "moduleResolution": "node", + "moduleResolution": "bundler", "outDir": "dist/esm", "strict": true, "experimentalDecorators": true, diff --git a/packages/storybook/.storybook/blocks/README.md b/packages/storybook/.storybook/blocks/README.md index aeab465325..8e159c6d9b 100644 --- a/packages/storybook/.storybook/blocks/README.md +++ b/packages/storybook/.storybook/blocks/README.md @@ -53,7 +53,7 @@ This folder contains reusable React components used in Nimble component MDX docu Compose the components to create clear and attractive usage documentation. To use any Nimble components in MDX documentation, first import the Nimble React wrapper for the component. -E.g. `import { NimbleButton } from '@ni/nimble-react/dist/esm/button';` +E.g. `import { NimbleButton } from '@ni/nimble-react/button';` ```jsx diff --git a/packages/storybook/.storybook/blocks/StoryLayout.tsx b/packages/storybook/.storybook/blocks/StoryLayout.tsx index 648100c66c..ac08acd8cb 100644 --- a/packages/storybook/.storybook/blocks/StoryLayout.tsx +++ b/packages/storybook/.storybook/blocks/StoryLayout.tsx @@ -1,7 +1,7 @@ import React, { type ReactNode } from 'react'; import './story-layout.css'; -import { NimbleIconCheck } from '@ni/nimble-react/dist/esm/icons/check'; -import { NimbleIconExclamationMark } from '@ni/nimble-react/dist/esm/icons/exclamation-mark'; +import { NimbleIconCheck } from '@ni/nimble-react/icons/check'; +import { NimbleIconExclamationMark } from '@ni/nimble-react/icons/exclamation-mark'; interface ChildrenProp { children?: ReactNode; diff --git a/packages/storybook/.storybook/main.js b/packages/storybook/.storybook/main.js index 41b4f6145f..9cf50bf13a 100644 --- a/packages/storybook/.storybook/main.js +++ b/packages/storybook/.storybook/main.js @@ -31,6 +31,7 @@ export async function viteFinal(config) { // Support Chromatic Turbosnap in a monorepo // See: https://github.com/chromaui/chromatic-cli/issues/1149#issuecomment-2936493954 // Keep in sync with tsconfig.json + // To test changes check the built preview-stats.json file for .ts vs .js references of mapped paths config.resolve.alias = [ { find: '@ni/nimble-components/dist/esm', @@ -45,16 +46,20 @@ export async function viteFinal(config) { replacement: '@ni/ok-components/src' }, { - find: '@ni/nimble-react/dist/esm', - replacement: '@ni/nimble-react/src' + find: /^@ni\/nimble-react\/icons\/(.*)/, + replacement: `${getAbsolutePath('@ni/nimble-react')}/src/icons/$1.ts` }, { - find: '@ni/spright-react/dist/esm', - replacement: '@ni/spright-react/src' + find: /^@ni\/nimble-react\/(.*)/, + replacement: `${getAbsolutePath('@ni/nimble-react')}/src/$1/index.ts` }, { - find: '@ni/ok-react/dist/esm', - replacement: '@ni/ok-react/src' + find: /^@ni\/spright-react\/(.*)/, + replacement: `${getAbsolutePath('@ni/spright-react')}/src/$1/index.ts` + }, + { + find: /^@ni\/ok-react\/(.*)/, + replacement: `${getAbsolutePath('@ni/ok-react')}/src/$1/index.ts` }, ]; diff --git a/packages/storybook/package.json b/packages/storybook/package.json index b5d9e2631a..ff1a076a84 100644 --- a/packages/storybook/package.json +++ b/packages/storybook/package.json @@ -5,7 +5,9 @@ "type": "module", "description": "Storybook for the Nimble repo", "scripts": { - "build": "storybook build -o dist/storybook --webpack-stats-json", + "build": "npm run build:ts && npm run build:sb", + "build:ts": "tsc -b", + "build:sb": "storybook build -o dist/storybook --webpack-stats-json", "start": "storybook dev --quiet -p 6006", "launch-webkit": "playwright wk http://localhost:6006", "lint": "eslint .", diff --git a/packages/storybook/src/nimble/patterns/button/styling-docs.mdx b/packages/storybook/src/nimble/patterns/button/styling-docs.mdx index 1af334fea2..cdc55d676b 100644 --- a/packages/storybook/src/nimble/patterns/button/styling-docs.mdx +++ b/packages/storybook/src/nimble/patterns/button/styling-docs.mdx @@ -1,4 +1,4 @@ -import { NimbleIconKey } from '@ni/nimble-react/dist/esm/icons/key'; +import { NimbleIconKey } from '@ni/nimble-react/icons/key'; ### Appearances diff --git a/packages/storybook/src/nimble/table-column/mapping/table-column-mapping.mdx b/packages/storybook/src/nimble/table-column/mapping/table-column-mapping.mdx index e2d12b3520..28605760d3 100644 --- a/packages/storybook/src/nimble/table-column/mapping/table-column-mapping.mdx +++ b/packages/storybook/src/nimble/table-column/mapping/table-column-mapping.mdx @@ -15,13 +15,12 @@ import ComponentApisLink from '../../../docs/component-apis-link.mdx'; import TableColumnApisLink from '../../../docs/table-column-apis-link.mdx'; import { tableColumnMappingTag } from '@ni/nimble-components/dist/esm/table-column/mapping'; import { mappingEmptyTag } from '@ni/nimble-components/dist/esm/mapping/empty'; -import { spinnerTag } from '@ni/nimble-components/dist/esm/spinner'; import iconOnlyIconHeader from './images/icon-only-icon-header.png'; import iconOnlyTextHeader from './images/icon-only-text-header.png'; import iconOnlyPlusTextOnlyTextHeader from './images/icon-only-plus-text-only-text-header.png'; import iconTextTextHeader from './images/icon-text-text-header.png'; import textOnlyTextHeader from './images/text-only-text-header.png'; -import { NimbleSpinner } from '@ni/nimble-react/dist/esm/spinner'; +import { NimbleSpinner } from '@ni/nimble-react/spinner'; diff --git a/packages/storybook/src/spright/chat/conversation/chat-conversation.stories.ts b/packages/storybook/src/spright/chat/conversation/chat-conversation.stories.ts index 54c431f84c..7eca6ccccf 100644 --- a/packages/storybook/src/spright/chat/conversation/chat-conversation.stories.ts +++ b/packages/storybook/src/spright/chat/conversation/chat-conversation.stories.ts @@ -109,7 +109,7 @@ export const chatConversation: StoryObj<ChatConversationArgs> = { </${buttonTag}> </${chatMessageTag}> ${when(x => x.input, html<ChatConversationArgs, ChatInput>` - <${chatInputTag} slot='input' placeholder='Type a message' send-button-label='Send' ${ref('inputRef')} + <${chatInputTag} slot='input' placeholder='Type a message' send-button-label='Send' @send="${(x2, c2) => x2.sendMessage(c2.event as CustomEvent<ChatInputSendEventDetail>, x2.conversationRef)}" ></${chatInputTag}> `)} diff --git a/packages/storybook/tsconfig.json b/packages/storybook/tsconfig.json index c6662f0c9d..667a616274 100644 --- a/packages/storybook/tsconfig.json +++ b/packages/storybook/tsconfig.json @@ -3,7 +3,8 @@ "declaration": true, "esModuleInterop": true, "moduleResolution": "bundler", - "outDir": "dist/esm", + "incremental": true, + "noEmit": true, "strict": true, "experimentalDecorators": true, "target": "ES2020", @@ -33,19 +34,18 @@ // Support Chromatic Turbosnap in a monorepo // See: https://github.com/chromaui/chromatic-cli/issues/1149#issuecomment-2936493954 // Keep in sync with .storybook/main.js vite config + // To test changes check the built tsconfig.tsbuildinfo file for .ts vs .d.ts references of mapped paths "paths": { "@ni/nimble-components/dist/esm/*": ["../nimble-components/src/*"], - "@ni/spright-components/dist/esm/*": [ - "../spright-components/src/*" - ], + "@ni/spright-components/dist/esm/*": ["../spright-components/src/*"], "@ni/ok-components/dist/esm/*": ["../ok-components/src/*"], - "@ni/nimble-react/dist/esm/*": [ + "@ni/nimble-react/*": [ "../react-workspace/nimble-react/src/*" ], - "@ni/spright-react/dist/esm/*": [ + "@ni/spright-react/*": [ "../react-workspace/spright-react/src/*" ], - "@ni/ok-react/dist/esm/*": ["../react-workspace/ok-react/src/*"] + "@ni/ok-react/*": ["../react-workspace/ok-react/src/*"] } }, "include": ["src"]