Refactor to enforce strictNullChecks

This commit applies `strictNullChecks` to the entire codebase to improve
maintainability and type safety. Key changes include:

- Remove some explicit null-checks where unnecessary.
- Add necessary null-checks.
- Refactor static factory functions for a more functional approach.
- Improve some test names and contexts for better debugging.
- Add unit tests for any additional logic introduced.
- Refactor `createPositionFromRegexFullMatch` to its own function as the
  logic is reused.
- Prefer `find` prefix on functions that may return `undefined` and
  `get` prefix for those that always return a value.
This commit is contained in:
undergroundwires
2023-11-12 22:54:00 +01:00
parent 7ab16ecccb
commit 949fac1a7c
294 changed files with 2477 additions and 2738 deletions

View File

@@ -75,7 +75,7 @@ describe('TreeNodeHierarchy', () => {
describe('depthInTree', () => {
interface DepthTestScenario {
readonly parentNode: TreeNode,
readonly parentNode: TreeNode | undefined,
readonly expectedDepth: number;
}
const testCases: readonly DepthTestScenario[] = [

View File

@@ -4,6 +4,7 @@ import { TreeNodeStateDescriptor } from '@/presentation/components/Scripts/View/
import { TreeNodeCheckState } from '@/presentation/components/Scripts/View/Tree/TreeView/Node/State/CheckState';
import { NodeStateChangedEvent, TreeNodeStateTransaction } from '@/presentation/components/Scripts/View/Tree/TreeView/Node/State/StateAccess';
import { PropertyKeys } from '@/TypeHelpers';
import { expectExists } from '@tests/shared/Assertions/ExpectExists';
describe('TreeNodeState', () => {
describe('beginTransaction', () => {
@@ -37,14 +38,14 @@ describe('TreeNodeState', () => {
const transaction = treeNodeState
.beginTransaction()
.withCheckState(TreeNodeCheckState.Checked);
let notifiedEvent: NodeStateChangedEvent;
let notifiedEvent: NodeStateChangedEvent | undefined;
// act
treeNodeState.changed.on((event) => {
notifiedEvent = event;
});
treeNodeState.commitTransaction(transaction);
// assert
expect(notifiedEvent).to.not.equal(undefined);
expectExists(notifiedEvent);
expect(notifiedEvent.oldState.checkState).to.equal(TreeNodeCheckState.Unchecked);
expect(notifiedEvent.newState.checkState).to.equal(TreeNodeCheckState.Checked);
});

View File

@@ -23,7 +23,7 @@ describe('TreeNodeManager', () => {
const act = () => new TreeNodeManager(absentId);
// assert
expect(act).to.throw(expectedError);
});
}, { excludeNull: true, excludeUndefined: true });
});
});
@@ -37,14 +37,14 @@ describe('TreeNodeManager', () => {
expect(node.metadata).to.equal(expectedMetadata);
});
describe('should accept absent metadata', () => {
itEachAbsentObjectValue((absentMetadata) => {
itEachAbsentObjectValue((absentValue) => {
// arrange
const expectedMetadata = absentMetadata;
const expectedMetadata = absentValue;
// act
const node = new TreeNodeManager('id', expectedMetadata);
// assert
expect(node.metadata).to.equal(absentMetadata);
});
expect(node.metadata).to.equal(undefined);
}, { excludeNull: true });
});
});

View File

@@ -74,13 +74,16 @@ describe('useKeyboardInteractionState', () => {
});
function mountWrapperComponent(window: WindowWithEventListeners) {
let returnObject: ReturnType<typeof useKeyboardInteractionState>;
let returnObject: ReturnType<typeof useKeyboardInteractionState> | undefined;
const wrapper = shallowMount(defineComponent({
setup() {
returnObject = useKeyboardInteractionState(window);
},
template: '<div></div>',
}));
if (!returnObject) {
throw new Error('missing hook result');
}
return {
returnObject,
wrapper,

View File

@@ -57,7 +57,7 @@ describe('useNodeState', () => {
});
function mountWrapperComponent(nodeRef: Readonly<Ref<ReadOnlyTreeNode>>) {
let returnObject: ReturnType<typeof useNodeState>;
let returnObject: ReturnType<typeof useNodeState> | undefined;
const wrapper = shallowMount(
defineComponent({
setup() {
@@ -74,6 +74,9 @@ function mountWrapperComponent(nodeRef: Readonly<Ref<ReadOnlyTreeNode>>) {
},
},
);
if (!returnObject) {
throw new Error('missing hook result');
}
return {
wrapper,
returnObject,