diff --git a/package.json b/package.json index 41720ee36..95d1fb8d7 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "@hedgedoc/markdown-it-task-lists": "1.0.3", "@hedgedoc/realtime": "0.0.5", "@matejmazur/react-katex": "3.1.3", + "@mrdrogdrog/optional": "0.0.4", "@react-hook/resize-observer": "1.2.5", "@redux-devtools/core": "3.13.1", "@reduxjs/toolkit": "1.8.2", @@ -97,7 +98,6 @@ "markmap-view": "0.2.7", "mermaid": "9.1.2", "next": "12.1.6", - "optional-js": "2.3.0", "react": "18.2.0", "react-bootstrap": "1.6.5", "react-bootstrap-typeahead": "5.2.2", diff --git a/src/components/editor-page/change-content-context/change-content-context.tsx b/src/components/editor-page/change-content-context/change-content-context.tsx index 4c1271504..844ce2514 100644 --- a/src/components/editor-page/change-content-context/change-content-context.tsx +++ b/src/components/editor-page/change-content-context/change-content-context.tsx @@ -6,7 +6,7 @@ import type { PropsWithChildren } from 'react' import React, { createContext, useContext, useState } from 'react' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' import type { EditorView } from '@codemirror/view' import type { ContentEdits } from '../editor-pane/tool-bar/formatters/types/changes' import type { CursorSelection } from '../editor-pane/tool-bar/formatters/types/cursor-selection' diff --git a/src/components/editor-page/change-content-context/use-change-editor-content-callback.tsx b/src/components/editor-page/change-content-context/use-change-editor-content-callback.tsx index c5dca8d7a..a887e231d 100644 --- a/src/components/editor-page/change-content-context/use-change-editor-content-callback.tsx +++ b/src/components/editor-page/change-content-context/use-change-editor-content-callback.tsx @@ -5,8 +5,7 @@ */ import { useMemo } from 'react' -import Optional from 'optional-js' -import type { CodeMirrorSelection } from './code-mirror-selection' +import { Optional } from '@mrdrogdrog/optional' import type { ContentFormatter } from './change-content-context' import { useCodeMirrorReference } from './change-content-context' import type { CursorSelection } from '../editor-pane/tool-bar/formatters/types/cursor-selection' @@ -45,6 +44,6 @@ export const useChangeEditorContentCallback = () => { const convertSelectionToCodeMirrorSelection = (selection: CursorSelection | undefined) => { return Optional.ofNullable(selection) - .map((selection) => ({ anchor: selection.from, head: selection.to })) + .map((selection) => ({ anchor: selection.from, head: selection.to })) .orElse(undefined) } diff --git a/src/components/editor-page/editor-document-renderer/hooks/use-set-checkbox-in-editor.tsx b/src/components/editor-page/editor-document-renderer/hooks/use-set-checkbox-in-editor.tsx index 125cc2f89..cab977341 100644 --- a/src/components/editor-page/editor-document-renderer/hooks/use-set-checkbox-in-editor.tsx +++ b/src/components/editor-page/editor-document-renderer/hooks/use-set-checkbox-in-editor.tsx @@ -7,7 +7,7 @@ import { useChangeEditorContentCallback } from '../../change-content-context/use-change-editor-content-callback' import { useCallback } from 'react' import type { ContentEdits } from '../../editor-pane/tool-bar/formatters/types/changes' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' const TASK_REGEX = /(\s*(?:[-*+]|\d+[.)]) )(\[[ xX]?])/ @@ -23,7 +23,7 @@ export const useSetCheckboxInEditor = () => { const lines = markdownContent.split('\n') const lineStartIndex = findStartIndexOfLine(lines, changedLineIndex) const edits = Optional.ofNullable(TASK_REGEX.exec(lines[changedLineIndex])) - .map(([, beforeCheckbox, oldCheckbox]) => { + .map(([, beforeCheckbox, oldCheckbox]) => { const checkboxStartIndex = lineStartIndex + beforeCheckbox.length return createCheckboxContentEdit(checkboxStartIndex, oldCheckbox, checkboxChecked) }) diff --git a/src/components/editor-page/editor-pane/hooks/code-mirror-extensions/use-code-mirror-file-insert-extension.ts b/src/components/editor-page/editor-pane/hooks/code-mirror-extensions/use-code-mirror-file-insert-extension.ts index e7d92c721..00f50200b 100644 --- a/src/components/editor-page/editor-pane/hooks/code-mirror-extensions/use-code-mirror-file-insert-extension.ts +++ b/src/components/editor-page/editor-pane/hooks/code-mirror-extensions/use-code-mirror-file-insert-extension.ts @@ -8,7 +8,7 @@ import { useMemo } from 'react' import { EditorView } from '@codemirror/view' import type { Extension } from '@codemirror/state' import { handleUpload } from '../use-handle-upload' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' import type { CursorSelection } from '../../tool-bar/formatters/types/cursor-selection' const calculateCursorPositionInEditor = (view: EditorView, event: MouseEvent): number => { diff --git a/src/components/editor-page/editor-pane/hooks/image-upload-from-renderer/use-on-image-upload-from-renderer.ts b/src/components/editor-page/editor-pane/hooks/image-upload-from-renderer/use-on-image-upload-from-renderer.ts index f219ab062..df0ff9983 100644 --- a/src/components/editor-page/editor-pane/hooks/image-upload-from-renderer/use-on-image-upload-from-renderer.ts +++ b/src/components/editor-page/editor-pane/hooks/image-upload-from-renderer/use-on-image-upload-from-renderer.ts @@ -11,7 +11,7 @@ import { useCallback } from 'react' import { getGlobalState } from '../../../../../redux' import { Logger } from '../../../../../utils/logger' import { findRegexMatchInText } from './find-regex-match-in-text' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' import { useHandleUpload } from '../use-handle-upload' import type { CursorSelection } from '../../tool-bar/formatters/types/cursor-selection' @@ -40,7 +40,7 @@ export const useOnImageUploadFromRenderer = (): void => { const file = new File([blob], fileName, { type: blob.type }) const { cursorSelection, alt, title } = Optional.ofNullable(lineIndex) .flatMap((actualLineIndex) => findPlaceholderInMarkdownContent(actualLineIndex, placeholderIndexInLine)) - .orElseGet(() => ({})) + .orElse({} as ExtractResult) handleUpload(file, cursorSelection, alt, title) }) .catch((error) => log.error(error)) diff --git a/src/components/editor-page/editor-pane/hooks/table-paste/use-code-mirror-table-paste-extension.ts b/src/components/editor-page/editor-pane/hooks/table-paste/use-code-mirror-table-paste-extension.ts index e6803c852..1f702c2aa 100644 --- a/src/components/editor-page/editor-pane/hooks/table-paste/use-code-mirror-table-paste-extension.ts +++ b/src/components/editor-page/editor-pane/hooks/table-paste/use-code-mirror-table-paste-extension.ts @@ -9,7 +9,7 @@ import { EditorView } from '@codemirror/view' import type { Extension } from '@codemirror/state' import { useApplicationState } from '../../../../../hooks/common/use-application-state' import { changeEditorContent } from '../../../change-content-context/use-change-editor-content-callback' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' import { replaceSelection } from '../../tool-bar/formatters/replace-selection' import { convertClipboardTableToMarkdown, isTable } from './table-extractor' import { isCursorInCodeFence } from './codefenceDetection' diff --git a/src/components/editor-page/editor-pane/tool-bar/emoji-picker/emoji-picker-button.tsx b/src/components/editor-page/editor-pane/tool-bar/emoji-picker/emoji-picker-button.tsx index 5877719df..c24eb5ef3 100644 --- a/src/components/editor-page/editor-pane/tool-bar/emoji-picker/emoji-picker-button.tsx +++ b/src/components/editor-page/editor-pane/tool-bar/emoji-picker/emoji-picker-button.tsx @@ -11,7 +11,7 @@ import { ForkAwesomeIcon } from '../../../../common/fork-awesome/fork-awesome-ic import { EmojiPicker } from './emoji-picker' import { cypressId } from '../../../../../utils/cypress-attribute' import type { EmojiClickEventDetail } from 'emoji-picker-element/shared' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' import { useChangeEditorContentCallback } from '../../../change-content-context/use-change-editor-content-callback' import { replaceSelection } from '../formatters/replace-selection' import { extractEmojiShortCode } from './extract-emoji-short-code' diff --git a/src/components/editor-page/editor-pane/tool-bar/formatters/replace-in-content.ts b/src/components/editor-page/editor-pane/tool-bar/formatters/replace-in-content.ts index 18717e3e5..3b3c30454 100644 --- a/src/components/editor-page/editor-pane/tool-bar/formatters/replace-in-content.ts +++ b/src/components/editor-page/editor-pane/tool-bar/formatters/replace-in-content.ts @@ -5,7 +5,7 @@ */ import type { ContentEdits } from './types/changes' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' export const replaceInContent = (currentContent: string, replaceable: string, replacement: string): ContentEdits => { return Optional.ofNullable(currentContent.indexOf(replaceable)) diff --git a/src/components/editor-page/editor-pane/tool-bar/upload-image-button/extract-selected-text.ts b/src/components/editor-page/editor-pane/tool-bar/upload-image-button/extract-selected-text.ts index 8c651d12e..5f101d049 100644 --- a/src/components/editor-page/editor-pane/tool-bar/upload-image-button/extract-selected-text.ts +++ b/src/components/editor-page/editor-pane/tool-bar/upload-image-button/extract-selected-text.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: AGPL-3.0-only */ import type { EditorState } from '@codemirror/state' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' /** * Extracts the currently selected text from the given CodeMirror state. @@ -16,6 +16,6 @@ export const extractSelectedText = (state: EditorState): string | undefined => { return Optional.ofNullable(state.selection.main) .map((selection) => [selection.from, selection.to]) .filter(([from, to]) => from !== to) - .map(([from, to]) => state.sliceDoc(from, to)) + .map(([from, to]) => state.sliceDoc(from, to)) .orElse(undefined) } diff --git a/src/components/editor-page/editor-pane/tool-bar/upload-image-button/upload-image-button.tsx b/src/components/editor-page/editor-pane/tool-bar/upload-image-button/upload-image-button.tsx index 2a29a8819..f6b16d7b4 100644 --- a/src/components/editor-page/editor-pane/tool-bar/upload-image-button/upload-image-button.tsx +++ b/src/components/editor-page/editor-pane/tool-bar/upload-image-button/upload-image-button.tsx @@ -15,7 +15,7 @@ import { useHandleUpload } from '../../hooks/use-handle-upload' import { ShowIf } from '../../../../common/show-if/show-if' import { useCodeMirrorReference } from '../../../change-content-context/change-content-context' import { extractSelectedText } from './extract-selected-text' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' /** * Shows a button that uploads a chosen file to the backend and adds the link to the note. @@ -33,7 +33,7 @@ export const UploadImageButton: React.FC = () => { const onUploadImage = useCallback( (file: File) => { const description = Optional.ofNullable(codeMirror?.state) - .map((state) => extractSelectedText(state)) + .map((state) => extractSelectedText(state)) .orElse(undefined) handleUpload(file, undefined, description) return Promise.resolve() diff --git a/src/components/history-page/history-toolbar/toolbar-context/use-history-toolbar-state.tsx b/src/components/history-page/history-toolbar/toolbar-context/use-history-toolbar-state.tsx index 4d00ff8f2..c667b9892 100644 --- a/src/components/history-page/history-toolbar/toolbar-context/use-history-toolbar-state.tsx +++ b/src/components/history-page/history-toolbar/toolbar-context/use-history-toolbar-state.tsx @@ -1,10 +1,10 @@ /* - * SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file) + * SPDX-FileCopyrightText: 2022 The HedgeDoc developers (see AUTHORS file) * * SPDX-License-Identifier: AGPL-3.0-only */ -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' import { useContext } from 'react' import type { HistoryToolbarStateWithDispatcher } from './toolbar-context' import { historyToolbarStateContext } from './history-toolbar-state-context-provider' diff --git a/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-border-color-node-preprocessor.ts b/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-border-color-node-preprocessor.ts index 422c47b55..5c1d4a60b 100644 --- a/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-border-color-node-preprocessor.ts +++ b/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-border-color-node-preprocessor.ts @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file) + * SPDX-FileCopyrightText: 2022 The HedgeDoc developers (see AUTHORS file) * * SPDX-License-Identifier: AGPL-3.0-only */ @@ -7,7 +7,7 @@ import type { Element, Node } from 'domhandler' import { isTag, isText } from 'domhandler' import { TravelerNodeProcessor } from '../../node-preprocessors/traveler-node-processor' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' import { BlockquoteExtraTagMarkdownExtension } from './blockquote-extra-tag-markdown-extension' /** diff --git a/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-color-extra-tag-replacer.tsx b/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-color-extra-tag-replacer.tsx index 32e1cdf5e..904c8c96d 100644 --- a/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-color-extra-tag-replacer.tsx +++ b/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-color-extra-tag-replacer.tsx @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file) + * SPDX-FileCopyrightText: 2022 The HedgeDoc developers (see AUTHORS file) * * SPDX-License-Identifier: AGPL-3.0-only */ @@ -10,9 +10,9 @@ import type { Element } from 'domhandler' import { isText } from 'domhandler' import { ForkAwesomeIcon } from '../../../common/fork-awesome/fork-awesome-icon' import { cssColor } from './blockquote-border-color-node-preprocessor' -import Optional from 'optional-js' import type { Text } from 'domhandler/lib/node' import { BlockquoteExtraTagMarkdownExtension } from './blockquote-extra-tag-markdown-extension' +import { Optional } from '@mrdrogdrog/optional' /** * Replaces elements with "color" as label and a valid color as content @@ -32,7 +32,7 @@ export class BlockquoteColorExtraTagReplacer extends ComponentReplacer { .filter(isText) .map((child) => (child as Text).data) .filter((content) => cssColor.test(content)) - .map((color) => ( + .map((color) => ( diff --git a/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-extra-tag-markdown-it-plugin.ts b/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-extra-tag-markdown-it-plugin.ts index d67572bb6..541f685e6 100644 --- a/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-extra-tag-markdown-it-plugin.ts +++ b/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-extra-tag-markdown-it-plugin.ts @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file) + * SPDX-FileCopyrightText: 2022 The HedgeDoc developers (see AUTHORS file) * * SPDX-License-Identifier: AGPL-3.0-only */ @@ -7,7 +7,7 @@ import type MarkdownIt from 'markdown-it/lib' import type Token from 'markdown-it/lib/token' import type { IconName } from '../../../common/fork-awesome/types' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' import type StateInline from 'markdown-it/lib/rules_inline/state_inline' import { BlockquoteExtraTagMarkdownExtension } from './blockquote-extra-tag-markdown-extension' import type { RuleInline } from 'markdown-it/lib/parser_inline' diff --git a/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-extra-tag-replacer.tsx b/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-extra-tag-replacer.tsx index 307022c19..49e9949b2 100644 --- a/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-extra-tag-replacer.tsx +++ b/src/components/markdown-renderer/markdown-extension/blockquote/blockquote-extra-tag-replacer.tsx @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file) + * SPDX-FileCopyrightText: 2022 The HedgeDoc developers (see AUTHORS file) * * SPDX-License-Identifier: AGPL-3.0-only */ @@ -11,7 +11,7 @@ import type { ForkAwesomeIconProps } from '../../../common/fork-awesome/fork-awe import { ForkAwesomeIcon } from '../../../common/fork-awesome/fork-awesome-icon' import type { IconName } from '../../../common/fork-awesome/types' import { ForkAwesomeIcons } from '../../../common/fork-awesome/fork-awesome-icons' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' import type { ReactElement } from 'react' import { BlockquoteExtraTagMarkdownExtension } from './blockquote-extra-tag-markdown-extension' @@ -44,9 +44,7 @@ export class BlockquoteExtraTagReplacer extends ComponentReplacer { private buildIconElement(node: Element): ReactElement | undefined { return Optional.ofNullable(node.attribs['data-icon'] as IconName) .filter((iconName) => ForkAwesomeIcons.includes(iconName)) - .map | undefined>((iconName) => ( - - )) + .map((iconName) => ) .orElse(undefined) } } diff --git a/src/components/markdown-renderer/markdown-extension/code-block-markdown-extension/code-block-markdown-plugin.ts b/src/components/markdown-renderer/markdown-extension/code-block-markdown-extension/code-block-markdown-plugin.ts index 5502c5dbd..4f7773b21 100644 --- a/src/components/markdown-renderer/markdown-extension/code-block-markdown-extension/code-block-markdown-plugin.ts +++ b/src/components/markdown-renderer/markdown-extension/code-block-markdown-extension/code-block-markdown-plugin.ts @@ -6,7 +6,7 @@ import type MarkdownIt from 'markdown-it' import type { RuleCore } from 'markdown-it/lib/parser_core' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' import { parseCodeBlockParameters } from './code-block-parameters' const ruleName = 'code-highlighter' diff --git a/src/components/markdown-renderer/markdown-extension/code-block-markdown-extension/find-language-by-code-block-name.ts b/src/components/markdown-renderer/markdown-extension/code-block-markdown-extension/find-language-by-code-block-name.ts index 101140ba4..28501776a 100644 --- a/src/components/markdown-renderer/markdown-extension/code-block-markdown-extension/find-language-by-code-block-name.ts +++ b/src/components/markdown-renderer/markdown-extension/code-block-markdown-extension/find-language-by-code-block-name.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' import type { LanguageDescription } from '@codemirror/language' import { parseCodeBlockParameters } from './code-block-parameters' @@ -21,7 +21,7 @@ export const findLanguageByCodeBlockName = ( inputLanguageName: string ): LanguageDescription | null => { return Optional.ofNullable(parseCodeBlockParameters(inputLanguageName).language) - .map((filteredLanguage) => + .map((filteredLanguage) => languages.find((language) => language.name === filteredLanguage || language.alias.includes(filteredLanguage)) ) .orElse(null) diff --git a/src/components/markdown-renderer/utils/node-to-react-transformer.tsx b/src/components/markdown-renderer/utils/node-to-react-transformer.tsx index b93684be8..132bae546 100644 --- a/src/components/markdown-renderer/utils/node-to-react-transformer.tsx +++ b/src/components/markdown-renderer/utils/node-to-react-transformer.tsx @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file) + * SPDX-FileCopyrightText: 2022 The HedgeDoc developers (see AUTHORS file) * * SPDX-License-Identifier: AGPL-3.0-only */ @@ -11,7 +11,7 @@ import type { ComponentReplacer, NodeReplacement, ValidReactDomElement } from '. import { DO_NOT_REPLACE, REPLACE_WITH_NOTHING } from '../replace-components/component-replacer' import React from 'react' import type { LineWithId } from '../markdown-extension/linemarker/types' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' import { LinemarkerMarkdownExtension } from '../markdown-extension/linemarker/linemarker-markdown-extension' type LineIndexPair = [startLineIndex: number, endLineIndex: number] diff --git a/src/components/render-page/window-post-message-communicator/window-post-message-communicator.ts b/src/components/render-page/window-post-message-communicator/window-post-message-communicator.ts index 07398c9a9..cf8944733 100644 --- a/src/components/render-page/window-post-message-communicator/window-post-message-communicator.ts +++ b/src/components/render-page/window-post-message-communicator/window-post-message-communicator.ts @@ -1,11 +1,11 @@ /* - * SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file) + * SPDX-FileCopyrightText: 2022 The HedgeDoc developers (see AUTHORS file) * * SPDX-License-Identifier: AGPL-3.0-only */ import type { Logger } from '../../../utils/logger' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' /** * Error that will be thrown if a message couldn't be sent. diff --git a/src/redux/note-details/reducers/build-state-from-task-list-update.ts b/src/redux/note-details/reducers/build-state-from-task-list-update.ts index 2039c01fb..85b2b7f0b 100644 --- a/src/redux/note-details/reducers/build-state-from-task-list-update.ts +++ b/src/redux/note-details/reducers/build-state-from-task-list-update.ts @@ -5,7 +5,7 @@ */ import type { NoteDetails } from '../types/note-details' -import Optional from 'optional-js' +import { Optional } from '@mrdrogdrog/optional' import { buildStateFromUpdatedMarkdownContentLines } from '../build-state-from-updated-markdown-content' const TASK_REGEX = /(\s*(?:[-*+]|\d+[.)]) )\[[ xX]?]( .*)/ diff --git a/yarn.lock b/yarn.lock index a6e7a504e..059364c66 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1993,6 +1993,7 @@ __metadata: "@hedgedoc/markdown-it-task-lists": 1.0.3 "@hedgedoc/realtime": 0.0.5 "@matejmazur/react-katex": 3.1.3 + "@mrdrogdrog/optional": 0.0.4 "@next/bundle-analyzer": 12.1.6 "@react-hook/resize-observer": 1.2.5 "@redux-devtools/core": 3.13.1 @@ -2077,7 +2078,6 @@ __metadata: mermaid: 9.1.2 netlify-cli: 10.5.1 next: 12.1.6 - optional-js: 2.3.0 prettier: 2.7.1 react: 18.2.0 react-bootstrap: 1.6.5 @@ -2673,6 +2673,13 @@ __metadata: languageName: node linkType: hard +"@mrdrogdrog/optional@npm:0.0.4": + version: 0.0.4 + resolution: "@mrdrogdrog/optional@npm:0.0.4" + checksum: f23ece2f8e72f8f807a185f739a681661879c8e66137f1ec07764133353b224876e56852215bab79114d4885e5eab1fa4447a3f584c551eb57f832cc7f4e43bf + languageName: node + linkType: hard + "@mrmlnc/readdir-enhanced@npm:^2.2.1": version: 2.2.1 resolution: "@mrmlnc/readdir-enhanced@npm:2.2.1" @@ -16121,13 +16128,6 @@ __metadata: languageName: node linkType: hard -"optional-js@npm:2.3.0": - version: 2.3.0 - resolution: "optional-js@npm:2.3.0" - checksum: f957ed47291c23b4fc54cd46df10606f2c8e7784210ee200446900b1bec9dcafc9e80f351e88939a4b5a03d405b0513a8dbdf7a39599d780e6d980015928be01 - languageName: node - linkType: hard - "optionator@npm:^0.8.1": version: 0.8.3 resolution: "optionator@npm:0.8.3"