diff --git a/package.json b/package.json
index 461e8c7c5..f23e1274c 100644
--- a/package.json
+++ b/package.json
@@ -9,12 +9,12 @@
"packages/*"
],
"resolutions": {
- "@patternfly/patternfly": "5.2.1",
- "@patternfly/react-code-editor": "5.1.0",
- "@patternfly/react-core": "5.2.2",
- "@patternfly/react-icons": "5.2.1",
- "@patternfly/react-table": "5.2.2",
- "@patternfly/react-topology": "5.2.1",
+ "@patternfly/patternfly": "5.3.1",
+ "@patternfly/react-code-editor": "5.3.3",
+ "@patternfly/react-core": "5.3.3",
+ "@patternfly/react-icons": "5.3.2",
+ "@patternfly/react-table": "5.3.3",
+ "@patternfly/react-topology": "5.4.0-prerelease.10",
"axios": "1.7.2",
"react": "18.2.0",
"react-dom": "18.2.0",
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 9f191f2ae..14cc8921a 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -46,12 +46,12 @@
"@kaoto-next/uniforms-patternfly": "^0.6.10",
"@kie-tools-core/editor": "0.32.0",
"@kie-tools-core/notifications": "0.32.0",
- "@patternfly/patternfly": "5.2.1",
- "@patternfly/react-code-editor": "5.1.0",
- "@patternfly/react-core": "5.2.2",
- "@patternfly/react-icons": "5.2.1",
- "@patternfly/react-table": "5.2.2",
- "@patternfly/react-topology": "5.2.1",
+ "@patternfly/patternfly": "5.3.1",
+ "@patternfly/react-code-editor": "5.3.3",
+ "@patternfly/react-core": "5.3.3",
+ "@patternfly/react-icons": "5.3.2",
+ "@patternfly/react-table": "5.3.3",
+ "@patternfly/react-topology": "5.4.0-prerelease.10",
"@types/uuid": "^10.0.0",
"ajv": "^8.12.0",
"ajv-draft-04": "^1.0.0",
diff --git a/packages/ui/src/components/Form/dataFormat/DataFormatEditor.test.tsx b/packages/ui/src/components/Form/dataFormat/DataFormatEditor.test.tsx
index 92382ade0..95a84bfe3 100644
--- a/packages/ui/src/components/Form/dataFormat/DataFormatEditor.test.tsx
+++ b/packages/ui/src/components/Form/dataFormat/DataFormatEditor.test.tsx
@@ -47,7 +47,7 @@ describe('DataFormatEditor', () => {
it('should render', async () => {
render();
- const buttons = screen.getAllByRole('button', { name: 'Menu toggle' });
+ const buttons = screen.getAllByRole('button', { name: 'Typeahead menu toggle' });
await act(async () => {
fireEvent.click(buttons[0]);
});
@@ -59,7 +59,7 @@ describe('DataFormatEditor', () => {
it('should filter candidates with a text input', async () => {
render();
- const buttons = screen.getAllByRole('button', { name: 'Menu toggle' });
+ const buttons = screen.getAllByRole('button', { name: 'Typeahead menu toggle' });
await act(async () => {
fireEvent.click(buttons[0]);
});
@@ -75,7 +75,7 @@ describe('DataFormatEditor', () => {
it('should clear filter and close the dropdown with close button', async () => {
render();
- const buttons = screen.getAllByRole('button', { name: 'Menu toggle' });
+ const buttons = screen.getAllByRole('button', { name: 'Typeahead menu toggle' });
await act(async () => {
fireEvent.click(buttons[0]);
});
diff --git a/packages/ui/src/components/Form/loadBalancer/LoadBalancerEditor.test.tsx b/packages/ui/src/components/Form/loadBalancer/LoadBalancerEditor.test.tsx
index 179d8a4d6..0f353dc22 100644
--- a/packages/ui/src/components/Form/loadBalancer/LoadBalancerEditor.test.tsx
+++ b/packages/ui/src/components/Form/loadBalancer/LoadBalancerEditor.test.tsx
@@ -48,7 +48,7 @@ describe('LoadBalancerEditor', () => {
it('should render', async () => {
render();
- const buttons = screen.getAllByRole('button', { name: 'Menu toggle' });
+ const buttons = screen.getAllByRole('button', { name: 'Typeahead menu toggle' });
await act(async () => {
fireEvent.click(buttons[0]);
});
@@ -62,7 +62,7 @@ describe('LoadBalancerEditor', () => {
it('should filter candidates with a text input', async () => {
render();
- const buttons = screen.getAllByRole('button', { name: 'Menu toggle' });
+ const buttons = screen.getAllByRole('button', { name: 'Typeahead menu toggle' });
await act(async () => {
fireEvent.click(buttons[0]);
});
@@ -78,7 +78,7 @@ describe('LoadBalancerEditor', () => {
it('should clear filter and close the dropdown with close button', async () => {
render();
- const buttons = screen.getAllByRole('button', { name: 'Menu toggle' });
+ const buttons = screen.getAllByRole('button', { name: 'Typeahead menu toggle' });
await act(async () => {
fireEvent.click(buttons[0]);
});
diff --git a/packages/ui/src/components/SourceCode/SourceCode.tsx b/packages/ui/src/components/SourceCode/SourceCode.tsx
index c6ceb7173..a910b4856 100644
--- a/packages/ui/src/components/SourceCode/SourceCode.tsx
+++ b/packages/ui/src/components/SourceCode/SourceCode.tsx
@@ -1,7 +1,6 @@
import { CodeEditor, CodeEditorProps, Language } from '@patternfly/react-code-editor';
-import * as monaco from 'monaco-editor';
import { configureMonacoYaml } from 'monaco-yaml';
-import { FunctionComponent, Ref, useCallback, useContext, useEffect, useMemo, useRef } from 'react';
+import { FunctionComponent, MutableRefObject, Ref, useCallback, useContext, useEffect, useMemo, useRef } from 'react';
import { EditorDidMount } from 'react-monaco-editor';
import { SourceSchemaType, sourceSchemaConfig } from '../../models/camel';
import { EntitiesContext } from '../../providers/entities.provider';
@@ -18,34 +17,33 @@ interface SourceCodeProps {
export const SourceCode: FunctionComponent = (props) => {
const editorRef = useRef[0] | null>(null);
const entityContext = useContext(EntitiesContext);
+ const schemaType: SourceSchemaType = entityContext?.currentSchemaType ?? SourceSchemaType.Route;
+ const currentSchema = sourceSchemaConfig.config[schemaType].schema;
+ const monacoYamlHandlerRef: MutableRefObject | undefined> = useRef(undefined);
- useEffect(() => {
- const schemaType: SourceSchemaType = entityContext?.currentSchemaType ?? SourceSchemaType.Route;
- const currentSchema = sourceSchemaConfig.config[schemaType].schema;
- let monacoYamlHandler: ReturnType | undefined;
-
- if (currentSchema) {
- monacoYamlHandler = configureMonacoYaml(monaco, {
- enableSchemaRequest: true,
- hover: true,
- completion: true,
- validate: true,
- format: true,
- schemas: [
- {
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- schema: currentSchema.schema as any,
- uri: currentSchema.uri,
- fileMatch: ['*'],
- },
- ],
- });
- }
+ const editorProps: Ref = useRef({
+ beforeMount: (monaco) => {
+ if (currentSchema) {
+ const monacoYamlHandler = configureMonacoYaml(monaco, {
+ enableSchemaRequest: true,
+ hover: true,
+ completion: true,
+ validate: true,
+ format: true,
+ schemas: [
+ {
+ schema: currentSchema.schema,
+ uri: currentSchema.uri,
+ fileMatch: ['*'],
+ },
+ ],
+ });
- return () => {
- monacoYamlHandler?.dispose();
- };
- }, [entityContext?.currentSchemaType]);
+ /** Capturing the monacoYamlHandlerRef so we can dispose it when unmounting this component */
+ monacoYamlHandlerRef.current = monacoYamlHandler;
+ }
+ },
+ });
const handleEditorDidMount: EditorDidMount = useCallback((editor) => {
editorRef.current = editor;
@@ -81,6 +79,16 @@ export const SourceCode: FunctionComponent = (props) => {
];
}, []);
+ useEffect(() => {
+ /**
+ * This useEffect acts as an unmount hook for the CodeEditor component
+ * It disposes the monacoYamlHandlerRef.current when the component is unmounted
+ */
+ return () => {
+ monacoYamlHandlerRef.current?.dispose();
+ };
+ }, []);
+
return (
= (props) => {
onCodeChange={props.onCodeChange}
customControls={customControls}
language={Language.yaml}
+ editorProps={editorProps.current!}
options={options.current!}
onEditorDidMount={handleEditorDidMount}
/>
diff --git a/packages/ui/src/components/Visualization/Canvas/CanvasForm.test.tsx b/packages/ui/src/components/Visualization/Canvas/CanvasForm.test.tsx
index ea30cc14c..20f36e30d 100644
--- a/packages/ui/src/components/Visualization/Canvas/CanvasForm.test.tsx
+++ b/packages/ui/src/components/Visualization/Canvas/CanvasForm.test.tsx
@@ -440,7 +440,7 @@ describe('CanvasForm', () => {
,
);
- const button = screen.getAllByRole('button', { name: 'Menu toggle' });
+ const button = screen.getAllByRole('button', { name: 'Typeahead menu toggle' });
await act(async () => {
fireEvent.click(button[0]);
});
@@ -497,7 +497,7 @@ describe('CanvasForm', () => {
expect(camelRoute.from.steps[0].marshal!.avro).toBeUndefined();
expect(camelRoute.from.steps[0].marshal!.id).toEqual('modified');
- const button = screen.getAllByRole('button', { name: 'Menu toggle' });
+ const button = screen.getAllByRole('button', { name: 'Typeahead menu toggle' });
await act(async () => {
fireEvent.click(button[0]);
});
@@ -546,7 +546,7 @@ describe('CanvasForm', () => {
,
);
- const button = screen.getAllByRole('button', { name: 'Menu toggle' });
+ const button = screen.getAllByRole('button', { name: 'Typeahead menu toggle' });
await act(async () => {
fireEvent.click(button[0]);
});
@@ -603,7 +603,7 @@ describe('CanvasForm', () => {
expect(camelRoute.from.steps[0].loadBalance!.weighted).toBeUndefined();
expect(camelRoute.from.steps[0].loadBalance!.id).toEqual('modified');
- const button = screen.getAllByRole('button', { name: 'Menu toggle' });
+ const button = screen.getAllByRole('button', { name: 'Typeahead menu toggle' });
await act(async () => {
fireEvent.click(button[0]);
});
diff --git a/packages/ui/src/components/Visualization/Canvas/__snapshots__/Canvas.test.tsx.snap b/packages/ui/src/components/Visualization/Canvas/__snapshots__/Canvas.test.tsx.snap
index 5c1baf688..9ea86a136 100644
--- a/packages/ui/src/components/Visualization/Canvas/__snapshots__/Canvas.test.tsx.snap
+++ b/packages/ui/src/components/Visualization/Canvas/__snapshots__/Canvas.test.tsx.snap
@@ -747,6 +747,103 @@ exports[`Canvas should render correctly 1`] = `
y="-60"
/>
+
+
+
+
+ route-8888
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
- route-8888
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ />
+
+
+
+
+ route-8888
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
- route-8888
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ />
+
+
+
+
+ route-8888
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
- route-8888
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ />
= 0.21.0 < 1"
+ checksum: 374ec0ea872ee15b33310e105a43217148161480d3955c5cece87d0f801754cd2c45a3f6c539a75da18a066c1615756fb87eaf1003f1df6a64a0cbce5d2c3749
+ languageName: node
+ linkType: hard
+
+"@monaco-editor/react@npm:^4.6.0":
+ version: 4.6.0
+ resolution: "@monaco-editor/react@npm:4.6.0"
+ dependencies:
+ "@monaco-editor/loader": ^1.4.0
+ peerDependencies:
+ monaco-editor: ">= 0.25.0 < 1"
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+ checksum: 9d44e76c5baad6db5f84c90a5540fbd3c9af691b97d76cf2a99b3c8273004d0efe44c2572d80e9d975c9af10022c21e4a66923924950a5201e82017c8b20428c
+ languageName: node
+ linkType: hard
+
"@mswjs/cookies@npm:^1.1.0":
version: 1.1.1
resolution: "@mswjs/cookies@npm:1.1.1"
@@ -3360,102 +3400,107 @@ __metadata:
languageName: node
linkType: hard
-"@patternfly/patternfly@npm:5.2.1":
- version: 5.2.1
- resolution: "@patternfly/patternfly@npm:5.2.1"
- checksum: ed043826e22d8138d1f448f63a63750c7b710fbc73b947b3474271e140f1780a85b0b6e01ff602b087ebedd5dbffe0d50697539185497e336b623fe7128e915d
+"@patternfly/patternfly@npm:5.3.1":
+ version: 5.3.1
+ resolution: "@patternfly/patternfly@npm:5.3.1"
+ checksum: 2bb6ed396f5c36c5c4c11fbd1141fa5830f3f1b1d9846eedba1df43f445ea43d1cadbbcf9fd416f966bf6195aeea00fb14770ced81ae3d6ff47a4fcd241bf89b
languageName: node
linkType: hard
-"@patternfly/react-code-editor@npm:5.1.0":
- version: 5.1.0
- resolution: "@patternfly/react-code-editor@npm:5.1.0"
+"@patternfly/react-code-editor@npm:5.3.3":
+ version: 5.3.3
+ resolution: "@patternfly/react-code-editor@npm:5.3.3"
dependencies:
- "@patternfly/react-core": ^5.1.0
- "@patternfly/react-icons": ^5.1.0
- "@patternfly/react-styles": ^5.1.0
+ "@monaco-editor/react": ^4.6.0
+ "@patternfly/react-core": ^5.3.3
+ "@patternfly/react-icons": ^5.3.2
+ "@patternfly/react-styles": ^5.3.1
react-dropzone: 14.2.3
tslib: ^2.5.0
peerDependencies:
react: ^17 || ^18
react-dom: ^17 || ^18
- react-monaco-editor: ^0.51.0
- checksum: 5d6e9d32491effa040c75f748a042d25d4405dfd2ce462df1abdd1bd2ea3fb6173b4caab58f399c4a42e40db1a820fd6cc4f0412fc59e47797eda2c277a8f72c
+ checksum: aab024e365402f74b7efa4a65849b728464093825c4dc631d94c73525db7c1b2067c3eb076cec1229d91181f2c18d7d01c03555cb927faf40a54cb3921480e0f
languageName: node
linkType: hard
-"@patternfly/react-core@npm:5.2.2":
- version: 5.2.2
- resolution: "@patternfly/react-core@npm:5.2.2"
+"@patternfly/react-core@npm:5.3.3":
+ version: 5.3.3
+ resolution: "@patternfly/react-core@npm:5.3.3"
dependencies:
- "@patternfly/react-icons": ^5.2.1
- "@patternfly/react-styles": ^5.2.1
- "@patternfly/react-tokens": ^5.2.1
+ "@patternfly/react-icons": ^5.3.2
+ "@patternfly/react-styles": ^5.3.1
+ "@patternfly/react-tokens": ^5.3.1
focus-trap: 7.5.2
react-dropzone: ^14.2.3
tslib: ^2.5.0
peerDependencies:
react: ^17 || ^18
react-dom: ^17 || ^18
- checksum: 88bee51a0275e493dbd9519d50bffa548096d5d06b644ced1e14dfe9771d3ec6c6d1bac80513db37e1866803435372e8ffc3c8ceeaaed4bb332e01ad7122a92d
+ checksum: 5af2b78ec3b5f7e56d28e150a5596b02cbc87cc1da7c6cb08517768ea165a2489847c4511cf1bc06411d7609da74c0144e0e0897171ac7d355624a576d471cc7
languageName: node
linkType: hard
-"@patternfly/react-icons@npm:5.2.1":
- version: 5.2.1
- resolution: "@patternfly/react-icons@npm:5.2.1"
+"@patternfly/react-icons@npm:5.3.2":
+ version: 5.3.2
+ resolution: "@patternfly/react-icons@npm:5.3.2"
peerDependencies:
react: ^17 || ^18
react-dom: ^17 || ^18
- checksum: 2bc14d3a3de34c48816988b9be65429b9c4bd2edb28c3e82e8dd47cc4be031e30ce65b4987e00abfd09ed36b89637a6fdd19ee5c46b07ff701e8315201b7ca36
+ checksum: 0d6f2c47905015fd70b1d2a53bb85844b04250742a37f067b42731f609bafda1f2819d77398985e4db0ac5662e24523b459013b312b9fde9a30df1f3de6bc15c
+ languageName: node
+ linkType: hard
+
+"@patternfly/react-styles@npm:^5.1.1":
+ version: 5.2.0
+ resolution: "@patternfly/react-styles@npm:5.2.0"
+ checksum: ab38211d265c5fdcebf1c6d10503cca3fa87e7f5021021a61e0b1cf320f6f906eb7ae4279b5d7767cd657ddea4659d74b072b100416f8c6dfb485d4d31a3dc76
languageName: node
linkType: hard
-"@patternfly/react-styles@npm:^5.1.0, @patternfly/react-styles@npm:^5.1.1, @patternfly/react-styles@npm:^5.2.1":
+"@patternfly/react-styles@npm:^5.3.1":
version: 5.3.1
resolution: "@patternfly/react-styles@npm:5.3.1"
checksum: fccb4e955e45538807397c7a53ee1b1f6ebf4137a4b708ad4e03f35b0dfe7b707f64240f11ee3a48b007d628d5d55b63b33c110a1f2d268b607e73ce8eccb514
languageName: node
linkType: hard
-"@patternfly/react-table@npm:5.2.2":
- version: 5.2.2
- resolution: "@patternfly/react-table@npm:5.2.2"
+"@patternfly/react-table@npm:5.3.3":
+ version: 5.3.3
+ resolution: "@patternfly/react-table@npm:5.3.3"
dependencies:
- "@patternfly/react-core": ^5.2.2
- "@patternfly/react-icons": ^5.2.1
- "@patternfly/react-styles": ^5.2.1
- "@patternfly/react-tokens": ^5.2.1
+ "@patternfly/react-core": ^5.3.3
+ "@patternfly/react-icons": ^5.3.2
+ "@patternfly/react-styles": ^5.3.1
+ "@patternfly/react-tokens": ^5.3.1
lodash: ^4.17.19
tslib: ^2.5.0
peerDependencies:
react: ^17 || ^18
react-dom: ^17 || ^18
- checksum: a97a63297d72a6c66eb3af07c05f7b5ab62c97250490af59eaa6992eab2e5b5c2cb170a307591ad18085849fc9a69b716acd969f74d3744106c2e0ab6e13e165
+ checksum: 6e0bb878bab665e9b611ffa8dbf36a2fce27eb4c16ba7a2abe714ad5b4e96f68861b002a30ee582387779b39b1a7585fc935e6f9eaf1c85dc97c6bc65fdc2884
languageName: node
linkType: hard
-"@patternfly/react-tokens@npm:^5.2.1":
+"@patternfly/react-tokens@npm:^5.3.1":
version: 5.3.1
resolution: "@patternfly/react-tokens@npm:5.3.1"
checksum: 0690ab162034370715e938c73a8364d1df2770d42ae2860ecca3cdbc38bae4b5aaf2bb9e46f3a3a4cdd2402b2ca40fd6b43de9bbce35429d392853f6e17f6aec
languageName: node
linkType: hard
-"@patternfly/react-topology@npm:5.2.1":
- version: 5.2.1
- resolution: "@patternfly/react-topology@npm:5.2.1"
+"@patternfly/react-topology@npm:5.4.0-prerelease.10":
+ version: 5.4.0-prerelease.10
+ resolution: "@patternfly/react-topology@npm:5.4.0-prerelease.10"
dependencies:
+ "@dagrejs/dagre": 1.1.2
"@patternfly/react-core": ^5.1.1
"@patternfly/react-icons": ^5.1.1
"@patternfly/react-styles": ^5.1.1
"@types/d3": ^7.4.0
"@types/d3-force": ^1.2.1
- "@types/dagre": 0.7.42
"@types/react-measure": ^2.0.6
d3: ^7.8.0
- dagre: 0.8.2
- lodash: ^4.17.19
mobx: ^6.9.0
mobx-react: ^7.6.0
point-in-svg-path: ^1.0.1
@@ -3466,7 +3511,7 @@ __metadata:
peerDependencies:
react: ^17 || ^18
react-dom: ^17 || ^18
- checksum: 91dd662a42a21b717cbce815f2305ec9957cc3a013f42591be9a7bac704eba7ff5eba2113736253255b4f8821380d32a0cf84eb04203068f048d66cf189c468b
+ checksum: 3ae348a86593ef5aeddac9cf1339f103b023c05a5ef1e9112b7a459e5b59d75dfc8047b9f0e4c91af4e34abd4fded8d093e92cf98088b78508963ea68986493d
languageName: node
linkType: hard
@@ -5573,13 +5618,6 @@ __metadata:
languageName: node
linkType: hard
-"@types/dagre@npm:0.7.42":
- version: 0.7.42
- resolution: "@types/dagre@npm:0.7.42"
- checksum: c63a0e9155df7d00b4e3bd5a781a69a958cf7281d2fec90cbea0e553841cd41bef3b35c749b1b481811ac7d81d25eb8a8366ea17ac647a907828e399ccdce82d
- languageName: node
- linkType: hard
-
"@types/detect-port@npm:^1.3.0":
version: 1.3.5
resolution: "@types/detect-port@npm:1.3.5"
@@ -8693,16 +8731,6 @@ __metadata:
languageName: node
linkType: hard
-"dagre@npm:0.8.2":
- version: 0.8.2
- resolution: "dagre@npm:0.8.2"
- dependencies:
- graphlib: ^2.1.5
- lodash: ^4.17.4
- checksum: 5a0446354610d423152badf34d0870a23382a8d224e158522840513dc095bf60fbc45132f9093a5bb348597be9967a46a21f3729af1a6d8d4d98d73ed8825fa4
- languageName: node
- linkType: hard
-
"dargs@npm:^8.0.0":
version: 8.1.0
resolution: "dargs@npm:8.1.0"
@@ -11163,15 +11191,6 @@ __metadata:
languageName: node
linkType: hard
-"graphlib@npm:^2.1.5":
- version: 2.1.8
- resolution: "graphlib@npm:2.1.8"
- dependencies:
- lodash: ^4.17.15
- checksum: 1e0db4dea1c8187d59103d5582ecf32008845ebe2103959a51d22cb6dae495e81fb9263e22c922bca3aaecb56064a45cd53424e15a4626cfb5a0c52d0aff61a8
- languageName: node
- linkType: hard
-
"graphql@npm:^16.8.1":
version: 16.8.2
resolution: "graphql@npm:16.8.2"
@@ -13376,7 +13395,7 @@ __metadata:
languageName: node
linkType: hard
-"lodash@npm:^4.0.0, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:~4.17.15":
+"lodash@npm:^4.0.0, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21, lodash@npm:~4.17.15":
version: 4.17.21
resolution: "lodash@npm:4.17.21"
checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7
@@ -16857,6 +16876,13 @@ __metadata:
languageName: node
linkType: hard
+"state-local@npm:^1.0.6":
+ version: 1.0.7
+ resolution: "state-local@npm:1.0.7"
+ checksum: d1afcf1429e7e6eb08685b3a94be8797db847369316d4776fd51f3962b15b984dacc7f8e401ad20968e5798c9565b4b377afedf4e4c4d60fe7495e1cbe14a251
+ languageName: node
+ linkType: hard
+
"statuses@npm:2.0.1, statuses@npm:^2.0.1":
version: 2.0.1
resolution: "statuses@npm:2.0.1"