@pb33f/cowboy-components 0.2.0 → 0.2.2
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/components/manage-ruleset/manage-ruleset.d.ts +5 -1
- package/dist/components/manage-ruleset/manage-ruleset.js +27 -5
- package/dist/components/model-renderer/rendered-node.css.d.ts +2 -0
- package/dist/components/model-renderer/rendered-node.css.js +96 -0
- package/dist/components/model-renderer/rendered-node.d.ts +8 -0
- package/dist/components/model-renderer/rendered-node.js +117 -0
- package/dist/components/model-renderer/rendered-property.css.d.ts +2 -0
- package/dist/components/model-renderer/rendered-property.css.js +118 -0
- package/dist/components/model-renderer/rendered-property.d.ts +14 -0
- package/dist/components/model-renderer/rendered-property.js +204 -0
- package/dist/components/model-tree/tree-item.d.ts +10 -0
- package/dist/components/model-tree/tree-item.js +37 -0
- package/dist/components/model-tree/tree.css.d.ts +2 -0
- package/dist/components/model-tree/tree.css.js +20 -0
- package/dist/components/model-tree/tree.d.ts +16 -0
- package/dist/components/model-tree/tree.js +103 -0
- package/dist/components/the-doctor/the-doctor.css.js +2 -2
- package/dist/components/the-doctor/the-doctor.d.ts +4 -2
- package/dist/components/the-doctor/the-doctor.js +42 -18
- package/dist/components/visualizer/explorer.d.ts +52 -0
- package/dist/components/visualizer/explorer.js +296 -0
- package/dist/components/visualizer/node.d.ts +11 -0
- package/dist/components/visualizer/node.js +27 -0
- package/dist/components/visualizer/operation.css.d.ts +2 -0
- package/dist/components/visualizer/operation.css.js +53 -0
- package/dist/components/visualizer/operation.d.ts +12 -0
- package/dist/components/visualizer/operation.js +52 -0
- package/dist/components/visualizer/visualizer.css.d.ts +2 -0
- package/dist/components/visualizer/visualizer.css.js +157 -0
- package/dist/components/visualizer/visualizer.d.ts +60 -0
- package/dist/components/visualizer/visualizer.js +137 -0
- package/dist/cowboy-components.d.ts +1 -0
- package/dist/cowboy-components.js +2 -0
- package/dist/cowboy-components.umd.cjs +950 -324
- package/dist/css/pb33f-theme.css +1 -1
- package/dist/events/doctor.d.ts +9 -0
- package/dist/events/doctor.js +3 -0
- package/dist/model/graph.d.ts +6 -0
- package/dist/model/graph.js +1 -0
- package/dist/services/model-service.d.ts +5 -0
- package/dist/services/model-service.js +30 -0
- package/dist/style.css +1 -1
- package/package.json +6 -3
|
@@ -6,6 +6,10 @@ import { RuleComponent } from "./rule.js";
|
|
|
6
6
|
import { Rule, RuleConfig, RuleSet } from "../../model/vacuum_rule.js";
|
|
7
7
|
import { SlButton, SlDialog, SlRadioButton, SlRadioGroup, SlSwitch } from "@shoelace-style/shoelace";
|
|
8
8
|
import { RuleError } from "../../model/errors.js";
|
|
9
|
+
export declare const defaultRuleset = "default";
|
|
10
|
+
export declare const owaspRuleset = "owasp";
|
|
11
|
+
export declare const allRuleset = "all";
|
|
12
|
+
export declare const customRuleset = "custom";
|
|
9
13
|
export declare class ManageRuleset extends LitElement {
|
|
10
14
|
static styles: import("lit").CSSResult[];
|
|
11
15
|
saveButton: SlButton;
|
|
@@ -34,7 +38,7 @@ export declare class ManageRuleset extends LitElement {
|
|
|
34
38
|
constructor();
|
|
35
39
|
private rulesetUpdated;
|
|
36
40
|
private exportRuleset;
|
|
37
|
-
|
|
41
|
+
compileRuleset(): void;
|
|
38
42
|
clearRuleProblems(): void;
|
|
39
43
|
processBadRules(ruleError: RuleError[]): void;
|
|
40
44
|
rulesetSaved(ruleset: RuleSet, returnedRuleset: RuleSet): void;
|
|
@@ -13,15 +13,15 @@ import manageRulesetCss from "./manage-ruleset.css.js";
|
|
|
13
13
|
import { RuleComponent } from "./rule.js";
|
|
14
14
|
import buttonCss from "../../css/button.css.js";
|
|
15
15
|
import spinnerCss from "../../css/spinner.css.js";
|
|
16
|
-
import { AddToast, CustomRulesetEnabled, ExportRuleset, RulesetDirty, RulesetSaved } from "../../events/doctor.js";
|
|
16
|
+
import { AddToast, BuiltInRulesetChanged, CustomRulesetEnabled, ExportRuleset, RulesetDirty, RulesetSaved } from "../../events/doctor.js";
|
|
17
17
|
import modalCss from "../../css/modal.css.js";
|
|
18
18
|
import { RulesetService } from "../../services/ruleset-service.js";
|
|
19
19
|
import { ToastType } from "../../model/toast.js";
|
|
20
20
|
import radioGroupsCss from "../../css/radiogroups.css.js";
|
|
21
|
-
const defaultRuleset = "default";
|
|
22
|
-
const owaspRuleset = "owasp";
|
|
23
|
-
const allRuleset = "all";
|
|
24
|
-
const customRuleset = "custom";
|
|
21
|
+
export const defaultRuleset = "default";
|
|
22
|
+
export const owaspRuleset = "owasp";
|
|
23
|
+
export const allRuleset = "all";
|
|
24
|
+
export const customRuleset = "custom";
|
|
25
25
|
let ManageRuleset = class ManageRuleset extends LitElement {
|
|
26
26
|
constructor() {
|
|
27
27
|
super();
|
|
@@ -345,20 +345,42 @@ let ManageRuleset = class ManageRuleset extends LitElement {
|
|
|
345
345
|
case defaultRuleset:
|
|
346
346
|
this._activeRuleset = this._defaultRules;
|
|
347
347
|
this.currentRuleset = defaultRuleset;
|
|
348
|
+
this.dispatchEvent(new CustomEvent(BuiltInRulesetChanged, {
|
|
349
|
+
bubbles: true,
|
|
350
|
+
composed: true,
|
|
351
|
+
detail: {
|
|
352
|
+
ruleset: defaultRuleset
|
|
353
|
+
}
|
|
354
|
+
}));
|
|
348
355
|
break;
|
|
349
356
|
case owaspRuleset:
|
|
350
357
|
this._activeRuleset = this._owaspRules;
|
|
351
358
|
this.currentRuleset = owaspRuleset;
|
|
359
|
+
this.dispatchEvent(new CustomEvent(BuiltInRulesetChanged, {
|
|
360
|
+
bubbles: true,
|
|
361
|
+
composed: true,
|
|
362
|
+
detail: {
|
|
363
|
+
ruleset: owaspRuleset
|
|
364
|
+
}
|
|
365
|
+
}));
|
|
352
366
|
break;
|
|
353
367
|
case allRuleset:
|
|
354
368
|
this._activeRuleset = this._allRules;
|
|
355
369
|
this.currentRuleset = allRuleset;
|
|
370
|
+
this.dispatchEvent(new CustomEvent(BuiltInRulesetChanged, {
|
|
371
|
+
bubbles: true,
|
|
372
|
+
composed: true,
|
|
373
|
+
detail: {
|
|
374
|
+
ruleset: allRuleset
|
|
375
|
+
}
|
|
376
|
+
}));
|
|
356
377
|
break;
|
|
357
378
|
case customRuleset:
|
|
358
379
|
this._activeRuleset = this._customRules;
|
|
359
380
|
this.currentRuleset = customRuleset;
|
|
360
381
|
break;
|
|
361
382
|
}
|
|
383
|
+
this.compileRuleset();
|
|
362
384
|
}
|
|
363
385
|
buildRulesets() {
|
|
364
386
|
this._defaultRules = [];
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { css } from "lit";
|
|
2
|
+
export default css `
|
|
3
|
+
|
|
4
|
+
h3 {
|
|
5
|
+
padding-top: 5px;
|
|
6
|
+
margin: 0;
|
|
7
|
+
font-size: 1.2rem;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.node-path {
|
|
11
|
+
font-size: 0.7rem;
|
|
12
|
+
word-wrap: break-word;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
sl-badge::part(base) {
|
|
16
|
+
border-radius: 0;
|
|
17
|
+
background-color: var(--background-color);
|
|
18
|
+
border: 1px solid var(--secondary-color);
|
|
19
|
+
color: var(--secondary-color);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
.prop {
|
|
24
|
+
font-size: 0.8rem;
|
|
25
|
+
padding: 5px 5px 5px 10px;
|
|
26
|
+
border: 1px solid var(--secondary-color);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.prop-key {
|
|
30
|
+
display: inline-block;
|
|
31
|
+
min-width: 80px;
|
|
32
|
+
text-align: right;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.empty-node {
|
|
36
|
+
font-size: 0.8rem;
|
|
37
|
+
color: var(--primary-color);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.empty-node:hover {
|
|
41
|
+
cursor: pointer;
|
|
42
|
+
text-decoration: underline;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.empty-node:active {
|
|
46
|
+
cursor: pointer;
|
|
47
|
+
text-decoration: underline;
|
|
48
|
+
color: var(--error-color);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.property {
|
|
52
|
+
border: 1px solid var(--secondary-color);
|
|
53
|
+
width: 100%;
|
|
54
|
+
font-size: 0.8rem;
|
|
55
|
+
margin-top: 5px;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
table {
|
|
60
|
+
border: 1px solid var(--secondary-color);
|
|
61
|
+
width: 100%;
|
|
62
|
+
font-size: 0.8rem;
|
|
63
|
+
margin-top: 5px;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
.nested-props {
|
|
69
|
+
margin-left: 20px;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
td {
|
|
73
|
+
// border: 1px dashed var(--secondary-color);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
td.key {
|
|
77
|
+
width: 5%;
|
|
78
|
+
text-align: right;
|
|
79
|
+
padding-right: 5px;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.required {
|
|
83
|
+
display: inline-block;
|
|
84
|
+
padding: 1px;
|
|
85
|
+
color: var(--warn-200);
|
|
86
|
+
border: 1px solid var(--warn-200);
|
|
87
|
+
font-size: 0.6rem;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
hr {
|
|
93
|
+
margin-top: 10px;
|
|
94
|
+
margin-bottom: 10px;
|
|
95
|
+
}
|
|
96
|
+
`;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
|
+
import { Node } from "../visualizer/visualizer.js";
|
|
3
|
+
import './rendered-property.js';
|
|
4
|
+
export declare class RenderedNodeComponent extends LitElement {
|
|
5
|
+
static styles: import("lit").CSSResult[];
|
|
6
|
+
node: Node;
|
|
7
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { customElement, property } from "lit/decorators.js";
|
|
8
|
+
import { html, LitElement } from "lit";
|
|
9
|
+
import renderedNodeCss from "./rendered-node.css.js";
|
|
10
|
+
import './rendered-property.js';
|
|
11
|
+
import sharedCss from "../../css/shared.css.js";
|
|
12
|
+
let RenderedNodeComponent = class RenderedNodeComponent extends LitElement {
|
|
13
|
+
//buildProps(obj: any, required: string[] = []) {
|
|
14
|
+
// return html``
|
|
15
|
+
//
|
|
16
|
+
//
|
|
17
|
+
//
|
|
18
|
+
// const props: Map<string, any> = new Map<string, any>();
|
|
19
|
+
// for (const key in obj) {
|
|
20
|
+
// if (obj.hasOwnProperty(key)) {
|
|
21
|
+
// const element = obj[key];
|
|
22
|
+
// props.set(key, element);
|
|
23
|
+
// }
|
|
24
|
+
// }
|
|
25
|
+
// let requiredProps: string[] = []
|
|
26
|
+
// if (props.get('required')) {
|
|
27
|
+
// requiredProps = props.get('required')
|
|
28
|
+
// }
|
|
29
|
+
// requiredProps.push(...required)
|
|
30
|
+
// console.log(requiredProps);
|
|
31
|
+
// return html`
|
|
32
|
+
//
|
|
33
|
+
// <table>
|
|
34
|
+
//
|
|
35
|
+
// ${Array.from(props).map(([key, value]) => {
|
|
36
|
+
//
|
|
37
|
+
// if (!isNaN(key as any) && !isNaN(parseFloat(key as any))) {
|
|
38
|
+
// key = "-"
|
|
39
|
+
// }
|
|
40
|
+
//
|
|
41
|
+
// if (typeof value === 'object' && !Array.isArray(value)) {
|
|
42
|
+
//
|
|
43
|
+
// let required = false;
|
|
44
|
+
// if (requiredProps.includes(key)){
|
|
45
|
+
// required = true;
|
|
46
|
+
// const idx = requiredProps.indexOf(key);
|
|
47
|
+
// requiredProps.splice(idx, 1);
|
|
48
|
+
// }
|
|
49
|
+
//
|
|
50
|
+
// return html`
|
|
51
|
+
// <tr>
|
|
52
|
+
//
|
|
53
|
+
// <td colspan="2"> ${key} ${required? html`<span class="required">required</span>`: requiredProps}
|
|
54
|
+
// <div class="nested-props">${this.buildProps(value, requiredProps)}</div></td>
|
|
55
|
+
// </tr>`;
|
|
56
|
+
// }
|
|
57
|
+
//
|
|
58
|
+
// if (typeof value === 'object' && Array.isArray(value)) {
|
|
59
|
+
// if (key === 'required') {
|
|
60
|
+
// return html``;
|
|
61
|
+
// }
|
|
62
|
+
// return html`
|
|
63
|
+
// <tr>
|
|
64
|
+
// <td colspan="2"> ${key} []
|
|
65
|
+
// <div class="nested-props">${this.buildProps(value)}</div>
|
|
66
|
+
// </td>
|
|
67
|
+
// </tr>`;
|
|
68
|
+
// }
|
|
69
|
+
//
|
|
70
|
+
// if (key.startsWith('$ref')) {
|
|
71
|
+
// value = "REF()"
|
|
72
|
+
// }
|
|
73
|
+
//
|
|
74
|
+
//
|
|
75
|
+
// return html`
|
|
76
|
+
// <tr>
|
|
77
|
+
// <td class="key">${key}${key!='-'? ':':''}</td>
|
|
78
|
+
// <td>${value}</td>
|
|
79
|
+
// </tr>
|
|
80
|
+
// `;
|
|
81
|
+
// })}
|
|
82
|
+
// </table>
|
|
83
|
+
//
|
|
84
|
+
// `
|
|
85
|
+
// }
|
|
86
|
+
render() {
|
|
87
|
+
if (!this.node) {
|
|
88
|
+
return html `
|
|
89
|
+
<div class="rendered-node">
|
|
90
|
+
No Node
|
|
91
|
+
</div>
|
|
92
|
+
`;
|
|
93
|
+
}
|
|
94
|
+
console.log(this.node);
|
|
95
|
+
let renderedNode = html `<pb33f-rendered-property .value="${this.node.instance}" class="proppy"></pb33f-rendered-property>`;
|
|
96
|
+
if (!this.node.instance || Object.keys(this.node.instance).length === 0) {
|
|
97
|
+
renderedNode = html `<span class="empty-node">Defined on line [${this.node.line}]</span>`;
|
|
98
|
+
}
|
|
99
|
+
return html `
|
|
100
|
+
<div class="rendered-node">
|
|
101
|
+
<sl-badge>${this.node.type}</sl-badge>
|
|
102
|
+
<h3>${this.node.label}</h3>
|
|
103
|
+
<span class="node-path">$.<pb33f-render-json-path path="${this.node.id}"></pb33f-render-json-path></span>
|
|
104
|
+
<hr/>
|
|
105
|
+
${renderedNode}
|
|
106
|
+
</div>
|
|
107
|
+
`;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
RenderedNodeComponent.styles = [sharedCss, renderedNodeCss];
|
|
111
|
+
__decorate([
|
|
112
|
+
property()
|
|
113
|
+
], RenderedNodeComponent.prototype, "node", void 0);
|
|
114
|
+
RenderedNodeComponent = __decorate([
|
|
115
|
+
customElement('pb33f-rendered-node')
|
|
116
|
+
], RenderedNodeComponent);
|
|
117
|
+
export { RenderedNodeComponent };
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { css } from "lit";
|
|
2
|
+
export default css `
|
|
3
|
+
|
|
4
|
+
.property {
|
|
5
|
+
border-left: 1px dashed var(--secondary-color);
|
|
6
|
+
|
|
7
|
+
font-size: 0.8rem;
|
|
8
|
+
//padding-top: 10px;
|
|
9
|
+
padding-left: 10px;
|
|
10
|
+
//padding-bottom: 10px;
|
|
11
|
+
|
|
12
|
+
//margin-bottom: 30px;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.property-start {
|
|
16
|
+
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.property-end {
|
|
20
|
+
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.inline-property {
|
|
24
|
+
font-size: 0.8rem;
|
|
25
|
+
margin-bottom: 5px;
|
|
26
|
+
margin-top: 5px;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.inline-ref {
|
|
30
|
+
font-size: 0.8rem;
|
|
31
|
+
margin-top: 10px;
|
|
32
|
+
margin-bottom: 10px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.reflink {
|
|
36
|
+
color: var(--terminal-text);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.poly-reflink {
|
|
40
|
+
color: var(--warn-color);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
sl-icon.reflink, sl-icon.poly-reflink {
|
|
45
|
+
font-size: 1.3rem;
|
|
46
|
+
vertical-align: sub;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.inline-ref:hover {
|
|
50
|
+
text-decoration: underline;
|
|
51
|
+
cursor: pointer;
|
|
52
|
+
}
|
|
53
|
+
.inline-ref:active {
|
|
54
|
+
text-decoration: underline;
|
|
55
|
+
cursor: pointer;
|
|
56
|
+
color: var(--error-color);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.type {
|
|
60
|
+
display: inline-block;
|
|
61
|
+
padding: 1px;
|
|
62
|
+
color: var(--secondary-color);
|
|
63
|
+
//border: 1px solid var(--secondary-color);
|
|
64
|
+
font-size: 0.8rem;
|
|
65
|
+
margin-bottom: 5px;
|
|
66
|
+
}
|
|
67
|
+
.nested {
|
|
68
|
+
padding-left: 15px;
|
|
69
|
+
margin-top: 5px;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.nested-inline {
|
|
73
|
+
display: inline-block;
|
|
74
|
+
text-align: center;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.object-node {
|
|
78
|
+
margin-bottom: 5px;
|
|
79
|
+
margin-top: 5px;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.required {
|
|
83
|
+
display: inline-block;
|
|
84
|
+
padding: 1px;
|
|
85
|
+
color: var(--primary-color);
|
|
86
|
+
|
|
87
|
+
font-size: 0.7rem;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.ref {
|
|
91
|
+
display: inline-block;
|
|
92
|
+
padding: 1px;
|
|
93
|
+
color: var(--primary-color);
|
|
94
|
+
border: 1px dashed var(--primary-color);
|
|
95
|
+
font-size: 0.7rem;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.label {
|
|
99
|
+
font-family: var(--font-stack-bold), monospace;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.prop-key {
|
|
103
|
+
color: var(--font-color-sub1)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.prop-type {
|
|
107
|
+
color: var(--primary-color);
|
|
108
|
+
font-family: var(--font-stack-bold), monospace;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.summary {
|
|
112
|
+
color: red;
|
|
113
|
+
border: 1px dashed var(--font-color-sub2);
|
|
114
|
+
padding: 5px;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
`;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
|
+
export declare class RenderedPropertyComponent extends LitElement {
|
|
3
|
+
static styles: import("lit").CSSResult[];
|
|
4
|
+
requiredProps: string[];
|
|
5
|
+
propType: string[];
|
|
6
|
+
value: any;
|
|
7
|
+
open: boolean;
|
|
8
|
+
polyParent: boolean;
|
|
9
|
+
ignoreProps: string[];
|
|
10
|
+
depth: number;
|
|
11
|
+
constructor();
|
|
12
|
+
toggleOpen(): void;
|
|
13
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { customElement, property } from "lit/decorators.js";
|
|
8
|
+
import { html, LitElement } from "lit";
|
|
9
|
+
import renderedPropertyCss from "./rendered-property.css.js";
|
|
10
|
+
let RenderedPropertyComponent = class RenderedPropertyComponent extends LitElement {
|
|
11
|
+
constructor() {
|
|
12
|
+
super();
|
|
13
|
+
this.ignoreProps = ['required', 'example', 'examples', 'type'];
|
|
14
|
+
this.depth = 0;
|
|
15
|
+
this.polyParent = false;
|
|
16
|
+
}
|
|
17
|
+
toggleOpen() {
|
|
18
|
+
this.open = !this.open;
|
|
19
|
+
}
|
|
20
|
+
render() {
|
|
21
|
+
if (!this.value || Object.keys(this.value).length === 0) {
|
|
22
|
+
return html ``;
|
|
23
|
+
}
|
|
24
|
+
const props = new Map();
|
|
25
|
+
for (const key in this.value) {
|
|
26
|
+
if (this.value.hasOwnProperty(key)) {
|
|
27
|
+
const element = this.value[key];
|
|
28
|
+
props.set(key, element);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let requiredProps = [];
|
|
32
|
+
if (props.get('required')) {
|
|
33
|
+
const rp = props.get('required');
|
|
34
|
+
if (typeof rp == 'boolean') {
|
|
35
|
+
requiredProps = ['true'];
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
requiredProps = rp;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (Array.isArray(this.requiredProps) && this.requiredProps.length > 0) {
|
|
42
|
+
requiredProps.push(...this.requiredProps);
|
|
43
|
+
}
|
|
44
|
+
let hasType = false;
|
|
45
|
+
if (this.value.hasOwnProperty('type')) {
|
|
46
|
+
hasType = true;
|
|
47
|
+
}
|
|
48
|
+
let typeDef = html ``;
|
|
49
|
+
if (this.depth == 0 && hasType) {
|
|
50
|
+
if (Array.isArray(this.value['type'])) {
|
|
51
|
+
typeDef = html `
|
|
52
|
+
<div>
|
|
53
|
+
<span class="label">type:</span> ${Array.from(this.value['type']).map((type, i) => {
|
|
54
|
+
return html `<span class="type">${type}</span> ${i + 1 < this.value['type'].length ? ', ' : ''}`;
|
|
55
|
+
})}
|
|
56
|
+
</div>`;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
typeDef = html `
|
|
60
|
+
<div>
|
|
61
|
+
<span class="label">type:</span> <span class="type">${this.value['type']}</span>
|
|
62
|
+
</div>`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const propArr = Array.from(props);
|
|
66
|
+
return html `
|
|
67
|
+
|
|
68
|
+
<div class="property">
|
|
69
|
+
${typeDef}
|
|
70
|
+
|
|
71
|
+
${propArr.map(([key, value], i) => {
|
|
72
|
+
let isNumKey = false;
|
|
73
|
+
if (!isNaN(key) && !isNaN(parseFloat(key))) {
|
|
74
|
+
key = `[${i}]`;
|
|
75
|
+
isNumKey = true;
|
|
76
|
+
}
|
|
77
|
+
let isPoly = false;
|
|
78
|
+
if (key == 'oneOf' || key == 'anyOf' || key == 'allOf' || this.polyParent) {
|
|
79
|
+
isPoly = true;
|
|
80
|
+
}
|
|
81
|
+
if (typeof value === 'object' && !Array.isArray(value)) {
|
|
82
|
+
if (this.ignoreProps.includes(key)) {
|
|
83
|
+
return html ``;
|
|
84
|
+
}
|
|
85
|
+
let required = false;
|
|
86
|
+
if (requiredProps?.includes(key)) {
|
|
87
|
+
required = true;
|
|
88
|
+
const idx = requiredProps.indexOf(key);
|
|
89
|
+
requiredProps.splice(idx, 1);
|
|
90
|
+
}
|
|
91
|
+
let propType = [];
|
|
92
|
+
let propTypeRendered = html ``;
|
|
93
|
+
if (value.hasOwnProperty('type')) {
|
|
94
|
+
propType = value['type'];
|
|
95
|
+
if (Array.isArray(propType) && propType.length > 0) {
|
|
96
|
+
propTypeRendered = html `${propType.length > 0 ? propType.map((type) => {
|
|
97
|
+
return html `<span class="type">${type}</span>`;
|
|
98
|
+
}) : html ``}`;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
propTypeRendered = html `<span class="type">${propType}</span>`;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
let nested = html `
|
|
105
|
+
<div class="nested">
|
|
106
|
+
<pb33f-rendered-property .value="${value}"
|
|
107
|
+
.requiredProps="${requiredProps}"
|
|
108
|
+
.depth="${this.depth + 1}"
|
|
109
|
+
?polyParent="${isPoly}"></pb33f-rendered-property>
|
|
110
|
+
</div>`;
|
|
111
|
+
let isRef = false;
|
|
112
|
+
// let isRefRendered = html``
|
|
113
|
+
if (value.hasOwnProperty('$ref')) {
|
|
114
|
+
isRef = true;
|
|
115
|
+
const ref = value['$ref'];
|
|
116
|
+
const segs = ref.split('/');
|
|
117
|
+
const refName = segs[segs.length - 1];
|
|
118
|
+
// isRefRendered = html`<span class="ref">refy</span>:`
|
|
119
|
+
nested = html `
|
|
120
|
+
<div class="nested${isNumKey ? '-inline' : ''}">
|
|
121
|
+
<sl-icon name="link"
|
|
122
|
+
class="${this.polyParent ? 'poly-reflink' : 'reflink'}"></sl-icon>
|
|
123
|
+
<span class="inline-ref ${this.polyParent ? 'poly-reflink' : 'reflink'}">${refName}</span>
|
|
124
|
+
</div>`;
|
|
125
|
+
}
|
|
126
|
+
return html `
|
|
127
|
+
<div class="object-node">
|
|
128
|
+
<span class="${(propType.length > 0 || isRef) ? 'prop-type' : 'prop-key'}">${key}</span>:
|
|
129
|
+
${propTypeRendered}
|
|
130
|
+
${required ? html `<span class="required">*required</span>` : ''}
|
|
131
|
+
${nested}
|
|
132
|
+
</div>
|
|
133
|
+
`;
|
|
134
|
+
}
|
|
135
|
+
if (typeof value === 'object' && Array.isArray(value)) {
|
|
136
|
+
if (this.ignoreProps.includes(key)) {
|
|
137
|
+
return html ``;
|
|
138
|
+
}
|
|
139
|
+
let nested = html `
|
|
140
|
+
<div class="nested">
|
|
141
|
+
<pb33f-rendered-property .value="${value}"
|
|
142
|
+
.requiredProps="${this.requiredProps}"
|
|
143
|
+
.depth="${this.depth + 1}"
|
|
144
|
+
?polyParent="${isPoly}"></pb33f-rendered-property>
|
|
145
|
+
</div>`;
|
|
146
|
+
if (value.length == 0) {
|
|
147
|
+
nested = html `<span class="nested-inline">[empty]</span>`;
|
|
148
|
+
}
|
|
149
|
+
return html `
|
|
150
|
+
<div>
|
|
151
|
+
<span class="${(value.length == 0) ? 'prop-type' : 'prop-key'}">${key}</span>:
|
|
152
|
+
${nested}
|
|
153
|
+
</div>
|
|
154
|
+
</div>`;
|
|
155
|
+
}
|
|
156
|
+
let renderedProp = html `<span class="prop-type">${key}</span>: ${value}`;
|
|
157
|
+
if (key.startsWith('$ref')) {
|
|
158
|
+
const segs = value.split('/');
|
|
159
|
+
value = segs[segs.length - 1];
|
|
160
|
+
renderedProp = html `reference: <div class="nested-inline"><sl-icon name="link" class="reflink"></sl-icon>
|
|
161
|
+
<span class="inline-ref reflink">${value}</span></div>`;
|
|
162
|
+
}
|
|
163
|
+
if (key == 'description' || key == 'summary') {
|
|
164
|
+
renderedProp = html `<div class="summary">${value}</div>`;
|
|
165
|
+
}
|
|
166
|
+
if (this.ignoreProps.includes(key)) {
|
|
167
|
+
return html ``;
|
|
168
|
+
}
|
|
169
|
+
const op = html `<div class="inline-property">${renderedProp}</div>`;
|
|
170
|
+
if (this.depth > 0) {
|
|
171
|
+
this.depth--;
|
|
172
|
+
}
|
|
173
|
+
return op;
|
|
174
|
+
})}
|
|
175
|
+
</div>
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
`;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
RenderedPropertyComponent.styles = [renderedPropertyCss];
|
|
183
|
+
__decorate([
|
|
184
|
+
property()
|
|
185
|
+
], RenderedPropertyComponent.prototype, "requiredProps", void 0);
|
|
186
|
+
__decorate([
|
|
187
|
+
property()
|
|
188
|
+
], RenderedPropertyComponent.prototype, "propType", void 0);
|
|
189
|
+
__decorate([
|
|
190
|
+
property()
|
|
191
|
+
], RenderedPropertyComponent.prototype, "value", void 0);
|
|
192
|
+
__decorate([
|
|
193
|
+
property({ type: Boolean })
|
|
194
|
+
], RenderedPropertyComponent.prototype, "open", void 0);
|
|
195
|
+
__decorate([
|
|
196
|
+
property({ type: Boolean })
|
|
197
|
+
], RenderedPropertyComponent.prototype, "polyParent", void 0);
|
|
198
|
+
__decorate([
|
|
199
|
+
property({ type: Number })
|
|
200
|
+
], RenderedPropertyComponent.prototype, "depth", void 0);
|
|
201
|
+
RenderedPropertyComponent = __decorate([
|
|
202
|
+
customElement('pb33f-rendered-property')
|
|
203
|
+
], RenderedPropertyComponent);
|
|
204
|
+
export { RenderedPropertyComponent };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import '@shoelace-style/shoelace/dist/components/tree-item/tree-item.js';
|
|
2
|
+
import { TemplateResult } from "lit";
|
|
3
|
+
import { Node } from "../visualizer/visualizer";
|
|
4
|
+
import { SlTreeItem } from "@shoelace-style/shoelace";
|
|
5
|
+
export declare class ModelTreeItem extends SlTreeItem {
|
|
6
|
+
node: Node;
|
|
7
|
+
results: TemplateResult[];
|
|
8
|
+
constructor(node: Node, results: TemplateResult[]);
|
|
9
|
+
render(): TemplateResult<1>;
|
|
10
|
+
}
|