@node-projects/web-component-designer 0.1.25 → 0.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/elements/services/ServiceContainer.d.ts +3 -0
- package/dist/elements/services/ServiceContainer.js +3 -0
- package/dist/elements/services/bindingsService/BaseCustomWebcomponentBindingsService.js +6 -5
- package/dist/elements/services/refactorService/BindingsRefactorService.d.ts +6 -0
- package/dist/elements/services/refactorService/BindingsRefactorService.js +21 -0
- package/dist/elements/services/refactorService/IRefactorService.d.ts +6 -0
- package/dist/elements/services/refactorService/IRefactorService.js +1 -0
- package/dist/elements/services/refactorService/IRefactoring.d.ts +13 -0
- package/dist/elements/services/refactorService/IRefactoring.js +1 -0
- package/dist/elements/services/refactorService/RefactorService.d.ts +5 -0
- package/dist/elements/services/refactorService/RefactorService.js +17 -0
- package/dist/elements/widgets/refactorView/code-view-simple.d.ts +23 -0
- package/dist/elements/widgets/refactorView/code-view-simple.js +55 -0
- package/dist/elements/widgets/refactorView/refactor-view.d.ts +20 -0
- package/dist/elements/widgets/refactorView/refactor-view.js +99 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +2 -0
- package/package.json +3 -3
|
@@ -44,6 +44,7 @@ import { IDesignItemService } from './designItemService/IDesignItemService.js';
|
|
|
44
44
|
import { IEventsService } from './eventsService/IEventsService.js';
|
|
45
45
|
import { IPropertyGridDragDropService } from './dragDropService/IPropertyGridDragDropService.js';
|
|
46
46
|
import { IConfigUiService } from './configUiService/IConfigUiService.js';
|
|
47
|
+
import { IRefactorService } from './refactorService/IRefactorService.js';
|
|
47
48
|
interface ServiceNameMap {
|
|
48
49
|
"propertyService": IPropertiesService;
|
|
49
50
|
"attachedPropertyService": IPropertiesService;
|
|
@@ -70,6 +71,7 @@ interface ServiceNameMap {
|
|
|
70
71
|
"eventsService": IEventsService;
|
|
71
72
|
"propertyGridDragDropService": IPropertyGridDragDropService;
|
|
72
73
|
"configUiService": IConfigUiService;
|
|
74
|
+
"refactorService": IRefactorService;
|
|
73
75
|
"undoService": (designerCanvas: IDesignerCanvas) => IUndoService;
|
|
74
76
|
"selectionService": (designerCanvas: IDesignerCanvas) => ISelectionService;
|
|
75
77
|
"contentService": (designerCanvas: IDesignerCanvas) => IContentService;
|
|
@@ -118,5 +120,6 @@ export declare class ServiceContainer extends BaseServiceContainer<ServiceNameMa
|
|
|
118
120
|
get demoProviderService(): IDemoProviderService;
|
|
119
121
|
get designItemService(): IDesignItemService;
|
|
120
122
|
get configUiServices(): IConfigUiService[];
|
|
123
|
+
get refactorServices(): IRefactorService[];
|
|
121
124
|
}
|
|
122
125
|
export {};
|
|
@@ -15,30 +15,31 @@ export class BaseCustomWebcomponentBindingsService {
|
|
|
15
15
|
if (a[0].startsWith('css:')) {
|
|
16
16
|
bnd.targetName = name.substring(4);
|
|
17
17
|
bnd.target = BindingTarget.css;
|
|
18
|
-
bnd.expression = value.substring(2, value.length -
|
|
18
|
+
bnd.expression = value.substring(2, value.length - 2);
|
|
19
19
|
}
|
|
20
20
|
else if (a[0].startsWith('class:')) {
|
|
21
21
|
bnd.targetName = name.substring(4);
|
|
22
22
|
bnd.target = BindingTarget.class;
|
|
23
|
-
bnd.expression = value.substring(2, value.length -
|
|
23
|
+
bnd.expression = value.substring(2, value.length - 2);
|
|
24
24
|
}
|
|
25
25
|
else if (a[0].startsWith('$')) {
|
|
26
26
|
bnd.targetName = name.substring(1);
|
|
27
27
|
bnd.target = BindingTarget.attribute;
|
|
28
|
-
bnd.expression = value.substring(2, value.length -
|
|
28
|
+
bnd.expression = value.substring(2, value.length - 2);
|
|
29
29
|
}
|
|
30
30
|
else if (a[0].startsWith('@')) {
|
|
31
31
|
bnd.targetName = name.substring(1);
|
|
32
32
|
bnd.target = BindingTarget.event;
|
|
33
|
-
bnd.expression = value.substring(2, value.length -
|
|
33
|
+
bnd.expression = value.substring(2, value.length - 2);
|
|
34
34
|
}
|
|
35
35
|
else {
|
|
36
36
|
bnd.targetName = PropertiesHelper.dashToCamelCase(name);
|
|
37
37
|
bnd.target = BindingTarget.property;
|
|
38
|
-
bnd.expression = value.substring(2, value.length -
|
|
38
|
+
bnd.expression = value.substring(2, value.length - 2);
|
|
39
39
|
}
|
|
40
40
|
bnd.type = BaseCustomWebcomponentBindingsService.type;
|
|
41
41
|
bnd.targetName = bnd.targetName;
|
|
42
|
+
bnd.bindableObjectNames = [value.substring(2, value.length - 2)];
|
|
42
43
|
bindings.push(bnd);
|
|
43
44
|
}
|
|
44
45
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { IDesignItem } from "../../item/IDesignItem.js";
|
|
2
|
+
import { IRefactoring } from "./IRefactoring.js";
|
|
3
|
+
export declare class BindingsRefactorService {
|
|
4
|
+
getRefactorings(designItems: IDesignItem[]): IRefactoring[];
|
|
5
|
+
refactor(refactoring: IRefactoring, oldValue: string, newValue: string): void;
|
|
6
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export class BindingsRefactorService {
|
|
2
|
+
getRefactorings(designItems) {
|
|
3
|
+
let refactorings = [];
|
|
4
|
+
for (let d of designItems) {
|
|
5
|
+
let bindings = d.serviceContainer.bindingService.getBindings(d);
|
|
6
|
+
if (bindings) {
|
|
7
|
+
for (let b of bindings) {
|
|
8
|
+
for (let s of b.bindableObjectNames) {
|
|
9
|
+
refactorings.push({ service: this, name: s, designItem: d, type: 'binding', sourceObject: b, display: b.target + '(' + b.targetName + ')' });
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return refactorings;
|
|
15
|
+
}
|
|
16
|
+
refactor(refactoring, oldValue, newValue) {
|
|
17
|
+
let binding = refactoring.sourceObject;
|
|
18
|
+
binding.bindableObjectNames = binding.bindableObjectNames.map(x => x == oldValue ? newValue : x);
|
|
19
|
+
refactoring.designItem.serviceContainer.bindingService.setBinding(refactoring.designItem, binding);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { IDesignItem } from "../../item/IDesignItem.js";
|
|
2
|
+
import { IRefactoring } from "./IRefactoring.js";
|
|
3
|
+
export interface IRefactorService {
|
|
4
|
+
getRefactorings(designItems: IDesignItem[]): IRefactoring[];
|
|
5
|
+
refactor(refactoring: IRefactoring, oldValue: string, newValue: string): any;
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BindingTarget } from "../../item/BindingTarget.js";
|
|
2
|
+
import { IDesignItem } from "../../item/IDesignItem.js";
|
|
3
|
+
import { IRefactorService } from "./IRefactorService.js";
|
|
4
|
+
export interface IRefactoring {
|
|
5
|
+
service: IRefactorService;
|
|
6
|
+
name: string;
|
|
7
|
+
designItem: IDesignItem;
|
|
8
|
+
type: 'binding' | 'script';
|
|
9
|
+
display?: string;
|
|
10
|
+
sourceObject: any;
|
|
11
|
+
target?: BindingTarget;
|
|
12
|
+
targetName?: string;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class RefactorService {
|
|
2
|
+
getRefactorings(designItems) {
|
|
3
|
+
let refactorings = {};
|
|
4
|
+
for (let d of designItems) {
|
|
5
|
+
let bindings = d.serviceContainer.bindingService.getBindings(d);
|
|
6
|
+
for (let b of bindings) {
|
|
7
|
+
for (let s of b.bindableObjectNames) {
|
|
8
|
+
if (!refactorings[s]) {
|
|
9
|
+
refactorings[s] = [];
|
|
10
|
+
}
|
|
11
|
+
refactorings[s].push({ name: s, designItem: d, type: 'binding', sourceObject: b });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return refactorings;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BaseCustomWebComponentConstructorAppend, TypedEvent } from '@node-projects/base-custom-webcomponent';
|
|
2
|
+
import { ICodeView } from './ICodeView.js';
|
|
3
|
+
import { IActivateable } from '../../../interfaces/IActivateable.js';
|
|
4
|
+
import { IStringPosition } from '../../services/htmlWriterService/IStringPosition.js';
|
|
5
|
+
import { IUiCommandHandler } from '../../../commandHandling/IUiCommandHandler.js';
|
|
6
|
+
import { IUiCommand } from '../../../commandHandling/IUiCommand.js';
|
|
7
|
+
export declare class CodeViewSimple extends BaseCustomWebComponentConstructorAppend implements ICodeView, IActivateable, IUiCommandHandler {
|
|
8
|
+
dispose(): void;
|
|
9
|
+
canvasElement: HTMLElement;
|
|
10
|
+
elementsToPackages: Map<string, string>;
|
|
11
|
+
onTextChanged: TypedEvent<string>;
|
|
12
|
+
private _text;
|
|
13
|
+
static readonly style: CSSStyleSheet;
|
|
14
|
+
static readonly template: HTMLTemplateElement;
|
|
15
|
+
executeCommand(command: IUiCommand): void;
|
|
16
|
+
canExecuteCommand(command: IUiCommand): boolean;
|
|
17
|
+
ready(): Promise<void>;
|
|
18
|
+
focusEditor(): void;
|
|
19
|
+
activated(): void;
|
|
20
|
+
update(code: any): void;
|
|
21
|
+
getText(): string;
|
|
22
|
+
setSelection(position: IStringPosition): void;
|
|
23
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { BaseCustomWebComponentConstructorAppend, css, html, TypedEvent } from '@node-projects/base-custom-webcomponent';
|
|
2
|
+
export class CodeViewSimple extends BaseCustomWebComponentConstructorAppend {
|
|
3
|
+
dispose() {
|
|
4
|
+
}
|
|
5
|
+
canvasElement;
|
|
6
|
+
elementsToPackages;
|
|
7
|
+
onTextChanged = new TypedEvent();
|
|
8
|
+
_text;
|
|
9
|
+
static style = css `
|
|
10
|
+
:host {
|
|
11
|
+
display: block;
|
|
12
|
+
height: 100%;
|
|
13
|
+
width: 100%;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
textarea {
|
|
17
|
+
height: 100%;
|
|
18
|
+
width: 100%;
|
|
19
|
+
resize: none;
|
|
20
|
+
white-space: nowrap;
|
|
21
|
+
box-sizing: border-box;
|
|
22
|
+
}
|
|
23
|
+
`;
|
|
24
|
+
static template = html `
|
|
25
|
+
<div id="container" style="width: 100%; height: 100%; position: absolute;">
|
|
26
|
+
<textarea id="text"></textarea>
|
|
27
|
+
</div>
|
|
28
|
+
`;
|
|
29
|
+
executeCommand(command) {
|
|
30
|
+
}
|
|
31
|
+
canExecuteCommand(command) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
async ready() {
|
|
35
|
+
this._text = this._getDomElement('text');
|
|
36
|
+
}
|
|
37
|
+
focusEditor() {
|
|
38
|
+
requestAnimationFrame(() => {
|
|
39
|
+
this.focus();
|
|
40
|
+
this._text.focus();
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
activated() {
|
|
44
|
+
}
|
|
45
|
+
update(code) {
|
|
46
|
+
this._text.value = code;
|
|
47
|
+
}
|
|
48
|
+
getText() {
|
|
49
|
+
return this._text.value;
|
|
50
|
+
}
|
|
51
|
+
setSelection(position) {
|
|
52
|
+
this._text.setSelectionRange(position.start, position.start + position.length);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
customElements.define('node-projects-code-view-simple', CodeViewSimple);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseCustomWebComponentConstructorAppend } from '@node-projects/base-custom-webcomponent';
|
|
2
|
+
import { InstanceServiceContainer } from '../../services/InstanceServiceContainer.js';
|
|
3
|
+
import { IDesignItem } from '../../item/IDesignItem.js';
|
|
4
|
+
import { IRefactoring } from '../../services/refactorService/IRefactoring.js';
|
|
5
|
+
export declare class RefactorView extends BaseCustomWebComponentConstructorAppend {
|
|
6
|
+
static readonly template: HTMLTemplateElement;
|
|
7
|
+
static readonly style: CSSStyleSheet;
|
|
8
|
+
static readonly is = "node-projects-refactor-view";
|
|
9
|
+
static readonly properties: {};
|
|
10
|
+
private _instanceServiceContainer;
|
|
11
|
+
private _selectionChangedHandler;
|
|
12
|
+
private _selectedItems;
|
|
13
|
+
refactorings: Map<string, IRefactoring[]>;
|
|
14
|
+
ready(): void;
|
|
15
|
+
set instanceServiceContainer(value: InstanceServiceContainer);
|
|
16
|
+
get selectedItems(): IDesignItem[];
|
|
17
|
+
set selectedItems(items: IDesignItem[]);
|
|
18
|
+
_refactor(refactoring: [string, IRefactoring[]], event: KeyboardEvent): void;
|
|
19
|
+
updateRefactorlist(designItems: IDesignItem[]): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { BaseCustomWebComponentConstructorAppend, css, html } from '@node-projects/base-custom-webcomponent';
|
|
2
|
+
export class RefactorView extends BaseCustomWebComponentConstructorAppend {
|
|
3
|
+
static template = html `
|
|
4
|
+
<div id="root">
|
|
5
|
+
<template repeat:item="[[this.refactorings]]">
|
|
6
|
+
<details>
|
|
7
|
+
<summary style="display: flex;">
|
|
8
|
+
name:<input value="[[item[0]]]" @keydown="[[this._refactor(item, event)]]" style="flex-grow: 1; min-width: 0">
|
|
9
|
+
</summary>
|
|
10
|
+
<ul>
|
|
11
|
+
<template repeat:reft="[[item[1]]]">
|
|
12
|
+
<li>[[reft.type]] - [[reft.display]]</li>
|
|
13
|
+
</template>
|
|
14
|
+
</ul>
|
|
15
|
+
</details>
|
|
16
|
+
</template>
|
|
17
|
+
</div>`;
|
|
18
|
+
static style = css `
|
|
19
|
+
:host {
|
|
20
|
+
box-sizing: border-box;
|
|
21
|
+
font-family: monospace;
|
|
22
|
+
height: 100%;
|
|
23
|
+
width: 100%;
|
|
24
|
+
position: absolute;
|
|
25
|
+
overflow: hidden;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
ul {
|
|
29
|
+
margin: 4px;
|
|
30
|
+
padding-left: 30px;
|
|
31
|
+
font-size: 10px;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#root {
|
|
35
|
+
padding: 5px;
|
|
36
|
+
display: flex;
|
|
37
|
+
flex-direction: column;
|
|
38
|
+
gap: 4px;
|
|
39
|
+
overflow-y: auto;
|
|
40
|
+
height: calc(100% - 10px);
|
|
41
|
+
}`;
|
|
42
|
+
static is = 'node-projects-refactor-view';
|
|
43
|
+
static properties = {};
|
|
44
|
+
_instanceServiceContainer;
|
|
45
|
+
_selectionChangedHandler;
|
|
46
|
+
_selectedItems;
|
|
47
|
+
refactorings = new Map();
|
|
48
|
+
;
|
|
49
|
+
ready() {
|
|
50
|
+
this._bindingsParse();
|
|
51
|
+
}
|
|
52
|
+
set instanceServiceContainer(value) {
|
|
53
|
+
this._instanceServiceContainer = value;
|
|
54
|
+
this._selectionChangedHandler?.dispose();
|
|
55
|
+
this._selectionChangedHandler = this._instanceServiceContainer.selectionService.onSelectionChanged.on(e => {
|
|
56
|
+
this.selectedItems = e.selectedElements;
|
|
57
|
+
});
|
|
58
|
+
this.selectedItems = this._instanceServiceContainer.selectionService.selectedElements;
|
|
59
|
+
}
|
|
60
|
+
get selectedItems() {
|
|
61
|
+
return this._selectedItems;
|
|
62
|
+
}
|
|
63
|
+
set selectedItems(items) {
|
|
64
|
+
if (this._selectedItems != items) {
|
|
65
|
+
this._selectedItems = items;
|
|
66
|
+
this.updateRefactorlist(this._selectedItems);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
_refactor(refactoring, event) {
|
|
70
|
+
const ip = event.target;
|
|
71
|
+
if (event.key == 'Enter') {
|
|
72
|
+
for (let r of refactoring[1]) {
|
|
73
|
+
r.service.refactor(r, r.name, ip.value);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
updateRefactorlist(designItems) {
|
|
78
|
+
this.refactorings.clear();
|
|
79
|
+
if (designItems && designItems.length) {
|
|
80
|
+
let refactorings = [];
|
|
81
|
+
const serviceContainer = designItems[0].serviceContainer;
|
|
82
|
+
for (let s of serviceContainer.refactorServices) {
|
|
83
|
+
let rfs = s.getRefactorings(designItems);
|
|
84
|
+
refactorings.push(...rfs);
|
|
85
|
+
}
|
|
86
|
+
//Group refactorings by name
|
|
87
|
+
for (const r of refactorings) {
|
|
88
|
+
let thisList = this.refactorings.get(r.name);
|
|
89
|
+
if (thisList === undefined) {
|
|
90
|
+
thisList = [];
|
|
91
|
+
this.refactorings.set(r.name, thisList);
|
|
92
|
+
}
|
|
93
|
+
thisList.push(r);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
this._bindingsRefresh();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
customElements.define(RefactorView.is, RefactorView);
|
package/dist/index.d.ts
CHANGED
|
@@ -120,6 +120,9 @@ export * from "./elements/services/propertiesService/services/CssCustomPropertie
|
|
|
120
120
|
export * from "./elements/services/propertiesService/services/UnkownElementsPropertiesService.js";
|
|
121
121
|
export * from "./elements/services/propertiesService/PropertyType.js";
|
|
122
122
|
export * from "./elements/services/propertiesService/ValueType.js";
|
|
123
|
+
export * from "./elements/services/refactorService/BindingsRefactorService.js";
|
|
124
|
+
export type { IRefactorService } from "./elements/services/refactorService/IRefactorService.js";
|
|
125
|
+
export type { IRefactoring } from "./elements/services/refactorService/IRefactoring.js";
|
|
123
126
|
export type { ISelectionChangedEvent } from "./elements/services/selectionService/ISelectionChangedEvent.js";
|
|
124
127
|
export type { ISelectionService } from "./elements/services/selectionService/ISelectionService.js";
|
|
125
128
|
export * from "./elements/services/selectionService/SelectionService.js";
|
|
@@ -246,6 +249,7 @@ export * from "./elements/widgets/designerView/extensions/pointerExtensions/Curs
|
|
|
246
249
|
export * from "./elements/widgets/designerView/extensions/pointerExtensions/CursorLinePointerExtensionProvider.js";
|
|
247
250
|
export type { IMiniatureView } from "./elements/widgets/miniatureView/IMiniatureView.js";
|
|
248
251
|
export * from "./elements/widgets/debugView/debug-view.js";
|
|
252
|
+
export * from "./elements/widgets/refactorView/refactor-view.js";
|
|
249
253
|
export * from "./elements/widgets/demoView/demoView.js";
|
|
250
254
|
export * from "./elements/widgets/paletteView/paletteElements.js";
|
|
251
255
|
export * from "./elements/widgets/paletteView/paletteView.js";
|
package/dist/index.js
CHANGED
|
@@ -80,6 +80,7 @@ export * from "./elements/services/propertiesService/services/CssCustomPropertie
|
|
|
80
80
|
export * from "./elements/services/propertiesService/services/UnkownElementsPropertiesService.js";
|
|
81
81
|
export * from "./elements/services/propertiesService/PropertyType.js";
|
|
82
82
|
export * from "./elements/services/propertiesService/ValueType.js";
|
|
83
|
+
export * from "./elements/services/refactorService/BindingsRefactorService.js";
|
|
83
84
|
export * from "./elements/services/selectionService/SelectionService.js";
|
|
84
85
|
export * from "./elements/services/stylesheetService/AbstractStylesheetService.js";
|
|
85
86
|
export * from "./elements/services/undoService/ChangeGroup.js";
|
|
@@ -186,6 +187,7 @@ export * from "./elements/widgets/designerView/extensions/pointerExtensions/Abst
|
|
|
186
187
|
export * from "./elements/widgets/designerView/extensions/pointerExtensions/CursorLinePointerExtension.js";
|
|
187
188
|
export * from "./elements/widgets/designerView/extensions/pointerExtensions/CursorLinePointerExtensionProvider.js";
|
|
188
189
|
export * from "./elements/widgets/debugView/debug-view.js";
|
|
190
|
+
export * from "./elements/widgets/refactorView/refactor-view.js";
|
|
189
191
|
export * from "./elements/widgets/demoView/demoView.js";
|
|
190
192
|
export * from "./elements/widgets/paletteView/paletteElements.js";
|
|
191
193
|
export * from "./elements/widgets/paletteView/paletteView.js";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"description": "A UI designer for Polymer apps",
|
|
3
3
|
"name": "@node-projects/web-component-designer",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.27",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"author": "jochen.kuehner@gmx.de",
|
|
@@ -12,10 +12,10 @@
|
|
|
12
12
|
"prepublishOnly": "npm run build"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@node-projects/base-custom-webcomponent": ">=0.
|
|
15
|
+
"@node-projects/base-custom-webcomponent": ">=0.21.2"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"mdn-data": "^2.
|
|
18
|
+
"mdn-data": "^2.3.0"
|
|
19
19
|
},
|
|
20
20
|
"repository": {
|
|
21
21
|
"type": "git",
|