Skip to content

Commit

Permalink
NO-ISSUE: DMN Editor: Fix random 'object not extensible' errors by ty…
Browse files Browse the repository at this point in the history
…ping everything with the new `Normalized` type, making the `@_id` property non-optional (#2351)
  • Loading branch information
tiagobento authored May 22, 2024
1 parent d164434 commit 8ae10f8
Show file tree
Hide file tree
Showing 90 changed files with 681 additions and 434 deletions.
23 changes: 14 additions & 9 deletions packages/dmn-editor-envelope/src/DmnEditorRoot.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import * as __path from "path";
import * as React from "react";
import * as DmnEditor from "@kie-tools/dmn-editor/dist/DmnEditor";
import { Normalized, normalize } from "@kie-tools/dmn-editor/dist/normalization/normalize";
import { getMarshaller } from "@kie-tools/dmn-marshaller";
import { generateUuid } from "@kie-tools/boxed-expression-component/dist/api";
import {
Expand Down Expand Up @@ -66,7 +67,7 @@ export type DmnEditorRootProps = {

export type DmnEditorRootState = {
marshaller: DmnMarshaller<typeof DMN_LATEST_VERSION> | undefined;
stack: DmnLatestModel[];
stack: Normalized<DmnLatestModel>[];
pointer: number;
openFilenormalizedPosixPathRelativeToTheWorkspaceRoot: string | undefined;
externalModelsByNamespace: DmnEditor.ExternalModelsIndex;
Expand Down Expand Up @@ -129,12 +130,16 @@ export class DmnEditorRoot extends React.Component<DmnEditorRootProps, DmnEditor
const marshaller = getMarshaller(content || EMPTY_DMN(), { upgradeTo: "latest" });

// Save stack
let savedStackPointer: DmnLatestModel[] = [];
let savedStackPointer: Normalized<DmnLatestModel>[] = [];

// Set the model and path for external models manager.
this.setState((prev) => {
savedStackPointer = [...prev.stack];
return { stack: [marshaller.parser.parse()], openFilenormalizedPosixPathRelativeToTheWorkspaceRoot, pointer: 0 };
return {
stack: [normalize(marshaller.parser.parse())],
openFilenormalizedPosixPathRelativeToTheWorkspaceRoot,
pointer: 0,
};
});

// Wait the external manager models to load.
Expand All @@ -151,7 +156,7 @@ export class DmnEditorRoot extends React.Component<DmnEditorRootProps, DmnEditor
return {
marshaller,
openFilenormalizedPosixPathRelativeToTheWorkspaceRoot,
stack: [...newStack, marshaller.parser.parse()],
stack: [...newStack, normalize(marshaller.parser.parse())],
readonly: false,
pointer: newStack.length,
externalModelsManagerDoneBootstraping: true,
Expand All @@ -163,7 +168,7 @@ export class DmnEditorRoot extends React.Component<DmnEditorRootProps, DmnEditor
return {
marshaller,
openFilenormalizedPosixPathRelativeToTheWorkspaceRoot,
stack: [marshaller.parser.parse()],
stack: [normalize(marshaller.parser.parse())],
readonly: false,
pointer: 0,
externalModelsManagerDoneBootstraping: true,
Expand All @@ -174,7 +179,7 @@ export class DmnEditorRoot extends React.Component<DmnEditorRootProps, DmnEditor

// Internal methods

public get model(): DmnLatestModel | undefined {
public get model(): Normalized<DmnLatestModel> | undefined {
return this.state.stack[this.state.pointer];
}

Expand Down Expand Up @@ -253,7 +258,7 @@ export class DmnEditorRoot extends React.Component<DmnEditorRootProps, DmnEditor
return {
normalizedPosixPathRelativeToTheOpenFile,
type: "dmn",
model: getMarshaller(resource?.content ?? "", { upgradeTo: "latest" }).parser.parse(),
model: normalize(getMarshaller(resource?.content ?? "", { upgradeTo: "latest" }).parser.parse()),
svg: "",
};
} else if (ext === ".pmml") {
Expand Down Expand Up @@ -502,7 +507,7 @@ function ExternalModelsManager({
}: {
workspaceRootAbsolutePosixPath: string;
thisDmnsNormalizedPosixPathRelativeToTheWorkspaceRoot: string | undefined;
model: DmnLatestModel;
model: Normalized<DmnLatestModel>;
onChange: (externalModelsByNamespace: DmnEditor.ExternalModelsIndex) => void;
onRequestWorkspaceFileContent: WorkspaceChannelApi["kogitoWorkspace_resourceContentRequest"];
onRequestWorkspaceFilesList: WorkspaceChannelApi["kogitoWorkspace_resourceListRequest"];
Expand Down Expand Up @@ -602,7 +607,7 @@ function ExternalModelsManager({

externalModelsIndex[namespace] = {
normalizedPosixPathRelativeToTheOpenFile,
model: getMarshaller(content, { upgradeTo: "latest" }).parser.parse(),
model: normalize(getMarshaller(content, { upgradeTo: "latest" }).parser.parse()),
type: "dmn",
svg: "",
};
Expand Down
12 changes: 8 additions & 4 deletions packages/dmn-editor/src/DmnEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ import { BoxedExpressionScreen } from "./boxedExpressions/BoxedExpressionScreen"
import { DataTypes } from "./dataTypes/DataTypes";
import { Diagram, DiagramRef } from "./diagram/Diagram";
import { DmnVersionLabel } from "./diagram/DmnVersionLabel";
import { normalize } from "./normalization/normalize";
import { Normalized, normalize } from "./normalization/normalize";
import { BoxedExpressionPropertiesPanel } from "./propertiesPanel/BoxedExpressionPropertiesPanel";
import { DmnEditorContextProvider, useDmnEditor } from "./DmnEditorContext";
import { DmnEditorErrorFallback } from "./DmnEditorErrorFallback";
Expand Down Expand Up @@ -71,7 +71,7 @@ export type DmnEditorRef = {

export type EvaluationResults = Record<string, any>;
export type ValidationMessages = Record<string, any>;
export type OnDmnModelChange = (model: DmnLatestModel) => void;
export type OnDmnModelChange = (model: Normalized<DmnLatestModel>) => void;

export type OnRequestToJumpToPath = (normalizedPosixPathRelativeToTheOpenFile: string) => void;
export type OnRequestToResolvePath = (normalizedPosixPathRelativeToTheOpenFile: string) => string;
Expand All @@ -89,7 +89,11 @@ export type ExternalModelsIndex = Record<
export type ExternalModel = ({ type: "dmn" } & ExternalDmn) | ({ type: "pmml" } & ExternalPmml);

export type ExternalDmnsIndex = Map<string /** normalizedPosixPathRelativeToTheOpenFile */, ExternalDmn>;
export type ExternalDmn = { model: DmnLatestModel; normalizedPosixPathRelativeToTheOpenFile: string; svg: string };
export type ExternalDmn = {
model: Normalized<DmnLatestModel>;
normalizedPosixPathRelativeToTheOpenFile: string;
svg: string;
};

export type ExternalPmmlsIndex = Map<string /** normalizedPosixPathRelativeToTheOpenFile */, ExternalPmml>;
export type ExternalPmml = { model: PMML; normalizedPosixPathRelativeToTheOpenFile: string };
Expand Down Expand Up @@ -190,7 +194,7 @@ export const DmnEditorInternal = ({
() => ({
reset: (model) => {
const state = dmnEditorStoreApi.getState();
return state.dispatch(state).dmn.reset(model);
return state.dispatch(state).dmn.reset(normalize(model));
},
getDiagramSvg: async () => {
const nodes = diagramRef.current?.getReactFlowInstance()?.getNodes();
Expand Down
1 change: 1 addition & 0 deletions packages/dmn-editor/src/DmnEditorContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import * as React from "react";
import { useContext, useMemo, useRef } from "react";
import { DmnEditorProps } from "./DmnEditor";
import { DmnLatestModel } from "@kie-tools/dmn-marshaller";
import { Normalized } from "./normalization/normalize";

export type DmnEditorContextProviderProps = Pick<
DmnEditorProps,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ import { DmnEditorTab } from "../store/Store";
import { useDmnEditorStore, useDmnEditorStoreApi } from "../store/StoreContext";
import { getDefaultColumnWidth } from "./getDefaultColumnWidth";
import { getDefaultBoxedExpression } from "./getDefaultBoxedExpression";
import { Normalized } from "../normalization/normalize";

export function BoxedExpressionScreen({ container }: { container: React.RefObject<HTMLElement> }) {
const { externalModelsByNamespace } = useExternalModels();
Expand Down Expand Up @@ -172,7 +173,7 @@ export function BoxedExpressionScreen({ container }: { container: React.RefObjec
}, [drgElement, drgElementIndex]);

const widthsByIdRef = useRef<Map<string, number[]>>(widthsById);
const boxedExpressionRef = useRef<BoxedExpression | undefined>(expression?.boxedExpression);
const boxedExpressionRef = useRef<Normalized<BoxedExpression> | undefined>(expression?.boxedExpression);

useEffect(() => {
widthsByIdRef.current = widthsById;
Expand Down Expand Up @@ -202,7 +203,7 @@ export function BoxedExpressionScreen({ container }: { container: React.RefObjec
[dmnEditorStoreApi]
);

const onExpressionChange: React.Dispatch<React.SetStateAction<BoxedExpression>> = useCallback(
const onExpressionChange: React.Dispatch<React.SetStateAction<Normalized<BoxedExpression>>> = useCallback(
(newExpressionAction) => {
dmnEditorStoreApi.setState((state) => {
const newExpression =
Expand Down Expand Up @@ -402,9 +403,9 @@ export function BoxedExpressionScreen({ container }: { container: React.RefObjec

export function drgElementToBoxedExpression(
expressionHolder:
| (DMN15__tDecision & { __$$element: "decision" })
| (DMN15__tBusinessKnowledgeModel & { __$$element: "businessKnowledgeModel" })
): BoxedExpression | undefined {
| (Normalized<DMN15__tDecision> & { __$$element: "decision" })
| (Normalized<DMN15__tBusinessKnowledgeModel> & { __$$element: "businessKnowledgeModel" })
): Normalized<BoxedExpression> | undefined {
if (expressionHolder.__$$element === "businessKnowledgeModel") {
return expressionHolder.encapsulatedLogic
? {
Expand Down Expand Up @@ -441,7 +442,7 @@ export function drgElementToBoxedExpression(
}

function determineInputsForDecision(
decision: DMN15__tDecision,
decision: Normalized<DMN15__tDecision>,
allTopLevelDataTypesByFeelName: DataTypeIndex,
nodesById: Map<string, RF.Node<DmnDiagramNodeData>>
) {
Expand Down Expand Up @@ -485,7 +486,7 @@ function flattenItemComponents({
itemDefinition,
acc,
}: {
itemDefinition: DMN15__tItemDefinition;
itemDefinition: Normalized<DMN15__tItemDefinition>;
acc: string;
}): { name: string; typeRef: string | undefined }[] {
if (!isStruct(itemDefinition)) {
Expand Down
81 changes: 41 additions & 40 deletions packages/dmn-editor/src/boxedExpressions/boxedExpressionIndex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
DMN15__tRelation,
} from "@kie-tools/dmn-marshaller/dist/schemas/dmn-1_5/ts-gen/types";
import { AllExpressionTypes, AllExpressions, AllExpressionsWithoutTypes } from "../dataTypes/DataTypeSpec";
import { Normalized } from "../normalization/normalize";

interface PathType {
type: AllExpressionTypes;
Expand Down Expand Up @@ -411,134 +412,134 @@ export function getDmnObjectByPath(
if (path.type === "conditional") {
// root
if (path.row === undefined) {
return expressionToEdit as DMN15__tConditional;
return expressionToEdit as Normalized<DMN15__tConditional>;
}
if (path.row === "if") {
return (expressionToEdit as DMN15__tConditional).if.expression;
return (expressionToEdit as Normalized<DMN15__tConditional>).if.expression;
}
if (path.row === "else") {
return (expressionToEdit as DMN15__tConditional).else.expression;
return (expressionToEdit as Normalized<DMN15__tConditional>).else.expression;
}
return (expressionToEdit as DMN15__tConditional).then.expression;
return (expressionToEdit as Normalized<DMN15__tConditional>).then.expression;
}
if (path.type === "context") {
// root
if (path.row === undefined || path.column === undefined) {
return expressionToEdit as DMN15__tContext;
return expressionToEdit as Normalized<DMN15__tContext>;
}
if (path.column === "expression") {
return (expressionToEdit as DMN15__tContext).contextEntry?.[path.row].expression;
return (expressionToEdit as Normalized<DMN15__tContext>).contextEntry?.[path.row].expression;
}
return (expressionToEdit as DMN15__tContext).contextEntry?.[path.row].variable;
return (expressionToEdit as Normalized<DMN15__tContext>).contextEntry?.[path.row].variable;
}
if (path.type === "decisionTable") {
// root
if (path.row === undefined || path.column === undefined) {
return expressionToEdit as DMN15__tDecisionTable;
return expressionToEdit as Normalized<DMN15__tDecisionTable>;
}
if (path.header === "input") {
if (path.row < 0) {
return (expressionToEdit as DMN15__tDecisionTable).input?.[path.column];
return (expressionToEdit as Normalized<DMN15__tDecisionTable>).input?.[path.column];
}
return (expressionToEdit as DMN15__tDecisionTable).rule?.[path.row].inputEntry?.[path.column];
return (expressionToEdit as Normalized<DMN15__tDecisionTable>).rule?.[path.row].inputEntry?.[path.column];
}
if (path.row < 0) {
return (expressionToEdit as DMN15__tDecisionTable).output?.[path.column];
return (expressionToEdit as Normalized<DMN15__tDecisionTable>).output?.[path.column];
}
return (expressionToEdit as DMN15__tDecisionTable).rule?.[path.row].outputEntry?.[path.column];
return (expressionToEdit as Normalized<DMN15__tDecisionTable>).rule?.[path.row].outputEntry?.[path.column];
}
if (path.type === "every") {
// root
if (path.row === undefined) {
return expressionToEdit as DMN15__tQuantified;
return expressionToEdit as Normalized<DMN15__tQuantified>;
}
if (path.row === "variable") {
return expressionToEdit as DMN15__tQuantified;
return expressionToEdit as Normalized<DMN15__tQuantified>;
}
if (path.row === "in") {
return (expressionToEdit as DMN15__tQuantified).in.expression;
return (expressionToEdit as Normalized<DMN15__tQuantified>).in.expression;
}
return (expressionToEdit as DMN15__tQuantified).satisfies.expression;
return (expressionToEdit as Normalized<DMN15__tQuantified>).satisfies.expression;
}
if (path.type === "filter") {
// root
if (path.row === undefined) {
return expressionToEdit as DMN15__tFilter;
return expressionToEdit as Normalized<DMN15__tFilter>;
}
if (path.row === "in") {
return (expressionToEdit as DMN15__tFilter).in.expression;
return (expressionToEdit as Normalized<DMN15__tFilter>).in.expression;
}
return (expressionToEdit as DMN15__tFilter).match.expression;
return (expressionToEdit as Normalized<DMN15__tFilter>).match.expression;
}
if (path.type === "for") {
// root
if (path.row === undefined) {
return expressionToEdit as DMN15__tFor;
return expressionToEdit as Normalized<DMN15__tFor>;
}
if (path.row === "variable") {
return expressionToEdit as DMN15__tFor;
return expressionToEdit as Normalized<DMN15__tFor>;
}
if (path.row === "in") {
return (expressionToEdit as DMN15__tFor).in.expression;
return (expressionToEdit as Normalized<DMN15__tFor>).in.expression;
}
return (expressionToEdit as DMN15__tFor).return.expression;
return (expressionToEdit as Normalized<DMN15__tFor>).return.expression;
}
if (path.type === "functionDefinition") {
// root
if (!path.parameterIndex) {
return expressionToEdit as DMN15__tFunctionDefinition;
return expressionToEdit as Normalized<DMN15__tFunctionDefinition>;
}
if (path.parameterIndex < 0) {
return (expressionToEdit as DMN15__tFunctionDefinition).expression;
return (expressionToEdit as Normalized<DMN15__tFunctionDefinition>).expression;
}
return expressionToEdit as DMN15__tFunctionDefinition;
return expressionToEdit as Normalized<DMN15__tFunctionDefinition>;
}
if (path.type === "invocation") {
// root
if (path.row === undefined || path.column === undefined) {
return expressionToEdit as DMN15__tInvocation;
return expressionToEdit as Normalized<DMN15__tInvocation>;
}
if (path.column === "parameter") {
return (expressionToEdit as DMN15__tInvocation).binding?.[path.row].parameter;
return (expressionToEdit as Normalized<DMN15__tInvocation>).binding?.[path.row].parameter;
}
if (path.column === "expression" && path.row >= 0) {
return (expressionToEdit as DMN15__tInvocation).binding?.[path.row].expression;
return (expressionToEdit as Normalized<DMN15__tInvocation>).binding?.[path.row].expression;
}
// function call
return (expressionToEdit as DMN15__tInvocation).expression;
return (expressionToEdit as Normalized<DMN15__tInvocation>).expression;
}
if (path.type === "list") {
// root
if (path.row === undefined) {
return expressionToEdit as DMN15__tList;
return expressionToEdit as Normalized<DMN15__tList>;
}
return (expressionToEdit as DMN15__tList).expression?.[path.row];
return (expressionToEdit as Normalized<DMN15__tList>).expression?.[path.row];
}
if (path.type === "literalExpression") {
return expressionToEdit as DMN15__tLiteralExpression;
return expressionToEdit as Normalized<DMN15__tLiteralExpression>;
}
if (path.type === "relation") {
// root
if (path.row === undefined || path.column === undefined) {
return expressionToEdit as DMN15__tRelation;
return expressionToEdit as Normalized<DMN15__tRelation>;
}
if (path.row < 0) {
return (expressionToEdit as DMN15__tRelation).column?.[path.column];
return (expressionToEdit as Normalized<DMN15__tRelation>).column?.[path.column];
}
return (expressionToEdit as DMN15__tRelation).row?.[path.row].expression?.[path.column];
return (expressionToEdit as Normalized<DMN15__tRelation>).row?.[path.row].expression?.[path.column];
}
if (path.type === "some") {
// root
if (path.row === undefined) {
return expressionToEdit as DMN15__tQuantified;
return expressionToEdit as Normalized<DMN15__tQuantified>;
}
if (path.row === "variable") {
return expressionToEdit as DMN15__tQuantified;
return expressionToEdit as Normalized<DMN15__tQuantified>;
}
if (path.row === "in") {
return (expressionToEdit as DMN15__tQuantified).in.expression;
return (expressionToEdit as Normalized<DMN15__tQuantified>).in.expression;
}
return (expressionToEdit as DMN15__tQuantified).satisfies.expression;
return (expressionToEdit as Normalized<DMN15__tQuantified>).satisfies.expression;
}
}, expressionRoot);
}
Loading

0 comments on commit 8ae10f8

Please sign in to comment.