1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-28 17:55:15 +02:00

feat: Unleash v7 ESM migration (#9877)

We're migrating to ESM, which will allow us to import the latest
versions of our dependencies.

Co-Authored-By: Christopher Kolstad <chriswk@getunleash.io>
This commit is contained in:
Gastón Fournier 2025-05-14 09:47:12 +02:00 committed by GitHub
parent c358a8ffd3
commit abe160eb7d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2484 changed files with 15366 additions and 13719 deletions

View File

@ -1,11 +1,13 @@
const fs = require('fs');
const path = require('path');
const directoryPath = path.join(`${__dirname}/..`, 'src/lib/openapi/spec');
const indexPath = path.join(directoryPath, 'index.ts');
import { readdir, writeFileSync } from 'node:fs';
import { join, basename, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const directoryPath = join(`${__dirname}/..`, 'src/lib/openapi/spec');
const indexPath = join(directoryPath, 'index.ts');
// Read files from the directory
fs.readdir(directoryPath, (err, files) => {
readdir(directoryPath, (err, files) => {
if (err) {
console.error('Could not list the directory.', err);
process.exit(1);
@ -13,16 +15,16 @@ fs.readdir(directoryPath, (err, files) => {
const exports = files
.filter((file) => file.includes('schema.ts')) // Filter files by 'schema.ts'
.map((file) => `export * from './${file.replace('.ts', '')}';`) // Create export statements
.map((file) => `export * from './${file.replace('.ts', '.js')}';`) // Create export statements
.join('\n');
// Append export statements to index.ts
const script = path.basename(__filename);
const script = basename(__filename);
const message = `/**
* Auto-generated file by ${script}. Do not edit.
* To run it manually execute \`yarn schema:update\` or \`node ${path.basename(__dirname)}/${script}\`
* To run it manually execute \`yarn schema:update\` or \`node ${basename(__dirname)}/${script}\`
*/\n`;
fs.writeFileSync(indexPath, `${message}${exports}\n${message}`, (err) => {
writeFileSync(indexPath, `${message}${exports}\n${message}`, (err) => {
if (err) {
console.error('Could not append to file.', err);
process.exit(1);

2
.nvmrc
View File

@ -1 +1 @@
20
22

File diff suppressed because one or more lines are too long

948
.yarn/releases/yarn-4.9.1.cjs vendored Executable file

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,3 @@
nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-4.7.0.cjs
yarnPath: .yarn/releases/yarn-4.9.1.cjs

View File

@ -12,7 +12,22 @@
"useExhaustiveDependencies": "off",
"noUnusedImports": "warn",
"useJsxKeyInIterable": "off",
"useHookAtTopLevel": "error"
"useHookAtTopLevel": "error",
"useImportExtensions": {
"level": "error",
"options": {
"suggestedExtensions": {
"ts": {
"module": "js",
"component": "jsx"
},
"tsx": {
"module": "js",
"component": "tsx"
}
}
}
}
},
"complexity": {
"noBannedTypes": "off",
@ -52,6 +67,7 @@
"website/build",
"website/docs/generated",
"website/global.js",
"website",
"setupJest.js",
"dist",
"build",

File diff suppressed because one or more lines are too long

948
frontend/.yarn/releases/yarn-4.9.1.cjs vendored Executable file

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,3 @@
nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-4.7.0.cjs
yarnPath: .yarn/releases/yarn-4.9.1.cjs

View File

@ -13,7 +13,7 @@ export default defineConfig({
on(
'file:preprocessor',
vitePreprocessor({
configFile: path.resolve(__dirname, './vite.config.mts'),
configFile: path.resolve('./vite.config.mts'),
mode: 'development',
}),
);

View File

@ -1,5 +1,5 @@
///<reference path="../../global.d.ts" />
import { TOPICS } from '../../../src/component/demo/demo-topics';
import { TOPICS } from '../../../src/component/demo/demo-topics.js';
describe('demo', () => {
const baseUrl = Cypress.config().baseUrl;

View File

@ -9,7 +9,7 @@ import {
PA_USERS_GROUPS_ID,
PA_USERS_GROUPS_TITLE_ID,
//@ts-ignore
} from '../../../src/utils/testIds';
} from '../../../src/utils/testIds.js';
describe('project-access', () => {
const baseUrl = Cypress.config().baseUrl;

View File

@ -13,8 +13,7 @@ import {
addUserIdStrategyToFeature_UI,
updateFlexibleRolloutStrategy_UI,
do_login,
//@ts-ignore
} from './UI';
} from './UI.ts';
import {
addUserToProject_API,
createFeature_API,
@ -24,8 +23,7 @@ import {
deleteProject_API,
updateUserPassword_API,
createEnvironment_API,
//@ts-ignore
} from './API';
} from './API.ts';
Cypress.on('window:before:load', (window) => {
Object.defineProperty(window.navigator, 'language', { value: 'en' });

View File

@ -14,7 +14,7 @@
// ***********************************************************
// Import commands.js using ES2015 syntax:
import './commands';
import './commands.js';
// Alternatively you can use CommonJS syntax:
// require('./commands')

View File

@ -15,7 +15,7 @@
// Import commands.js using ES2015 syntax:
// @ts-ignore
import './commands';
import './commands.js';
// Alternatively you can use CommonJS syntax:
// require('./commands')

View File

@ -1,9 +1,10 @@
require('pkginfo')(module, 'version');
const path = require('path');
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const dirname = path.dirname(fileURLToPath(import.meta.url));
const { version } = module.exports;
module.exports = {
publicFolder: path.join(__dirname, 'build'),
publicFolder: path.join(dirname, 'build'),
version,
};

2
frontend/mise.toml Normal file
View File

@ -0,0 +1,2 @@
[tools]
node = "22"

View File

@ -9,6 +9,7 @@
"engines": {
"node": ">=18"
},
"type": "module",
"scripts": {
"build": "yarn run lint:material:icons && vite build",
"dev": "vite",
@ -156,7 +157,7 @@
"last 1 safari version"
]
},
"packageManager": "yarn@4.7.0",
"packageManager": "yarn@4.9.1",
"dependencies": {
"json-2-csv": "^5.5.5"
}

View File

@ -14,16 +14,16 @@ import { useAuthUser } from 'hooks/api/getters/useAuth/useAuthUser';
import { SplashPageRedirect } from 'component/splash/SplashPageRedirect/SplashPageRedirect';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import MaintenanceBanner from './maintenance/MaintenanceBanner';
import MaintenanceBanner from './maintenance/MaintenanceBanner.tsx';
import { styled } from '@mui/material';
import { InitialRedirect, useLastViewedPage } from './InitialRedirect';
import { InternalBanners } from './banners/internalBanners/InternalBanners';
import { ExternalBanners } from './banners/externalBanners/ExternalBanners';
import { LicenseBanner } from './banners/internalBanners/LicenseBanner';
import { Demo } from './demo/Demo';
import { LoginRedirect } from './common/LoginRedirect/LoginRedirect';
import { SecurityBanner } from './banners/internalBanners/SecurityBanner';
import { MonthsOldVersionBanner } from './banners/internalBanners/MonthsOldVersionBanner';
import { InitialRedirect, useLastViewedPage } from './InitialRedirect.tsx';
import { InternalBanners } from './banners/internalBanners/InternalBanners.tsx';
import { ExternalBanners } from './banners/externalBanners/ExternalBanners.tsx';
import { LicenseBanner } from './banners/internalBanners/LicenseBanner.tsx';
import { Demo } from './demo/Demo.tsx';
import { LoginRedirect } from './common/LoginRedirect/LoginRedirect.tsx';
import { SecurityBanner } from './banners/internalBanners/SecurityBanner.tsx';
import { MonthsOldVersionBanner } from './banners/internalBanners/MonthsOldVersionBanner.tsx';
const StyledContainer = styled('div')(() => ({
'& ul': {

View File

@ -2,7 +2,7 @@ import { useEffect } from 'react';
import { type Location, Navigate } from 'react-router-dom';
import useProjects from 'hooks/api/getters/useProjects/useProjects';
import { useLastViewedProject } from 'hooks/useLastViewedProject';
import Loader from './common/Loader/Loader';
import Loader from './common/Loader/Loader.tsx';
import { useLocalStorageState } from 'hooks/useLocalStorageState';
import { useAuthUser } from 'hooks/api/getters/useAuth/useAuthUser';

View File

@ -1,24 +1,24 @@
import { Routes, Route } from 'react-router-dom';
import { ApiTokenPage } from './apiToken/ApiTokenPage/ApiTokenPage';
import { CreateApiToken } from './apiToken/CreateApiToken/CreateApiToken';
import { AuthSettings } from './auth/AuthSettings';
import { Billing } from './billing/Billing';
import FlaggedBillingRedirect from './billing/FlaggedBillingRedirect/FlaggedBillingRedirect';
import { CorsAdmin } from './cors';
import { GroupsAdmin } from './groups/GroupsAdmin';
import { InstanceAdmin } from './instance-admin/InstanceAdmin';
import { InstancePrivacy } from './instance-privacy/InstancePrivacy';
import { MaintenanceAdmin } from './maintenance';
import { Network } from './network/Network';
import { Roles } from './roles/Roles';
import { ServiceAccounts } from './serviceAccounts/ServiceAccounts';
import CreateUser from './users/CreateUser/CreateUser';
import { InviteLink } from './users/InviteLink/InviteLink';
import UsersAdmin from './users/UsersAdmin';
import { ApiTokenPage } from './apiToken/ApiTokenPage/ApiTokenPage.tsx';
import { CreateApiToken } from './apiToken/CreateApiToken/CreateApiToken.tsx';
import { AuthSettings } from './auth/AuthSettings.tsx';
import { Billing } from './billing/Billing.tsx';
import FlaggedBillingRedirect from './billing/FlaggedBillingRedirect/FlaggedBillingRedirect.tsx';
import { CorsAdmin } from './cors/index.js';
import { GroupsAdmin } from './groups/GroupsAdmin.tsx';
import { InstanceAdmin } from './instance-admin/InstanceAdmin.tsx';
import { InstancePrivacy } from './instance-privacy/InstancePrivacy.tsx';
import { MaintenanceAdmin } from './maintenance/index.js';
import { Network } from './network/Network.tsx';
import { Roles } from './roles/Roles.tsx';
import { ServiceAccounts } from './serviceAccounts/ServiceAccounts.tsx';
import CreateUser from './users/CreateUser/CreateUser.tsx';
import { InviteLink } from './users/InviteLink/InviteLink.tsx';
import UsersAdmin from './users/UsersAdmin.tsx';
import NotFound from 'component/common/NotFound/NotFound';
import { Banners } from './banners/Banners';
import { License } from './license/License';
import { AdminHome } from './AdminHome';
import { Banners } from './banners/Banners.tsx';
import { License } from './license/License.tsx';
import { AdminHome } from './AdminHome.tsx';
export const Admin = () => {
return (

View File

@ -1,3 +1,3 @@
import { lazy } from 'react';
export const LazyAdmin = lazy(() => import('./LazyAdminExport'));
export const LazyAdmin = lazy(() => import('./LazyAdminExport.tsx'));

View File

@ -2,6 +2,6 @@
// that says we should only use named exports, because
// it makes it harder to diverge from the name of the component when
// importing it in other files.
import { Admin } from './Admin';
import { Admin } from './Admin.tsx';
export default Admin;

View File

@ -1,6 +1,6 @@
import { Box, Button, styled } from '@mui/material';
import Input from '../../../common/Input/Input';
import GeneralSelect from '../../../common/GeneralSelect/GeneralSelect';
import Input from '../../../common/Input/Input.tsx';
import GeneralSelect from '../../../common/GeneralSelect/GeneralSelect.tsx';
export const StyledContainer = styled('div')(() => ({
maxWidth: '400px',

View File

@ -1,4 +1,4 @@
import { TokenType } from '../../../../../interfaces/token';
import { TokenType } from '../../../../../interfaces/token.ts';
import KeyboardArrowDownOutlined from '@mui/icons-material/KeyboardArrowDownOutlined';
import type React from 'react';
import {

View File

@ -1,9 +1,9 @@
import { SelectProjectInput } from './SelectProjectInput/SelectProjectInput';
import { TokenType } from '../../../../../interfaces/token';
import { SelectProjectInput } from './SelectProjectInput/SelectProjectInput.tsx';
import { TokenType } from '../../../../../interfaces/token.ts';
import type React from 'react';
import { StyledInputDescription } from '../ApiTokenForm.styles';
import useProjects from 'hooks/api/getters/useProjects/useProjects';
import type { ApiTokenFormErrorType } from '../useApiTokenForm';
import type { ApiTokenFormErrorType } from '../useApiTokenForm.ts';
import { useOptionalPathParam } from 'hooks/useOptionalPathParam';
interface IProjectSelectorProps {

View File

@ -5,7 +5,7 @@ import { render } from 'utils/testRenderer';
import {
type ISelectProjectInputProps,
SelectProjectInput,
} from './SelectProjectInput';
} from './SelectProjectInput.tsx';
import { testServerRoute, testServerSetup } from 'utils/testServer';
const onChange = vi.fn();

View File

@ -19,7 +19,7 @@ import type {
import CheckBoxOutlineBlankIcon from '@mui/icons-material/CheckBoxOutlineBlank';
import CheckBoxIcon from '@mui/icons-material/CheckBox';
import type { IAutocompleteBoxOption } from 'component/common/AutocompleteBox/AutocompleteBox';
import { SelectAllButton } from './SelectAllButton/SelectAllButton';
import { SelectAllButton } from './SelectAllButton/SelectAllButton.tsx';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
const ALL_PROJECTS = '*';

View File

@ -1,6 +1,6 @@
import type React from 'react';
import { StyledInput, StyledInputDescription } from '../ApiTokenForm.styles';
import type { ApiTokenFormErrorType } from '../useApiTokenForm';
import type { ApiTokenFormErrorType } from '../useApiTokenForm.ts';
interface ITokenInfoProps {
tokenName: string;

View File

@ -8,7 +8,7 @@ import {
CREATE_PROJECT_API_TOKEN,
} from '@server/types/permissions';
import { useHasRootAccess } from 'hooks/useHasAccess';
import type { SelectOption } from './TokenTypeSelector/TokenTypeSelector';
import type { SelectOption } from './TokenTypeSelector/TokenTypeSelector.jsx';
export type ApiTokenFormErrorType = 'tokenName' | 'projects';
export const useApiTokenForm = (project?: string) => {

View File

@ -1,7 +1,7 @@
import { render } from 'utils/testRenderer';
import { screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { ApiTokenIcon, isOrphanedToken } from './ApiTokenIcon';
import { ApiTokenIcon, isOrphanedToken } from './ApiTokenIcon.tsx';
describe('isOrphanedToken', () => {
it('should be true for wildcard tokens with secret indicating it is orphaned', () => {

View File

@ -1,7 +1,7 @@
import { Alert, Typography } from '@mui/material';
import { Link } from 'react-router-dom';
import { Dialogue } from 'component/common/Dialogue/Dialogue';
import { UserToken } from './UserToken/UserToken';
import { UserToken } from './UserToken/UserToken.tsx';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { TokenType } from 'interfaces/token';

View File

@ -1,7 +1,7 @@
import { render } from 'utils/testRenderer';
import { screen, waitFor } from '@testing-library/react';
import { testServerRoute, testServerSetup } from 'utils/testServer';
import { CreateApiToken } from './CreateApiToken';
import { CreateApiToken } from './CreateApiToken.tsx';
import {
ADMIN,
CREATE_CLIENT_API_TOKEN,

View File

@ -2,22 +2,22 @@ import { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { styled } from '@mui/material';
import FormTemplate from 'component/common/FormTemplate/FormTemplate';
import ApiTokenForm from '../ApiTokenForm/ApiTokenForm';
import ApiTokenForm from '../ApiTokenForm/ApiTokenForm.tsx';
import { CreateButton } from 'component/common/CreateButton/CreateButton';
import useApiTokensApi from 'hooks/api/actions/useApiTokensApi/useApiTokensApi';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import useToast from 'hooks/useToast';
import { useApiTokenForm } from 'component/admin/apiToken/ApiTokenForm/useApiTokenForm';
import { ConfirmToken } from '../ConfirmToken/ConfirmToken';
import { ConfirmToken } from '../ConfirmToken/ConfirmToken.tsx';
import { scrollToTop } from 'component/common/util';
import { formatUnknownError } from 'utils/formatUnknownError';
import { usePageTitle } from 'hooks/usePageTitle';
import { GO_BACK } from 'constants/navigate';
import { useApiTokens } from 'hooks/api/getters/useApiTokens/useApiTokens';
import { TokenInfo } from '../ApiTokenForm/TokenInfo/TokenInfo';
import { TokenTypeSelector } from '../ApiTokenForm/TokenTypeSelector/TokenTypeSelector';
import { ProjectSelector } from '../ApiTokenForm/ProjectSelector/ProjectSelector';
import { EnvironmentSelector } from '../ApiTokenForm/EnvironmentSelector/EnvironmentSelector';
import { TokenInfo } from '../ApiTokenForm/TokenInfo/TokenInfo.tsx';
import { TokenTypeSelector } from '../ApiTokenForm/TokenTypeSelector/TokenTypeSelector.tsx';
import { ProjectSelector } from '../ApiTokenForm/ProjectSelector/ProjectSelector.tsx';
import { EnvironmentSelector } from '../ApiTokenForm/EnvironmentSelector/EnvironmentSelector.tsx';
import {
ADMIN,
CREATE_CLIENT_API_TOKEN,

View File

@ -1,6 +1,6 @@
import { render } from 'utils/testRenderer';
import { screen } from '@testing-library/react';
import { ProjectsList } from './ProjectsList';
import { ProjectsList } from './ProjectsList.tsx';
describe('ProjectsList', () => {
it('should prioritize new "projects" array over deprecated "project"', async () => {

View File

@ -1,11 +1,11 @@
import {} from '@mui/material';
import { PageContent } from 'component/common/PageContent/PageContent';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { OidcAuth } from './OidcAuth/OidcAuth';
import { SamlAuth } from './SamlAuth/SamlAuth';
import { ScimSettings } from './ScimSettings/ScimSettings';
import { PasswordAuth } from './PasswordAuth/PasswordAuth';
import { GoogleAuth } from './GoogleAuth/GoogleAuth';
import { OidcAuth } from './OidcAuth/OidcAuth.tsx';
import { SamlAuth } from './SamlAuth/SamlAuth.tsx';
import { ScimSettings } from './ScimSettings/ScimSettings.tsx';
import { PasswordAuth } from './PasswordAuth/PasswordAuth.tsx';
import { GoogleAuth } from './GoogleAuth/GoogleAuth.tsx';
import { PermissionGuard } from 'component/common/PermissionGuard/PermissionGuard';
import { ADMIN, UPDATE_AUTH_CONFIGURATION } from '@server/types/permissions';
import { PremiumFeature } from 'component/common/PremiumFeature/PremiumFeature';

View File

@ -12,14 +12,14 @@ import {
TextField,
} from '@mui/material';
import { Alert } from '@mui/material';
import { AutoCreateForm } from '../AutoCreateForm/AutoCreateForm';
import { AutoCreateForm } from '../AutoCreateForm/AutoCreateForm.tsx';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import useAuthSettingsApi from 'hooks/api/actions/useAuthSettingsApi/useAuthSettingsApi';
import useAuthSettings from 'hooks/api/getters/useAuthSettings/useAuthSettings';
import useToast from 'hooks/useToast';
import { formatUnknownError } from 'utils/formatUnknownError';
import { removeEmptyStringFields } from 'utils/removeEmptyStringFields';
import { SsoGroupSettings } from '../SsoGroupSettings';
import { SsoGroupSettings } from '../SsoGroupSettings.tsx';
import type { IRole } from 'interfaces/role';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';

View File

@ -11,7 +11,7 @@ import { formatUnknownError } from 'utils/formatUnknownError';
import { useAdminCount } from 'hooks/api/getters/useAdminCount/useAdminCount';
import { Link } from 'react-router-dom';
import { useApiTokens } from 'hooks/api/getters/useApiTokens/useApiTokens';
import { PasswordAuthDialog } from './PasswordAuthDialog';
import { PasswordAuthDialog } from './PasswordAuthDialog.tsx';
export const PasswordAuth = () => {
const { setToastData, setToastApiError } = useToast();

View File

@ -8,14 +8,14 @@ import {
TextField,
} from '@mui/material';
import { Alert } from '@mui/material';
import { AutoCreateForm } from '../AutoCreateForm/AutoCreateForm';
import { AutoCreateForm } from '../AutoCreateForm/AutoCreateForm.tsx';
import useToast from 'hooks/useToast';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import useAuthSettings from 'hooks/api/getters/useAuthSettings/useAuthSettings';
import useAuthSettingsApi from 'hooks/api/actions/useAuthSettingsApi/useAuthSettingsApi';
import { formatUnknownError } from 'utils/formatUnknownError';
import { removeEmptyStringFields } from 'utils/removeEmptyStringFields';
import { SsoGroupSettings } from '../SsoGroupSettings';
import { SsoGroupSettings } from '../SsoGroupSettings.tsx';
import type { IRole } from 'interfaces/role';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';

View File

@ -1,15 +1,15 @@
import { Button, FormControlLabel, Grid, Switch, styled } from '@mui/material';
import { Alert } from '@mui/material';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { ScimTokenGenerationDialog } from './ScimTokenGenerationDialog';
import { ScimTokenDialog } from './ScimTokenDialog';
import { ScimTokenGenerationDialog } from './ScimTokenGenerationDialog.tsx';
import { ScimTokenDialog } from './ScimTokenDialog.tsx';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { useEffect, useState } from 'react';
import { formatUnknownError } from 'utils/formatUnknownError';
import useToast from 'hooks/useToast';
import { useScimSettingsApi } from 'hooks/api/actions/useScimSettingsApi/useScimSettingsApi';
import { useScimSettings } from 'hooks/api/getters/useScimSettings/useScimSettings';
import { ScimDeleteEntityDialog } from './ScimDeleteUsersDialog';
import { ScimDeleteEntityDialog } from './ScimDeleteUsersDialog.tsx';
import useAdminUsersApi from 'hooks/api/actions/useAdminUsersApi/useAdminUsersApi';
import { useGroupApi } from 'hooks/api/actions/useGroupApi/useGroupApi';

View File

@ -11,7 +11,7 @@ import {
type AddOrUpdateBanner,
useBannersApi,
} from 'hooks/api/actions/useBannersApi/useBannersApi';
import { BannerForm } from './BannerForm';
import { BannerForm } from './BannerForm.tsx';
const StyledForm = styled('form')(() => ({
display: 'flex',

View File

@ -2,7 +2,7 @@ import { ADMIN } from 'component/providers/AccessProvider/permissions';
import { PermissionGuard } from 'component/common/PermissionGuard/PermissionGuard';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { PremiumFeature } from 'component/common/PremiumFeature/PremiumFeature';
import { BannersTable } from './BannersTable/BannersTable';
import { BannersTable } from './BannersTable/BannersTable.tsx';
import { UPDATE_INSTANCE_BANNERS } from '@server/types/permissions';
export const Banners = () => {

View File

@ -19,10 +19,10 @@ import { useBanners } from 'hooks/api/getters/useBanners/useBanners';
import { useBannersApi } from 'hooks/api/actions/useBannersApi/useBannersApi';
import type { IInternalBanner } from 'interfaces/banner';
import { Banner } from 'component/banners/Banner/Banner';
import { BannersActionsCell } from './BannersActionsCell';
import { BannerDeleteDialog } from './BannerDeleteDialog';
import { BannersActionsCell } from './BannersActionsCell.tsx';
import { BannerDeleteDialog } from './BannerDeleteDialog.tsx';
import { ToggleCell } from 'component/common/Table/cells/ToggleCell/ToggleCell';
import { BannerModal } from '../BannerModal/BannerModal';
import { BannerModal } from '../BannerModal/BannerModal.tsx';
export const BannersTable = () => {
const { setToastData, setToastApiError } = useToast();

View File

@ -5,8 +5,8 @@ import { ConditionallyRender } from 'component/common/ConditionallyRender/Condit
import { PermissionGuard } from 'component/common/PermissionGuard/PermissionGuard';
import { useInstanceStatus } from 'hooks/api/getters/useInstanceStatus/useInstanceStatus';
import { Alert } from '@mui/material';
import { BillingDashboard } from './BillingDashboard/BillingDashboard';
import { BillingHistory } from './BillingHistory/BillingHistory';
import { BillingDashboard } from './BillingDashboard/BillingDashboard.tsx';
import { BillingHistory } from './BillingHistory/BillingHistory.tsx';
import useInvoices from 'hooks/api/getters/useInvoices/useInvoices';
export const Billing = () => {

View File

@ -1,6 +1,6 @@
import { Grid } from '@mui/material';
import { BillingInformation } from './BillingInformation/BillingInformation';
import { BillingPlan } from './BillingPlan/BillingPlan';
import { BillingInformation } from './BillingInformation/BillingInformation.tsx';
import { BillingPlan } from './BillingPlan/BillingPlan.tsx';
export const BillingDashboard = () => {
return (

View File

@ -1,5 +1,5 @@
import { Alert, Divider, Grid, styled, Typography } from '@mui/material';
import { BillingInformationButton } from './BillingInformationButton/BillingInformationButton';
import { BillingInformationButton } from './BillingInformationButton/BillingInformationButton.tsx';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { InstanceState } from 'interfaces/instance';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';

View File

@ -1,7 +1,7 @@
import { type IInstanceStatus, InstancePlan } from 'interfaces/instance';
import { BillingDetailsPro } from './BillingDetailsPro';
import { BillingDetailsPAYG } from './BillingDetailsPAYG';
import { BillingDetailsEnterpriseConsumption } from './BillingDetailsEnterpriseConsumption';
import { BillingDetailsPro } from './BillingDetailsPro.tsx';
import { BillingDetailsPAYG } from './BillingDetailsPAYG.tsx';
import { BillingDetailsEnterpriseConsumption } from './BillingDetailsEnterpriseConsumption.tsx';
interface IBillingDetailsProps {
instanceStatus: IInstanceStatus;

View File

@ -2,7 +2,7 @@ import { Link } from 'react-router-dom';
import { Divider, Grid, styled, Typography } from '@mui/material';
import { GridRow } from 'component/common/GridRow/GridRow';
import { GridCol } from 'component/common/GridCol/GridCol';
import { GridColLink } from './GridColLink/GridColLink';
import { GridColLink } from './GridColLink/GridColLink.tsx';
import type { IInstanceStatus } from 'interfaces/instance';
import { useUsers } from 'hooks/api/getters/useUsers/useUsers';
import {
@ -10,9 +10,9 @@ import {
BILLING_PAYG_DEFAULT_MINIMUM_SEATS,
BILLING_PAYG_SEAT_PRICE,
BILLING_TRAFFIC_PRICE,
} from './BillingPlan';
} from './BillingPlan.tsx';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { useOverageCost } from './useOverageCost';
import { useOverageCost } from './useOverageCost.ts';
const StyledInfoLabel = styled(Typography)(({ theme }) => ({
fontSize: theme.fontSizes.smallBody,

View File

@ -3,7 +3,7 @@ import { Divider, Grid, styled, Typography } from '@mui/material';
import CheckIcon from '@mui/icons-material/Check';
import { GridRow } from 'component/common/GridRow/GridRow';
import { GridCol } from 'component/common/GridCol/GridCol';
import { GridColLink } from './GridColLink/GridColLink';
import { GridColLink } from './GridColLink/GridColLink.tsx';
import type { IInstanceStatus } from 'interfaces/instance';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { useUsers } from 'hooks/api/getters/useUsers/useUsers';
@ -13,8 +13,8 @@ import {
BILLING_PRO_BASE_PRICE,
BILLING_PRO_SEAT_PRICE,
BILLING_TRAFFIC_PRICE,
} from './BillingPlan';
import { useOverageCost } from './useOverageCost';
} from './BillingPlan.tsx';
import { useOverageCost } from './useOverageCost.ts';
const StyledInfoLabel = styled(Typography)(({ theme }) => ({
fontSize: theme.fontSizes.smallBody,

View File

@ -6,7 +6,7 @@ import { trialHasExpired, isTrialInstance } from 'utils/instanceTrial';
import { GridRow } from 'component/common/GridRow/GridRow';
import { GridCol } from 'component/common/GridCol/GridCol';
import { Badge } from 'component/common/Badge/Badge';
import { BillingDetails } from './BillingDetails';
import { BillingDetails } from './BillingDetails.tsx';
import { useInstanceStatus } from 'hooks/api/getters/useInstanceStatus/useInstanceStatus';
export const BILLING_PRO_BASE_PRICE = 80;

View File

@ -5,7 +5,7 @@ import {
calculateOverageCost,
calculateTotalUsage,
} from 'utils/traffic-calculations';
import { BILLING_TRAFFIC_PRICE } from './BillingPlan';
import { BILLING_TRAFFIC_PRICE } from './BillingPlan.jsx';
import { useInstanceStatus } from 'hooks/api/getters/useInstanceStatus/useInstanceStatus';
export const useOverageCost = (includedTraffic: number) => {

View File

@ -1,4 +1,4 @@
import { filterRoutesByPlanData } from './filterRoutesByPlanData';
import { filterRoutesByPlanData } from './filterRoutesByPlanData.js';
describe('filterRoutesByPlanData - open souce routes', () => {
test('open source - should show menu item if mode paid plan mode is not defined', () => {

View File

@ -1,7 +1,7 @@
import FormTemplate from 'component/common/FormTemplate/FormTemplate';
import { useNavigate } from 'react-router-dom';
import { GroupForm } from '../GroupForm/GroupForm';
import { useGroupForm } from '../hooks/useGroupForm';
import { GroupForm } from '../GroupForm/GroupForm.tsx';
import { useGroupForm } from '../hooks/useGroupForm.ts';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import useToast from 'hooks/useToast';
import { useGroupApi } from 'hooks/api/actions/useGroupApi/useGroupApi';

View File

@ -1,7 +1,7 @@
import FormTemplate from 'component/common/FormTemplate/FormTemplate';
import { useNavigate } from 'react-router-dom';
import { GroupForm } from '../GroupForm/GroupForm';
import { useGroupForm } from '../hooks/useGroupForm';
import { GroupForm } from '../GroupForm/GroupForm.tsx';
import { useGroupForm } from '../hooks/useGroupForm.ts';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import useToast from 'hooks/useToast';
import { useGroupApi } from 'hooks/api/actions/useGroupApi/useGroupApi';
@ -14,7 +14,7 @@ import { UG_SAVE_BTN_ID } from 'utils/testIds';
import { GO_BACK } from 'constants/navigate';
import { useGroups } from 'hooks/api/getters/useGroups/useGroups';
import type { IGroup } from 'interfaces/group';
import { scimGroupTooltip } from '../group-constants';
import { scimGroupTooltip } from '../group-constants.ts';
import { useScimSettings } from 'hooks/api/getters/useScimSettings/useScimSettings';
export const EditGroupContainer = () => {

View File

@ -31,8 +31,8 @@ import { MainHeader } from 'component/common/MainHeader/MainHeader';
import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
import { RemoveGroup } from 'component/admin/groups/RemoveGroup/RemoveGroup';
import { ActionCell } from 'component/common/Table/cells/ActionCell/ActionCell';
import { EditGroupUsers } from './EditGroupUsers/EditGroupUsers';
import { RemoveGroupUser } from './RemoveGroupUser/RemoveGroupUser';
import { EditGroupUsers } from './EditGroupUsers/EditGroupUsers.tsx';
import { RemoveGroupUser } from './RemoveGroupUser/RemoveGroupUser.tsx';
import { UserAvatar } from 'component/common/UserAvatar/UserAvatar';
import ResponsiveButton from 'component/common/ResponsiveButton/ResponsiveButton';
import {
@ -42,7 +42,7 @@ import {
UG_REMOVE_USER_BTN_ID,
} from 'utils/testIds';
import { useScimSettings } from 'hooks/api/getters/useScimSettings/useScimSettings';
import { scimGroupTooltip } from '../group-constants';
import { scimGroupTooltip } from '../group-constants.ts';
export const groupUsersPlaceholder: IGroupUser[] = Array(15).fill({
name: 'Name of the user',

View File

@ -5,8 +5,8 @@ import { UG_DESC_ID, UG_NAME_ID } from 'utils/testIds';
import Input from 'component/common/Input/Input';
import type { IGroupUser } from 'interfaces/group';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { GroupFormUsersSelect } from './GroupFormUsersSelect/GroupFormUsersSelect';
import { GroupFormUsersTable } from './GroupFormUsersTable/GroupFormUsersTable';
import { GroupFormUsersSelect } from './GroupFormUsersSelect/GroupFormUsersSelect.tsx';
import { GroupFormUsersTable } from './GroupFormUsersTable/GroupFormUsersTable.tsx';
import { ItemList } from 'component/common/ItemList/ItemList';
import useAuthSettings from 'hooks/api/getters/useAuthSettings/useAuthSettings';
import { Link } from 'react-router-dom';

View File

@ -1,11 +1,11 @@
import { Route, Routes } from 'react-router-dom';
import { UG } from 'component/common/flags';
import { PermissionGuard } from 'component/common/PermissionGuard/PermissionGuard';
import { GroupsList } from './GroupsList/GroupsList';
import { GroupsList } from './GroupsList/GroupsList.tsx';
import { ADMIN } from '@server/types/permissions';
import { CreateGroup } from './CreateGroup/CreateGroup';
import { EditGroupContainer } from './EditGroup/EditGroup';
import { Group } from './Group/Group';
import { CreateGroup } from './CreateGroup/CreateGroup.tsx';
import { EditGroupContainer } from './EditGroup/EditGroup.tsx';
import { Group } from './Group/Group.tsx';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { PremiumFeature } from 'component/common/PremiumFeature/PremiumFeature';

View File

@ -1,7 +1,7 @@
import { styled } from '@mui/material';
import type { IGroup } from 'interfaces/group';
import { Link } from 'react-router-dom';
import { GroupCardActions } from './GroupCardActions';
import { GroupCardActions } from './GroupCardActions.tsx';
import { RoleBadge } from 'component/common/RoleBadge/RoleBadge';
import { useScimSettings } from 'hooks/api/getters/useScimSettings/useScimSettings';
import GroupsIcon from '@mui/icons-material/GroupsOutlined';
@ -9,7 +9,7 @@ import { useSearchHighlightContext } from 'component/common/Table/SearchHighligh
import { Highlighter } from 'component/common/Highlighter/Highlighter';
import { Truncator } from 'component/common/Truncator/Truncator';
import { Card } from 'component/common/Card/Card';
import { GroupCardFooter } from './GroupCardFooter';
import { GroupCardFooter } from './GroupCardFooter.tsx';
const StyledCardLink = styled(Link)(({ theme }) => ({
color: 'inherit',

View File

@ -10,14 +10,14 @@ import { styled, useMediaQuery } from '@mui/material';
import theme from 'themes/theme';
import { SearchHighlightProvider } from 'component/common/Table/SearchHighlightContext/SearchHighlightContext';
import { TablePlaceholder } from 'component/common/Table';
import { GroupCard } from './GroupCard/GroupCard';
import { GroupEmpty } from './GroupEmpty/GroupEmpty';
import { GroupCard } from './GroupCard/GroupCard.tsx';
import { GroupEmpty } from './GroupEmpty/GroupEmpty.tsx';
import ResponsiveButton from 'component/common/ResponsiveButton/ResponsiveButton';
import { ADMIN } from 'component/providers/AccessProvider/permissions';
import Add from '@mui/icons-material/Add';
import { NAVIGATE_TO_CREATE_GROUP } from 'utils/testIds';
import { EditGroupUsers } from '../Group/EditGroupUsers/EditGroupUsers';
import { RemoveGroup } from '../RemoveGroup/RemoveGroup';
import { EditGroupUsers } from '../Group/EditGroupUsers/EditGroupUsers.tsx';
import { RemoveGroup } from '../RemoveGroup/RemoveGroup.tsx';
const StyledGridContainer = styled('div')(({ theme }) => ({
display: 'grid',

View File

@ -1,4 +1,4 @@
import { InstanceStats } from './InstanceStats/InstanceStats';
import { InstanceStats } from './InstanceStats/InstanceStats.tsx';
export const InstanceAdmin = () => {
return (

View File

@ -10,9 +10,9 @@ import {
import { Box } from '@mui/system';
import type { FC } from 'react';
import { useInstanceStats } from 'hooks/api/getters/useInstanceStats/useInstanceStats';
import { formatApiPath } from '../../../../utils/formatPath';
import { PageContent } from '../../../common/PageContent/PageContent';
import { PageHeader } from '../../../common/PageHeader/PageHeader';
import { formatApiPath } from '../../../../utils/formatPath.ts';
import { PageContent } from '../../../common/PageContent/PageContent.tsx';
import { PageHeader } from '../../../common/PageHeader/PageHeader.tsx';
export const InstanceStats: FC = () => {
const { stats } = useInstanceStats();

View File

@ -2,7 +2,7 @@ import { PageContent } from 'component/common/PageContent/PageContent';
import { PageHeader } from 'component/common/PageHeader/PageHeader';
import { Box, styled } from '@mui/material';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { InstancePrivacySection } from './InstancePrivacySection';
import { InstancePrivacySection } from './InstancePrivacySection.tsx';
import { useTelemetry } from 'hooks/api/getters/useTelemetry/useTelemetry';
interface IFeatureActivenessManagementInfo {

View File

@ -1,4 +1,4 @@
import InvoiceList from './InvoiceList';
import InvoiceList from './InvoiceList.tsx';
import { ADMIN } from 'component/providers/AccessProvider/permissions';
import { PermissionGuard } from 'component/common/PermissionGuard/PermissionGuard';

View File

@ -4,8 +4,8 @@ import { PageContent } from 'component/common/PageContent/PageContent';
import { PageHeader } from 'component/common/PageHeader/PageHeader';
import { Box, styled } from '@mui/material';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { MaintenanceTooltip } from './MaintenanceTooltip';
import { MaintenanceToggle } from './MaintenanceToggle';
import { MaintenanceTooltip } from './MaintenanceTooltip.tsx';
import { MaintenanceToggle } from './MaintenanceToggle.tsx';
import { UPDATE_MAINTENANCE_MODE } from '@server/types/permissions';
export const MaintenanceAdmin = () => (

View File

@ -6,19 +6,23 @@ import { TabLink } from 'component/common/TabNav/TabLink';
import { PageContent } from 'component/common/PageContent/PageContent';
import { useUiFlag } from 'hooks/useUiFlag';
const NetworkOverview = lazy(() => import('./NetworkOverview/NetworkOverview'));
const NetworkConnectedEdges = lazy(
() => import('./NetworkConnectedEdges/NetworkConnectedEdges'),
const NetworkOverview = lazy(
() => import('./NetworkOverview/NetworkOverview.tsx'),
);
const NetworkConnectedEdges = lazy(
() => import('./NetworkConnectedEdges/NetworkConnectedEdges.tsx'),
);
const NetworkTraffic = lazy(
() => import('./NetworkTraffic/NetworkTraffic.tsx'),
);
const NetworkTraffic = lazy(() => import('./NetworkTraffic/NetworkTraffic'));
const NetworkTrafficUsage = lazy(
() => import('./NetworkTrafficUsage/NetworkTrafficUsage'),
() => import('./NetworkTrafficUsage/NetworkTrafficUsage.tsx'),
);
const BackendConnections = lazy(
() => import('./NetworkTrafficUsage/BackendConnections'),
() => import('./NetworkTrafficUsage/BackendConnections.tsx'),
);
const FrontendNetworkTrafficUsage = lazy(
() => import('./NetworkTrafficUsage/FrontendNetworkTrafficUsage'),
() => import('./NetworkTrafficUsage/FrontendNetworkTrafficUsage.tsx'),
);
const tabs = [

View File

@ -12,7 +12,7 @@ import {
} from '@mui/material';
import { Badge } from 'component/common/Badge/Badge';
import { HelpIcon } from 'component/common/HelpIcon/HelpIcon';
import { NetworkConnectedEdgeInstanceLatency } from './NetworkConnectedEdgeInstanceLatency';
import { NetworkConnectedEdgeInstanceLatency } from './NetworkConnectedEdgeInstanceLatency.tsx';
const StyledInstance = styled('div')(({ theme }) => ({
width: '100%',

View File

@ -8,7 +8,7 @@ import { ReactComponent as LogoIconWhite } from 'assets/icons/logoWhiteBg.svg';
import { ThemeMode } from 'component/common/ThemeMode/ThemeMode';
import { useConnectedEdges } from 'hooks/api/getters/useConnectedEdges/useConnectedEdges';
import type { ConnectedEdge } from 'interfaces/connectedEdge';
import { NetworkConnectedEdgeInstance } from './NetworkConnectedEdgeInstance';
import { NetworkConnectedEdgeInstance } from './NetworkConnectedEdgeInstance.tsx';
const UNLEASH = 'Unleash';

View File

@ -11,7 +11,7 @@ import type {
import { ReactComponent as LogoIcon } from 'assets/icons/logoBg.svg';
import { ReactComponent as LogoIconWhite } from 'assets/icons/logoWhiteBg.svg';
import { ThemeMode } from 'component/common/ThemeMode/ThemeMode';
import { NetworkPrometheusAPIWarning } from '../NetworkPrometheusAPIWarning';
import { NetworkPrometheusAPIWarning } from '../NetworkPrometheusAPIWarning.tsx';
const StyleUnleashContainer = styled('div')(({ theme }) => ({
marginBottom: theme.spacing(18),

View File

@ -28,7 +28,7 @@ import { ConditionallyRender } from 'component/common/ConditionallyRender/Condit
import { usePageTitle } from 'hooks/usePageTitle';
import { unknownify } from 'utils/unknownify';
import type { Theme } from '@mui/material/styles/createTheme';
import { NetworkPrometheusAPIWarning } from '../NetworkPrometheusAPIWarning';
import { NetworkPrometheusAPIWarning } from '../NetworkPrometheusAPIWarning.tsx';
const pointStyles = ['circle', 'rect', 'rectRounded', 'rectRot', 'triangle'];

View File

@ -9,12 +9,12 @@ import {
Tooltip as TooltipComponent,
Typography,
} from '@mui/material';
import { PeriodSelector } from './PeriodSelector';
import { PeriodSelector } from './PeriodSelector.tsx';
import { Bar } from 'react-chartjs-2';
import { customHighlightPlugin } from 'component/common/Chart/customHighlightPlugin';
import { getChartLabel } from './chart-functions';
import { useConsumptionStats } from './hooks/useStats';
import { StyledBox, TopRow } from './SharedComponents';
import { getChartLabel } from './chart-functions.ts';
import { useConsumptionStats } from './hooks/useStats.ts';
import { StyledBox, TopRow } from './SharedComponents.tsx';
import {
BarElement,
CategoryScale,
@ -25,7 +25,7 @@ import {
Tooltip,
} from 'chart.js';
import annotationPlugin from 'chartjs-plugin-annotation';
import { useChartDataSelection } from './hooks/useChartDataSelection';
import { useChartDataSelection } from './hooks/useChartDataSelection.ts';
import HelpOutline from '@mui/icons-material/HelpOutline';
const ConnectionExplanationBox = styled(Box)(({ theme }) => ({

View File

@ -16,11 +16,11 @@ import {
import { Bar } from 'react-chartjs-2';
import annotationPlugin from 'chartjs-plugin-annotation';
import { customHighlightPlugin } from 'component/common/Chart/customHighlightPlugin';
import { PeriodSelector } from './PeriodSelector';
import { getChartLabel } from './chart-functions';
import { useRequestsStats } from './hooks/useStats';
import { StyledBox, TopRow } from './SharedComponents';
import { useChartDataSelection } from './hooks/useChartDataSelection';
import { PeriodSelector } from './PeriodSelector.tsx';
import { getChartLabel } from './chart-functions.ts';
import { useRequestsStats } from './hooks/useStats.ts';
import { StyledBox, TopRow } from './SharedComponents.tsx';
import { useChartDataSelection } from './hooks/useChartDataSelection.ts';
const FrontendNetworkTrafficUsage: FC = () => {
usePageTitle('Network - Frontend Traffic Usage');

View File

@ -18,15 +18,15 @@ import {
import { Bar } from 'react-chartjs-2';
import annotationPlugin from 'chartjs-plugin-annotation';
import { customHighlightPlugin } from 'component/common/Chart/customHighlightPlugin';
import { PeriodSelector } from './PeriodSelector';
import { PeriodSelector } from './PeriodSelector.tsx';
import { useUiFlag } from 'hooks/useUiFlag';
import { OverageInfo, RequestSummary } from './RequestSummary';
import { currentMonth } from './dates';
import { getChartLabel } from './chart-functions';
import { useTrafficStats } from './hooks/useStats';
import { BoldText, StyledBox, TopRow } from './SharedComponents';
import { useChartDataSelection } from './hooks/useChartDataSelection';
import { useTrafficBundles } from '../../../../hooks/api/getters/useTrafficBundles/useTrafficBundles';
import { OverageInfo, RequestSummary } from './RequestSummary.tsx';
import { currentMonth } from './dates.ts';
import { getChartLabel } from './chart-functions.ts';
import { useTrafficStats } from './hooks/useStats.ts';
import { BoldText, StyledBox, TopRow } from './SharedComponents.tsx';
import { useChartDataSelection } from './hooks/useChartDataSelection.ts';
import { useTrafficBundles } from '../../../../hooks/api/getters/useTrafficBundles/useTrafficBundles.ts';
const TrafficInfoBoxes = styled('div')(({ theme }) => ({
display: 'grid',

View File

@ -3,9 +3,9 @@ import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';
import ArrowDropUpIcon from '@mui/icons-material/ArrowDropUp';
import { useRef, useState, type FC } from 'react';
import { format } from 'date-fns';
import type { ChartDataSelection } from './chart-data-selection';
import { selectablePeriods } from './selectable-periods';
import { parseMonthString } from './dates';
import type { ChartDataSelection } from './chart-data-selection.ts';
import { selectablePeriods } from './selectable-periods.ts';
import { parseMonthString } from './dates.ts';
const dropdownWidth = '15rem';
const dropdownInlinePadding = (theme: Theme) => theme.spacing(3);

View File

@ -3,8 +3,8 @@ import { Badge } from 'component/common/Badge/Badge';
import { subMonths } from 'date-fns';
import { useLocationSettings } from 'hooks/useLocationSettings';
import type { FC } from 'react';
import type { ChartDataSelection } from './chart-data-selection';
import { parseMonthString } from './dates';
import type { ChartDataSelection } from './chart-data-selection.ts';
import { parseMonthString } from './dates.ts';
type Props = {
period: ChartDataSelection;

View File

@ -1,6 +1,6 @@
import { differenceInCalendarMonths } from 'date-fns';
import type { TrafficUsageDataSegmentedCombinedSchema } from 'openapi';
import { currentMonth } from './dates';
import { currentMonth } from './dates.js';
export const averageTrafficPreviousMonths = (
traffic: TrafficUsageDataSegmentedCombinedSchema,

View File

@ -1,4 +1,7 @@
import { type ChartDataSelection, toDateRange } from './chart-data-selection';
import {
type ChartDataSelection,
toDateRange,
} from './chart-data-selection.js';
test('daily conversion', () => {
const input: ChartDataSelection = {

View File

@ -1,5 +1,5 @@
import { endOfMonth, format, startOfMonth, subMonths } from 'date-fns';
import { parseMonthString } from './dates';
import { parseMonthString } from './dates.js';
export type ChartDataSelection =
| {

View File

@ -7,8 +7,8 @@ import {
toConnectionChartData,
toRequestChartData,
toTrafficUsageChartData,
} from './chart-functions';
import { endpointsInfo } from './endpoint-info';
} from './chart-functions.js';
import { endpointsInfo } from './endpoint-info.js';
describe('toTrafficUsageChartData', () => {
const dataPoint = (period: string, count: number) => ({

View File

@ -4,15 +4,15 @@ import type {
MeteredRequestsSchema,
TrafficUsageDataSegmentedCombinedSchema,
} from 'openapi';
import { endpointsInfo } from './endpoint-info';
import { endpointsInfo } from './endpoint-info.js';
import {
addDays,
addMonths,
differenceInCalendarDays,
differenceInCalendarMonths,
} from 'date-fns';
import { formatDay, formatMonth, parseDateString } from './dates';
import type { ChartDataSelection } from './chart-data-selection';
import { formatDay, formatMonth, parseDateString } from './dates.js';
import type { ChartDataSelection } from './chart-data-selection.js';
export type ChartDatasetType = ChartDataset<'bar'>;
export const toTrafficUsageChartData = (

View File

@ -1,10 +1,10 @@
import { useMemo, useState } from 'react';
import type { ChartDataSelection } from '../chart-data-selection';
import { periodsRecord, selectablePeriods } from '../selectable-periods';
import { createBarChartOptions } from '../bar-chart-options';
import type { ChartDataSelection } from '../chart-data-selection.js';
import { periodsRecord, selectablePeriods } from '../selectable-periods.js';
import { createBarChartOptions } from '../bar-chart-options.js';
import useTheme from '@mui/material/styles/useTheme';
import { useLocationSettings } from 'hooks/useLocationSettings';
import { parseMonthString } from '../dates';
import { parseMonthString } from '../dates.js';
export const useChartDataSelection = (includedTraffic?: number) => {
const theme = useTheme();

View File

@ -1,19 +1,22 @@
import { type ChartDataSelection, toDateRange } from '../chart-data-selection';
import {
type ChartDataSelection,
toDateRange,
} from '../chart-data-selection.js';
import { useTrafficSearch } from 'hooks/api/getters/useInstanceTrafficMetrics/useInstanceTrafficMetrics';
import { currentDate } from '../dates';
import { currentDate } from '../dates.js';
import { useMemo } from 'react';
import {
toConnectionChartData,
toRequestChartData,
toTrafficUsageChartData,
} from '../chart-functions';
} from '../chart-functions.js';
import {
calculateEstimatedMonthlyCost,
calculateOverageCost,
calculateTotalUsage,
} from 'utils/traffic-calculations';
import { BILLING_TRAFFIC_PRICE } from '../../../billing/BillingDashboard/BillingPlan/BillingPlan';
import { averageTrafficPreviousMonths } from '../average-traffic-previous-months';
import { BILLING_TRAFFIC_PRICE } from '../../../billing/BillingDashboard/BillingPlan/BillingPlan.jsx';
import { averageTrafficPreviousMonths } from '../average-traffic-previous-months.js';
import { useConnectionsConsumption } from 'hooks/api/getters/useConnectionsConsumption/useConnectionsConsumption';
import { useRequestsConsumption } from 'hooks/api/getters/useRequestsConsumption/useRequestsConsumption';
import { useInstanceStatus } from 'hooks/api/getters/useInstanceStatus/useInstanceStatus';

View File

@ -1,4 +1,4 @@
import { generateSelectablePeriodsFromDate } from './selectable-periods';
import { generateSelectablePeriodsFromDate } from './selectable-periods.js';
test('marks months before May 2024 as unselectable', () => {
const now = new Date('2025-01-01');

View File

@ -1,5 +1,5 @@
import { getDaysInMonth, startOfMonth, subMonths } from 'date-fns';
import { currentDate, formatMonth } from './dates';
import { currentDate, formatMonth } from './dates.js';
import { TRAFFIC_MEASUREMENT_START_DATE } from 'utils/traffic-calculations';
export type Period = {

View File

@ -1,11 +1,11 @@
import { Alert, styled } from '@mui/material';
import Input from 'component/common/Input/Input';
import type { ICheckedPermissions } from 'interfaces/permissions';
import type { IRoleFormErrors } from './useRoleForm';
import type { IRoleFormErrors } from './useRoleForm.ts';
import type { PredefinedRoleType } from 'interfaces/role';
import { ROOT_ROLE_TYPE } from '@server/util/constants';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { RolePermissionCategories } from './RolePermissionCategories/RolePermissionCategories';
import { RolePermissionCategories } from './RolePermissionCategories/RolePermissionCategories.tsx';
const StyledInputDescription = styled('p')(({ theme }) => ({
display: 'flex',

View File

@ -16,11 +16,11 @@ import {
toggleAllPermissions,
togglePermission,
} from 'utils/permissions';
import { RolePermissionEnvironment } from './RolePermissionEnvironment';
import { RolePermissionEnvironment } from './RolePermissionEnvironment.tsx';
import { useMemo } from 'react';
import { useUiFlag } from 'hooks/useUiFlag';
import { RolePermissionProject } from './RolePermissionProject';
import { RolePermissionCategoryAccordion } from './RolePermissionCategoryAccordion';
import { RolePermissionProject } from './RolePermissionProject.tsx';
import { RolePermissionCategoryAccordion } from './RolePermissionCategoryAccordion.tsx';
interface IPermissionCategoriesProps {
type: PredefinedRoleType;

View File

@ -1,8 +1,8 @@
import { useMemo } from 'react';
import { styled, Typography } from '@mui/material';
import type { ICheckedPermissions, IPermission } from 'interfaces/permissions';
import { createProjectPermissionsStructure } from './createProjectPermissionsStructure';
import { RolePermissionProjectItem } from './RolePermissionProjectItem';
import { createProjectPermissionsStructure } from './createProjectPermissionsStructure.ts';
import { RolePermissionProjectItem } from './RolePermissionProjectItem.tsx';
interface IEnvironmentPermissionAccordionProps {
permissions: IPermission[];

View File

@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest';
import { createProjectPermissionsStructure } from './createProjectPermissionsStructure';
import { createProjectPermissionsStructure } from './createProjectPermissionsStructure.js';
describe('createProjectPermissionsStructure', () => {
it('returns an empty array when no permissions are given', () => {

View File

@ -1,5 +1,5 @@
import { renderHook } from '@testing-library/react';
import { useRoleForm } from './useRoleForm';
import { useRoleForm } from './useRoleForm.js';
import { test } from 'vitest';
import { act } from 'react';

View File

@ -1,9 +1,9 @@
import { Button, styled } from '@mui/material';
import { SidebarModal } from 'component/common/SidebarModal/SidebarModal';
import { useRoleForm } from '../RoleForm/useRoleForm';
import { useRoleForm } from '../RoleForm/useRoleForm.ts';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import FormTemplate from 'component/common/FormTemplate/FormTemplate';
import { RoleForm } from '../RoleForm/RoleForm';
import { RoleForm } from '../RoleForm/RoleForm.tsx';
import { useRoles } from 'hooks/api/getters/useRoles/useRoles';
import useToast from 'hooks/useToast';
import { formatUnknownError } from 'utils/formatUnknownError';

View File

@ -3,7 +3,7 @@ import { PermissionGuard } from 'component/common/PermissionGuard/PermissionGuar
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { PremiumFeature } from 'component/common/PremiumFeature/PremiumFeature';
import { READ_ROLE } from '@server/types/permissions';
import { RolesPage } from './RolesPage';
import { RolesPage } from './RolesPage.tsx';
export const Roles = () => {
const { isEnterprise } = useUiConfig();

View File

@ -1,7 +1,7 @@
import { useState } from 'react';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { ADMIN } from 'component/providers/AccessProvider/permissions';
import { RolesTable } from './RolesTable/RolesTable';
import { RolesTable } from './RolesTable/RolesTable.tsx';
import { PageContent } from 'component/common/PageContent/PageContent';
import { Tab, Tabs, styled, useMediaQuery } from '@mui/material';
import { Route, Routes, useLocation } from 'react-router-dom';

View File

@ -1,6 +1,6 @@
import type { IRole } from 'interfaces/role';
import { RoleDeleteDialogRootRole } from './RoleDeleteDialogRootRole/RoleDeleteDialogRootRole';
import { RoleDeleteDialogProjectRole } from './RoleDeleteDialogProjectRole/RoleDeleteDialogProjectRole';
import { RoleDeleteDialogRootRole } from './RoleDeleteDialogRootRole/RoleDeleteDialogRootRole.tsx';
import { RoleDeleteDialogProjectRole } from './RoleDeleteDialogProjectRole/RoleDeleteDialogProjectRole.tsx';
import { CUSTOM_PROJECT_ROLE_TYPE } from 'constants/roles';
interface IRoleDeleteDialogProps {

View File

@ -3,7 +3,7 @@ import { ConditionallyRender } from 'component/common/ConditionallyRender/Condit
import { Dialogue } from 'component/common/Dialogue/Dialogue';
import type { IRole } from 'interfaces/role';
import { useProjectRoleAccessUsage } from 'hooks/api/getters/useProjectRoleAccessUsage/useProjectRoleAccessUsage';
import { RoleDeleteDialogProjectRoleTable } from './RoleDeleteDialogProjectRoleTable';
import { RoleDeleteDialogProjectRoleTable } from './RoleDeleteDialogProjectRoleTable.tsx';
const StyledTableContainer = styled('div')(({ theme }) => ({
marginTop: theme.spacing(1.5),

View File

@ -4,10 +4,10 @@ import { Dialogue } from 'component/common/Dialogue/Dialogue';
import { useServiceAccounts } from 'hooks/api/getters/useServiceAccounts/useServiceAccounts';
import { useUsers } from 'hooks/api/getters/useUsers/useUsers';
import type { IRole } from 'interfaces/role';
import { RoleDeleteDialogUsers } from './RoleDeleteDialogUsers';
import { RoleDeleteDialogServiceAccounts } from './RoleDeleteDialogServiceAccounts';
import { RoleDeleteDialogUsers } from './RoleDeleteDialogUsers.tsx';
import { RoleDeleteDialogServiceAccounts } from './RoleDeleteDialogServiceAccounts.tsx';
import { useGroups } from 'hooks/api/getters/useGroups/useGroups';
import { RoleDeleteDialogGroups } from './RoleDeleteDialogGroups';
import { RoleDeleteDialogGroups } from './RoleDeleteDialogGroups.tsx';
const StyledTableContainer = styled('div')(({ theme }) => ({
marginTop: theme.spacing(1.5),

View File

@ -14,13 +14,13 @@ import { useConditionallyHiddenColumns } from 'hooks/useConditionallyHiddenColum
import { useSearch } from 'hooks/useSearch';
import { IconCell } from 'component/common/Table/cells/IconCell/IconCell';
import SupervisedUserCircle from '@mui/icons-material/SupervisedUserCircle';
import { RolesActionsCell } from './RolesActionsCell/RolesActionsCell';
import { RolesCell } from './RolesCell/RolesCell';
import { RoleDeleteDialog } from './RoleDeleteDialog/RoleDeleteDialog';
import { RolesActionsCell } from './RolesActionsCell/RolesActionsCell.tsx';
import { RolesCell } from './RolesCell/RolesCell.tsx';
import { RoleDeleteDialog } from './RoleDeleteDialog/RoleDeleteDialog.tsx';
import { useRolesApi } from 'hooks/api/actions/useRolesApi/useRolesApi';
import { useRoles } from 'hooks/api/getters/useRoles/useRoles';
import { RoleModal } from '../RoleModal/RoleModal';
import { RolePermissionsCell } from './RolePermissionsCell/RolePermissionsCell';
import { RoleModal } from '../RoleModal/RoleModal.tsx';
import { RolePermissionsCell } from './RolePermissionsCell/RolePermissionsCell.tsx';
import { ROOT_ROLE_TYPE } from '@server/util/constants';
interface IRolesTableProps {

View File

@ -1,6 +1,6 @@
import { ADMIN } from 'component/providers/AccessProvider/permissions';
import { PermissionGuard } from 'component/common/PermissionGuard/PermissionGuard';
import { ServiceAccountsTable } from './ServiceAccountsTable/ServiceAccountsTable';
import { ServiceAccountsTable } from './ServiceAccountsTable/ServiceAccountsTable.tsx';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { PremiumFeature } from 'component/common/PremiumFeature/PremiumFeature';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';

View File

@ -2,7 +2,7 @@ import { Alert, styled } from '@mui/material';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { Dialogue } from 'component/common/Dialogue/Dialogue';
import type { IServiceAccount } from 'interfaces/service-account';
import { ServiceAccountTokens } from '../ServiceAccountModal/ServiceAccountTokens/ServiceAccountTokens';
import { ServiceAccountTokens } from '../ServiceAccountModal/ServiceAccountTokens/ServiceAccountTokens.tsx';
const StyledTableContainer = styled('div')(({ theme }) => ({
marginTop: theme.spacing(1.5),

View File

@ -30,7 +30,7 @@ import {
} from 'component/user/Profile/PersonalAPITokensTab/CreatePersonalAPIToken/PersonalAPITokenForm/PersonalAPITokenForm';
import { useServiceAccountTokensApi } from 'hooks/api/actions/useServiceAccountTokensApi/useServiceAccountTokensApi';
import type { INewPersonalAPIToken } from 'interfaces/personalAPIToken';
import { ServiceAccountTokens } from './ServiceAccountTokens/ServiceAccountTokens';
import { ServiceAccountTokens } from './ServiceAccountTokens/ServiceAccountTokens.tsx';
import type { IServiceAccount } from 'interfaces/service-account';
import { RoleSelect } from 'component/common/RoleSelect/RoleSelect';
import type { IRole } from 'interfaces/role';

View File

@ -30,7 +30,7 @@ import {
useFlexLayout,
} from 'react-table';
import { sortTypes } from 'utils/sortTypes';
import { ServiceAccountCreateTokenDialog } from './ServiceAccountCreateTokenDialog/ServiceAccountCreateTokenDialog';
import { ServiceAccountCreateTokenDialog } from './ServiceAccountCreateTokenDialog/ServiceAccountCreateTokenDialog.tsx';
import { ServiceAccountTokenDialog } from 'component/admin/serviceAccounts/ServiceAccountsTable/ServiceAccountTokenDialog/ServiceAccountTokenDialog';
import { TimeAgoCell } from 'component/common/Table/cells/TimeAgoCell/TimeAgoCell';
import { useConditionallyHiddenColumns } from 'hooks/useConditionallyHiddenColumns';

View File

@ -20,12 +20,12 @@ import { useConditionallyHiddenColumns } from 'hooks/useConditionallyHiddenColum
import { useSearch } from 'hooks/useSearch';
import { useServiceAccounts } from 'hooks/api/getters/useServiceAccounts/useServiceAccounts';
import { useServiceAccountsApi } from 'hooks/api/actions/useServiceAccountsApi/useServiceAccountsApi';
import { ServiceAccountModal } from './ServiceAccountModal/ServiceAccountModal';
import { ServiceAccountDeleteDialog } from './ServiceAccountDeleteDialog/ServiceAccountDeleteDialog';
import { ServiceAccountsActionsCell } from './ServiceAccountsActionsCell/ServiceAccountsActionsCell';
import { ServiceAccountModal } from './ServiceAccountModal/ServiceAccountModal.tsx';
import { ServiceAccountDeleteDialog } from './ServiceAccountDeleteDialog/ServiceAccountDeleteDialog.tsx';
import { ServiceAccountsActionsCell } from './ServiceAccountsActionsCell/ServiceAccountsActionsCell.tsx';
import type { INewPersonalAPIToken } from 'interfaces/personalAPIToken';
import { ServiceAccountTokenDialog } from './ServiceAccountTokenDialog/ServiceAccountTokenDialog';
import { ServiceAccountTokensCell } from './ServiceAccountTokensCell/ServiceAccountTokensCell';
import { ServiceAccountTokenDialog } from './ServiceAccountTokenDialog/ServiceAccountTokenDialog.tsx';
import { ServiceAccountTokensCell } from './ServiceAccountTokensCell/ServiceAccountTokensCell.tsx';
import { TimeAgoCell } from 'component/common/Table/cells/TimeAgoCell/TimeAgoCell';
import type { IServiceAccount } from 'interfaces/service-account';
import { RoleCell } from 'component/common/Table/cells/RoleCell/RoleCell';

Some files were not shown because too many files have changed in this diff Show More