@fairspec/agent 0.9.0
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/LICENSE.md +9 -0
- package/README.md +3 -0
- package/build/actions/tableSchema/asHtml.d.ts +4 -0
- package/build/actions/tableSchema/asHtml.js +82 -0
- package/build/actions/tableSchema/asHtml.spec.d.ts +1 -0
- package/build/actions/tableSchema/asHtml.spec.js +356 -0
- package/build/actions/tableSchema/asMarkdown.d.ts +4 -0
- package/build/actions/tableSchema/asMarkdown.js +65 -0
- package/build/actions/tableSchema/asMarkdown.spec.d.ts +1 -0
- package/build/actions/tableSchema/asMarkdown.spec.js +133 -0
- package/build/document/Document.d.ts +2 -0
- package/build/document/Document.js +2 -0
- package/build/document/index.d.ts +3 -0
- package/build/document/index.js +3 -0
- package/build/document/types/Base.d.ts +3 -0
- package/build/document/types/Base.js +2 -0
- package/build/document/types/Json.d.ts +5 -0
- package/build/document/types/Json.js +2 -0
- package/build/document/validate.d.ts +5 -0
- package/build/document/validate.js +23 -0
- package/build/document/validate.spec.d.ts +1 -0
- package/build/document/validate.spec.js +71 -0
- package/build/index.d.ts +1 -0
- package/build/index.js +2 -0
- package/build/package.json +39 -0
- package/build/plugin.d.ts +6 -0
- package/build/plugin.js +15 -0
- package/build/schema/convert/toHtml.d.ts +4 -0
- package/build/schema/convert/toHtml.js +107 -0
- package/build/schema/convert/toHtml.spec.d.ts +1 -0
- package/build/schema/convert/toHtml.spec.js +432 -0
- package/build/schema/convert/toMarkdown.d.ts +4 -0
- package/build/schema/convert/toMarkdown.js +75 -0
- package/build/schema/convert/toMarkdown.spec.d.ts +1 -0
- package/build/schema/convert/toMarkdown.spec.js +137 -0
- package/build/schema/index.d.ts +2 -0
- package/build/schema/index.js +3 -0
- package/build/server.d.ts +2 -0
- package/build/server.js +29 -0
- package/build/tableSchema/convert/toHtml.d.ts +4 -0
- package/build/tableSchema/convert/toHtml.js +80 -0
- package/build/tableSchema/convert/toHtml.spec.d.ts +1 -0
- package/build/tableSchema/convert/toHtml.spec.js +375 -0
- package/build/tableSchema/convert/toMarkdown.d.ts +4 -0
- package/build/tableSchema/convert/toMarkdown.js +57 -0
- package/build/tableSchema/convert/toMarkdown.spec.d.ts +1 -0
- package/build/tableSchema/convert/toMarkdown.spec.js +141 -0
- package/build/tableSchema/index.d.ts +2 -0
- package/build/tableSchema/index.js +3 -0
- package/build/tools/data/validate.d.ts +971 -0
- package/build/tools/data/validate.js +15 -0
- package/build/tools/data/validate.spec.d.ts +1 -0
- package/build/tools/data/validate.spec.js +228 -0
- package/build/tools/dataSchema/infer.d.ts +797 -0
- package/build/tools/dataSchema/infer.js +15 -0
- package/build/tools/dataSchema/infer.spec.d.ts +1 -0
- package/build/tools/dataSchema/infer.spec.js +215 -0
- package/build/tools/dataSchema/validate.d.ts +177 -0
- package/build/tools/dataSchema/validate.js +17 -0
- package/build/tools/dataSchema/validate.spec.d.ts +1 -0
- package/build/tools/dataSchema/validate.spec.js +148 -0
- package/build/tools/dataset/infer.d.ts +1985 -0
- package/build/tools/dataset/infer.js +15 -0
- package/build/tools/dataset/infer.spec.d.ts +1 -0
- package/build/tools/dataset/infer.spec.js +181 -0
- package/build/tools/dataset/validate.d.ts +1168 -0
- package/build/tools/dataset/validate.js +17 -0
- package/build/tools/dataset/validate.spec.d.ts +1 -0
- package/build/tools/dataset/validate.spec.js +212 -0
- package/build/tools/dialect/infer.d.ts +889 -0
- package/build/tools/dialect/infer.js +16 -0
- package/build/tools/dialect/infer.spec.d.ts +1 -0
- package/build/tools/dialect/infer.spec.js +138 -0
- package/build/tools/table/query.d.ts +798 -0
- package/build/tools/table/query.js +24 -0
- package/build/tools/table/query.spec.d.ts +1 -0
- package/build/tools/table/query.spec.js +138 -0
- package/build/tools/table/validate.d.ts +999 -0
- package/build/tools/table/validate.js +16 -0
- package/build/tools/table/validate.spec.d.ts +1 -0
- package/build/tools/table/validate.spec.js +106 -0
- package/build/tools/tableSchema/infer.d.ts +1316 -0
- package/build/tools/tableSchema/infer.js +16 -0
- package/build/tools/tableSchema/infer.spec.d.ts +1 -0
- package/build/tools/tableSchema/infer.spec.js +152 -0
- package/build/tools/tableSchema/validate.d.ts +177 -0
- package/build/tools/tableSchema/validate.js +17 -0
- package/build/tools/tableSchema/validate.spec.d.ts +1 -0
- package/build/tools/tableSchema/validate.spec.js +121 -0
- package/package.json +39 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright © `2025` `Evgeny Karev`
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
|
+
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# @fairspec/agent
|
|
2
|
+
|
|
3
|
+
Fairspec TypeScript is a fast data management framework built on top of the Fairspec standard and Polars DataFrames. It supports various formats like CSV, JSON, and Parquet and integrates with data platforms such as CKAN, Zenodo, and GitHub. For more information, please read the [project's documentation](https://typescript.fairspec.org).
|
|
@@ -0,0 +1,82 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNIdG1sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYWN0aW9ucy90YWJsZVNjaGVtYS9hc0h0bWwudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUV2RCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLE1BQW1CLEVBQ25CLE9BQW1DO0lBRW5DLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFDLFdBQVcsSUFBQyxNQUFNLEVBQUUsTUFBTSxHQUFJLENBQUMsQ0FBQyxDQUFBO0lBRTFFLElBQUksT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLElBQUksR0FBRyxlQUFlLE1BQU0sQ0FBQyxLQUFLLFlBQVksSUFBSSxFQUFFLENBQUE7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUE4QjtJQUNqRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBRXhCLE9BQU8sQ0FDTCw4QkFDRyxNQUFNLENBQUMsVUFBVSxJQUFJLEtBQUMsVUFBVSxJQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBVSxHQUFJLEVBQzlELE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQ3RELEtBQUMsV0FBVyxJQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxHQUFJLENBQ2pELEVBQ0QsS0FBQyxXQUFXLElBQUMsTUFBTSxFQUFFLE1BQU0sR0FBSSxJQUM5QixDQUNKLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBOEI7SUFDakQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUN4QixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUE7SUFFdEMsT0FBTyxDQUNMLDhCQUNFLG1DQUFnQixFQUNoQiw0QkFDRSwrQkFDRSxjQUFLLEtBQUssRUFBQyxLQUFLLEdBQUcsRUFDbkIsY0FBSyxLQUFLLEVBQUMsS0FBSyxHQUFHLEVBQ25CLGNBQUssS0FBSyxFQUFDLEtBQUssR0FBRyxJQUNWLEVBQ1gsMEJBQ0UseUJBQ0UsZ0NBQWEsRUFDYixzQ0FBbUIsRUFDbkIsZ0NBQWEsSUFDVixHQUNDLEVBQ1IsMEJBQ0csT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQ3JCLEtBQUMsUUFBUSxJQUVQLE1BQU0sRUFBRSxNQUFNLEVBQ2QsVUFBVSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUZyQyxNQUFNLENBQUMsSUFBSSxDQUdoQixDQUNILENBQUMsR0FDSSxJQUNGLElBQ1AsQ0FDSixDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEtBQThDO0lBQzlELE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBQ3BDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sQ0FBQTtJQUN2QyxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFBO0lBRXBELE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRWhELE9BQU8sQ0FDTCx5QkFDRSxhQUFJLEVBQUUsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQ3RCLHlCQUNFLDZCQUNHLElBQUksRUFDSixDQUFDLFVBQVUsSUFBSSxHQUFHLElBQ1osR0FDSixHQUNKLEVBQ0wseUJBQ0csaUJBQWlCLElBQUksc0JBQUksaUJBQWlCLEdBQUssRUFDL0MsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FDekIsS0FBQyxlQUFlLElBQUMsV0FBVyxFQUFFLFdBQVcsR0FBSSxDQUM5QyxFQUNBLFlBQVksSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksQ0FDaEUsS0FBQyxjQUFjLElBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEdBQUksQ0FDcEQsSUFDRSxFQUNMLHVCQUNFLHlCQUFPLElBQUksR0FBUSxHQUNoQixJQUNGLENBQ04sQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxLQUFvQztJQUMzRCxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBQzdCLE9BQU8sQ0FDTCw4QkFDRSwyQ0FBNEIsRUFDNUIsdUJBQ0csV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQ3RDLHlCQUNHLFVBQVUsQ0FBQyxJQUFJLFFBQUcseUJBQU8sVUFBVSxDQUFDLEtBQUssR0FBUSxLQUQzQyxLQUFLLENBRVQsQ0FDTixDQUFDLEdBQ0MsSUFDSixDQUNKLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBNEI7SUFDbEQsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUM1QixPQUFPLENBQ0wsOEJBQ0UsMENBQTJCLEVBQzNCLHVCQUNHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUU7b0JBQ2xDLE1BQU0sS0FBSyxHQUFHLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFBO29CQUN0RSxNQUFNLEtBQUssR0FDVCxPQUFPLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtvQkFDM0QsT0FBTyxDQUNMLHlCQUNFLHlCQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBUSxFQUMzQixLQUFLLElBQUksTUFBTSxLQUFLLEVBQUUsS0FGaEIsS0FBSyxDQUdULENBQ04sQ0FBQTtnQkFDSCxDQUFDLENBQUMsR0FDQyxJQUNKLENBQ0osQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLFFBQTRCO0lBQ3RELE1BQU0sV0FBVyxHQUFpQixFQUFFLENBQUE7SUFFcEMsSUFBSSxTQUFTLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDNUQsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFDRCxJQUFJLFNBQVMsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM1RCxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDeEUsQ0FBQztJQUNELElBQUksV0FBVyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hFLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUM1RSxDQUFDO0lBQ0QsSUFBSSxXQUFXLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEUsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFDRCxJQUFJLFNBQVMsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUNoRSxDQUFDO0lBQ0QsSUFBSSxNQUFNLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMvRCxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUE7QUFDcEIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQTJCO0lBQzdDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFDeEIsT0FBTyxDQUNMLDhCQUNFLHVDQUFvQixFQUNwQixzQkFDRSx5QkFBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFRLEdBQzlCLElBQ0gsQ0FDSixDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQWtEO0lBQ3JFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFDN0IsSUFBSSxDQUFDLFdBQVc7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUU3QixPQUFPLENBQ0wsOEJBQ0Usd0NBQXFCLEVBQ3JCLDRCQUNFLCtCQUNFLGNBQUssS0FBSyxFQUFDLEtBQUssR0FBRyxFQUNuQixjQUFLLEtBQUssRUFBQyxLQUFLLEdBQUcsRUFDbkIsY0FBSyxLQUFLLEVBQUMsS0FBSyxHQUFHLElBQ1YsRUFDWCwwQkFDRSx5QkFDRSxtQ0FBZ0IsRUFDaEIsOENBQTJCLEVBQzNCLDZDQUEwQixJQUN2QixHQUNDLEVBQ1IsMEJBQ0csV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQzlCLHlCQUNFLHVCQUNFLHlCQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFRLEdBQ2pDLEVBQ0wsdUJBQ0UseUJBQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksR0FBRyxHQUFRLEdBQ3hDLEVBQ0wsdUJBQ0UseUJBQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFRLEdBQzNDLEtBVEUsS0FBSyxDQVVULENBQ04sQ0FBQyxHQUNJLElBQ0YsSUFDUCxDQUNKLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBWTtJQUM5QixPQUFPLElBQUk7U0FDUixXQUFXLEVBQUU7U0FDYixPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQztTQUMzQixPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbHVtbiwgVGFibGVTY2hlbWEgfSBmcm9tIFwiQGZhaXJzcGVjL21ldGFkYXRhXCJcbmltcG9ydCB7IGdldENvbHVtbnMgfSBmcm9tIFwiQGZhaXJzcGVjL21ldGFkYXRhXCJcbmltcG9ydCB7IHByZXR0aWZ5IH0gZnJvbSBcImh0bWxmeVwiXG5pbXBvcnQgeyByZW5kZXJUb1N0YXRpY01hcmt1cCB9IGZyb20gXCJyZWFjdC1kb20vc2VydmVyXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRhYmxlU2NoZW1hQXNIdG1sKFxuICBzY2hlbWE6IFRhYmxlU2NoZW1hLFxuICBvcHRpb25zPzogeyBmcm9udG1hdHRlcj86IGJvb2xlYW4gfSxcbik6IHN0cmluZyB7XG4gIGxldCBodG1sID0gcHJldHRpZnkocmVuZGVyVG9TdGF0aWNNYXJrdXAoPFNjaGVtYVRhYmxlIHNjaGVtYT17c2NoZW1hfSAvPikpXG5cbiAgaWYgKG9wdGlvbnM/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==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,356 @@
|
|
|
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=
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { getColumns } from "@fairspec/metadata";
|
|
2
|
+
export function renderTableSchemaAsMarkdown(schema, options) {
|
|
3
|
+
const rows = [];
|
|
4
|
+
rows.push("");
|
|
5
|
+
rows.push("## Columns");
|
|
6
|
+
rows.push("");
|
|
7
|
+
rows.push("| Name | Type | Title | Description | Constraints |");
|
|
8
|
+
rows.push("|------|------|-------|-------------|-------------|");
|
|
9
|
+
const columns = getColumns(schema);
|
|
10
|
+
const required = schema.required ?? [];
|
|
11
|
+
for (const column of columns) {
|
|
12
|
+
const { name, type, property } = column;
|
|
13
|
+
const title = property.title ?? "";
|
|
14
|
+
const description = property.description ?? "";
|
|
15
|
+
const constraints = [];
|
|
16
|
+
if (required.includes(name)) {
|
|
17
|
+
constraints.push("required");
|
|
18
|
+
}
|
|
19
|
+
constraints.push(...extractConstraints(property));
|
|
20
|
+
const constraintsStr = constraints.join(", ");
|
|
21
|
+
const escapedName = escapeMarkdown(name);
|
|
22
|
+
const escapedTitle = escapeMarkdown(title);
|
|
23
|
+
const escapedDescription = escapeMarkdown(description);
|
|
24
|
+
const escapedConstraints = escapeMarkdown(constraintsStr);
|
|
25
|
+
rows.push(`| ${escapedName} | ${type} | ${escapedTitle} | ${escapedDescription} | ${escapedConstraints} |`);
|
|
26
|
+
}
|
|
27
|
+
let markdown = `${rows.join("\n")}\n`;
|
|
28
|
+
if (options?.frontmatter) {
|
|
29
|
+
const header = [];
|
|
30
|
+
header.push("---");
|
|
31
|
+
if (schema.title) {
|
|
32
|
+
header.push(`title: ${schema.title}`);
|
|
33
|
+
}
|
|
34
|
+
header.push("---");
|
|
35
|
+
header.push("");
|
|
36
|
+
markdown = header.join("\n") + markdown;
|
|
37
|
+
}
|
|
38
|
+
return markdown;
|
|
39
|
+
}
|
|
40
|
+
function escapeMarkdown(text) {
|
|
41
|
+
return text.replace(/\n/g, " ");
|
|
42
|
+
}
|
|
43
|
+
function extractConstraints(property) {
|
|
44
|
+
const constraints = [];
|
|
45
|
+
if ("minimum" in property && property.minimum !== undefined) {
|
|
46
|
+
constraints.push(`min: ${property.minimum}`);
|
|
47
|
+
}
|
|
48
|
+
if ("maximum" in property && property.maximum !== undefined) {
|
|
49
|
+
constraints.push(`max: ${property.maximum}`);
|
|
50
|
+
}
|
|
51
|
+
if ("minLength" in property && property.minLength !== undefined) {
|
|
52
|
+
constraints.push(`minLength: ${property.minLength}`);
|
|
53
|
+
}
|
|
54
|
+
if ("maxLength" in property && property.maxLength !== undefined) {
|
|
55
|
+
constraints.push(`maxLength: ${property.maxLength}`);
|
|
56
|
+
}
|
|
57
|
+
if ("pattern" in property && property.pattern) {
|
|
58
|
+
constraints.push(`pattern: ${property.pattern}`);
|
|
59
|
+
}
|
|
60
|
+
if ("enum" in property && property.enum) {
|
|
61
|
+
constraints.push(`enum: ${property.enum.join(", ")}`);
|
|
62
|
+
}
|
|
63
|
+
return constraints;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNNYXJrZG93bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FjdGlvbnMvdGFibGVTY2hlbWEvYXNNYXJrZG93bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFL0MsTUFBTSxVQUFVLDJCQUEyQixDQUN6QyxNQUFtQixFQUNuQixPQUFtQztJQUVuQyxNQUFNLElBQUksR0FBYSxFQUFFLENBQUE7SUFFekIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNiLElBQUksQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQTtJQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUE7SUFFaEUsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ2xDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFBO0lBRXRDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFBO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFBO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFBO1FBRTlDLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQTtRQUVoQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QixXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzlCLENBQUM7UUFFRCxX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QUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUE7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29sdW1uLCBUYWJsZVNjaGVtYSB9IGZyb20gXCJAZmFpcnNwZWMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgZ2V0Q29sdW1ucyB9IGZyb20gXCJAZmFpcnNwZWMvbWV0YWRhdGFcIlxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVGFibGVTY2hlbWFBc01hcmtkb3duKFxuICBzY2hlbWE6IFRhYmxlU2NoZW1hLFxuICBvcHRpb25zPzogeyBmcm9udG1hdHRlcj86IGJvb2xlYW4gfSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHJvd3M6IHN0cmluZ1tdID0gW11cblxuICByb3dzLnB1c2goXCJcIilcbiAgcm93cy5wdXNoKFwiIyMgQ29sdW1uc1wiKVxuICByb3dzLnB1c2goXCJcIilcbiAgcm93cy5wdXNoKFwifCBOYW1lIHwgVHlwZSB8IFRpdGxlIHwgRGVzY3JpcHRpb24gfCBDb25zdHJhaW50cyB8XCIpXG4gIHJvd3MucHVzaChcInwtLS0tLS18LS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfFwiKVxuXG4gIGNvbnN0IGNvbHVtbnMgPSBnZXRDb2x1bW5zKHNjaGVtYSlcbiAgY29uc3QgcmVxdWlyZWQgPSBzY2hlbWEucmVxdWlyZWQgPz8gW11cblxuICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgY29uc3QgeyBuYW1lLCB0eXBlLCBwcm9wZXJ0eSB9ID0gY29sdW1uXG4gICAgY29uc3QgdGl0bGUgPSBwcm9wZXJ0eS50aXRsZSA/PyBcIlwiXG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBwcm9wZXJ0eS5kZXNjcmlwdGlvbiA/PyBcIlwiXG5cbiAgICBjb25zdCBjb25zdHJhaW50czogc3RyaW5nW10gPSBbXVxuXG4gICAgaWYgKHJlcXVpcmVkLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICBjb25zdHJhaW50cy5wdXNoKFwicmVxdWlyZWRcIilcbiAgICB9XG5cbiAgICBjb25zdHJhaW50cy5wdXNoKC4uLmV4dHJhY3RDb25zdHJhaW50cyhwcm9wZXJ0eSkpXG5cbiAgICBjb25zdCBjb25zdHJhaW50c1N0ciA9IGNvbnN0cmFpbnRzLmpvaW4oXCIsIFwiKVxuXG4gICAgY29uc3QgZXNjYXBlZE5hbWUgPSBlc2NhcGVNYXJrZG93bihuYW1lKVxuICAgIGNvbnN0IGVzY2FwZWRUaXRsZSA9IGVzY2FwZU1hcmtkb3duKHRpdGxlKVxuICAgIGNvbnN0IGVzY2FwZWREZXNjcmlwdGlvbiA9IGVzY2FwZU1hcmtkb3duKGRlc2NyaXB0aW9uKVxuICAgIGNvbnN0IGVzY2FwZWRDb25zdHJhaW50cyA9IGVzY2FwZU1hcmtkb3duKGNvbnN0cmFpbnRzU3RyKVxuXG4gICAgcm93cy5wdXNoKFxuICAgICAgYHwgJHtlc2NhcGVkTmFtZX0gfCAke3R5cGV9IHwgJHtlc2NhcGVkVGl0bGV9IHwgJHtlc2NhcGVkRGVzY3JpcHRpb259IHwgJHtlc2NhcGVkQ29uc3RyYWludHN9IHxgLFxuICAgIClcbiAgfVxuXG4gIGxldCBtYXJrZG93biA9IGAke3Jvd3Muam9pbihcIlxcblwiKX1cXG5gXG5cbiAgaWYgKG9wdGlvbnM/LmZyb250bWF0dGVyKSB7XG4gICAgY29uc3QgaGVhZGVyOiBzdHJpbmdbXSA9IFtdXG4gICAgaGVhZGVyLnB1c2goXCItLS1cIilcbiAgICBpZiAoc2NoZW1hLnRpdGxlKSB7XG4gICAgICBoZWFkZXIucHVzaChgdGl0bGU6ICR7c2NoZW1hLnRpdGxlfWApXG4gICAgfVxuICAgIGhlYWRlci5wdXNoKFwiLS0tXCIpXG4gICAgaGVhZGVyLnB1c2goXCJcIilcbiAgICBtYXJrZG93biA9IGhlYWRlci5qb2luKFwiXFxuXCIpICsgbWFya2Rvd25cbiAgfVxuXG4gIHJldHVybiBtYXJrZG93blxufVxuXG5mdW5jdGlvbiBlc2NhcGVNYXJrZG93bih0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXG4vZywgXCIgXCIpXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDb25zdHJhaW50cyhwcm9wZXJ0eTogQ29sdW1uW1wicHJvcGVydHlcIl0pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNvbnN0cmFpbnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgaWYgKFwibWluaW11bVwiIGluIHByb3BlcnR5ICYmIHByb3BlcnR5Lm1pbmltdW0gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0cmFpbnRzLnB1c2goYG1pbjogJHtwcm9wZXJ0eS5taW5pbXVtfWApXG4gIH1cbiAgaWYgKFwibWF4aW11bVwiIGluIHByb3BlcnR5ICYmIHByb3BlcnR5Lm1heGltdW0gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0cmFpbnRzLnB1c2goYG1heDogJHtwcm9wZXJ0eS5tYXhpbXVtfWApXG4gIH1cbiAgaWYgKFwibWluTGVuZ3RoXCIgaW4gcHJvcGVydHkgJiYgcHJvcGVydHkubWluTGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdHJhaW50cy5wdXNoKGBtaW5MZW5ndGg6ICR7cHJvcGVydHkubWluTGVuZ3RofWApXG4gIH1cbiAgaWYgKFwibWF4TGVuZ3RoXCIgaW4gcHJvcGVydHkgJiYgcHJvcGVydHkubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdHJhaW50cy5wdXNoKGBtYXhMZW5ndGg6ICR7cHJvcGVydHkubWF4TGVuZ3RofWApXG4gIH1cbiAgaWYgKFwicGF0dGVyblwiIGluIHByb3BlcnR5ICYmIHByb3BlcnR5LnBhdHRlcm4pIHtcbiAgICBjb25zdHJhaW50cy5wdXNoKGBwYXR0ZXJuOiAke3Byb3BlcnR5LnBhdHRlcm59YClcbiAgfVxuICBpZiAoXCJlbnVtXCIgaW4gcHJvcGVydHkgJiYgcHJvcGVydHkuZW51bSkge1xuICAgIGNvbnN0cmFpbnRzLnB1c2goYGVudW06ICR7cHJvcGVydHkuZW51bS5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIHJldHVybiBjb25zdHJhaW50c1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|