[WIKI-578] refactor: editor types structure#7536
Conversation
|
Pull Request Linked with Plane Work Items
Comment Automatically Generated by Plane |
There was a problem hiding this comment.
Pull Request Overview
This PR refactors the editor type structure by standardizing TypeScript type definitions and improving type safety. The changes focus on converting interface declarations to type aliases and replacing any types with unknown for better type safety.
- Replace all
interfacedeclarations withtypealiases for consistency - Replace
anytype annotations withunknownfor improved type safety - Consolidate duplicate type definitions by moving them to a centralized location
Reviewed Changes
Copilot reviewed 29 out of 29 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| packages/editor/src/core/types/editor.ts | Convert editor interfaces to types and consolidate IMarking import |
| packages/editor/src/core/helpers/scroll-to-node.ts | Remove duplicate IMarking definition and import from centralized types |
| packages/editor/src/core/helpers/common.ts | Convert EditorClassNames interface to type |
| packages/editor/src/core/extensions/work-item-embed/extension.tsx | Replace any with proper NodeViewProps type |
| packages/editor/src/core/extensions/utility.ts | Convert UtilityExtensionStorage interface to type |
| packages/editor/src/core/extensions/typography/inputRules.ts | Convert TypographyOptions interface to type |
| packages/editor/src/core/extensions/table/table/utilities/helpers.ts | Add constant usage for paragraph type |
| packages/editor/src/core/extensions/table/table/utilities/delete-key-shortcut.ts | Convert interfaces to types and add proper imports |
| packages/editor/src/core/extensions/table/table/utilities/create-cell.ts | Replace any with unknown in attrs parameter |
| packages/editor/src/core/extensions/table/table/table.ts | Convert TableOptions interface to type and replace any with unknown |
| packages/editor/src/core/extensions/table/table-row.ts | Convert TableRowOptions interface to type and replace any with unknown |
| packages/editor/src/core/extensions/table/table-header.ts | Convert TableHeaderOptions interface to type and replace any with unknown |
| packages/editor/src/core/extensions/table/table-cell.ts | Convert TableCellOptions interface to type and replace any with unknown |
| packages/editor/src/core/extensions/horizontal-rule.ts | Convert HorizontalRuleOptions interface to type and replace any with unknown |
| packages/editor/src/core/extensions/headings-list.ts | Remove duplicate IMarking definition and import from types |
| packages/editor/src/core/extensions/emoji/emoji.ts | Replace any with unknown in EmojiItem and EmojiOptions |
| packages/editor/src/core/extensions/emoji/components/emojis-list.tsx | Convert interfaces to types and reorganize type definitions |
| packages/editor/src/core/extensions/custom-link/extension.tsx | Convert interfaces to types and replace any with unknown |
| packages/editor/src/core/extensions/code/code-block.ts | Convert CodeBlockOptions interface to type and replace any with unknown |
| packages/editor/src/core/extensions/code/code-block-node-view.tsx | Convert interface to type and rename for clarity |
| packages/editor/src/core/extensions/code/code-block-lowlight.ts | Convert interface to type using intersection |
| packages/editor/src/core/extensions/code-inline/index.tsx | Convert CodeOptions interface to type and rename for clarity |
| packages/editor/src/core/components/menus/bubble-menu/root.tsx | Convert EditorStateType interface to type |
| packages/editor/src/core/components/menus/block-menu.tsx | Convert interface to type and add proper imports |
| packages/editor/src/core/components/links/link-view.tsx | Convert LinkViewProps interface to type |
| packages/editor/src/core/components/links/link-edit-view.tsx | Convert interfaces to types |
| packages/editor/src/core/components/editors/link-view-container.tsx | Convert interface to type |
| packages/editor/src/core/components/editors/editor-content.tsx | Convert interface to type and add proper imports |
| packages/editor/src/core/components/editors/editor-container.tsx | Convert interface to type |
Comments suppressed due to low confidence (2)
packages/editor/src/core/extensions/code-inline/index.tsx:5
- [nitpick] The type name 'InlineCodeOptions' is inconsistent with the original 'CodeOptions'. Consider keeping the original name or ensuring this naming change is intentional and consistent throughout the codebase.
type InlineCodeOptions = {
packages/editor/src/core/extensions/code/code-block-node-view.tsx:18
- [nitpick] The generic type name 'Props' is less descriptive than the original 'CodeBlockComponentProps'. Consider using a more specific name like 'CodeBlockComponentProps' to maintain clarity.
type Props = {
|
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. WalkthroughThis update refactors numerous TypeScript interface declarations to type aliases across editor components and extensions, standardizes the use of Changes
Sequence Diagram(s)sequenceDiagram
participant ParentComponent
participant DocumentEditor
participant PageRenderer
ParentComponent->>DocumentEditor: Render with isTouchDevice prop
DocumentEditor->>PageRenderer: Passes isTouchDevice prop
PageRenderer-->>DocumentEditor: Renders based on isTouchDevice
Estimated code review effort🎯 2 (Simple) | ⏱️ ~8 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Note ⚡️ Unit Test Generation is now available in beta!Learn more here, or try it out under "Finishing Touches" below. ✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
|
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. ✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
3 similar comments
|
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. ✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
|
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. ✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
|
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. ✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 0
♻️ Duplicate comments (1)
packages/editor/src/core/extensions/code/code-block-lowlight.ts (1)
6-9: Good interface-to-type conversion, but address theanytype.The conversion from interface to type alias aligns with the PR objectives. However, the
lowlightproperty should use a more specific type instead ofany, consistent with the PR goal of replacinganywithunknownwhere possible.
🧹 Nitpick comments (8)
packages/editor/src/core/extensions/table/table/utilities/helpers.ts (1)
4-5: Import only what’s needed to maximise tree-shaking benefits
CORE_EXTENSIONSis presumably an object containing several string constants, yet this file only uses thePARAGRAPHentry. Importing the whole object can marginally inflate bundle size and prevents some bundlers from pruning unused keys.-import { CORE_EXTENSIONS } from "@/constants/extension"; +import { CORE_EXTENSIONS } from "@/constants/extension"; // current approach + +// Optional leaner variant: +// import { PARAGRAPH } from "@/constants/extension";If the constants module supports named exports, the latter keeps the dependency surface minimal.
packages/editor/src/core/components/menus/bubble-menu/root.tsx (1)
32-50: Consider extracting the repeated color-option shape
colorandbackgroundColorshare the same inline object definition. Extracting a dedicatedtype ColorOption = { key: string; label: string; textColor: string; backgroundColor: string }would reduce duplication and tighten future refactors.-type EditorStateType = { - … - color: { key: string; label: string; textColor: string; backgroundColor: string } | undefined; - backgroundColor: - | { - key: string; - label: string; - textColor: string; - backgroundColor: string; - } - | undefined; -}; +type ColorOption = { + key: string; + label: string; + textColor: string; + backgroundColor: string; +}; + +export type EditorStateType = { + … + color?: ColorOption; + backgroundColor?: ColorOption; +};packages/editor/src/core/components/menus/block-menu.tsx (1)
8-12: Good refactoring, consider more descriptive naming.The conversion from interface to type alias aligns with the PR objectives. However, consider using a more descriptive name like
BlockMenuPropsinstead of the genericPropsto improve code readability, especially in larger files.-type Props = { +type BlockMenuProps = { editor: Editor; }; -export const BlockMenu = (props: Props) => { +export const BlockMenu = (props: BlockMenuProps) => {packages/editor/src/core/components/editors/link-view-container.tsx (2)
7-10: Prefer more descriptive prop alias than genericPropsUsing a generic alias like
Propsmakes quick navigation harder when viewing type references in IDEs and during code-search (grep Propsyields hundreds of hits). RetainingLinkViewContainerProps(or exportingLinkViewContainer.Props) would improve traceability without affecting the refactor goal.
12-12: Component displayName not set after renamingWhen components are exported anonymously (
export const LinkViewContainer = …) the runtime display name defaults to the variable name. If you ever minify or wrap this component the display name might be lost, complicating React-DevTools inspection. Consider adding:export const LinkViewContainer: FC<Props> = ({ editor, containerRef }) => { … }; +LinkViewContainer.displayName = "LinkViewContainer";packages/editor/src/core/extensions/code/code-block-node-view.tsx (1)
18-20: Avoid the overly genericPropsaliasAs with other files, consider a more specific name such as
CodeBlockNodeViewPropsto aid discoverability and future grep-based refactors.packages/editor/src/core/components/editors/editor-content.tsx (1)
4-9: Generic prop alias reduces searchabilityThe new alias
Propsis technically fine but not uniquely identifiable. A specific name (EditorContentWrapperProps) keeps type-lookups unambiguous, especially in a large monorepo.packages/editor/src/core/extensions/code-inline/index.tsx (1)
5-8: Improved safety withunknownis 👍 — consider keeping legacy aliasThe move from
anytounknownstrengthens type-safety. However, renamingCodeOptionstoInlineCodeOptionscould break external consumers who import the old name. If this extension is part of a public API, exporting a deprecated alias for one release helps downstream teams migrate smoothly.+/** @deprecated — use InlineCodeOptions */ +export type CodeOptions = InlineCodeOptions;
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (29)
packages/editor/src/core/components/editors/document/editor.tsx(2 hunks)packages/editor/src/core/components/editors/editor-content.tsx(1 hunks)packages/editor/src/core/components/editors/link-view-container.tsx(1 hunks)packages/editor/src/core/components/links/link-edit-view.tsx(2 hunks)packages/editor/src/core/components/links/link-view.tsx(1 hunks)packages/editor/src/core/components/menus/block-menu.tsx(1 hunks)packages/editor/src/core/components/menus/bubble-menu/root.tsx(2 hunks)packages/editor/src/core/extensions/code-inline/index.tsx(2 hunks)packages/editor/src/core/extensions/code/code-block-lowlight.ts(1 hunks)packages/editor/src/core/extensions/code/code-block-node-view.tsx(2 hunks)packages/editor/src/core/extensions/code/code-block.ts(2 hunks)packages/editor/src/core/extensions/custom-link/extension.tsx(2 hunks)packages/editor/src/core/extensions/emoji/components/emojis-list.tsx(2 hunks)packages/editor/src/core/extensions/emoji/emoji.ts(1 hunks)packages/editor/src/core/extensions/headings-list.ts(1 hunks)packages/editor/src/core/extensions/horizontal-rule.ts(1 hunks)packages/editor/src/core/extensions/table/table-cell.ts(1 hunks)packages/editor/src/core/extensions/table/table-header.ts(1 hunks)packages/editor/src/core/extensions/table/table-row.ts(1 hunks)packages/editor/src/core/extensions/table/table/table.ts(1 hunks)packages/editor/src/core/extensions/table/table/utilities/create-cell.ts(1 hunks)packages/editor/src/core/extensions/table/table/utilities/delete-key-shortcut.ts(1 hunks)packages/editor/src/core/extensions/table/table/utilities/helpers.ts(2 hunks)packages/editor/src/core/extensions/typography/inputRules.ts(2 hunks)packages/editor/src/core/extensions/utility.ts(1 hunks)packages/editor/src/core/extensions/work-item-embed/extension.tsx(2 hunks)packages/editor/src/core/helpers/common.ts(1 hunks)packages/editor/src/core/helpers/scroll-to-node.ts(1 hunks)packages/editor/src/core/types/editor.ts(5 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (6)
packages/editor/src/core/extensions/code/code-block-lowlight.ts (1)
packages/editor/src/core/extensions/code/code-block.ts (1)
CodeBlockOptions(6-26)
packages/editor/src/core/components/links/link-edit-view.tsx (1)
packages/editor/src/core/components/links/link-view.tsx (2)
LinkViewProps(8-16)LinkViews(6-6)
packages/editor/src/core/extensions/table/table/utilities/delete-key-shortcut.ts (1)
packages/editor/src/core/extensions/table/plugins/insert-handlers/utils.ts (1)
TableInfo(14-20)
packages/editor/src/core/extensions/utility.ts (2)
packages/editor/src/core/types/asset.ts (1)
TEditorAsset(14-14)packages/editor/src/core/types/config.ts (1)
TFileHandler(4-20)
packages/editor/src/core/extensions/code/code-block-node-view.tsx (1)
packages/ui/src/icons/epic-icon.tsx (1)
Props(3-8)
packages/editor/src/core/types/editor.ts (1)
packages/editor/src/core/types/config.ts (1)
TUserDetails(35-40)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Build and lint web apps
🔇 Additional comments (40)
packages/editor/src/core/extensions/table/table/utilities/helpers.ts (1)
26-33: String literal replaced with constant – 👍 improves maintainabilitySwitching from the hard-coded
"paragraph"toCORE_EXTENSIONS.PARAGRAPHcentralises the source of truth and eliminates typo risk. This aligns with the refactor objective and keeps node-type checks consistent across the codebase.packages/editor/src/core/extensions/work-item-embed/extension.tsx (1)
1-1: Type-safe import & parameter annotation look correctNice replacement of
anywith the explicitNodeViewPropswhile keeping the import type-only. No other issues spotted in this hunk.Also applies to: 20-20
packages/editor/src/core/extensions/typography/inputRules.ts (1)
3-23: Interface → type alias change is benignSwitching to a
typealias preserves the original shape and causes no functional impact. ✔︎packages/editor/src/core/extensions/utility.ts (1)
33-39: Storage alias change looks fineThe conversion to a
typealias is seamless and does not alter public shape. 👍packages/editor/src/core/extensions/horizontal-rule.ts (2)
6-8: Good move fromany→unknownTightening
HTMLAttributestoRecord<string, unknown>increases type safety without runtime impact.
6-8: No external imports ofHorizontalRuleOptionsfound
A global search forHorizontalRuleOptionsonly surfaced its definition and its use inNode.create<HorizontalRuleOptions>withinpackages/editor/src/core/extensions/horizontal-rule.ts. There are no external imports of this type, so switching from an exported interface to an internaltypewill not break consumers or tests.packages/editor/src/core/extensions/custom-link/extension.tsx (2)
13-16: LGTM: Interface to type conversion is correct.The conversion from
interface LinkProtocolOptionstotype LinkProtocolOptionsmaintains the same structure and functionality while aligning with the PR's refactoring objectives.
18-50: LGTM: Improved type safety withunknownoverany.The conversion to type alias and the change from
Record<string, any>toRecord<string, unknown>on Line 43 improves type safety by requiring explicit type checking before using HTMLAttributes values.packages/editor/src/core/extensions/table/table-cell.ts (1)
12-14: LGTM: Consistent type refactoring with improved safety.The conversion to type alias and the change from
Record<string, any>toRecord<string, unknown>follows the established refactoring pattern and improves type safety.packages/editor/src/core/helpers/common.ts (2)
8-12: LGTM: Interface to type conversion with improved naming.The conversion from interface to type alias aligns with the refactoring goals, and the rename from
EditorClassNamestoEditorClassNameArgsprovides better semantic clarity about the type's purpose.
14-14: LGTM: Function signature correctly updated.The function parameter type annotation has been properly updated to use the new type alias name.
packages/editor/src/core/components/editors/document/editor.tsx (2)
33-33: LGTM: New touch device prop added.The addition of the
isTouchDeviceprop aligns with improving touch device support in the editor.
100-100: LGTM: Proper boolean conversion for prop passing.The use of
!!isTouchDeviceensures a consistent boolean type is passed to the PageRenderer component, which is good defensive programming practice.packages/editor/src/core/components/links/link-view.tsx (1)
8-16: LGTM: Consistent interface to type conversion.The conversion from
interface LinkViewPropstotype LinkViewPropsmaintains the identical structure while aligning with the PR's systematic refactoring of type declarations.packages/editor/src/core/extensions/table/table-row.ts (1)
5-7: Removing theexportmakes options no longer augmentableConverting
TableRowOptionsfrom an exportedinterfaceto an internaltypeprevents declaration-merging and external consumers from extending the options (e.g. to add custom attributes).
If any downstream code relied ondeclare module "@tiptap/core"augmentation for this node, this is a silent breaking change.Please double-check that no public plugin API relied on extending these options, or consider keeping the type exported:
-type TableRowOptions = { +export type TableRowOptions = {packages/editor/src/core/extensions/code/code-block.ts (1)
6-26: Switching frominterface→typemay be a breaking change for consumers
interfaceallowed declaration merging so external packages could augmentCodeBlockOptions.
With an exportedtypealias this is no longer possible, potentially breaking third-party extensions that add extra flags (e.g.lineNumbers?: boolean).If preventing augmentation is intentional, add a CHANGELOG entry.
Otherwise keep it as aninterfaceor provide an explicit extension point.No other issues with the
unknownsubstitution—good call tightening the type.packages/editor/src/core/helpers/scroll-to-node.ts (1)
1-3: 👍 Type-only imports are correct hereUsing
import typeavoids bundling/reactivity overhead and aligns with TS 5 “preserve value export” rules.
No concerns.packages/editor/src/core/extensions/table/table-header.ts (1)
7-9: Validate loss ofexportonTableHeaderOptionsSame concern as with
TableRowOptions: dropping the export eliminates declaration-merging and may break consumers that extend the header-cell options.
Confirm this isn’t publicly relied upon or re-export the type.packages/editor/src/core/extensions/table/table/utilities/create-cell.ts (1)
6-6: Good move tounknown
attrs?: Record<string, unknown>improves type safety without affecting runtime behaviour.
Looks correct.packages/editor/src/core/extensions/table/table/table.ts (1)
35-42: LGTM! Excellent type safety improvements.The conversion from interface to type alias and the change from
anytounknownforHTMLAttributesaligns perfectly with the PR objectives and improves type safety.packages/editor/src/core/components/menus/block-menu.tsx (1)
1-1: LGTM! Type-only import improves clarity.Converting to a type-only import for
Editoris appropriate since it's only used for type annotations.packages/editor/src/core/components/links/link-edit-view.tsx (2)
9-15: LGTM! Clean interface-to-type conversion.The conversion from interface to type alias for
InputViewPropsaligns with the PR objectives and maintains the same structure.
31-34: LGTM! Consistent type refactoring.The conversion from interface to type alias for
LinkEditViewPropsis consistent with the broader refactoring pattern across the codebase.packages/editor/src/core/extensions/table/table/utilities/delete-key-shortcut.ts (2)
1-1: LGTM! Improved import clarity.Converting to type-only imports for
EditorandKeyboardShortcutCommandis appropriate since they're only used for type annotations.
9-20: Dismiss TableInfo duplication suggestionThe
TableInfoininsert-handlers/utils.ts(fields:tableElement,tableNode,tablePos, optional button elements) serves a DOM insertion context, while the one indelete-key-shortcut.ts(fields:node,pos,map,totalColumns,totalRows) models ProseMirror table state for deletion handling. They represent different concepts and should remain separate.Likely an incorrect or invalid review comment.
packages/editor/src/core/extensions/headings-list.ts (1)
5-6: CentralisedIMarkingimport looks goodSwitching from a local interface to the shared
@/typesdefinition eliminates duplication and keeps the extension in sync with global edits. Nothing else to flag here.packages/editor/src/core/components/editors/editor-content.tsx (1)
1-1:import { type Editor }– minor tree-shaking win, good jobSwitching to a type-only import prevents the
Editorobject from leaking into the bundle. Nice attention to detail.packages/editor/src/core/extensions/code-inline/index.tsx (1)
31-31: Generic parameter updated correctly
Mark.create<InlineCodeOptions>reflects the renamed options type; compile-time behaviour remains intact.packages/editor/src/core/extensions/emoji/emoji.ts (2)
68-68: LGTM: Improved type safety withunknown.Replacing
anywithunknownfor the index signature provides better type safety by requiring explicit type checking before using values.
72-72: LGTM: Enhanced type safety for HTMLAttributes.The change from
Record<string, any>toRecord<string, unknown>improves type safety by ensuring values are properly typed before use.packages/editor/src/core/types/editor.ts (5)
9-9: LGTM: Consistent type import.Using type-only import for
IMarkingaligns with TypeScript best practices and the PR's refactoring objectives.
131-157: LGTM: Interface to type alias conversion.The conversion of
IEditorPropsfrom interface to type alias is consistent with the PR's refactoring goals while maintaining identical functionality.
165-174: LGTM: Consistent refactoring pattern.Converting
ICollaborativeDocumentEditorPropsto a type alias maintains the same structure and extendsIEditorPropscorrectly.
176-181: LGTM: Type alias conversion maintained.The
IDocumentEditorPropsconversion to type alias preserves all properties and type relationships.
183-193: LGTM: EditorEvents type conversion.Converting
EditorEventsinterface to type alias maintains the event mapping structure correctly.packages/editor/src/core/extensions/emoji/components/emojis-list.tsx (5)
2-2: LGTM: Type-only import optimization.Using type-only import for
Editorimproves compilation performance and aligns with the PR's type safety improvements.
8-14: LGTM: Interface to type conversion.Converting
EmojiIteminterface to type alias maintains the same structure while following the PR's consistent refactoring pattern.
35-37: LGTM: Ref type conversion.The
EmojiListRefconversion to type alias preserves the method signature correctly.
39-44: LGTM: Props type simplification.Converting to
Propstype alias and simplifying the name follows common React component patterns while maintaining all required properties.
46-46: LGTM: Component signature updated correctly.The component signature properly uses the new
Propstype alias, maintaining type safety.
Description
This PR refactors the editor type structure by-
interfacewithtype.anywithunknownwherever possible.Type of Change
Summary by CodeRabbit
New Features
Refactor
Style