@finos/legend-application-studio
Version:
Legend Studio application core
360 lines (304 loc) • 11.7 kB
text/typescript
/**
* Copyright (c) 2020-present, Goldman Sachs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import type { LegendStudioPluginManager } from '../application/LegendStudioPluginManager.js';
import type { ElementEditorState } from './editor/editor-state/element-editor-state/ElementEditorState.js';
import type {
EditorExtensionState,
EditorStore,
} from './editor/EditorStore.js';
import type {
NewElementDriver,
NewElementState,
} from './editor/NewElementState.js';
import type { Class, PackageableElement, Testable } from '@finos/legend-graph';
import {
LegendApplicationPlugin,
type ApplicationPageEntry,
} from '@finos/legend-application';
import type { TestableMetadata } from './editor/sidebar-state/testable/GlobalTestRunnerState.js';
import type {
ExtensionModelImportRendererState,
ModelImporterState,
} from './editor/editor-state/ModelImporterState.js';
import type { PureGrammarTextSuggestion } from '@finos/legend-code-editor';
import type { DocumentationEntry } from '@finos/legend-shared';
export type ExplorerContextMenuItemRendererConfiguration = {
key: string;
renderer: (
editorStore: EditorStore,
element: PackageableElement | undefined,
) => React.ReactNode | undefined;
};
export type EditorExtensionComponentRendererConfiguration = {
key: string;
renderer: (editorStore: EditorStore) => React.ReactNode | undefined;
};
export type EditorExtensionStateBuilder = (
editorStore: EditorStore,
) => EditorExtensionState | undefined;
export type ClassPreviewRenderer = (
_class: Class,
) => React.ReactNode | undefined;
export type ModelImporterExtensionConfiguration = {
key: string;
label?: string | undefined;
allowHardReplace?: boolean;
getExtensionModelImportRendererStateCreator: (
modelImporterState: ModelImporterState,
) => ExtensionModelImportRendererState;
renderer: (
rendererState: ExtensionModelImportRendererState,
) => React.ReactNode | undefined;
loadModel: (
rendererState: ExtensionModelImportRendererState,
) => Promise<void>;
};
export type TestableMetadataGetter = (
testable: Testable,
editorStore: EditorStore,
) => TestableMetadata | undefined;
export type TestRunnerViewConfiguration = {
key: string;
title: string;
renderer: (editorStore: EditorStore) => React.ReactNode | undefined;
};
export type ActivityBarItemConfiguration = {
key: string;
title: string;
icon: React.ReactElement;
disabled?: (editorStore: EditorStore) => boolean;
renderer: (editorStore: EditorStore) => React.ReactNode;
};
export type StudioApplicationPageEntry = ApplicationPageEntry & {
nonSDLCApp?: boolean | undefined;
};
export abstract class LegendStudioApplicationPlugin extends LegendApplicationPlugin {
/**
* This helps to better type-check for this empty abtract type
* See https://github.com/finos/legend-studio/blob/master/docs/technical/typescript-usage.md#understand-typescript-structual-type-system
*/
private readonly _$nominalTypeBrand!: 'LegendStudioApplicationPlugin';
install(pluginManager: LegendStudioPluginManager): void {
pluginManager.registerApplicationPlugin(this);
}
/**
* Get the list of application page entries to be rendered.
*/
override getExtraApplicationPageEntries?(): StudioApplicationPageEntry[];
/**
* Get the list of extension state builders for editor store.
*
* This is a mechanism to have the store holds references to extension states
* so that we can refer back to these states when needed or do cross-extensions
* operations
*/
getExtraEditorExtensionStateBuilders?(): EditorExtensionStateBuilder[];
/**
* Get the list of items to be rendered in the explorer context menu.
*/
getExtraExplorerContextMenuItemRendererConfigurations?(): ExplorerContextMenuItemRendererConfiguration[];
/**
* Get the list of configurations for the renderer of editor extension states.
*/
getExtraEditorExtensionComponentRendererConfigurations?(): EditorExtensionComponentRendererConfiguration[];
/**
* Get the list of renderers for the preview panel of a class.
*/
getExtraClassPreviewRenderers?(): ClassPreviewRenderer[];
/**
* Get the list of extension configurations for model importer.
*/
getExtraModelImporterExtensionConfigurations?(): ModelImporterExtensionConfiguration[];
/**
* Get the list of extension for testables
*/
getExtraTestableMetadata?(): TestableMetadataGetter[];
/**
* Get the list of view configurations for test runner.
*/
getExtraTestRunnerViewConfigurations?(): TestRunnerViewConfiguration[];
/**
* Get the list of extra activity bar item configurations.
* These add new activities to the activity bar with corresponding sidebar panels.
*/
getExtraActivityBarItemConfigurations?(): ActivityBarItemConfiguration[];
}
export type PureGrammarElementLabeler = (
metamodel: PackageableElement,
) => string | undefined;
export type ElementClassifier = (
metamodel: PackageableElement,
) => string | undefined;
// TODO: we should consider restrict the usage of type classifier and consider using the element instead
// the only mechanism that really needs the type classifier is element creation, which we could refactor
// to have a plugin that produces a single configuration for the creation ceremony
// e.g.
// export type ElementCreatorConfiguration = {
// key: string;
// label: string;
// icon: React.ReactNode;
// ...
// }
export type ElementIconGetter = (
type: string,
element: PackageableElement | undefined,
) => React.ReactNode | undefined;
export type ElementTypeLabelGetter = (type: string) => string | undefined;
export type NewElementFromStateCreator = (
type: string,
name: string,
state: NewElementState,
) => PackageableElement | undefined;
export type NewElementDriverCreator = (
editorStore: EditorStore,
type: string,
) => NewElementDriver<PackageableElement> | undefined;
export type NewElementDriverEditorRenderer = (
type: string,
) => React.ReactNode | undefined;
export type ElementEditorPostCreateAction = (
editorStore: EditorStore,
element: PackageableElement,
) => void;
export type ElementEditorPostRenameAction = (
editorStore: EditorStore,
element: PackageableElement,
// newPath?
) => void;
export type ElementEditorPostDeleteAction = (
editorStore: EditorStore,
element: PackageableElement,
) => void;
export type ElementEditorRenderer = (
elementEditorState: ElementEditorState,
) => React.ReactNode | undefined;
export type ElementEditorStateCreator = (
editorStore: EditorStore,
element: PackageableElement,
) => ElementEditorState | undefined;
export type DragElementClassifier = (
element: PackageableElement,
) => string | undefined;
export type PureGrammarParserDocumentationGetter = (
editorStore: EditorStore,
parserKeyword: string,
) => DocumentationEntry | undefined;
export type PureGrammarParserElementDocumentationGetter = (
editorStore: EditorStore,
parserKeyword: string,
elementKeyword: string,
) => DocumentationEntry | undefined;
export type PureGrammarParserKeywordSuggestionGetter = (
editorStore: EditorStore,
) => PureGrammarTextSuggestion[];
export type PureGrammarParserElementSnippetSuggestionsGetter = (
editorStore: EditorStore,
parserKeyword: string,
) => PureGrammarTextSuggestion[] | undefined;
/**
* Studio plugins for new DSL extension.
*/
export interface DSL_LegendStudioApplicationPlugin_Extension
extends LegendStudioApplicationPlugin {
/**
* Get the list of supported Pure grammar keywords.
*/
getExtraPureGrammarKeywords?(): string[];
/**
* Get the list of the supported packageable element type specifiers.
*/
getExtraSupportedElementTypes?(): string[];
/**
* Get the Map of the supported packageable element type specifiers with its category.
*/
getExtraSupportedElementTypesWithCategory?(): Map<string, string[]>;
/**
* Get the list of classifiers for a packageable element.
*/
getExtraElementClassifiers?(): ElementClassifier[];
/**
* Get the list of (user-friendly) type labelers for a packageable element.
*/
getExtraElementTypeLabelGetters?(): ElementTypeLabelGetter[];
/**
* Get the list of icon renderers for a packageable element.
*/
getExtraElementIconGetters?(): ElementIconGetter[];
/**
* Get the list of creators for packageable element given the creation state.
*/
getExtraNewElementFromStateCreators?(): NewElementFromStateCreator[];
/**
* Get the list of creators for element creation state driver given the element type specifier.
*/
getExtraNewElementDriverCreators?(): NewElementDriverCreator[];
/**
* Get the list of renderers for the editor for an element creation state driver given the element type specifier.
*/
getExtraNewElementDriverEditorRenderers?(): NewElementDriverEditorRenderer[];
/**
* Get the list of actions to perform after creating a new packageable element.
*/
getExtraElementEditorPostCreateActions?(): ElementEditorPostCreateAction[];
/**
* Get the list of actions to perform after renaming a packageable element.
*/
getExtraElementEditorPostRenameActions?(): ElementEditorPostRenameAction[];
/**
* Get the list of actions to perform after deleting a packageable element.
*/
getExtraElementEditorPostDeleteActions?(): ElementEditorPostDeleteAction[];
/**
* Get the list of renderers for the editor for a packageable element.
*/
getExtraElementEditorRenderers?(): ElementEditorRenderer[];
/**
* Get the list of creators for element editor state.
*/
getExtraElementEditorStateCreators?(): ElementEditorStateCreator[];
/**
* Get the list of the classifiers for draggable elements from explorer tree
*/
getExtraDragElementClassifiers?(): DragElementClassifier[];
/**
* Get the list of the supported drag element type speficiers for Pure grammar text editor.
*/
getExtraPureGrammarTextEditorDragElementTypes?(): string[];
/**
* Get the list of Pure grammar parser description getters based on parser section keyword
* (e.g. ###Pure, ###Mapping, etc.)
*/
getExtraPureGrammarParserDocumentationGetters?(): PureGrammarParserDocumentationGetter[];
/**
* Get the list of Pure grammar element documentation getters based on the value of the
* element and the parser keywords (e.g. Class, Enum in ###Pure section)
*/
getExtraPureGrammarParserElementDocumentationGetters?(): PureGrammarParserElementDocumentationGetter[];
/**
* Get the list of Pure grammar parser keyword suggestion getters (e.g. ###Pure, ###Mapping)
*/
getExtraPureGrammarParserKeywordSuggestionGetters?(): PureGrammarParserKeywordSuggestionGetter[];
/**
* Get the list of Pure grammar element suggestion snippet getters based on the parser section
* (e.g. Class, Enum in ###Pure)
*/
getExtraPureGrammarParserElementSnippetSuggestionsGetters?(): PureGrammarParserElementSnippetSuggestionsGetter[];
/**
* Get a string of the Pure grammar element name for auto-folding the element
* (e.g. Diagram, or Text)
*/
getExtraGrammarTextEditorAutoFoldingElementCreatorKeywords?(): string[];
}