Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
13b6f5a
chore: upgrade build toolchain - TypeScript 5.8, TSLint to ESLint, re…
rafarhat Apr 30, 2026
a8f1c26
chore: upgrade Electron from 22 to 41
rafarhat Apr 30, 2026
460f372
Upgrade React 16 to 18, react-router-dom v5 to v6, and fix dev server
rafarhat Apr 30, 2026
808f1de
Upgrade FluentUI, Azure SDKs, and remaining libraries
rafarhat Apr 30, 2026
db2d32f
Convert 26 files from string-based icon names to React icon component…
rafarhat May 1, 2026
d27ca21
fix: post-migration polish β€” accessibility, icon cleanup, and CSS sco…
rafarhat May 1, 2026
1bbd97c
fix: migrate SCSS from deprecated @import to @use/@forward
rafarhat May 1, 2026
6878f2c
refactor: migrate test suite from Enzyme to React Testing Library (Ph…
rafarhat May 1, 2026
da1b579
test: enhance RTL tests with meaningful assertions across 50 test files
rafarhat May 1, 2026
ebcdc32
Upgrade TypeScript 5.8 to 6.0.3, target ES2025, modern moduleResolution
rafarhat May 2, 2026
7606087
Upgrade to React 19 and react-toastify v11
rafarhat May 2, 2026
f5c969a
Fix SCSS webpack warnings in dev config
rafarhat May 2, 2026
2ff120d
Fix 'process is not defined' error in dev server
rafarhat May 2, 2026
b45d5e1
fix: resolve dependency conflicts for React 19 upgrade
rafarhat May 4, 2026
2a1e93a
fix: support national cloud endpoints in hostname validation (#728)
rafarhat May 4, 2026
2a9b857
fix: folder picker dialog displays folders one per line
rafarhat May 4, 2026
da36bc7
feat: re-add enqueue time filtering for event hub monitoring (#694)
rafarhat May 4, 2026
7f3664f
fix: use space-free executable name for Linux packaging (#706)
rafarhat May 4, 2026
937052d
fix: CommandBarV9 not passing submit type to ToolbarButton
rafarhat May 4, 2026
96d49df
fix: show light/dark label on theme toggle switch
rafarhat May 4, 2026
920b1b3
fix: collapsed nav shrinks to content width and align hamburger icon
rafarhat May 4, 2026
7f4b957
feat: default to OS theme preference on first launch (#667)
rafarhat May 4, 2026
2b33b7e
Add multi-tenant Azure AD support with tenant picker
rafarhat May 5, 2026
bced400
fix: resolve navigate-during-render and unblock external doc links
rafarhat May 5, 2026
7649eea
test: replace no-op toBeDefined() with toBeInTheDocument() across 105…
rafarhat May 5, 2026
52c0476
test: wrap async renders in act() to eliminate act() warnings across …
rafarhat May 5, 2026
7ecfa9e
refactor: rename iconNames.ts to commandBarItemKeys.ts and remove dea…
rafarhat May 5, 2026
9bad074
refactor: migrate ESLint to flat config and auto-fix curly violations
rafarhat May 5, 2026
41f8170
fix: initialize state with empty strings to prevent uncontrolled-to-c…
rafarhat May 6, 2026
9e8cfd5
fix: resolve all ESLint errors (radix, no-console, duplicate imports,…
rafarhat May 6, 2026
0787f47
fix: resolve all ESLint warnings (no-shadow, no-unused-vars, exhausti…
rafarhat May 6, 2026
137e209
fix: align hamburger menu icon on device detail page
rafarhat May 6, 2026
85ae65b
feat: enable freeform time input in start time picker
rafarhat May 15, 2026
181144d
ci: update to Node 24.x and add --legacy-peer-deps to npm ci
rafarhat May 15, 2026
71eecc1
ci: remove --detectOpenHandles from test script
rafarhat May 15, 2026
b12dd49
fix: address PR review comments and add TLS 1.3 hostname support
rafarhat Jun 3, 2026
f8c5821
chore: npm audit fix package-lock.json update
rafarhat Jun 3, 2026
ca82f6b
chore: npm audit fix with legacy peer deps
rafarhat Jun 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// This file has been replaced by eslint.config.mjs (flat config).
8 changes: 4 additions & 4 deletions .github/workflows/nodejs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,18 @@ jobs:

strategy:
matrix:
node-version: [18.x]
node-version: [24.x]
os: [ubuntu-latest, windows-latest, macOS-latest]

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Use Node ${{ matrix.node-version }}
uses: actions/setup-node@v1
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: npm install, build, and test
timeout-minutes: 15
run: |
npm ci
npm ci --legacy-peer-deps
npm run build --if-present
npm test
104 changes: 104 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
import globals from 'globals';
import tseslint from 'typescript-eslint';
import reactPlugin from 'eslint-plugin-react';
import reactHooksPlugin from 'eslint-plugin-react-hooks';

export default tseslint.config(
// Global ignores (replaces ignorePatterns)
{
ignores: [
'node_modules/',
'dist/',
'host/',
'coverage/',
'**/*.js',
'webpack.*.ts',
],
},

// Base ESLint recommended rules
...tseslint.configs.recommended,

// TypeScript + React files
{
files: ['**/*.{ts,tsx}'],
plugins: {
react: reactPlugin,
'react-hooks': reactHooksPlugin,
},
languageOptions: {
ecmaVersion: 2020,
sourceType: 'module',
globals: {
...globals.browser,
...globals.node,
...globals.es2020,
...globals.jest,
},
parserOptions: {
ecmaFeatures: { jsx: true },
},
},
settings: {
react: { version: 'detect' },
},
rules: {
// Core ESLint rules
'curly': 'error',
'eqeqeq': ['error', 'always'],
'no-bitwise': 'error',
'no-console': 'error',
'no-debugger': 'error',
'no-eval': 'error',
'no-duplicate-imports': 'error',
'no-sparse-arrays': 'error',
'no-var': 'error',
'prefer-const': 'error',
'prefer-object-spread': 'error',
'radix': 'error',
'use-isnan': 'error',
'no-new-wrappers': 'error',
'no-throw-literal': 'off',
'no-empty': 'error',
'no-fallthrough': 'error',
'no-unsafe-finally': 'error',

// TypeScript rules
'@typescript-eslint/only-throw-error': 'off',
'@typescript-eslint/adjacent-overload-signatures': 'error',
'@typescript-eslint/no-restricted-types': 'error',
'@typescript-eslint/no-empty-object-type': ['error', { allowInterfaces: 'always', allowObjectTypes: 'always' }],
'@typescript-eslint/no-misused-new': 'error',
'@typescript-eslint/no-namespace': 'error',
'@typescript-eslint/no-require-imports': 'off',
'@typescript-eslint/prefer-for-of': 'warn',
'@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-inferrable-types': 'off',
'@typescript-eslint/explicit-member-accessibility': ['warn', {
accessibility: 'explicit',
overrides: { constructors: 'no-public' },
}],

// React rules
'react/jsx-key': 'error',
'react/jsx-no-bind': 'off',
'react/no-string-refs': 'error',
'react/self-closing-comp': 'error',
'react/prop-types': 'off',
'react/display-name': 'off',
'react/no-unescaped-entities': 'off',

// React Hooks rules
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'warn',

// Shadow and return-await
'no-shadow': 'off',
'@typescript-eslint/no-shadow': 'warn',
// return-await requires type-aware linting; disabled for now
'no-return-await': 'off',
'@typescript-eslint/return-await': 'off',
},
},
);
8 changes: 8 additions & 0 deletions images.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,12 @@ declare module "*.svg" {
declare module "*.png" {
const value: any;
export default value;
}
declare module "*.scss" {
const content: any;
export default content;
}
declare module "*.css" {
const content: any;
export default content;
}
24 changes: 14 additions & 10 deletions jestSetup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,23 @@
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License
**********************************************************/
import { setIconOptions } from '@fluentui/react';
import * as Enzyme from 'enzyme';
import * as Adapter from 'enzyme-adapter-react-16';

// react-router-dom v7 requires TextEncoder/TextDecoder in jsdom
const { TextEncoder, TextDecoder } = require('util');
global.TextEncoder = global.TextEncoder || TextEncoder;
global.TextDecoder = global.TextDecoder || TextDecoder;

// FluentUI v9 components use ResizeObserver, which jsdom doesn't provide
global.ResizeObserver = class ResizeObserver {
observe() {}
unobserve() {}
disconnect() {}
} as any;

// tslint:disable-next-line: no-string-literal
global.Headers = jest.fn();
window.fetch = jest.fn();

// suppress icon warnings.
setIconOptions({
disableWarnings: true,
});

Enzyme.configure({ adapter: new Adapter() });
document.execCommand = jest.fn(); // maskedCopyableTextField

// fix for smooth-dnd invocation error in test
Expand All @@ -24,7 +27,8 @@ Object.defineProperty(global, 'Node', {
});

jest.mock('react-i18next', () => ({
useTranslation: () => ({t: key => key})
useTranslation: () => ({t: key => key}),
Trans: ({ children }) => children
}));

jest.mock('./src/appConfig/appConfig', () => ({
Expand Down
Loading
Loading