/** * 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 packageJson from '../../package.json' with { type: 'json' }; import { type NewElementFromStateCreator, type ElementClassifier, type DragElementClassifier, type ElementIconGetter, type DSL_LegendStudioApplicationPlugin_Extension, type NewElementState, type ElementEditorStateCreator, type EditorStore, type ElementEditorState, type PureGrammarParserElementDocumentationGetter, type PureGrammarParserDocumentationGetter, type PureGrammarParserKeywordSuggestionGetter, type PureGrammarParserElementSnippetSuggestionsGetter, LegendStudioApplicationPlugin, type ExplorerContextMenuItemRendererConfiguration, type EditorExtensionStateBuilder, type EditorExtensionComponentRendererConfiguration, PACKAGEABLE_ELEMENT_GROUP_BY_CATEGORY, type NewElementDriverEditorRenderer, type NewElementDriverCreator, type NewElementDriver, } from '@finos/legend-application-studio'; import { type ElementObserver, type PackageableElement, } from '@finos/legend-graph'; import type { ApplicationPageEntry } from '@finos/legend-application'; import type { PureGrammarTextSuggestion } from '@finos/legend-code-editor'; import { DataSpace, observe_DataSpace, } from '@finos/legend-extension-dsl-data-space/graph'; import { DSL_DATA_SPACE_LEGEND_STUDIO_APPLICATION_NAVIGATION_CONTEXT_KEY, DSL_DATA_SPACE_LEGEND_STUDIO_DOCUMENTATION_KEY, } from '../__lib__/DSL_DataSpace_LegendStudioDocumentation.js'; import { DataSpacePreviewState } from '../stores/DataSpacePreviewState.js'; import { SIMPLE_DATA_SPACE_SNIPPET } from '../__lib__/DSL_DataSpace_LegendStudioCodeSnippet.js'; import { DATA_SPACE_STUDIO_ROUTE_PATTERN, DataSpaceIcon, } from '@finos/legend-extension-dsl-data-space/application'; import { DataSpaceTemplateQueryPromotionReviewer } from './DataSpaceTemplateQueryPromoteReview.js'; import { DataSpaceQueryAction } from './DataSpaceQueryAction.js'; import { DataSpacePreviewAction, DataSpacePreviewDialog, } from './DataSpacePreviewAction.js'; import { DataSpaceEditorState } from '../stores/DataSpaceEditorState.js'; import { DataSpaceEditor } from './DataSpaceEditor.js'; import type { DocumentationEntry } from '@finos/legend-shared'; import { NewDataProductDriverEditor } from './DSL_NewDataProductEditor.js'; import { NewDataProductDriver } from './DSL_DataProduct_ElementDriver.js'; const DATA_SPACE_ELEMENT_TYPE = 'DATA PRODUCT'; const DATA_SPACE_ELEMENT_PROJECT_EXPLORER_DND_TYPE = 'PROJECT_EXPLORER_DATA_SPACE'; const PURE_GRAMMAR_DATA_SPACE_PARSER_NAME = 'DataSpace'; const PURE_GRAMMAR_DATA_SPACE_ELEMENT_TYPE_LABEL = 'DataSpace'; export class DSL_DataSpace_LegendStudioApplicationPlugin extends LegendStudioApplicationPlugin implements DSL_LegendStudioApplicationPlugin_Extension { constructor() { super(packageJson.extensions.applicationStudioPlugin, packageJson.version); } override getExtraRequiredDocumentationKeys(): string[] { return [ DSL_DATA_SPACE_LEGEND_STUDIO_DOCUMENTATION_KEY.CONCEPT_ELEMENT_DATA_SPACE, DSL_DATA_SPACE_LEGEND_STUDIO_DOCUMENTATION_KEY.GRAMMAR_PARSER, ]; } override getExtraApplicationPageEntries(): ApplicationPageEntry[] { return [ { key: 'promote-as-curated-template-query-page', addressPatterns: [ DATA_SPACE_STUDIO_ROUTE_PATTERN.PROMOTE_TEMPLATE_QUERY, ], renderer: () => , }, ]; } override getExtraExplorerContextMenuItemRendererConfigurations(): ExplorerContextMenuItemRendererConfiguration[] { return [ { key: 'data-space-query', renderer: (editorStore, element) => { if (element instanceof DataSpace) { return ; } return undefined; }, }, { key: 'data-space-preview', renderer: (editorStore, element) => { if (element instanceof DataSpace) { return ; } return undefined; }, }, ]; } override getExtraEditorExtensionStateBuilders(): EditorExtensionStateBuilder[] { return [(editorStore) => new DataSpacePreviewState(editorStore)]; } override getExtraEditorExtensionComponentRendererConfigurations(): EditorExtensionComponentRendererConfiguration[] { return [ { key: 'data-space-preview', renderer: (editorStore) => , }, ]; } override getExtraAccessEventLoggingApplicationContextKeys(): string[] { return [ DSL_DATA_SPACE_LEGEND_STUDIO_APPLICATION_NAVIGATION_CONTEXT_KEY.DATA_SPACE_EDITOR, ]; } getExtraPureGrammarKeywords(): string[] { return [PURE_GRAMMAR_DATA_SPACE_ELEMENT_TYPE_LABEL]; } getExtraSupportedElementTypes(): string[] { return [DATA_SPACE_ELEMENT_TYPE]; } getExtraSupportedElementTypesWithCategory?(): Map { const elementTypesWithCategoryMap = new Map(); elementTypesWithCategoryMap.set( PACKAGEABLE_ELEMENT_GROUP_BY_CATEGORY.QUERY, [DATA_SPACE_ELEMENT_TYPE], ); return elementTypesWithCategoryMap; } getExtraElementClassifiers(): ElementClassifier[] { return [ (element: PackageableElement): string | undefined => { if (element instanceof DataSpace) { return DATA_SPACE_ELEMENT_TYPE; } return undefined; }, ]; } getExtraElementIconGetters(): ElementIconGetter[] { return [ (type: string): React.ReactNode | undefined => { if (type === DATA_SPACE_ELEMENT_TYPE) { return ; } return undefined; }, ]; } getExtraNewElementFromStateCreators(): NewElementFromStateCreator[] { return [ ( type: string, name: string, state: NewElementState, ): PackageableElement | undefined => { if (type === DATA_SPACE_ELEMENT_TYPE) { return state .getNewElementDriver(NewDataProductDriver) .createElement(name); } return undefined; }, ]; } getExtraNewElementDriverEditorRenderers(): NewElementDriverEditorRenderer[] { return [ (type: string): React.ReactNode | undefined => { if (type === DATA_SPACE_ELEMENT_TYPE) { return ; } return undefined; }, ]; } getExtraNewElementDriverCreators(): NewElementDriverCreator[] { return [ ( editorStore: EditorStore, type: string, ): NewElementDriver | undefined => { if (type === DATA_SPACE_ELEMENT_TYPE) { return new NewDataProductDriver(editorStore); } return undefined; }, ]; } getExtraElementEditorRenderers(): (( editorState: ElementEditorState, ) => React.ReactNode)[] { return [ (editorState: ElementEditorState): React.ReactNode | undefined => { if (editorState instanceof DataSpaceEditorState) { return ; } return undefined; }, ]; } getExtraElementEditorStateCreators(): ElementEditorStateCreator[] { return [ ( editorStore: EditorStore, element: PackageableElement, ): ElementEditorState | undefined => { if (element instanceof DataSpace) { // return new UnsupportedElementEditorState(editorStore, element); return new DataSpaceEditorState(editorStore, element); } return undefined; }, ]; } getExtraElementObservers(): ElementObserver[] { return [ (element: PackageableElement): PackageableElement | undefined => { if (element instanceof DataSpace) { return observe_DataSpace(element); } return undefined; }, ]; } getExtraDragElementClassifiers(): DragElementClassifier[] { return [ (element: PackageableElement): string | undefined => { if (element instanceof DataSpace) { return DATA_SPACE_ELEMENT_PROJECT_EXPLORER_DND_TYPE; } return undefined; }, ]; } getExtraPureGrammarTextEditorDragElementTypes(): string[] { return [DATA_SPACE_ELEMENT_PROJECT_EXPLORER_DND_TYPE]; } getExtraPureGrammarParserElementDocumentationGetters(): PureGrammarParserElementDocumentationGetter[] { return [ ( editorStore: EditorStore, parserKeyword: string, elementKeyword: string, ): DocumentationEntry | undefined => { if (parserKeyword === PURE_GRAMMAR_DATA_SPACE_PARSER_NAME) { if (elementKeyword === PURE_GRAMMAR_DATA_SPACE_ELEMENT_TYPE_LABEL) { return editorStore.applicationStore.documentationService.getDocEntry( DSL_DATA_SPACE_LEGEND_STUDIO_DOCUMENTATION_KEY.CONCEPT_ELEMENT_DATA_SPACE, ); } } return undefined; }, ]; } getExtraPureGrammarParserDocumentationGetters(): PureGrammarParserDocumentationGetter[] { return [ ( editorStore: EditorStore, parserKeyword: string, ): DocumentationEntry | undefined => { if (parserKeyword === PURE_GRAMMAR_DATA_SPACE_PARSER_NAME) { return editorStore.applicationStore.documentationService.getDocEntry( DSL_DATA_SPACE_LEGEND_STUDIO_DOCUMENTATION_KEY.GRAMMAR_PARSER, ); } return undefined; }, ]; } getExtraPureGrammarParserKeywordSuggestionGetters(): PureGrammarParserKeywordSuggestionGetter[] { return [ (editorStore: EditorStore): PureGrammarTextSuggestion[] => [ { text: PURE_GRAMMAR_DATA_SPACE_PARSER_NAME, description: `(dsl)`, documentation: editorStore.applicationStore.documentationService.getDocEntry( DSL_DATA_SPACE_LEGEND_STUDIO_DOCUMENTATION_KEY.GRAMMAR_PARSER, ), insertText: PURE_GRAMMAR_DATA_SPACE_PARSER_NAME, }, ], ]; } getExtraPureGrammarParserElementSnippetSuggestionsGetters(): PureGrammarParserElementSnippetSuggestionsGetter[] { return [ ( editorStore: EditorStore, parserKeyword: string, ): PureGrammarTextSuggestion[] | undefined => parserKeyword === PURE_GRAMMAR_DATA_SPACE_PARSER_NAME ? [ { text: PURE_GRAMMAR_DATA_SPACE_ELEMENT_TYPE_LABEL, insertText: SIMPLE_DATA_SPACE_SNIPPET, }, ] : undefined, ]; } }