@fairspec/agent 0.9.0 → 0.9.1
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/build/package.json +1 -1
- package/package.json +2 -2
- package/build/actions/tableSchema/asHtml.d.ts +0 -4
- package/build/actions/tableSchema/asHtml.js +0 -82
- package/build/actions/tableSchema/asHtml.spec.d.ts +0 -1
- package/build/actions/tableSchema/asHtml.spec.js +0 -356
- package/build/actions/tableSchema/asMarkdown.d.ts +0 -4
- package/build/actions/tableSchema/asMarkdown.js +0 -65
- package/build/actions/tableSchema/asMarkdown.spec.d.ts +0 -1
- package/build/actions/tableSchema/asMarkdown.spec.js +0 -133
- package/build/document/Document.d.ts +0 -2
- package/build/document/Document.js +0 -2
- package/build/document/index.d.ts +0 -3
- package/build/document/index.js +0 -3
- package/build/document/types/Base.d.ts +0 -3
- package/build/document/types/Base.js +0 -2
- package/build/document/types/Json.d.ts +0 -5
- package/build/document/types/Json.js +0 -2
- package/build/document/validate.d.ts +0 -5
- package/build/document/validate.js +0 -23
- package/build/document/validate.spec.d.ts +0 -1
- package/build/document/validate.spec.js +0 -71
- package/build/plugin.d.ts +0 -6
- package/build/plugin.js +0 -15
- package/build/schema/convert/toHtml.d.ts +0 -4
- package/build/schema/convert/toHtml.js +0 -107
- package/build/schema/convert/toHtml.spec.d.ts +0 -1
- package/build/schema/convert/toHtml.spec.js +0 -432
- package/build/schema/convert/toMarkdown.d.ts +0 -4
- package/build/schema/convert/toMarkdown.js +0 -75
- package/build/schema/convert/toMarkdown.spec.d.ts +0 -1
- package/build/schema/convert/toMarkdown.spec.js +0 -137
- package/build/schema/index.d.ts +0 -2
- package/build/schema/index.js +0 -3
- package/build/tableSchema/convert/toHtml.d.ts +0 -4
- package/build/tableSchema/convert/toHtml.js +0 -80
- package/build/tableSchema/convert/toHtml.spec.d.ts +0 -1
- package/build/tableSchema/convert/toHtml.spec.js +0 -375
- package/build/tableSchema/convert/toMarkdown.d.ts +0 -4
- package/build/tableSchema/convert/toMarkdown.js +0 -57
- package/build/tableSchema/convert/toMarkdown.spec.d.ts +0 -1
- package/build/tableSchema/convert/toMarkdown.spec.js +0 -141
- package/build/tableSchema/index.d.ts +0 -2
- package/build/tableSchema/index.js +0 -3
package/build/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fairspec/agent",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.9.
|
|
4
|
+
"version": "0.9.1",
|
|
5
5
|
"exports": "./build/index.js",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"files": [
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"@mastra/core": "^1.2.0",
|
|
31
31
|
"@mastra/mcp": "^1.0.0",
|
|
32
32
|
"zod": "^4.2.1",
|
|
33
|
-
"@fairspec/library": "0.
|
|
33
|
+
"@fairspec/library": "0.9.1"
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
36
|
"build": "tsc",
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { getColumns } from "@fairspec/metadata";
|
|
3
|
-
import { prettify } from "htmlfy";
|
|
4
|
-
import { renderToStaticMarkup } from "react-dom/server";
|
|
5
|
-
export function renderTableSchemaAsHtml(schema, options) {
|
|
6
|
-
let html = prettify(renderToStaticMarkup(_jsx(SchemaTable, { schema: schema })));
|
|
7
|
-
if (options?.frontmatter) {
|
|
8
|
-
if (schema.title) {
|
|
9
|
-
html = `---\ntitle: ${schema.title}\n---\n\n${html}`;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
return html;
|
|
13
|
-
}
|
|
14
|
-
function SchemaTable(props) {
|
|
15
|
-
const { schema } = props;
|
|
16
|
-
return (_jsxs(_Fragment, { children: [schema.primaryKey && _jsx(PrimaryKey, { fields: schema.primaryKey }), schema.foreignKeys && schema.foreignKeys.length > 0 && (_jsx(ForeignKeys, { foreignKeys: schema.foreignKeys })), _jsx(FieldsTable, { schema: schema })] }));
|
|
17
|
-
}
|
|
18
|
-
function FieldsTable(props) {
|
|
19
|
-
const { schema } = props;
|
|
20
|
-
const columns = getColumns(schema);
|
|
21
|
-
const required = schema.required ?? [];
|
|
22
|
-
return (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Columns" }), _jsxs("table", { children: [_jsxs("colgroup", { children: [_jsx("col", { width: "20%" }), _jsx("col", { width: "65%" }), _jsx("col", { width: "15%" })] }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Name" }), _jsx("th", { children: "Definition" }), _jsx("th", { children: "Type" })] }) }), _jsx("tbody", { children: columns.map(column => (_jsx(FieldRow, { column: column, isRequired: required.includes(column.name) }, column.name))) })] })] }));
|
|
23
|
-
}
|
|
24
|
-
function FieldRow(props) {
|
|
25
|
-
const { column, isRequired } = props;
|
|
26
|
-
const { name, type, property } = column;
|
|
27
|
-
const columnDescription = property.description ?? "";
|
|
28
|
-
const constraints = extractConstraints(property);
|
|
29
|
-
return (_jsxs("tr", { children: [_jsx("td", { id: sanitizeId(name), children: _jsx("code", { children: _jsxs("strong", { children: [name, !isRequired && "?"] }) }) }), _jsxs("td", { children: [columnDescription && _jsx("p", { children: columnDescription }), constraints.length > 0 && (_jsx(ConstraintsList, { constraints: constraints })), "categories" in property && property.categories !== undefined && (_jsx(CategoriesList, { categories: property.categories }))] }), _jsx("td", { children: _jsx("code", { children: type }) })] }));
|
|
30
|
-
}
|
|
31
|
-
function ConstraintsList(props) {
|
|
32
|
-
const { constraints } = props;
|
|
33
|
-
return (_jsxs(_Fragment, { children: [_jsx("strong", { children: "Constraints" }), _jsx("ul", { children: constraints.map((constraint, index) => (_jsxs("li", { children: [constraint.name, ": ", _jsx("code", { children: constraint.value })] }, index))) })] }));
|
|
34
|
-
}
|
|
35
|
-
function CategoriesList(props) {
|
|
36
|
-
const { categories } = props;
|
|
37
|
-
return (_jsxs(_Fragment, { children: [_jsx("strong", { children: "Categories" }), _jsx("ul", { children: categories.map((category, index) => {
|
|
38
|
-
const value = typeof category === "object" ? category.value : category;
|
|
39
|
-
const label = typeof category === "object" ? category.label : undefined;
|
|
40
|
-
return (_jsxs("li", { children: [_jsx("code", { children: String(value) }), label && ` - ${label}`] }, index));
|
|
41
|
-
}) })] }));
|
|
42
|
-
}
|
|
43
|
-
function extractConstraints(property) {
|
|
44
|
-
const constraints = [];
|
|
45
|
-
if ("minimum" in property && property.minimum !== undefined) {
|
|
46
|
-
constraints.push({ name: "minimum", value: String(property.minimum) });
|
|
47
|
-
}
|
|
48
|
-
if ("maximum" in property && property.maximum !== undefined) {
|
|
49
|
-
constraints.push({ name: "maximum", value: String(property.maximum) });
|
|
50
|
-
}
|
|
51
|
-
if ("minLength" in property && property.minLength !== undefined) {
|
|
52
|
-
constraints.push({ name: "minLength", value: String(property.minLength) });
|
|
53
|
-
}
|
|
54
|
-
if ("maxLength" in property && property.maxLength !== undefined) {
|
|
55
|
-
constraints.push({ name: "maxLength", value: String(property.maxLength) });
|
|
56
|
-
}
|
|
57
|
-
if ("pattern" in property && property.pattern) {
|
|
58
|
-
constraints.push({ name: "pattern", value: property.pattern });
|
|
59
|
-
}
|
|
60
|
-
if ("enum" in property && property.enum) {
|
|
61
|
-
const enumValues = property.enum.map(v => String(v)).join(", ");
|
|
62
|
-
constraints.push({ name: "enum", value: enumValues });
|
|
63
|
-
}
|
|
64
|
-
return constraints;
|
|
65
|
-
}
|
|
66
|
-
function PrimaryKey(props) {
|
|
67
|
-
const { fields } = props;
|
|
68
|
-
return (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Primary Key" }), _jsx("p", { children: _jsx("code", { children: fields.join(", ") }) })] }));
|
|
69
|
-
}
|
|
70
|
-
function ForeignKeys(props) {
|
|
71
|
-
const { foreignKeys } = props;
|
|
72
|
-
if (!foreignKeys)
|
|
73
|
-
return null;
|
|
74
|
-
return (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Foreign Keys" }), _jsxs("table", { children: [_jsxs("colgroup", { children: [_jsx("col", { width: "40%" }), _jsx("col", { width: "30%" }), _jsx("col", { width: "30%" })] }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Columns" }), _jsx("th", { children: "Reference Resource" }), _jsx("th", { children: "Reference Columns" })] }) }), _jsx("tbody", { children: foreignKeys.map((fk, index) => (_jsxs("tr", { children: [_jsx("td", { children: _jsx("code", { children: fk.columns.join(", ") }) }), _jsx("td", { children: _jsx("code", { children: fk.reference.resource || "-" }) }), _jsx("td", { children: _jsx("code", { children: fk.reference.columns.join(", ") }) })] }, index))) })] })] }));
|
|
75
|
-
}
|
|
76
|
-
function sanitizeId(text) {
|
|
77
|
-
return text
|
|
78
|
-
.toLowerCase()
|
|
79
|
-
.replace(/[^a-z0-9]+/g, "-")
|
|
80
|
-
.replace(/^-|-$/g, "");
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNIdG1sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYWN0aW9ucy90YWJsZVNjaGVtYS9hc0h0bWwudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUV2RCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLE1BQW1CLEVBQ25CLE9BQW1DO0lBRW5DLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFDLFdBQVcsSUFBQyxNQUFNLEVBQUUsTUFBTSxHQUFJLENBQUMsQ0FBQyxDQUFBO0lBRTFFLElBQUksT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLElBQUksR0FBRyxlQUFlLE1BQU0sQ0FBQyxLQUFLLFlBQVksSUFBSSxFQUFFLENBQUE7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUE4QjtJQUNqRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBRXhCLE9BQU8sQ0FDTCw4QkFDRyxNQUFNLENBQUMsVUFBVSxJQUFJLEtBQUMsVUFBVSxJQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBVSxHQUFJLEVBQzlELE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQ3RELEtBQUMsV0FBVyxJQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxHQUFJLENBQ2pELEVBQ0QsS0FBQyxXQUFXLElBQUMsTUFBTSxFQUFFLE1BQU0sR0FBSSxJQUM5QixDQUNK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LEVBQ3JCLDRCQUNFLCtCQUNFLGNBQUssS0FBSyxFQUFDLEtBQUssR0FBRyxFQUNuQixjQUFLLEtBQUssRUFBQyxLQUFLLEdBQUcsRUFDbkIsY0FBSyxLQUFLLEVBQUMsS0FBSyxHQUFHLElBQ1YsRUFDWCwwQkFDRSx5QkFDRSxtQ0FBZ0IsRUFDaEIsOENBQTJCLEVBQzNCLDZDQUEwQixJQUN2QixHQUNDLEVBQ1IsMEJBQ0csV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQzlCLHlCQUNFLHVCQUNFLHlCQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFRLEdBQ2pDLEVBQ0wsdUJBQ0UseUJBQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksR0FBRyxHQUFRLEdBQ3hDLEVBQ0wsdUJBQ0UseUJBQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFRLEdBQzNDLEtBVEUsS0FBSyxDQVVULENBQ04sQ0FBQyxHQUNJLElBQ0YsSUFDUCxDQUNKLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBWTtJQUM5QixPQUFPLElBQUk7U0FDUixXQUFXLEVBQUU7U0FDYixPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQztTQUMzQixPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbHVtbiwgVGFibGVTY2hlbWEgfSBmcm9tIFwiQGZhaXJzcGVjL21ldGFkYXRhXCJcbmltcG9ydCB7IGdldENvbHVtbnMgfSBmcm9tIFwiQGZhaXJzcGVjL21ldGFkYXRhXCJcbmltcG9ydCB7IHByZXR0aWZ5IH0gZnJvbSBcImh0bWxmeVwiXG5pbXBvcnQgeyByZW5kZXJUb1N0YXRpY01hcmt1cCB9IGZyb20gXCJyZWFjdC1kb20vc2VydmVyXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRhYmxlU2NoZW1hQXNIdG1sKFxuICBzY2hlbWE6IFRhYmxlU2NoZW1hLFxuICBvcHRpb25zPzogeyBmcm9udG1hdHRlcj86IGJvb2xlYW4gfSxcbik6IHN0cmluZyB7XG4gIGxldCBodG1sID0gcHJldHRpZnkocmVuZGVyVG9TdGF0aWNNYXJrdXAoPFNjaGVtYVRhYmxlIHNjaGVtYT17c2NoZW1hfSAvPikpXG5cbiAgaWYgKG9wdGlvbnM/LmZyb250bWF0dGVyKSB7XG4gICAgaWYgKHNjaGVtYS50aXRsZSkge1xuICAgICAgaHRtbCA9IGAtLS1cXG50aXRsZTogJHtzY2hlbWEudGl0bGV9XFxuLS0tXFxuXFxuJHtodG1sfWBcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaHRtbFxufVxuXG5mdW5jdGlvbiBTY2hlbWFUYWJsZShwcm9wczogeyBzY2hlbWE6IFRhYmxlU2NoZW1hIH0pIHtcbiAgY29uc3QgeyBzY2hlbWEgfSA9IHByb3BzXG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAge3NjaGVtYS5wcmltYXJ5S2V5ICYmIDxQcmltYXJ5S2V5IGZpZWxkcz17c2NoZW1hLnByaW1hcnlLZXl9IC8+fVxuICAgICAge3NjaGVtYS5mb3JlaWduS2V5cyAmJiBzY2hlbWEuZm9yZWlnbktleXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgIDxGb3JlaWduS2V5cyBmb3JlaWduS2V5cz17c2NoZW1hLmZvcmVpZ25LZXlzfSAvPlxuICAgICAgKX1cbiAgICAgIDxGaWVsZHNUYWJsZSBzY2hlbWE9e3NjaGVtYX0gLz5cbiAgICA8Lz5cbiAgKVxufVxuXG5mdW5jdGlvbiBGaWVsZHNUYWJsZShwcm9wczogeyBzY2hlbWE6IFRhYmxlU2NoZW1hIH0pIHtcbiAgY29uc3QgeyBzY2hlbWEgfSA9IHByb3BzXG4gIGNvbnN0IGNvbHVtbnMgPSBnZXRDb2x1bW5zKHNjaGVtYSlcbiAgY29uc3QgcmVxdWlyZWQgPSBzY2hlbWEucmVxdWlyZWQgPz8gW11cblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8aDI+Q29sdW1uczwvaDI+XG4gICAgICA8dGFibGU+XG4gICAgICAgIDxjb2xncm91cD5cbiAgICAgICAgICA8Y29sIHdpZHRoPVwiMjAlXCIgLz5cbiAgICAgICAgICA8Y29sIHdpZHRoPVwiNjUlXCIgLz5cbiAgICAgICAgICA8Y29sIHdpZHRoPVwiMTUlXCIgLz5cbiAgICAgICAgPC9jb2xncm91cD5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cbiAgICAgICAgICAgIDx0aD5EZWZpbml0aW9uPC90aD5cbiAgICAgICAgICAgIDx0aD5UeXBlPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAge2NvbHVtbnMubWFwKGNvbHVtbiA9PiAoXG4gICAgICAgICAgICA8RmllbGRSb3dcbiAgICAgICAgICAgICAga2V5PXtjb2x1bW4ubmFtZX1cbiAgICAgICAgICAgICAgY29sdW1uPXtjb2x1bW59XG4gICAgICAgICAgICAgIGlzUmVxdWlyZWQ9e3JlcXVpcmVkLmluY2x1ZGVzKGNvbHVtbi5uYW1lKX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvPlxuICApXG59XG5cbmZ1bmN0aW9uIEZpZWxkUm93KHByb3BzOiB7IGNvbHVtbjogQ29sdW1uOyBpc1JlcXVpcmVkOiBib29sZWFuIH0pIHtcbiAgY29uc3QgeyBjb2x1bW4sIGlzUmVxdWlyZWQgfSA9IHByb3BzXG4gIGNvbnN0IHsgbmFtZSwgdHlwZSwgcHJvcGVydHkgfSA9IGNvbHVtblxuICBjb25zdCBjb2x1bW5EZXNjcmlwdGlvbiA9IHByb3BlcnR5LmRlc2NyaXB0aW9uID8/IFwiXCJcblxuICBjb25zdCBjb25zdHJhaW50cyA9IGV4dHJhY3RDb25zdHJhaW50cyhwcm9wZXJ0eSlcblxuICByZXR1cm4gKFxuICAgIDx0cj5cbiAgICAgIDx0ZCBpZD17c2FuaXRpemVJZChuYW1lKX0+XG4gICAgICAgIDxjb2RlPlxuICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICB7bmFtZX1cbiAgICAgICAgICAgIHshaXNSZXF1aXJlZCAmJiBcIj9cIn1cbiAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgPC9jb2RlPlxuICAgICAgPC90ZD5cbiAgICAgIDx0ZD5cbiAgICAgICAge2NvbHVtbkRlc2NyaXB0aW9uICYmIDxwPntjb2x1bW5EZXNjcmlwdGlvbn08L3A+fVxuICAgICAgICB7Y29uc3RyYWludHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgPENvbnN0cmFpbnRzTGlzdCBjb25zdHJhaW50cz17Y29uc3RyYWludHN9IC8+XG4gICAgICAgICl9XG4gICAgICAgIHtcImNhdGVnb3JpZXNcIiBpbiBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5jYXRlZ29yaWVzICE9PSB1bmRlZmluZWQgJiYgKFxuICAgICAgICAgIDxDYXRlZ29yaWVzTGlzdCBjYXRlZ29yaWVzPXtwcm9wZXJ0eS5jYXRlZ29yaWVzfSAvPlxuICAgICAgICApfVxuICAgICAgPC90ZD5cbiAgICAgIDx0ZD5cbiAgICAgICAgPGNvZGU+e3R5cGV9PC9jb2RlPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICApXG59XG5cbmZ1bmN0aW9uIENvbnN0cmFpbnRzTGlzdChwcm9wczogeyBjb25zdHJhaW50czogQ29uc3RyYWludFtdIH0pIHtcbiAgY29uc3QgeyBjb25zdHJhaW50cyB9ID0gcHJvcHNcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPHN0cm9uZz5Db25zdHJhaW50czwvc3Ryb25nPlxuICAgICAgPHVsPlxuICAgICAgICB7Y29uc3RyYWludHMubWFwKChjb25zdHJhaW50LCBpbmRleCkgPT4gKFxuICAgICAgICAgIDxsaSBrZXk9e2luZGV4fT5cbiAgICAgICAgICAgIHtjb25zdHJhaW50Lm5hbWV9OiA8Y29kZT57Y29uc3RyYWludC52YWx1ZX08L2NvZGU+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgKSl9XG4gICAgICA8L3VsPlxuICAgIDwvPlxuICApXG59XG5cbmZ1bmN0aW9uIENhdGVnb3JpZXNMaXN0KHByb3BzOiB7IGNhdGVnb3JpZXM6IGFueVtdIH0pIHtcbiAgY29uc3QgeyBjYXRlZ29yaWVzIH0gPSBwcm9wc1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8c3Ryb25nPkNhdGVnb3JpZXM8L3N0cm9uZz5cbiAgICAgIDx1bD5cbiAgICAgICAge2NhdGVnb3JpZXMubWFwKChjYXRlZ29yeSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIiA/IGNhdGVnb3J5LnZhbHVlIDogY2F0ZWdvcnlcbiAgICAgICAgICBjb25zdCBsYWJlbCA9XG4gICAgICAgICAgICB0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCIgPyBjYXRlZ29yeS5sYWJlbCA6IHVuZGVmaW5lZFxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8bGkga2V5PXtpbmRleH0+XG4gICAgICAgICAgICAgIDxjb2RlPntTdHJpbmcodmFsdWUpfTwvY29kZT5cbiAgICAgICAgICAgICAge2xhYmVsICYmIGAgLSAke2xhYmVsfWB9XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIClcbiAgICAgICAgfSl9XG4gICAgICA8L3VsPlxuICAgIDwvPlxuICApXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDb25zdHJhaW50cyhwcm9wZXJ0eTogQ29sdW1uW1wicHJvcGVydHlcIl0pOiBDb25zdHJhaW50W10ge1xuICBjb25zdCBjb25zdHJhaW50czogQ29uc3RyYWludFtdID0gW11cblxuICBpZiAoXCJtaW5pbXVtXCIgaW4gcHJvcGVydHkgJiYgcHJvcGVydHkubWluaW11bSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3RyYWludHMucHVzaCh7IG5hbWU6IFwibWluaW11bVwiLCB2YWx1ZTogU3RyaW5nKHByb3BlcnR5Lm1pbmltdW0pIH0pXG4gIH1cbiAgaWYgKFwibWF4aW11bVwiIGluIHByb3BlcnR5ICYmIHByb3BlcnR5Lm1heGltdW0gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0cmFpbnRzLnB1c2goeyBuYW1lOiBcIm1heGltdW1cIiwgdmFsdWU6IFN0cmluZyhwcm9wZXJ0eS5tYXhpbXVtKSB9KVxuICB9XG4gIGlmIChcIm1pbkxlbmd0aFwiIGluIHByb3BlcnR5ICYmIHByb3BlcnR5Lm1pbkxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3RyYWludHMucHVzaCh7IG5hbWU6IFwibWluTGVuZ3RoXCIsIHZhbHVlOiBTdHJpbmcocHJvcGVydHkubWluTGVuZ3RoKSB9KVxuICB9XG4gIGlmIChcIm1heExlbmd0aFwiIGluIHByb3BlcnR5ICYmIHByb3BlcnR5Lm1heExlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3RyYWludHMucHVzaCh7IG5hbWU6IFwibWF4TGVuZ3RoXCIsIHZhbHVlOiBTdHJpbmcocHJvcGVydHkubWF4TGVuZ3RoKSB9KVxuICB9XG4gIGlmIChcInBhdHRlcm5cIiBpbiBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5wYXR0ZXJuKSB7XG4gICAgY29uc3RyYWludHMucHVzaCh7IG5hbWU6IFwicGF0dGVyblwiLCB2YWx1ZTogcHJvcGVydHkucGF0dGVybiB9KVxuICB9XG4gIGlmIChcImVudW1cIiBpbiBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5lbnVtKSB7XG4gICAgY29uc3QgZW51bVZhbHVlcyA9IHByb3BlcnR5LmVudW0ubWFwKHYgPT4gU3RyaW5nKHYpKS5qb2luKFwiLCBcIilcbiAgICBjb25zdHJhaW50cy5wdXNoKHsgbmFtZTogXCJlbnVtXCIsIHZhbHVlOiBlbnVtVmFsdWVzIH0pXG4gIH1cblxuICByZXR1cm4gY29uc3RyYWludHNcbn1cblxuZnVuY3Rpb24gUHJpbWFyeUtleShwcm9wczogeyBmaWVsZHM6IHN0cmluZ1tdIH0pIHtcbiAgY29uc3QgeyBmaWVsZHMgfSA9IHByb3BzXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxoMj5QcmltYXJ5IEtleTwvaDI+XG4gICAgICA8cD5cbiAgICAgICAgPGNvZGU+e2ZpZWxkcy5qb2luKFwiLCBcIil9PC9jb2RlPlxuICAgICAgPC9wPlxuICAgIDwvPlxuICApXG59XG5cbmZ1bmN0aW9uIEZvcmVpZ25LZXlzKHByb3BzOiB7IGZvcmVpZ25LZXlzOiBUYWJsZVNjaGVtYVtcImZvcmVpZ25LZXlzXCJdIH0pIHtcbiAgY29uc3QgeyBmb3JlaWduS2V5cyB9ID0gcHJvcHNcbiAgaWYgKCFmb3JlaWduS2V5cykgcmV0dXJuIG51bGxcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8aDI+Rm9yZWlnbiBLZXlzPC9oMj5cbiAgICAgIDx0YWJsZT5cbiAgICAgICAgPGNvbGdyb3VwPlxuICAgICAgICAgIDxjb2wgd2lkdGg9XCI0MCVcIiAvPlxuICAgICAgICAgIDxjb2wgd2lkdGg9XCIzMCVcIiAvPlxuICAgICAgICAgIDxjb2wgd2lkdGg9XCIzMCVcIiAvPlxuICAgICAgICA8L2NvbGdyb3VwPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoPkNvbHVtbnM8L3RoPlxuICAgICAgICAgICAgPHRoPlJlZmVyZW5jZSBSZXNvdXJjZTwvdGg+XG4gICAgICAgICAgICA8dGg+UmVmZXJlbmNlIENvbHVtbnM8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICB7Zm9yZWlnbktleXMubWFwKChmaywgaW5kZXgpID0+IChcbiAgICAgICAgICAgIDx0ciBrZXk9e2luZGV4fT5cbiAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgIDxjb2RlPntmay5jb2x1bW5zLmpvaW4oXCIsIFwiKX08L2NvZGU+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICA8Y29kZT57ZmsucmVmZXJlbmNlLnJlc291cmNlIHx8IFwiLVwifTwvY29kZT5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgIDxjb2RlPntmay5yZWZlcmVuY2UuY29sdW1ucy5qb2luKFwiLCBcIil9PC9jb2RlPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC8+XG4gIClcbn1cblxuZnVuY3Rpb24gc2FuaXRpemVJZCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgXCItXCIpXG4gICAgLnJlcGxhY2UoL14tfC0kL2csIFwiXCIpXG59XG5cbmludGVyZmFjZSBDb25zdHJhaW50IHtcbiAgbmFtZTogc3RyaW5nXG4gIHZhbHVlOiBzdHJpbmdcbn1cbiJdfQ==
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,356 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { renderTableSchemaAsHtml } from "./asHtml.js";
|
|
3
|
-
describe("renderTableSchemaAsHtml", () => {
|
|
4
|
-
it("converts a simple schema to html table", () => {
|
|
5
|
-
const schema = {
|
|
6
|
-
properties: {
|
|
7
|
-
id: {
|
|
8
|
-
type: "integer",
|
|
9
|
-
title: "Identifier",
|
|
10
|
-
description: "Unique identifier",
|
|
11
|
-
},
|
|
12
|
-
name: {
|
|
13
|
-
type: "string",
|
|
14
|
-
title: "Name",
|
|
15
|
-
description: "Person name",
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
20
|
-
expect(result).toContain("<h2>Columns</h2>");
|
|
21
|
-
expect(result).toContain("<table>");
|
|
22
|
-
expect(result).toContain("<th>Name</th>");
|
|
23
|
-
expect(result).toContain("<th>Definition</th>");
|
|
24
|
-
expect(result).toContain("<th>Type</th>");
|
|
25
|
-
expect(result).toContain("<strong>id?</strong>");
|
|
26
|
-
expect(result).toContain("<strong>name?</strong>");
|
|
27
|
-
expect(result).toContain("<p>Unique identifier</p>");
|
|
28
|
-
expect(result).toContain("<p>Person name</p>");
|
|
29
|
-
expect(result).toContain("<code>integer</code>");
|
|
30
|
-
expect(result).toContain("<code>string</code>");
|
|
31
|
-
});
|
|
32
|
-
it("handles column constraints", () => {
|
|
33
|
-
const schema = {
|
|
34
|
-
properties: {
|
|
35
|
-
age: {
|
|
36
|
-
type: "integer",
|
|
37
|
-
minimum: 0,
|
|
38
|
-
maximum: 120,
|
|
39
|
-
},
|
|
40
|
-
email: {
|
|
41
|
-
type: "string",
|
|
42
|
-
pattern: "^[a-z]+@[a-z]+\\.[a-z]+$",
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
required: ["age", "email"],
|
|
46
|
-
};
|
|
47
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
48
|
-
expect(result).toContain("<strong>Constraints</strong>");
|
|
49
|
-
expect(result).toContain("minimum:");
|
|
50
|
-
expect(result).toContain("<code>0</code>");
|
|
51
|
-
expect(result).toContain("maximum:");
|
|
52
|
-
expect(result).toContain("<code>120</code>");
|
|
53
|
-
expect(result).toContain("pattern:");
|
|
54
|
-
});
|
|
55
|
-
it("handles required field indicator", () => {
|
|
56
|
-
const schema = {
|
|
57
|
-
properties: {
|
|
58
|
-
requiredField: {
|
|
59
|
-
type: "string",
|
|
60
|
-
},
|
|
61
|
-
optionalField: {
|
|
62
|
-
type: "string",
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
required: ["requiredField"],
|
|
66
|
-
};
|
|
67
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
68
|
-
expect(result).toContain("<strong>requiredField</strong>");
|
|
69
|
-
expect(result).not.toContain("requiredField?");
|
|
70
|
-
expect(result).toContain("<strong>optionalField?</strong>");
|
|
71
|
-
});
|
|
72
|
-
it("handles empty properties object", () => {
|
|
73
|
-
const schema = {
|
|
74
|
-
properties: {},
|
|
75
|
-
};
|
|
76
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
77
|
-
expect(result).toContain("<h2>Columns</h2>");
|
|
78
|
-
expect(result).toContain("<table>");
|
|
79
|
-
expect(result).toContain("</table>");
|
|
80
|
-
});
|
|
81
|
-
it("escapes HTML special characters", () => {
|
|
82
|
-
const schema = {
|
|
83
|
-
properties: {
|
|
84
|
-
field: {
|
|
85
|
-
type: "string",
|
|
86
|
-
description: "Description with <script>alert('xss')</script>",
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
};
|
|
90
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
91
|
-
expect(result).toContain("Description with <script>alert('xss')</script>");
|
|
92
|
-
});
|
|
93
|
-
it("handles columns with enum constraints", () => {
|
|
94
|
-
const schema = {
|
|
95
|
-
properties: {
|
|
96
|
-
status: {
|
|
97
|
-
type: "string",
|
|
98
|
-
enum: ["active", "inactive", "pending"],
|
|
99
|
-
},
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
103
|
-
expect(result).toContain("enum:");
|
|
104
|
-
expect(result).toContain("<code>active, inactive, pending</code>");
|
|
105
|
-
});
|
|
106
|
-
it("handles multiple constraint types", () => {
|
|
107
|
-
const schema = {
|
|
108
|
-
properties: {
|
|
109
|
-
username: {
|
|
110
|
-
type: "string",
|
|
111
|
-
minLength: 3,
|
|
112
|
-
maxLength: 20,
|
|
113
|
-
pattern: "^[a-zA-Z0-9_]+$",
|
|
114
|
-
},
|
|
115
|
-
},
|
|
116
|
-
required: ["username"],
|
|
117
|
-
};
|
|
118
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
119
|
-
expect(result).toContain("minLength:");
|
|
120
|
-
expect(result).toContain("<code>3</code>");
|
|
121
|
-
expect(result).toContain("maxLength:");
|
|
122
|
-
expect(result).toContain("<code>20</code>");
|
|
123
|
-
expect(result).toContain("pattern:");
|
|
124
|
-
});
|
|
125
|
-
it("handles different column types", () => {
|
|
126
|
-
const schema = {
|
|
127
|
-
properties: {
|
|
128
|
-
field1: { type: "string" },
|
|
129
|
-
field2: { type: "integer" },
|
|
130
|
-
field3: { type: "number" },
|
|
131
|
-
field4: { type: "boolean" },
|
|
132
|
-
field5: { type: "string", format: "date-time" },
|
|
133
|
-
field6: { type: "array" },
|
|
134
|
-
},
|
|
135
|
-
};
|
|
136
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
137
|
-
expect(result).toContain("<code>string</code>");
|
|
138
|
-
expect(result).toContain("<code>integer</code>");
|
|
139
|
-
expect(result).toContain("<code>number</code>");
|
|
140
|
-
expect(result).toContain("<code>boolean</code>");
|
|
141
|
-
expect(result).toContain("<code>array</code>");
|
|
142
|
-
});
|
|
143
|
-
it("sanitizes IDs for anchors", () => {
|
|
144
|
-
const schema = {
|
|
145
|
-
properties: {
|
|
146
|
-
"field-with-dashes": {
|
|
147
|
-
type: "string",
|
|
148
|
-
},
|
|
149
|
-
"Field With Spaces": {
|
|
150
|
-
type: "string",
|
|
151
|
-
},
|
|
152
|
-
},
|
|
153
|
-
};
|
|
154
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
155
|
-
expect(result).toContain('id="field-with-dashes"');
|
|
156
|
-
expect(result).toContain('id="field-with-spaces"');
|
|
157
|
-
});
|
|
158
|
-
it("does not include top-level html tags", () => {
|
|
159
|
-
const schema = {
|
|
160
|
-
properties: {
|
|
161
|
-
field1: { type: "string" },
|
|
162
|
-
},
|
|
163
|
-
};
|
|
164
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
165
|
-
expect(result).not.toContain("<!DOCTYPE");
|
|
166
|
-
expect(result).not.toContain("<html>");
|
|
167
|
-
expect(result).not.toContain("<head>");
|
|
168
|
-
expect(result).not.toContain("<body>");
|
|
169
|
-
expect(result).not.toContain("<style>");
|
|
170
|
-
});
|
|
171
|
-
it("handles column without description", () => {
|
|
172
|
-
const schema = {
|
|
173
|
-
properties: {
|
|
174
|
-
field1: {
|
|
175
|
-
type: "string",
|
|
176
|
-
},
|
|
177
|
-
},
|
|
178
|
-
};
|
|
179
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
180
|
-
expect(result).toContain("<strong>field1?</strong>");
|
|
181
|
-
expect(result).toContain("<code>string</code>");
|
|
182
|
-
});
|
|
183
|
-
it("uses frontmatter when frontmatter option is true", () => {
|
|
184
|
-
const schema = {
|
|
185
|
-
title: "Table Schema",
|
|
186
|
-
properties: {
|
|
187
|
-
field1: {
|
|
188
|
-
type: "string",
|
|
189
|
-
},
|
|
190
|
-
},
|
|
191
|
-
};
|
|
192
|
-
const result = renderTableSchemaAsHtml(schema, { frontmatter: true });
|
|
193
|
-
expect(result).toContain("---");
|
|
194
|
-
expect(result).toContain("title: Table Schema");
|
|
195
|
-
});
|
|
196
|
-
it("handles schema with primary key", () => {
|
|
197
|
-
const schema = {
|
|
198
|
-
properties: {
|
|
199
|
-
id: {
|
|
200
|
-
type: "integer",
|
|
201
|
-
},
|
|
202
|
-
name: {
|
|
203
|
-
type: "string",
|
|
204
|
-
},
|
|
205
|
-
},
|
|
206
|
-
primaryKey: ["id"],
|
|
207
|
-
};
|
|
208
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
209
|
-
expect(result).toContain("<h2>Primary Key</h2>");
|
|
210
|
-
expect(result).toContain("<code>id</code>");
|
|
211
|
-
});
|
|
212
|
-
it("handles schema with composite primary key", () => {
|
|
213
|
-
const schema = {
|
|
214
|
-
properties: {
|
|
215
|
-
user_id: {
|
|
216
|
-
type: "integer",
|
|
217
|
-
},
|
|
218
|
-
project_id: {
|
|
219
|
-
type: "integer",
|
|
220
|
-
},
|
|
221
|
-
},
|
|
222
|
-
primaryKey: ["user_id", "project_id"],
|
|
223
|
-
};
|
|
224
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
225
|
-
expect(result).toContain("<h2>Primary Key</h2>");
|
|
226
|
-
expect(result).toContain("<code>user_id, project_id</code>");
|
|
227
|
-
});
|
|
228
|
-
it("handles schema with foreign keys", () => {
|
|
229
|
-
const schema = {
|
|
230
|
-
properties: {
|
|
231
|
-
user_id: {
|
|
232
|
-
type: "integer",
|
|
233
|
-
},
|
|
234
|
-
},
|
|
235
|
-
foreignKeys: [
|
|
236
|
-
{
|
|
237
|
-
columns: ["user_id"],
|
|
238
|
-
reference: {
|
|
239
|
-
resource: "users",
|
|
240
|
-
columns: ["id"],
|
|
241
|
-
},
|
|
242
|
-
},
|
|
243
|
-
],
|
|
244
|
-
};
|
|
245
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
246
|
-
expect(result).toContain("<h2>Foreign Keys</h2>");
|
|
247
|
-
expect(result).toContain("<th>Columns</th>");
|
|
248
|
-
expect(result).toContain("<th>Reference Resource</th>");
|
|
249
|
-
expect(result).toContain("<th>Reference Columns</th>");
|
|
250
|
-
expect(result).toContain("<code>user_id</code>");
|
|
251
|
-
expect(result).toContain("<code>users</code>");
|
|
252
|
-
expect(result).toContain("<code>id</code>");
|
|
253
|
-
});
|
|
254
|
-
it("handles schema with multiple foreign keys", () => {
|
|
255
|
-
const schema = {
|
|
256
|
-
properties: {
|
|
257
|
-
user_id: {
|
|
258
|
-
type: "integer",
|
|
259
|
-
},
|
|
260
|
-
project_id: {
|
|
261
|
-
type: "integer",
|
|
262
|
-
},
|
|
263
|
-
},
|
|
264
|
-
foreignKeys: [
|
|
265
|
-
{
|
|
266
|
-
columns: ["user_id"],
|
|
267
|
-
reference: {
|
|
268
|
-
resource: "users",
|
|
269
|
-
columns: ["id"],
|
|
270
|
-
},
|
|
271
|
-
},
|
|
272
|
-
{
|
|
273
|
-
columns: ["project_id"],
|
|
274
|
-
reference: {
|
|
275
|
-
resource: "projects",
|
|
276
|
-
columns: ["id"],
|
|
277
|
-
},
|
|
278
|
-
},
|
|
279
|
-
],
|
|
280
|
-
};
|
|
281
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
282
|
-
expect(result).toContain("<h2>Foreign Keys</h2>");
|
|
283
|
-
expect(result).toContain("<code>user_id</code>");
|
|
284
|
-
expect(result).toContain("<code>users</code>");
|
|
285
|
-
expect(result).toContain("<code>project_id</code>");
|
|
286
|
-
expect(result).toContain("<code>projects</code>");
|
|
287
|
-
});
|
|
288
|
-
it("handles foreign key without resource specified", () => {
|
|
289
|
-
const schema = {
|
|
290
|
-
properties: {
|
|
291
|
-
parent_id: {
|
|
292
|
-
type: "integer",
|
|
293
|
-
},
|
|
294
|
-
},
|
|
295
|
-
foreignKeys: [
|
|
296
|
-
{
|
|
297
|
-
columns: ["parent_id"],
|
|
298
|
-
reference: {
|
|
299
|
-
columns: ["id"],
|
|
300
|
-
},
|
|
301
|
-
},
|
|
302
|
-
],
|
|
303
|
-
};
|
|
304
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
305
|
-
expect(result).toContain("<h2>Foreign Keys</h2>");
|
|
306
|
-
expect(result).toContain("<code>parent_id</code>");
|
|
307
|
-
expect(result).toContain("<code>-</code>");
|
|
308
|
-
expect(result).toContain("<code>id</code>");
|
|
309
|
-
});
|
|
310
|
-
it("does not render primary key or foreign keys sections when not present", () => {
|
|
311
|
-
const schema = {
|
|
312
|
-
properties: {
|
|
313
|
-
field1: {
|
|
314
|
-
type: "string",
|
|
315
|
-
},
|
|
316
|
-
},
|
|
317
|
-
};
|
|
318
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
319
|
-
expect(result).not.toContain("<h2>Primary Key</h2>");
|
|
320
|
-
expect(result).not.toContain("<h2>Foreign Keys</h2>");
|
|
321
|
-
});
|
|
322
|
-
it("handles string categories", () => {
|
|
323
|
-
const schema = {
|
|
324
|
-
properties: {
|
|
325
|
-
status: {
|
|
326
|
-
type: "string",
|
|
327
|
-
categories: ["active", "inactive"],
|
|
328
|
-
},
|
|
329
|
-
},
|
|
330
|
-
};
|
|
331
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
332
|
-
expect(result).toContain("<strong>Categories</strong>");
|
|
333
|
-
expect(result).toContain("<code>active</code>");
|
|
334
|
-
expect(result).toContain("<code>inactive</code>");
|
|
335
|
-
});
|
|
336
|
-
it("handles integer categories with labels", () => {
|
|
337
|
-
const schema = {
|
|
338
|
-
properties: {
|
|
339
|
-
level: {
|
|
340
|
-
type: "integer",
|
|
341
|
-
categories: [
|
|
342
|
-
{ value: 1, label: "Beginner" },
|
|
343
|
-
{ value: 2, label: "Advanced" },
|
|
344
|
-
],
|
|
345
|
-
},
|
|
346
|
-
},
|
|
347
|
-
};
|
|
348
|
-
const result = renderTableSchemaAsHtml(schema);
|
|
349
|
-
expect(result).toContain("<strong>Categories</strong>");
|
|
350
|
-
expect(result).toContain("<code>1</code>");
|
|
351
|
-
expect(result).toContain(" - Beginner");
|
|
352
|
-
expect(result).toContain("<code>2</code>");
|
|
353
|
-
expect(result).toContain(" - Advanced");
|
|
354
|
-
});
|
|
355
|
-
});
|
|
356
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNIdG1sLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hY3Rpb25zL3RhYmxlU2NoZW1hL2FzSHRtbC5zcGVjLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sYUFBYyxDQUFBO0FBRXRELFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7SUFDdkMsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtRQUNoRCxNQUFNLE1BQU0sR0FBZ0I7WUFDMUIsVUFBVSxFQUFFO2dCQUNWLEVBQUUsRUFBRTtvQkFDRixJQUFJLEVBQUUsU0FBUztvQkFDZixLQUFLLEVBQUUsWUFBWTtvQkFDbkIsV0FBVyxFQUFFLG1CQUFtQjtpQkFDakM7Z0JBQ0QsSUFBSSxFQUFFO29CQUNKLElBQUksRUFBRSxRQUFRO29CQUNkLEtBQUssRUFBRSxNQUFNO29CQUNiLFdBQVcsRUFBRSxhQUFhO2lCQUMzQjthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUM1QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ25DLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDekMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1FBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDekMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxD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QUVGLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLEVBQUU7UUFDaEQsTUFBTSxNQUFNLEdBQWdCO1lBQzFCLFVBQVUsRUFBRTtnQkFDVixLQUFLLEVBQUU7b0JBQ0wsSUFBSSxFQUFFLFNBQVM7b0JBRWYsVUFBVSxFQUFFO3dCQUNWLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO3dCQUMvQixFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtxQkFDaEM7aUJBQ0Y7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUU5QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLDZCQUE2QixDQUFDLENBQUE7UUFDdkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDdkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDekMsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVGFibGVTY2hlbWEgfSBmcm9tIFwiQGZhaXJzcGVjL21ldGFkYXRhXCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyByZW5kZXJUYWJsZVNjaGVtYUFzSHRtbCB9IGZyb20gXCIuL2FzSHRtbC50c3hcIlxuXG5kZXNjcmliZShcInJlbmRlclRhYmxlU2NoZW1hQXNIdG1sXCIsICgpID0+IHtcbiAgaXQoXCJjb252ZXJ0cyBhIHNpbXBsZSBzY2hlbWEgdG8gaHRtbCB0YWJsZVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgaWQ6IHtcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICB0aXRsZTogXCJJZGVudGlmaWVyXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiVW5pcXVlIGlkZW50aWZpZXJcIixcbiAgICAgICAgfSxcbiAgICAgICAgbmFtZToge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgdGl0bGU6IFwiTmFtZVwiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlBlcnNvbiBuYW1lXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHJlbmRlclRhYmxlU2NoZW1hQXNIdG1sKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxoMj5Db2x1bW5zPC9oMj5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8dGFibGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHRoPk5hbWU8L3RoPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjx0aD5EZWZpbml0aW9uPC90aD5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8dGg+VHlwZTwvdGg+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHN0cm9uZz5pZD88L3N0cm9uZz5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8c3Ryb25nPm5hbWU/PC9zdHJvbmc+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHA+VW5pcXVlIGlkZW50aWZpZXI8L3A+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHA+UGVyc29uIG5hbWU8L3A+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+aW50ZWdlcjwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT5zdHJpbmc8L2NvZGU+XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGNvbHVtbiBjb25zdHJhaW50c1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgYWdlOiB7XG4gICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG5cbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIG1heGltdW06IDEyMCxcbiAgICAgICAgfSxcbiAgICAgICAgZW1haWw6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgIHBhdHRlcm46IFwiXlthLXpdK0BbYS16XStcXFxcLlthLXpdKyRcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZXF1aXJlZDogW1wiYWdlXCIsIFwiZW1haWxcIl0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyVGFibGVTY2hlbWFBc0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHN0cm9uZz5Db25zdHJhaW50czwvc3Ryb25nPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIm1pbmltdW06XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+MDwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJtYXhpbXVtOlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPjEyMDwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJwYXR0ZXJuOlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyByZXF1aXJlZCBmaWVsZCBpbmRpY2F0b3JcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHJlcXVpcmVkRmllbGQ6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25hbEZpZWxkOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZXF1aXJlZDogW1wicmVxdWlyZWRGaWVsZFwiXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByZW5kZXJUYWJsZVNjaGVtYUFzSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8c3Ryb25nPnJlcXVpcmVkRmllbGQ8L3N0cm9uZz5cIilcbiAgICBleHBlY3QocmVzdWx0KS5ub3QudG9Db250YWluKFwicmVxdWlyZWRGaWVsZD9cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8c3Ryb25nPm9wdGlvbmFsRmllbGQ/PC9zdHJvbmc+XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGVtcHR5IHByb3BlcnRpZXMgb2JqZWN0XCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgcHJvcGVydGllczoge30sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyVGFibGVTY2hlbWFBc0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGgyPkNvbHVtbnM8L2gyPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjx0YWJsZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8L3RhYmxlPlwiKVxuICB9KVxuXG4gIGl0KFwiZXNjYXBlcyBIVE1MIHNwZWNpYWwgY2hhcmFjdGVyc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgZmllbGQ6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkRlc2NyaXB0aW9uIHdpdGggPHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD5cIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyVGFibGVTY2hlbWFBc0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFxuICAgICAgXCJEZXNjcmlwdGlvbiB3aXRoICZsdDtzY3JpcHQmZ3Q7YWxlcnQoJiN4Mjc7eHNzJiN4Mjc7KSZsdDsvc2NyaXB0Jmd0O1wiLFxuICAgIClcbiAgfSlcblxuICBpdChcImhhbmRsZXMgY29sdW1ucyB3aXRoIGVudW0gY29uc3RyYWludHNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHN0YXR1czoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgZW51bTogW1wiYWN0aXZlXCIsIFwiaW5hY3RpdmVcIiwgXCJwZW5kaW5nXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByZW5kZXJUYWJsZVNjaGVtYUFzSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJlbnVtOlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmFjdGl2ZSwgaW5hY3RpdmUsIHBlbmRpbmc8L2NvZGU+XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIG11bHRpcGxlIGNvbnN0cmFpbnQgdHlwZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHVzZXJuYW1lOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBtaW5MZW5ndGg6IDMsXG4gICAgICAgICAgbWF4TGVuZ3RoOiAyMCxcbiAgICAgICAgICBwYXR0ZXJuOiBcIl5bYS16QS1aMC05X10rJFwiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmVkOiBbXCJ1c2VybmFtZVwiXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByZW5kZXJUYWJsZVNjaGVtYUFzSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJtaW5MZW5ndGg6XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+MzwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJtYXhMZW5ndGg6XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+MjA8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwicGF0dGVybjpcIilcbiAgfSlcblxuICBpdChcImhhbmRsZXMgZGlmZmVyZW50IGNvbHVtbiB0eXBlc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgZmllbGQxOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgZmllbGQyOiB7IHR5cGU6IFwiaW50ZWdlclwiIH0sXG4gICAgICAgIGZpZWxkMzogeyB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgIGZpZWxkNDogeyB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgICBmaWVsZDU6IHsgdHlwZTogXCJzdHJpbmdcIiwgZm9ybWF0OiBcImRhdGUtdGltZVwiIH0sXG4gICAgICAgIGZpZWxkNjogeyB0eXBlOiBcImFycmF5XCIgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyVGFibGVTY2hlbWFBc0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+c3RyaW5nPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmludGVnZXI8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+bnVtYmVyPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmJvb2xlYW48L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+YXJyYXk8L2NvZGU+XCIpXG4gIH0pXG5cbiAgaXQoXCJzYW5pdGl6ZXMgSURzIGZvciBhbmNob3JzXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBcImZpZWxkLXdpdGgtZGFzaGVzXCI6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgICBcIkZpZWxkIFdpdGggU3BhY2VzXCI6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByZW5kZXJUYWJsZVNjaGVtYUFzSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oJ2lkPVwiZmllbGQtd2l0aC1kYXNoZXNcIicpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKCdpZD1cImZpZWxkLXdpdGgtc3BhY2VzXCInKVxuICB9KVxuXG4gIGl0KFwiZG9lcyBub3QgaW5jbHVkZSB0b3AtbGV2ZWwgaHRtbCB0YWdzXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBmaWVsZDE6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByZW5kZXJUYWJsZVNjaGVtYUFzSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS5ub3QudG9Db250YWluKFwiPCFET0NUWVBFXCIpXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIjxodG1sPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0NvbnRhaW4oXCI8aGVhZD5cIilcbiAgICBleHBlY3QocmVzdWx0KS5ub3QudG9Db250YWluKFwiPGJvZHk+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIjxzdHlsZT5cIilcbiAgfSlcblxuICBpdChcImhhbmRsZXMgY29sdW1uIHdpdGhvdXQgZGVzY3JpcHRpb25cIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGZpZWxkMToge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHJlbmRlclRhYmxlU2NoZW1hQXNIdG1sKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxzdHJvbmc+ZmllbGQxPzwvc3Ryb25nPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPnN0cmluZzwvY29kZT5cIilcbiAgfSlcblxuICBpdChcInVzZXMgZnJvbnRtYXR0ZXIgd2hlbiBmcm9udG1hdHRlciBvcHRpb24gaXMgdHJ1ZVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgIHRpdGxlOiBcIlRhYmxlIFNjaGVtYVwiLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBmaWVsZDE6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByZW5kZXJUYWJsZVNjaGVtYUFzSHRtbChzY2hlbWEsIHsgZnJvbnRtYXR0ZXI6IHRydWUgfSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIi0tLVwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcInRpdGxlOiBUYWJsZSBTY2hlbWFcIilcbiAgfSlcblxuICBpdChcImhhbmRsZXMgc2NoZW1hIHdpdGggcHJpbWFyeSBrZXlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGlkOiB7XG4gICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgIH0sXG4gICAgICAgIG5hbWU6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHByaW1hcnlLZXk6IFtcImlkXCJdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHJlbmRlclRhYmxlU2NoZW1hQXNIdG1sKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxoMj5QcmltYXJ5IEtleTwvaDI+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+aWQ8L2NvZGU+XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIHNjaGVtYSB3aXRoIGNvbXBvc2l0ZSBwcmltYXJ5IGtleVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdXNlcl9pZDoge1xuICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICB9LFxuICAgICAgICBwcm9qZWN0X2lkOiB7XG4gICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcHJpbWFyeUtleTogW1widXNlcl9pZFwiLCBcInByb2plY3RfaWRcIl0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyVGFibGVTY2hlbWFBc0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGgyPlByaW1hcnkgS2V5PC9oMj5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT51c2VyX2lkLCBwcm9qZWN0X2lkPC9jb2RlPlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBzY2hlbWEgd2l0aCBmb3JlaWduIGtleXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHVzZXJfaWQ6IHtcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmb3JlaWduS2V5czogW1xuICAgICAgICB7XG4gICAgICAgICAgY29sdW1uczogW1widXNlcl9pZFwiXSxcbiAgICAgICAgICByZWZlcmVuY2U6IHtcbiAgICAgICAgICAgIHJlc291cmNlOiBcInVzZXJzXCIsXG4gICAgICAgICAgICBjb2x1bW5zOiBbXCJpZFwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByZW5kZXJUYWJsZVNjaGVtYUFzSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8aDI+Rm9yZWlnbiBLZXlzPC9oMj5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8dGg+Q29sdW1uczwvdGg+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHRoPlJlZmVyZW5jZSBSZXNvdXJjZTwvdGg+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHRoPlJlZmVyZW5jZSBDb2x1bW5zPC90aD5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT51c2VyX2lkPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPnVzZXJzPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmlkPC9jb2RlPlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBzY2hlbWEgd2l0aCBtdWx0aXBsZSBmb3JlaWduIGtleXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHVzZXJfaWQ6IHtcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgfSxcbiAgICAgICAgcHJvamVjdF9pZDoge1xuICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGZvcmVpZ25LZXlzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2x1bW5zOiBbXCJ1c2VyX2lkXCJdLFxuICAgICAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICAgICAgcmVzb3VyY2U6IFwidXNlcnNcIixcbiAgICAgICAgICAgIGNvbHVtbnM6IFtcImlkXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2x1bW5zOiBbXCJwcm9qZWN0X2lkXCJdLFxuICAgICAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICAgICAgcmVzb3VyY2U6IFwicHJvamVjdHNcIixcbiAgICAgICAgICAgIGNvbHVtbnM6IFtcImlkXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHJlbmRlclRhYmxlU2NoZW1hQXNIdG1sKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxoMj5Gb3JlaWduIEtleXM8L2gyPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPnVzZXJfaWQ8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+dXNlcnM8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+cHJvamVjdF9pZDwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT5wcm9qZWN0czwvY29kZT5cIilcbiAgfSlcblxuICBpdChcImhhbmRsZXMgZm9yZWlnbiBrZXkgd2l0aG91dCByZXNvdXJjZSBzcGVjaWZpZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHBhcmVudF9pZDoge1xuICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGZvcmVpZ25LZXlzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2x1bW5zOiBbXCJwYXJlbnRfaWRcIl0sXG4gICAgICAgICAgcmVmZXJlbmNlOiB7XG4gICAgICAgICAgICBjb2x1bW5zOiBbXCJpZFwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByZW5kZXJUYWJsZVNjaGVtYUFzSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8aDI+Rm9yZWlnbiBLZXlzPC9oMj5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT5wYXJlbnRfaWQ8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+LTwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT5pZDwvY29kZT5cIilcbiAgfSlcblxuICBpdChcImRvZXMgbm90IHJlbmRlciBwcmltYXJ5IGtleSBvciBmb3JlaWduIGtleXMgc2VjdGlvbnMgd2hlbiBub3QgcHJlc2VudFwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgZmllbGQxOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyVGFibGVTY2hlbWFBc0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIjxoMj5QcmltYXJ5IEtleTwvaDI+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIjxoMj5Gb3JlaWduIEtleXM8L2gyPlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBzdHJpbmcgY2F0ZWdvcmllc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJhY3RpdmVcIiwgXCJpbmFjdGl2ZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyVGFibGVTY2hlbWFBc0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHN0cm9uZz5DYXRlZ29yaWVzPC9zdHJvbmc+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+YWN0aXZlPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmluYWN0aXZlPC9jb2RlPlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBpbnRlZ2VyIGNhdGVnb3JpZXMgd2l0aCBsYWJlbHNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGxldmVsOiB7XG4gICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG5cbiAgICAgICAgICBjYXRlZ29yaWVzOiBbXG4gICAgICAgICAgICB7IHZhbHVlOiAxLCBsYWJlbDogXCJCZWdpbm5lclwiIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAyLCBsYWJlbDogXCJBZHZhbmNlZFwiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyVGFibGVTY2hlbWFBc0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHN0cm9uZz5DYXRlZ29yaWVzPC9zdHJvbmc+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+MTwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCIgLSBCZWdpbm5lclwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPjI8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiIC0gQWR2YW5jZWRcIilcbiAgfSlcbn0pXG4iXX0=
|