Skip to content

Commit 27551b7

Browse files
committed
Turn on strict mode in typescript compiler options
1 parent cf6df75 commit 27551b7

File tree

11 files changed

+135
-91
lines changed

11 files changed

+135
-91
lines changed

js/edit/edit.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
import './editor';
22
import './tabs';
33
import './shortcode';
4+
import { window } from '../types';
45

56
document.addEventListener('DOMContentLoaded', () => {
67
const form = document.getElementById('snippet-form');
7-
const editor = window.code_snippets_editor.codemirror;
8+
const editor = window.code_snippets_editor?.codemirror;
89
const strings = window.code_snippets_edit_i18n;
9-
const snippet_name = document.querySelector('input[name=snippet_name]') as HTMLInputElement;
10+
const snippetName = document.querySelector('input[name=snippet_name]') as HTMLInputElement;
1011

11-
if (!form || !editor || !snippet_name) return;
12+
if (!form || !editor || !snippetName) return;
1213

1314
form.addEventListener('submit', (event: SubmitEvent) => {
14-
const missing_title = '' === snippet_name.value.trim();
15+
const missing_title = '' === snippetName.value.trim();
1516
const missing_code = '' === editor.getValue().trim();
1617

1718
const message = missing_title ?
1819
missing_code ? strings.missing_title_code : strings.missing_title :
1920
missing_code ? strings.missing_code : '';
2021

21-
if (event.submitter.id.startsWith('save_snippet') && message && !confirm(message)) {
22+
if (event?.submitter?.id.startsWith('save_snippet') && message && !confirm(message)) {
2223
event.preventDefault();
2324
}
2425
});

js/edit/editor.ts

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,35 @@
11
import '../editor-lib';
2+
import { window } from '../types'
23

34
window.code_snippets_editor = (({ codeEditor }) => {
4-
const editor = codeEditor.initialize(document.getElementById('snippet_code'));
5+
const textarea = document.getElementById('snippet_code');
6+
if (!textarea) {
7+
console.error('Could not initialise CodeMirror on textarea.', textarea)
8+
return
9+
}
10+
const editor = codeEditor.initialize(textarea);
511

612
const extraKeys = editor.codemirror.getOption('extraKeys');
713
const controlKey = window.navigator.platform.match('Mac') ? 'Cmd' : 'Ctrl';
8-
const save_snippet_cb = () => document.getElementById('save_snippet').click();
14+
const saveSnippet = () => document.getElementById('save_snippet')?.click();
915

1016
editor.codemirror.setOption('extraKeys', {
1117
...'object' === typeof extraKeys ? extraKeys : {},
12-
[`${controlKey}-S`]: save_snippet_cb,
13-
[`${controlKey}-Enter`]: save_snippet_cb,
18+
[`${controlKey}-S`]: saveSnippet,
19+
[`${controlKey}-Enter`]: saveSnippet,
1420
});
1521

1622
return editor;
1723
})(window.wp);
1824

1925
if (window.navigator.platform.match('Mac')) {
20-
document.querySelector('.editor-help-text').className += ' platform-mac';
26+
const helpText = document.querySelector('.editor-help-text')
27+
if (helpText) {
28+
helpText.className += ' platform-mac';
29+
}
2130
}
2231

23-
const dir_control = document.getElementById('snippet-code-direction') as HTMLSelectElement;
24-
25-
if (dir_control) {
26-
dir_control.addEventListener('change', () => {
27-
window.code_snippets_editor.codemirror.setOption('direction', 'rtl' === dir_control.value ? 'rtl' : 'ltr');
28-
});
29-
}
32+
const directionControl = document.getElementById('snippet-code-direction') as HTMLSelectElement | null;
33+
directionControl?.addEventListener('change', () => {
34+
window.code_snippets_editor?.codemirror.setOption('direction', 'rtl' === directionControl.value ? 'rtl' : 'ltr');
35+
});

js/edit/shortcode.ts

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
(() => {
2-
const options_wrap = document.querySelector('.html-shortcode-options');
3-
if (!options_wrap) return;
2+
const optionsContainer = document.querySelector('.html-shortcode-options');
3+
if (!optionsContainer) return;
44

5-
const options = options_wrap.getElementsByTagName('input');
6-
const network_admin = -1 !== document.body.className.indexOf('network-admin');
5+
const options = optionsContainer.getElementsByTagName('input');
6+
const isNetworkAdmin = -1 !== document.body.className.indexOf('network-admin');
77

8-
const snippet_id_input = document.querySelector('input[name=snippet_id]') as HTMLInputElement;
9-
const snippet_id = snippet_id_input ? parseInt(snippet_id_input.value, 10) : 0;
8+
const snippetIdInput = document.querySelector('input[name=snippet_id]') as HTMLInputElement;
9+
const snippetId = snippetIdInput ? parseInt(snippetIdInput.value, 10) : 0;
1010

11-
const update_shortcode = () => {
11+
const updateShortcode = () => {
1212
let shortcode = '[code_snippet';
1313

14-
if (snippet_id) {
15-
shortcode += ` id=${snippet_id}`;
14+
if (snippetId) {
15+
shortcode += ` id=${snippetId}`;
1616
}
1717

18-
if (network_admin) {
18+
if (isNetworkAdmin) {
1919
shortcode += ' network=true';
2020
}
2121

@@ -27,10 +27,16 @@
2727

2828
shortcode += ']';
2929

30-
document.querySelector('.html-scopes-list').querySelector('.shortcode-tag').textContent = shortcode;
30+
const scopes = document.querySelector('.html-scopes-list');
31+
if (scopes) {
32+
const shortcodeScope = scopes.querySelector('.shortcode-tag');
33+
if (shortcodeScope) {
34+
shortcodeScope.textContent = shortcode
35+
}
36+
}
3137
};
3238

3339
for (const option of options) {
34-
option.addEventListener('change', update_shortcode);
40+
option.addEventListener('change', updateShortcode);
3541
}
3642
})();

js/edit/tabs.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import { SnippetType } from '../types';
1+
import { SnippetType, window } from '../types';
22
import { EditorConfiguration } from 'codemirror';
33

44
(editor => {
5-
const tabs_wrapper = document.getElementById('snippet-type-tabs');
6-
if (!tabs_wrapper) return;
5+
const tabsContainer = document.getElementById('snippet-type-tabs');
6+
if (!tabsContainer) return;
77

8-
const snippet_form = document.getElementById('snippet-form');
8+
const snippetForm = document.getElementById('snippet-form');
99

10-
const tabs = tabs_wrapper.querySelectorAll('.nav-tab');
10+
const tabs = tabsContainer.querySelectorAll('.nav-tab');
1111

1212
const modes: Record<SnippetType, string> = {
1313
css: 'text/css',
@@ -17,17 +17,17 @@ import { EditorConfiguration } from 'codemirror';
1717
};
1818

1919
const selectScope = (type: SnippetType) => {
20-
const scope = snippet_form.querySelector(`.${type}-scopes-list input:first-child`) as HTMLInputElement;
20+
const scope = snippetForm?.querySelector(`.${type}-scopes-list input:first-child`) as HTMLInputElement;
2121
if (scope) scope.checked = true;
2222

23-
editor.setOption('lint' as keyof EditorConfiguration, 'php' === type || 'css' === type);
24-
if (type in modes) editor.setOption('mode', modes[type]);
23+
editor?.setOption('lint' as keyof EditorConfiguration, 'php' === type || 'css' === type);
24+
if (type in modes) editor?.setOption('mode', modes[type]);
2525
};
2626

2727
const switchTab = (tab: Element) => {
28-
const prev_active = tabs_wrapper.querySelector('.nav-tab-active');
29-
prev_active.setAttribute('href', '#');
30-
prev_active.classList.remove('nav-tab-active');
28+
const prev_active = tabsContainer.querySelector('.nav-tab-active');
29+
prev_active?.setAttribute('href', '#');
30+
prev_active?.classList.remove('nav-tab-active');
3131

3232
tab.classList.add('nav-tab-active');
3333
tab.removeAttribute('href');
@@ -40,12 +40,12 @@ import { EditorConfiguration } from 'codemirror';
4040
event.preventDefault();
4141

4242
// Update the form styles to match the new type.
43-
snippet_form.setAttribute('data-snippet-type', type);
43+
snippetForm?.setAttribute('data-snippet-type', type);
4444

4545
// Switch the active tab and change the snippet scope.
4646
switchTab(tab);
4747
selectScope(type);
4848
});
4949
}
5050

51-
})(window.code_snippets_editor.codemirror);
51+
})(window.code_snippets_editor?.codemirror);

js/edit/tags.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import tagger from '@jcubic/tagger';
2+
import { window } from '../types'
23

34
(tags => {
45
const tags_field = document.getElementById('snippet_tags');

js/manage.ts

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Snippet } from './types';
1+
import { Snippet, window } from './types';
22

33
type SuccessCallback = (response: { success: boolean, data?: unknown }) => void;
44

@@ -37,14 +37,14 @@ const send_snippet_request = (query: string, success_callback?: SuccessCallback)
3737
const update_snippet = (field: string, row_element: Element, snippet: Partial<Snippet>, success_callback?: SuccessCallback) => {
3838
const id_column = row_element.querySelector('.column-id');
3939

40-
if (!id_column || !parseInt(id_column.textContent, 10)) {
40+
if (!id_column?.textContent || !parseInt(id_column.textContent, 10)) {
4141
return;
4242
}
4343

4444
snippet.id = parseInt(id_column.textContent, 10);
4545
snippet.shared_network = Boolean(row_element.className.match(/\bshared-network-snippet\b/));
4646
snippet.network = snippet.shared_network || network_admin;
47-
snippet.scope = row_element.getAttribute('data-snippet-scope');
47+
snippet.scope = row_element.getAttribute('data-snippet-scope') ?? snippet.scope;
4848

4949
const query_string = `action=update_code_snippet&_ajax_nonce=${nonce}&field=${field}&snippet=${JSON.stringify(snippet)}`;
5050
send_snippet_request(query_string, success_callback);
@@ -56,9 +56,14 @@ const update_snippet = (field: string, row_element: Element, snippet: Partial<Sn
5656
* Update the priority of a snippet
5757
*/
5858
const update_snippet_priority = (element: HTMLInputElement) => {
59-
const row = element.parentElement.parentElement;
59+
const row = element.parentElement?.parentElement;
6060
const snippet: Partial<Snippet> = { priority: parseFloat(element.value) };
61-
update_snippet('priority', row, snippet);
61+
if (row) {
62+
update_snippet('priority', row, snippet);
63+
} else {
64+
console.error('Could not update snippet information.', snippet, row)
65+
}
66+
6267
};
6368

6469
for (const field of document.getElementsByClassName('snippet-priority') as HTMLCollectionOf<HTMLInputElement>) {
@@ -74,9 +79,13 @@ for (const field of document.getElementsByClassName('snippet-priority') as HTMLC
7479
* @param increment
7580
*/
7681
const update_view_count = (view_count: HTMLElement, increment: boolean) => {
77-
let count = parseInt(view_count.textContent.replace(/\((?<count>\d+)\)/, '$1'), 10);
78-
count += increment ? 1 : -1;
79-
view_count.textContent = `(${count.toString()})`;
82+
if (view_count?.textContent) {
83+
let count = parseInt(view_count.textContent.replace(/\((?<count>\d+)\)/, '$1'), 10);
84+
count += increment ? 1 : -1;
85+
view_count.textContent = `(${count.toString()})`;
86+
} else {
87+
console.error('Could not update view count.', view_count);
88+
}
8089
};
8190

8291
/**
@@ -85,9 +94,12 @@ const update_view_count = (view_count: HTMLElement, increment: boolean) => {
8594
* @param event
8695
*/
8796
const toggle_snippet_active = (link: HTMLAnchorElement, event: Event) => {
97+
const row = link?.parentElement?.parentElement; // Switch < cell < row
98+
if (!row) {
99+
console.error('Could not toggle snippet active status.', row)
100+
return;
101+
}
88102

89-
// Switch < cell < row
90-
const row = link.parentElement.parentElement;
91103
const match = row.className.match(/\b(?:in)?active-snippet\b/);
92104
if (!match) return;
93105

@@ -105,8 +117,11 @@ const toggle_snippet_active = (link: HTMLAnchorElement, event: Event) => {
105117
row.className.replace(/\bactive-snippet\b/, 'inactive-snippet');
106118

107119
const views = document.querySelector('.subsubsub');
108-
update_view_count(views.querySelector('.active .count'), activating);
109-
update_view_count(views.querySelector('.inactive .count'), activating);
120+
const activeCount = views?.querySelector<HTMLElement>('.active .count');
121+
const inactiveCount = views?.querySelector<HTMLElement>('.inactive .count');
122+
123+
activeCount ? update_view_count(activeCount, activating) : null;
124+
inactiveCount ? update_view_count(inactiveCount, activating) : null;
110125

111126
button.title = activating ? strings.deactivate : strings.activate;
112127
} else {

js/mce.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import * as tinymce from 'tinymce';
2+
import { Editor } from 'tinymce';
23

34
interface SourceShortcodeOps {
45
id: string;
@@ -12,7 +13,7 @@ interface ContentShortcodeOps {
1213
shortcodes: boolean;
1314
}
1415

15-
interface Editor extends tinymce.Editor {
16+
interface WordPressEditor extends Editor {
1617
getLang: (s: string) => string | Record<string, string>;
1718
}
1819

@@ -22,22 +23,22 @@ const convertToValues = (array: Record<string, string>) =>
2223
value: key
2324
}));
2425

25-
const insertContentMenu = (editor: Editor, ed: Editor) => ({
26-
text: ed.getLang('code_snippets.insert_source_menu'),
26+
const insertContentMenu = (editor: Editor, activeEditor: WordPressEditor) => ({
27+
text: activeEditor.getLang('code_snippets.insert_source_menu'),
2728
onclick: () => {
2829
editor.windowManager.open({
29-
title: ed.getLang('code_snippets.insert_source_title'),
30+
title: activeEditor.getLang('code_snippets.insert_source_title'),
3031
body: [
3132
{
3233
type: 'listbox',
3334
name: 'id',
34-
label: ed.getLang('code_snippets.snippet_label'),
35-
values: convertToValues(ed.getLang('code_snippets.all_snippets') as Record<string, string>),
35+
label: activeEditor.getLang('code_snippets.snippet_label'),
36+
values: convertToValues(activeEditor.getLang('code_snippets.all_snippets') as Record<string, string>),
3637
},
3738
{
3839
type: 'checkbox',
3940
name: 'line_numbers',
40-
label: ed.getLang('code_snippets.show_line_numbers_label'),
41+
label: activeEditor.getLang('code_snippets.show_line_numbers_label'),
4142
}
4243
],
4344
onsubmit: (event: { data: SourceShortcodeOps }) => {
@@ -56,7 +57,7 @@ const insertContentMenu = (editor: Editor, ed: Editor) => ({
5657
}
5758
});
5859

59-
const insertSourceMenu = (editor: Editor, ed: Editor) => ({
60+
const insertSourceMenu = (editor: Editor, ed: WordPressEditor) => ({
6061
text: ed.getLang('code_snippets.insert_content_menu'),
6162
onclick: () => {
6263
editor.windowManager.open({
@@ -102,12 +103,12 @@ const insertSourceMenu = (editor: Editor, ed: Editor) => ({
102103
}
103104
});
104105

105-
tinymce.PluginManager.add('code_snippets', (editor: Editor) => {
106-
const ed = tinymce.activeEditor as Editor;
106+
tinymce.PluginManager.add('code_snippets', editor => {
107+
const activeEditor = tinymce.activeEditor as WordPressEditor;
107108

108109
editor.addButton('code_snippets', {
109110
icon: 'code',
110-
menu: [insertContentMenu(editor, ed), insertSourceMenu(editor, ed)],
111+
menu: [insertContentMenu(editor, activeEditor), insertSourceMenu(editor, activeEditor)],
111112
type: 'menubutton'
112113
});
113114
});

js/settings/editor-preview.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import '../editor-lib';
2-
import { EditorOption } from '../types';
2+
import { EditorOption, window } from '../types';
33

44
const { codeEditor } = window.wp;
55
const editor_settings: EditorOption[] = window.code_snippets_editor_settings;
66

77
const editor = (() => {
88
const textarea = document.getElementById('code_snippets_editor_preview');
9-
window.code_snippets_editor_preview = codeEditor.initialize(textarea);
10-
return window.code_snippets_editor_preview.codemirror;
9+
if (textarea) {
10+
window.code_snippets_editor_preview = codeEditor.initialize(textarea);
11+
return window.code_snippets_editor_preview.codemirror;
12+
}
13+
console.error('Could not initialise CodeMirror on textarea.', textarea)
1114
})();
1215

1316
const parseSelect = (select: HTMLSelectElement) => select.options[select.selectedIndex].value;
@@ -17,7 +20,7 @@ const parseNumber = (input: HTMLInputElement) => parseInt(input.value, 10);
1720
for (const setting of editor_settings) {
1821
const element = document.querySelector(`[name="code_snippets_settings[editor][${setting.name}]"]`);
1922

20-
element.addEventListener('change', () => {
23+
element?.addEventListener('change', () => {
2124
const opt = setting.codemirror;
2225

2326
const value = (() => {
@@ -34,7 +37,7 @@ for (const setting of editor_settings) {
3437
})();
3538

3639
if (null !== value) {
37-
editor.setOption(opt, value);
40+
editor?.setOption(opt, value);
3841
}
3942
});
4043
}

0 commit comments

Comments
 (0)