@frictionless-ts/document 1.0.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/LICENSE.md +9 -0
- package/README.md +3 -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 +25 -0
- package/build/document/validate.spec.d.ts +1 -0
- package/build/document/validate.spec.js +71 -0
- package/build/index.d.ts +5 -0
- package/build/index.js +4 -0
- package/build/plugin.d.ts +1 -0
- package/build/plugin.js +3 -0
- package/build/schema/convert/toHtml.d.ts +4 -0
- package/build/schema/convert/toHtml.js +170 -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/package.json +45 -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
|
+
# @frictionless-ts/document
|
|
2
|
+
|
|
3
|
+
frictionless-ts is a fast TypeScript data management framework built on top of the Data Package 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://frictionlessdata.github.io/frictionless-ts/).
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kb2N1bWVudC9Eb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBKc29uRG9jdW1lbnQgfSBmcm9tIFwiLi90eXBlcy9Kc29uLnRzXCJcblxuZXhwb3J0IHR5cGUgRG9jdW1lbnQgPSBKc29uRG9jdW1lbnRcbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { validateDocument } from "./validate.js";
|
|
2
|
+
export * from "./types/Json.js";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kb2N1bWVudC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDaEQsY0FBYyxpQkFBaUIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgRG9jdW1lbnQgfSBmcm9tIFwiLi9Eb2N1bWVudC50c1wiXG5leHBvcnQgeyB2YWxpZGF0ZURvY3VtZW50IH0gZnJvbSBcIi4vdmFsaWRhdGUudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMvSnNvbi50c1wiXG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RvY3VtZW50L3R5cGVzL0Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQmFzZURvY3VtZW50IHtcbiAgdHlwZTogc3RyaW5nXG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSnNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RvY3VtZW50L3R5cGVzL0pzb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQmFzZURvY3VtZW50IH0gZnJvbSBcIi4vQmFzZS50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbkRvY3VtZW50IGV4dGVuZHMgQmFzZURvY3VtZW50IHtcbiAgdHlwZTogXCJqc29uXCJcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PlxufVxuIl19
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createReport } from "@frictionless-ts/metadata";
|
|
2
|
+
import { resolveJsonSchema } from "@frictionless-ts/metadata";
|
|
3
|
+
import { inspectJsonValue } from "@frictionless-ts/metadata";
|
|
4
|
+
export async function validateDocument(resource) {
|
|
5
|
+
if (resource.jsonSchema) {
|
|
6
|
+
const jsonSchema = await resolveJsonSchema(resource.jsonSchema);
|
|
7
|
+
if (!resource.data) {
|
|
8
|
+
return createReport([
|
|
9
|
+
{
|
|
10
|
+
type: "data",
|
|
11
|
+
message: `missing ${resource.name} data`,
|
|
12
|
+
},
|
|
13
|
+
]);
|
|
14
|
+
}
|
|
15
|
+
if (jsonSchema) {
|
|
16
|
+
const errors = await inspectJsonValue(resource.data, { jsonSchema });
|
|
17
|
+
return createReport(errors.map(error => ({
|
|
18
|
+
type: "document/json",
|
|
19
|
+
...error,
|
|
20
|
+
})));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return createReport();
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kb2N1bWVudC92YWxpZGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFNUQsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxRQUEyQjtJQUNoRSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN4QixNQUFNLFVBQVUsR0FBRyxNQUFNLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUUvRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLE9BQU8sWUFBWSxDQUFZO2dCQUM3QjtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixPQUFPLEVBQUUsV0FBVyxRQUFRLENBQUMsSUFBSSxPQUFPO2lCQUN6QzthQUNGLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFFRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtZQUVwRSxPQUFPLFlBQVksQ0FDakIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ25CLElBQUksRUFBRSxlQUFlO2dCQUNyQixHQUFHLEtBQUs7YUFDVCxDQUFDLENBQUMsQ0FDSixDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFlBQVksRUFBRSxDQUFBO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlc291cmNlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBEYXRhRXJyb3IgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IEpzb25Eb2N1bWVudEVycm9yIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgY3JlYXRlUmVwb3J0IH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgcmVzb2x2ZUpzb25TY2hlbWEgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyBpbnNwZWN0SnNvblZhbHVlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVEb2N1bWVudChyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4pIHtcbiAgaWYgKHJlc291cmNlLmpzb25TY2hlbWEpIHtcbiAgICBjb25zdCBqc29uU2NoZW1hID0gYXdhaXQgcmVzb2x2ZUpzb25TY2hlbWEocmVzb3VyY2UuanNvblNjaGVtYSlcblxuICAgIGlmICghcmVzb3VyY2UuZGF0YSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlcG9ydDxEYXRhRXJyb3I+KFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiZGF0YVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBtaXNzaW5nICR7cmVzb3VyY2UubmFtZX0gZGF0YWAsXG4gICAgICAgIH0sXG4gICAgICBdKVxuICAgIH1cblxuICAgIGlmIChqc29uU2NoZW1hKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0SnNvblZhbHVlKHJlc291cmNlLmRhdGEsIHsganNvblNjaGVtYSB9KVxuXG4gICAgICByZXR1cm4gY3JlYXRlUmVwb3J0PEpzb25Eb2N1bWVudEVycm9yPihcbiAgICAgICAgZXJyb3JzLm1hcChlcnJvciA9PiAoe1xuICAgICAgICAgIHR5cGU6IFwiZG9jdW1lbnQvanNvblwiLFxuICAgICAgICAgIC4uLmVycm9yLFxuICAgICAgICB9KSksXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVJlcG9ydCgpXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { validateDocument } from "./validate.js";
|
|
3
|
+
describe("validateDocument", () => {
|
|
4
|
+
it("should return valid report when data matches jsonSchema", async () => {
|
|
5
|
+
const resource = {
|
|
6
|
+
name: "test-document",
|
|
7
|
+
data: {
|
|
8
|
+
name: "test-package",
|
|
9
|
+
version: "1.0.0",
|
|
10
|
+
},
|
|
11
|
+
jsonSchema: {
|
|
12
|
+
type: "object",
|
|
13
|
+
required: ["name", "version"],
|
|
14
|
+
properties: {
|
|
15
|
+
name: { type: "string" },
|
|
16
|
+
version: { type: "string" },
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
const report = await validateDocument(resource);
|
|
21
|
+
expect(report.valid).toBe(true);
|
|
22
|
+
expect(report.errors).toEqual([]);
|
|
23
|
+
});
|
|
24
|
+
it("should return error when data is missing with jsonSchema", async () => {
|
|
25
|
+
const resource = {
|
|
26
|
+
name: "test-document",
|
|
27
|
+
jsonSchema: {
|
|
28
|
+
type: "object",
|
|
29
|
+
required: ["name"],
|
|
30
|
+
properties: {
|
|
31
|
+
name: { type: "string" },
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
const report = await validateDocument(resource);
|
|
36
|
+
expect(report.valid).toBe(false);
|
|
37
|
+
expect(report.errors).toEqual([
|
|
38
|
+
{
|
|
39
|
+
type: "data",
|
|
40
|
+
message: "missing test-document data",
|
|
41
|
+
},
|
|
42
|
+
]);
|
|
43
|
+
});
|
|
44
|
+
it("should return validation errors when data does not match jsonSchema", async () => {
|
|
45
|
+
const resource = {
|
|
46
|
+
name: "test-document",
|
|
47
|
+
data: {
|
|
48
|
+
name: "test-package",
|
|
49
|
+
version: 123,
|
|
50
|
+
},
|
|
51
|
+
jsonSchema: {
|
|
52
|
+
type: "object",
|
|
53
|
+
required: ["name", "version"],
|
|
54
|
+
properties: {
|
|
55
|
+
name: { type: "string" },
|
|
56
|
+
version: { type: "string" },
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
const report = await validateDocument(resource);
|
|
61
|
+
expect(report.valid).toBe(false);
|
|
62
|
+
expect(report.errors).toEqual([
|
|
63
|
+
{
|
|
64
|
+
type: "document/json",
|
|
65
|
+
pointer: "/version",
|
|
66
|
+
message: "must be string",
|
|
67
|
+
},
|
|
68
|
+
]);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2RvY3VtZW50L3ZhbGlkYXRlLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVoRCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RSxNQUFNLFFBQVEsR0FBRztZQUNmLElBQUksRUFBRSxlQUFlO1lBQ3JCLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsY0FBYztnQkFDcEIsT0FBTyxFQUFFLE9BQU87YUFDakI7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQztnQkFDN0IsVUFBVSxFQUFFO29CQUNWLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7b0JBQ3hCLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7aUJBQzVCO2FBQ0Y7U0FDRixDQUFBO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUUvQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMvQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNuQyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywwREFBMEQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN4RSxNQUFNLFFBQVEsR0FBRztZQUNmLElBQUksRUFBRSxlQUFlO1lBQ3JCLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsUUFBUTtnQkFDZCxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xCLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2lCQUN6QjthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDNUI7Z0JBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osT0FBTyxFQUFFLDRCQUE0QjthQUN0QztTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHFFQUFxRSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ25GLE1BQU0sUUFBUSxHQUFHO1lBQ2YsSUFBSSxFQUFFLGVBQWU7WUFDckIsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxjQUFjO2dCQUNwQixPQUFPLEVBQUUsR0FBRzthQUNiO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxRQUFRO2dCQUNkLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7Z0JBQzdCLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO29CQUN4QixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2lCQUM1QjthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDNUI7Z0JBQ0UsSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLE9BQU8sRUFBRSxVQUFVO2dCQUNuQixPQUFPLEVBQUUsZ0JBQWdCO2FBQzFCO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyB2YWxpZGF0ZURvY3VtZW50IH0gZnJvbSBcIi4vdmFsaWRhdGUudHNcIlxuXG5kZXNjcmliZShcInZhbGlkYXRlRG9jdW1lbnRcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCByZXR1cm4gdmFsaWQgcmVwb3J0IHdoZW4gZGF0YSBtYXRjaGVzIGpzb25TY2hlbWFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LWRvY3VtZW50XCIsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICAgIH0sXG4gICAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCIsIFwidmVyc2lvblwiXSxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIG5hbWU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIHZlcnNpb246IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZURvY3VtZW50KHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlcG9ydC52YWxpZCkudG9CZSh0cnVlKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzKS50b0VxdWFsKFtdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHJldHVybiBlcnJvciB3aGVuIGRhdGEgaXMgbWlzc2luZyB3aXRoIGpzb25TY2hlbWFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LWRvY3VtZW50XCIsXG4gICAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCJdLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlRG9jdW1lbnQocmVzb3VyY2UpXG5cbiAgICBleHBlY3QocmVwb3J0LnZhbGlkKS50b0JlKGZhbHNlKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJkYXRhXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwibWlzc2luZyB0ZXN0LWRvY3VtZW50IGRhdGFcIixcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCByZXR1cm4gdmFsaWRhdGlvbiBlcnJvcnMgd2hlbiBkYXRhIGRvZXMgbm90IG1hdGNoIGpzb25TY2hlbWFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LWRvY3VtZW50XCIsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICAgIHZlcnNpb246IDEyMyxcbiAgICAgIH0sXG4gICAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCIsIFwidmVyc2lvblwiXSxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIG5hbWU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIHZlcnNpb246IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZURvY3VtZW50KHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlcG9ydC52YWxpZCkudG9CZShmYWxzZSlcbiAgICBleHBlY3QocmVwb3J0LmVycm9ycykudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiZG9jdW1lbnQvanNvblwiLFxuICAgICAgICBwb2ludGVyOiBcIi92ZXJzaW9uXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwibXVzdCBiZSBzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcbn0pXG4iXX0=
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { Document } from "./document/index.ts";
|
|
2
|
+
export type { JsonDocument } from "./document/index.ts";
|
|
3
|
+
export { convertSchemaToHtml } from "./schema/index.tsx";
|
|
4
|
+
export { convertSchemaToMarkdown } from "./schema/index.ts";
|
|
5
|
+
export { validateDocument } from "./document/index.ts";
|
package/build/index.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { convertSchemaToHtml } from "./schema/index.js";
|
|
2
|
+
export { convertSchemaToMarkdown } from "./schema/index.js";
|
|
3
|
+
export { validateDocument } from "./document/index.js";
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBb0IsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgRG9jdW1lbnQgfSBmcm9tIFwiLi9kb2N1bWVudC9pbmRleC50c1wiXG5leHBvcnQgdHlwZSB7IEpzb25Eb2N1bWVudCB9IGZyb20gXCIuL2RvY3VtZW50L2luZGV4LnRzXCJcblxuZXhwb3J0IHsgY29udmVydFNjaGVtYVRvSHRtbCB9IGZyb20gXCIuL3NjaGVtYS9pbmRleC50c3hcIlxuZXhwb3J0IHsgY29udmVydFNjaGVtYVRvTWFya2Rvd24gfSBmcm9tIFwiLi9zY2hlbWEvaW5kZXgudHNcIlxuZXhwb3J0IHsgdmFsaWRhdGVEb2N1bWVudCB9IGZyb20gXCIuL2RvY3VtZW50L2luZGV4LnRzXCJcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/build/plugin.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
// TODO: consider having a plugin here (e.g. plugin.convertSchema)
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrRUFBa0UiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUT0RPOiBjb25zaWRlciBoYXZpbmcgYSBwbHVnaW4gaGVyZSAoZS5nLiBwbHVnaW4uY29udmVydFNjaGVtYSlcbiJdfQ==
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { prettify } from "htmlfy";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { renderToStaticMarkup } from "react-dom/server";
|
|
4
|
+
export function convertSchemaToHtml(schema, options) {
|
|
5
|
+
let html = prettify(renderToStaticMarkup(React.createElement(SchemaTable, { schema: schema, withTitle: !options?.frontmatter })));
|
|
6
|
+
if (options?.frontmatter) {
|
|
7
|
+
if (schema.title) {
|
|
8
|
+
html = `---\ntitle: ${schema.title}\n---\n\n${html}`;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return html;
|
|
12
|
+
}
|
|
13
|
+
function SchemaTable(props) {
|
|
14
|
+
const { schema, withTitle } = props;
|
|
15
|
+
const title = withTitle ? schema.title : undefined;
|
|
16
|
+
return (React.createElement(React.Fragment, null,
|
|
17
|
+
React.createElement(SchemaHeader, { title: title, description: schema.description }),
|
|
18
|
+
schema.primaryKey && React.createElement(PrimaryKey, { fields: schema.primaryKey }),
|
|
19
|
+
schema.foreignKeys && schema.foreignKeys.length > 0 && (React.createElement(ForeignKeys, { foreignKeys: schema.foreignKeys })),
|
|
20
|
+
React.createElement(FieldsTable, { fields: schema.fields })));
|
|
21
|
+
}
|
|
22
|
+
function SchemaHeader(props) {
|
|
23
|
+
const { title, description } = props;
|
|
24
|
+
return (React.createElement(React.Fragment, null,
|
|
25
|
+
title && React.createElement("h1", { id: sanitizeId(title) }, title),
|
|
26
|
+
description && React.createElement("p", null, description)));
|
|
27
|
+
}
|
|
28
|
+
function FieldsTable(props) {
|
|
29
|
+
const { fields } = props;
|
|
30
|
+
return (React.createElement(React.Fragment, null,
|
|
31
|
+
React.createElement("h2", null, "Fields"),
|
|
32
|
+
React.createElement("table", null,
|
|
33
|
+
React.createElement("colgroup", null,
|
|
34
|
+
React.createElement("col", { width: "20%" }),
|
|
35
|
+
React.createElement("col", { width: "65%" }),
|
|
36
|
+
React.createElement("col", { width: "15%" })),
|
|
37
|
+
React.createElement("thead", null,
|
|
38
|
+
React.createElement("tr", null,
|
|
39
|
+
React.createElement("th", null, "Name"),
|
|
40
|
+
React.createElement("th", null, "Definition"),
|
|
41
|
+
React.createElement("th", null, "Type"))),
|
|
42
|
+
React.createElement("tbody", null, fields.map((field, index) => (React.createElement(FieldRow, { key: index, field: field })))))));
|
|
43
|
+
}
|
|
44
|
+
function FieldRow(props) {
|
|
45
|
+
const { field } = props;
|
|
46
|
+
const fieldName = field.name || "";
|
|
47
|
+
const fieldType = field.type || "any";
|
|
48
|
+
const fieldDescription = field.description || "";
|
|
49
|
+
let isRequired = false;
|
|
50
|
+
if ("constraints" in field && field.constraints) {
|
|
51
|
+
const c = field.constraints;
|
|
52
|
+
if (c.required) {
|
|
53
|
+
isRequired = true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const constraints = extractConstraints(field);
|
|
57
|
+
return (React.createElement("tr", null,
|
|
58
|
+
React.createElement("td", { id: sanitizeId(fieldName) },
|
|
59
|
+
React.createElement("code", null,
|
|
60
|
+
React.createElement("strong", null,
|
|
61
|
+
fieldName,
|
|
62
|
+
!isRequired && "?"))),
|
|
63
|
+
React.createElement("td", null,
|
|
64
|
+
fieldDescription && React.createElement("p", null, fieldDescription),
|
|
65
|
+
constraints.length > 0 && (React.createElement(ConstraintsList, { constraints: constraints })),
|
|
66
|
+
(field.type === "string" || field.type === "integer") &&
|
|
67
|
+
"categories" in field &&
|
|
68
|
+
field.categories !== undefined && (React.createElement(CategoriesList, { categories: field.categories })),
|
|
69
|
+
field.examples !== undefined && (React.createElement(ExamplesList, { examples: field.examples }))),
|
|
70
|
+
React.createElement("td", null,
|
|
71
|
+
React.createElement("code", null, fieldType))));
|
|
72
|
+
}
|
|
73
|
+
function ConstraintsList(props) {
|
|
74
|
+
const { constraints } = props;
|
|
75
|
+
return (React.createElement(React.Fragment, null,
|
|
76
|
+
React.createElement("strong", null, "Constraints"),
|
|
77
|
+
React.createElement("ul", null, constraints.map((constraint, index) => (React.createElement("li", { key: index },
|
|
78
|
+
constraint.name,
|
|
79
|
+
": ",
|
|
80
|
+
React.createElement("code", null, constraint.value)))))));
|
|
81
|
+
}
|
|
82
|
+
function ExamplesList(props) {
|
|
83
|
+
const { examples } = props;
|
|
84
|
+
return (React.createElement(React.Fragment, null,
|
|
85
|
+
React.createElement("strong", null, "Examples"),
|
|
86
|
+
React.createElement("ul", null, examples.map((example, index) => (React.createElement("li", { key: index },
|
|
87
|
+
React.createElement("code", null, String(example))))))));
|
|
88
|
+
}
|
|
89
|
+
function CategoriesList(props) {
|
|
90
|
+
const { categories } = props;
|
|
91
|
+
return (React.createElement(React.Fragment, null,
|
|
92
|
+
React.createElement("strong", null, "Categories"),
|
|
93
|
+
React.createElement("ul", null, categories.map((category, index) => {
|
|
94
|
+
const value = typeof category === "object" ? category.value : category;
|
|
95
|
+
const label = typeof category === "object" ? category.label : undefined;
|
|
96
|
+
return (React.createElement("li", { key: index },
|
|
97
|
+
React.createElement("code", null, String(value)),
|
|
98
|
+
label && ` - ${label}`));
|
|
99
|
+
}))));
|
|
100
|
+
}
|
|
101
|
+
function extractConstraints(field) {
|
|
102
|
+
const constraints = [];
|
|
103
|
+
if ("constraints" in field && field.constraints) {
|
|
104
|
+
const c = field.constraints;
|
|
105
|
+
if (c.required) {
|
|
106
|
+
constraints.push({ name: "required", value: "true" });
|
|
107
|
+
}
|
|
108
|
+
if (c.unique) {
|
|
109
|
+
constraints.push({ name: "unique", value: "true" });
|
|
110
|
+
}
|
|
111
|
+
if (c.minimum !== undefined) {
|
|
112
|
+
constraints.push({ name: "minimum", value: String(c.minimum) });
|
|
113
|
+
}
|
|
114
|
+
if (c.maximum !== undefined) {
|
|
115
|
+
constraints.push({ name: "maximum", value: String(c.maximum) });
|
|
116
|
+
}
|
|
117
|
+
if (c.minLength !== undefined) {
|
|
118
|
+
constraints.push({ name: "minLength", value: String(c.minLength) });
|
|
119
|
+
}
|
|
120
|
+
if (c.maxLength !== undefined) {
|
|
121
|
+
constraints.push({ name: "maxLength", value: String(c.maxLength) });
|
|
122
|
+
}
|
|
123
|
+
if (c.pattern) {
|
|
124
|
+
constraints.push({ name: "pattern", value: c.pattern });
|
|
125
|
+
}
|
|
126
|
+
if (c.enum) {
|
|
127
|
+
const enumValues = c.enum.map((v) => String(v)).join(", ");
|
|
128
|
+
constraints.push({ name: "enum", value: enumValues });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return constraints;
|
|
132
|
+
}
|
|
133
|
+
function PrimaryKey(props) {
|
|
134
|
+
const { fields } = props;
|
|
135
|
+
return (React.createElement(React.Fragment, null,
|
|
136
|
+
React.createElement("h2", null, "Primary Key"),
|
|
137
|
+
React.createElement("p", null,
|
|
138
|
+
React.createElement("code", null, fields.join(", ")))));
|
|
139
|
+
}
|
|
140
|
+
function ForeignKeys(props) {
|
|
141
|
+
const { foreignKeys } = props;
|
|
142
|
+
if (!foreignKeys)
|
|
143
|
+
return null;
|
|
144
|
+
return (React.createElement(React.Fragment, null,
|
|
145
|
+
React.createElement("h2", null, "Foreign Keys"),
|
|
146
|
+
React.createElement("table", null,
|
|
147
|
+
React.createElement("colgroup", null,
|
|
148
|
+
React.createElement("col", { width: "40%" }),
|
|
149
|
+
React.createElement("col", { width: "30%" }),
|
|
150
|
+
React.createElement("col", { width: "30%" })),
|
|
151
|
+
React.createElement("thead", null,
|
|
152
|
+
React.createElement("tr", null,
|
|
153
|
+
React.createElement("th", null, "Fields"),
|
|
154
|
+
React.createElement("th", null, "Reference Resource"),
|
|
155
|
+
React.createElement("th", null, "Reference Fields"))),
|
|
156
|
+
React.createElement("tbody", null, foreignKeys.map((fk, index) => (React.createElement("tr", { key: index },
|
|
157
|
+
React.createElement("td", null,
|
|
158
|
+
React.createElement("code", null, fk.fields.join(", "))),
|
|
159
|
+
React.createElement("td", null,
|
|
160
|
+
React.createElement("code", null, fk.reference.resource || "-")),
|
|
161
|
+
React.createElement("td", null,
|
|
162
|
+
React.createElement("code", null, fk.reference.fields.join(", "))))))))));
|
|
163
|
+
}
|
|
164
|
+
function sanitizeId(text) {
|
|
165
|
+
return text
|
|
166
|
+
.toLowerCase()
|
|
167
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
168
|
+
.replace(/^-|-$/g, "");
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9IdG1sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc2NoZW1hL2NvbnZlcnQvdG9IdG1sLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ2pDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUV2RCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLE1BQWMsRUFDZCxPQUFtQztJQUVuQyxJQUFJLElBQUksR0FBRyxRQUFRLENBQ2pCLG9CQUFvQixDQUNsQixvQkFBQyxXQUFXLElBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsV0FBVyxHQUFJLENBQ2xFLENBQ0YsQ0FBQTtJQUVELElBQUksT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLElBQUksR0FBRyxlQUFlLE1BQU0sQ0FBQyxLQUFLLFlBQVksSUFBSSxFQUFFLENBQUE7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUE4QztJQUNqRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUNuQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUVsRCxPQUFPLENBQ0w7UUFDRSxvQkFBQyxZQUFZLElBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsR0FBSTtRQUM5RCxNQUFNLENBQUMsVUFBVSxJQUFJLG9CQUFDLFVBQVUsSUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFVB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Q2IsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUM7U0FDM0IsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBGaWVsZCwgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgcHJldHRpZnkgfSBmcm9tIFwiaHRtbGZ5XCJcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHsgcmVuZGVyVG9TdGF0aWNNYXJrdXAgfSBmcm9tIFwicmVhY3QtZG9tL3NlcnZlclwiXG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U2NoZW1hVG9IdG1sKFxuICBzY2hlbWE6IFNjaGVtYSxcbiAgb3B0aW9ucz86IHsgZnJvbnRtYXR0ZXI/OiBib29sZWFuIH0sXG4pOiBzdHJpbmcge1xuICBsZXQgaHRtbCA9IHByZXR0aWZ5KFxuICAgIHJlbmRlclRvU3RhdGljTWFya3VwKFxuICAgICAgPFNjaGVtYVRhYmxlIHNjaGVtYT17c2NoZW1hfSB3aXRoVGl0bGU9eyFvcHRpb25zPy5mcm9udG1hdHRlcn0gLz4sXG4gICAgKSxcbiAgKVxuXG4gIGlmIChvcHRpb25zPy5mcm9udG1hdHRlcikge1xuICAgIGlmIChzY2hlbWEudGl0bGUpIHtcbiAgICAgIGh0bWwgPSBgLS0tXFxudGl0bGU6ICR7c2NoZW1hLnRpdGxlfVxcbi0tLVxcblxcbiR7aHRtbH1gXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGh0bWxcbn1cblxuZnVuY3Rpb24gU2NoZW1hVGFibGUocHJvcHM6IHsgc2NoZW1hOiBTY2hlbWE7IHdpdGhUaXRsZT86IGJvb2xlYW4gfSkge1xuICBjb25zdCB7IHNjaGVtYSwgd2l0aFRpdGxlIH0gPSBwcm9wc1xuICBjb25zdCB0aXRsZSA9IHdpdGhUaXRsZSA/IHNjaGVtYS50aXRsZSA6IHVuZGVmaW5lZFxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxTY2hlbWFIZWFkZXIgdGl0bGU9e3RpdGxlfSBkZXNjcmlwdGlvbj17c2NoZW1hLmRlc2NyaXB0aW9ufSAvPlxuICAgICAge3NjaGVtYS5wcmltYXJ5S2V5ICYmIDxQcmltYXJ5S2V5IGZpZWxkcz17c2NoZW1hLnByaW1hcnlLZXl9IC8+fVxuICAgICAge3NjaGVtYS5mb3JlaWduS2V5cyAmJiBzY2hlbWEuZm9yZWlnbktleXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgIDxGb3JlaWduS2V5cyBmb3JlaWduS2V5cz17c2NoZW1hLmZvcmVpZ25LZXlzfSAvPlxuICAgICAgKX1cbiAgICAgIDxGaWVsZHNUYWJsZSBmaWVsZHM9e3NjaGVtYS5maWVsZHN9IC8+XG4gICAgPC8+XG4gIClcbn1cblxuZnVuY3Rpb24gU2NoZW1hSGVhZGVyKHByb3BzOiB7IHRpdGxlPzogc3RyaW5nOyBkZXNjcmlwdGlvbj86IHN0cmluZyB9KSB7XG4gIGNvbnN0IHsgdGl0bGUsIGRlc2NyaXB0aW9uIH0gPSBwcm9wc1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHt0aXRsZSAmJiA8aDEgaWQ9e3Nhbml0aXplSWQodGl0bGUpfT57dGl0bGV9PC9oMT59XG4gICAgICB7ZGVzY3JpcHRpb24gJiYgPHA+e2Rlc2NyaXB0aW9ufTwvcD59XG4gICAgPC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRmllbGRzVGFibGUocHJvcHM6IHsgZmllbGRzOiBGaWVsZFtdIH0pIHtcbiAgY29uc3QgeyBmaWVsZHMgfSA9IHByb3BzXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxoMj5GaWVsZHM8L2gyPlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8Y29sZ3JvdXA+XG4gICAgICAgICAgPGNvbCB3aWR0aD1cIjIwJVwiIC8+XG4gICAgICAgICAgPGNvbCB3aWR0aD1cIjY1JVwiIC8+XG4gICAgICAgICAgPGNvbCB3aWR0aD1cIjE1JVwiIC8+XG4gICAgICAgIDwvY29sZ3JvdXA+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGg+TmFtZTwvdGg+XG4gICAgICAgICAgICA8dGg+RGVmaW5pdGlvbjwvdGg+XG4gICAgICAgICAgICA8dGg+VHlwZTwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIHtmaWVsZHMubWFwKChmaWVsZCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgIDxGaWVsZFJvdyBrZXk9e2luZGV4fSBmaWVsZD17ZmllbGR9IC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvPlxuICApXG59XG5cbmZ1bmN0aW9uIEZpZWxkUm93KHByb3BzOiB7IGZpZWxkOiBGaWVsZCB9KSB7XG4gIGNvbnN0IHsgZmllbGQgfSA9IHByb3BzXG4gIGNvbnN0IGZpZWxkTmFtZSA9IGZpZWxkLm5hbWUgfHwgXCJcIlxuICBjb25zdCBmaWVsZFR5cGUgPSBmaWVsZC50eXBlIHx8IFwiYW55XCJcbiAgY29uc3QgZmllbGREZXNjcmlwdGlvbiA9IGZpZWxkLmRlc2NyaXB0aW9uIHx8IFwiXCJcblxuICBsZXQgaXNSZXF1aXJlZCA9IGZhbHNlXG4gIGlmIChcImNvbnN0cmFpbnRzXCIgaW4gZmllbGQgJiYgZmllbGQuY29uc3RyYWludHMpIHtcbiAgICBjb25zdCBjID0gZmllbGQuY29uc3RyYWludHMgYXMgYW55XG4gICAgaWYgKGMucmVxdWlyZWQpIHtcbiAgICAgIGlzUmVxdWlyZWQgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uc3RyYWludHMgPSBleHRyYWN0Q29uc3RyYWludHMoZmllbGQpXG5cbiAgcmV0dXJuIChcbiAgICA8dHI+XG4gICAgICA8dGQgaWQ9e3Nhbml0aXplSWQoZmllbGROYW1lKX0+XG4gICAgICAgIDxjb2RlPlxuICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICB7ZmllbGROYW1lfVxuICAgICAgICAgICAgeyFpc1JlcXVpcmVkICYmIFwiP1wifVxuICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICA8L2NvZGU+XG4gICAgICA8L3RkPlxuICAgICAgPHRkPlxuICAgICAgICB7ZmllbGREZXNjcmlwdGlvbiAmJiA8cD57ZmllbGREZXNjcmlwdGlvbn08L3A+fVxuICAgICAgICB7Y29uc3RyYWludHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgPENvbnN0cmFpbnRzTGlzdCBjb25zdHJhaW50cz17Y29uc3RyYWludHN9IC8+XG4gICAgICAgICl9XG4gICAgICAgIHsoZmllbGQudHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBmaWVsZC50eXBlID09PSBcImludGVnZXJcIikgJiZcbiAgICAgICAgICBcImNhdGVnb3JpZXNcIiBpbiBmaWVsZCAmJlxuICAgICAgICAgIGZpZWxkLmNhdGVnb3JpZXMgIT09IHVuZGVmaW5lZCAmJiAoXG4gICAgICAgICAgICA8Q2F0ZWdvcmllc0xpc3QgY2F0ZWdvcmllcz17ZmllbGQuY2F0ZWdvcmllc30gLz5cbiAgICAgICAgICApfVxuICAgICAgICB7ZmllbGQuZXhhbXBsZXMgIT09IHVuZGVmaW5lZCAmJiAoXG4gICAgICAgICAgPEV4YW1wbGVzTGlzdCBleGFtcGxlcz17ZmllbGQuZXhhbXBsZXN9IC8+XG4gICAgICAgICl9XG4gICAgICA8L3RkPlxuICAgICAgPHRkPlxuICAgICAgICA8Y29kZT57ZmllbGRUeXBlfTwvY29kZT5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgKVxufVxuXG5mdW5jdGlvbiBDb25zdHJhaW50c0xpc3QocHJvcHM6IHsgY29uc3RyYWludHM6IENvbnN0cmFpbnRbXSB9KSB7XG4gIGNvbnN0IHsgY29uc3RyYWludHMgfSA9IHByb3BzXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxzdHJvbmc+Q29uc3RyYWludHM8L3N0cm9uZz5cbiAgICAgIDx1bD5cbiAgICAgICAge2NvbnN0cmFpbnRzLm1hcCgoY29uc3RyYWludCwgaW5kZXgpID0+IChcbiAgICAgICAgICA8bGkga2V5PXtpbmRleH0+XG4gICAgICAgICAgICB7Y29uc3RyYWludC5uYW1lfTogPGNvZGU+e2NvbnN0cmFpbnQudmFsdWV9PC9jb2RlPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICkpfVxuICAgICAgPC91bD5cbiAgICA8Lz5cbiAgKVxufVxuXG5mdW5jdGlvbiBFeGFtcGxlc0xpc3QocHJvcHM6IHsgZXhhbXBsZXM6IGFueVtdIH0pIHtcbiAgY29uc3QgeyBleGFtcGxlcyB9ID0gcHJvcHNcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPHN0cm9uZz5FeGFtcGxlczwvc3Ryb25nPlxuICAgICAgPHVsPlxuICAgICAgICB7ZXhhbXBsZXMubWFwKChleGFtcGxlLCBpbmRleCkgPT4gKFxuICAgICAgICAgIDxsaSBrZXk9e2luZGV4fT5cbiAgICAgICAgICAgIDxjb2RlPntTdHJpbmcoZXhhbXBsZSl9PC9jb2RlPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICkpfVxuICAgICAgPC91bD5cbiAgICA8Lz5cbiAgKVxufVxuXG5mdW5jdGlvbiBDYXRlZ29yaWVzTGlzdChwcm9wczoge1xuICBjYXRlZ29yaWVzOlxuICAgIHwgc3RyaW5nW11cbiAgICB8IG51bWJlcltdXG4gICAgfCBBcnJheTx7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfT5cbn0pIHtcbiAgY29uc3QgeyBjYXRlZ29yaWVzIH0gPSBwcm9wc1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8c3Ryb25nPkNhdGVnb3JpZXM8L3N0cm9uZz5cbiAgICAgIDx1bD5cbiAgICAgICAge2NhdGVnb3JpZXMubWFwKChjYXRlZ29yeSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIiA/IGNhdGVnb3J5LnZhbHVlIDogY2F0ZWdvcnlcbiAgICAgICAgICBjb25zdCBsYWJlbCA9XG4gICAgICAgICAgICB0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCIgPyBjYXRlZ29yeS5sYWJlbCA6IHVuZGVmaW5lZFxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8bGkga2V5PXtpbmRleH0+XG4gICAgICAgICAgICAgIDxjb2RlPntTdHJpbmcodmFsdWUpfTwvY29kZT5cbiAgICAgICAgICAgICAge2xhYmVsICYmIGAgLSAke2xhYmVsfWB9XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIClcbiAgICAgICAgfSl9XG4gICAgICA8L3VsPlxuICAgIDwvPlxuICApXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDb25zdHJhaW50cyhmaWVsZDogRmllbGQpOiBDb25zdHJhaW50W10ge1xuICBjb25zdCBjb25zdHJhaW50czogQ29uc3RyYWludFtdID0gW11cblxuICBpZiAoXCJjb25zdHJhaW50c1wiIGluIGZpZWxkICYmIGZpZWxkLmNvbnN0cmFpbnRzKSB7XG4gICAgY29uc3QgYyA9IGZpZWxkLmNvbnN0cmFpbnRzIGFzIGFueVxuXG4gICAgaWYgKGMucmVxdWlyZWQpIHtcbiAgICAgIGNvbnN0cmFpbnRzLnB1c2goeyBuYW1lOiBcInJlcXVpcmVkXCIsIHZhbHVlOiBcInRydWVcIiB9KVxuICAgIH1cbiAgICBpZiAoYy51bmlxdWUpIHtcbiAgICAgIGNvbnN0cmFpbnRzLnB1c2goeyBuYW1lOiBcInVuaXF1ZVwiLCB2YWx1ZTogXCJ0cnVlXCIgfSlcbiAgICB9XG4gICAgaWYgKGMubWluaW11bSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdHJhaW50cy5wdXNoKHsgbmFtZTogXCJtaW5pbXVtXCIsIHZhbHVlOiBTdHJpbmcoYy5taW5pbXVtKSB9KVxuICAgIH1cbiAgICBpZiAoYy5tYXhpbXVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0cmFpbnRzLnB1c2goeyBuYW1lOiBcIm1heGltdW1cIiwgdmFsdWU6IFN0cmluZyhjLm1heGltdW0pIH0pXG4gICAgfVxuICAgIGlmIChjLm1pbkxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdHJhaW50cy5wdXNoKHsgbmFtZTogXCJtaW5MZW5ndGhcIiwgdmFsdWU6IFN0cmluZyhjLm1pbkxlbmd0aCkgfSlcbiAgICB9XG4gICAgaWYgKGMubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0cmFpbnRzLnB1c2goeyBuYW1lOiBcIm1heExlbmd0aFwiLCB2YWx1ZTogU3RyaW5nKGMubWF4TGVuZ3RoKSB9KVxuICAgIH1cbiAgICBpZiAoYy5wYXR0ZXJuKSB7XG4gICAgICBjb25zdHJhaW50cy5wdXNoKHsgbmFtZTogXCJwYXR0ZXJuXCIsIHZhbHVlOiBjLnBhdHRlcm4gfSlcbiAgICB9XG4gICAgaWYgKGMuZW51bSkge1xuICAgICAgY29uc3QgZW51bVZhbHVlcyA9IGMuZW51bS5tYXAoKHY6IGFueSkgPT4gU3RyaW5nKHYpKS5qb2luKFwiLCBcIilcbiAgICAgIGNvbnN0cmFpbnRzLnB1c2goeyBuYW1lOiBcImVudW1cIiwgdmFsdWU6IGVudW1WYWx1ZXMgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uc3RyYWludHNcbn1cblxuZnVuY3Rpb24gUHJpbWFyeUtleShwcm9wczogeyBmaWVsZHM6IHN0cmluZ1tdIH0pIHtcbiAgY29uc3QgeyBmaWVsZHMgfSA9IHByb3BzXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxoMj5QcmltYXJ5IEtleTwvaDI+XG4gICAgICA8cD5cbiAgICAgICAgPGNvZGU+e2ZpZWxkcy5qb2luKFwiLCBcIil9PC9jb2RlPlxuICAgICAgPC9wPlxuICAgIDwvPlxuICApXG59XG5cbmZ1bmN0aW9uIEZvcmVpZ25LZXlzKHByb3BzOiB7IGZvcmVpZ25LZXlzOiBTY2hlbWFbXCJmb3JlaWduS2V5c1wiXSB9KSB7XG4gIGNvbnN0IHsgZm9yZWlnbktleXMgfSA9IHByb3BzXG4gIGlmICghZm9yZWlnbktleXMpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPGgyPkZvcmVpZ24gS2V5czwvaDI+XG4gICAgICA8dGFibGU+XG4gICAgICAgIDxjb2xncm91cD5cbiAgICAgICAgICA8Y29sIHdpZHRoPVwiNDAlXCIgLz5cbiAgICAgICAgICA8Y29sIHdpZHRoPVwiMzAlXCIgLz5cbiAgICAgICAgICA8Y29sIHdpZHRoPVwiMzAlXCIgLz5cbiAgICAgICAgPC9jb2xncm91cD5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aD5GaWVsZHM8L3RoPlxuICAgICAgICAgICAgPHRoPlJlZmVyZW5jZSBSZXNvdXJjZTwvdGg+XG4gICAgICAgICAgICA8dGg+UmVmZXJlbmNlIEZpZWxkczwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIHtmb3JlaWduS2V5cy5tYXAoKGZrLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPHRyIGtleT17aW5kZXh9PlxuICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgPGNvZGU+e2ZrLmZpZWxkcy5qb2luKFwiLCBcIil9PC9jb2RlPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgPGNvZGU+e2ZrLnJlZmVyZW5jZS5yZXNvdXJjZSB8fCBcIi1cIn08L2NvZGU+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICA8Y29kZT57ZmsucmVmZXJlbmNlLmZpZWxkcy5qb2luKFwiLCBcIil9PC9jb2RlPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC8+XG4gIClcbn1cblxuZnVuY3Rpb24gc2FuaXRpemVJZCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgXCItXCIpXG4gICAgLnJlcGxhY2UoL14tfC0kL2csIFwiXCIpXG59XG5cbmludGVyZmFjZSBDb25zdHJhaW50IHtcbiAgbmFtZTogc3RyaW5nXG4gIHZhbHVlOiBzdHJpbmdcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { convertSchemaToHtml } from "./toHtml.js";
|
|
3
|
+
describe("convertSchemaToHtml", () => {
|
|
4
|
+
it("converts a simple schema to html table", () => {
|
|
5
|
+
const schema = {
|
|
6
|
+
fields: [
|
|
7
|
+
{
|
|
8
|
+
name: "id",
|
|
9
|
+
type: "integer",
|
|
10
|
+
title: "Identifier",
|
|
11
|
+
description: "Unique identifier",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: "name",
|
|
15
|
+
type: "string",
|
|
16
|
+
title: "Name",
|
|
17
|
+
description: "Person name",
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
const result = convertSchemaToHtml(schema);
|
|
22
|
+
expect(result).toContain("<h2>Fields</h2>");
|
|
23
|
+
expect(result).toContain("<table>");
|
|
24
|
+
expect(result).toContain("<th>Name</th>");
|
|
25
|
+
expect(result).toContain("<th>Definition</th>");
|
|
26
|
+
expect(result).toContain("<th>Type</th>");
|
|
27
|
+
expect(result).toContain("<strong>id?</strong>");
|
|
28
|
+
expect(result).toContain("<strong>name?</strong>");
|
|
29
|
+
expect(result).toContain("<p>Unique identifier</p>");
|
|
30
|
+
expect(result).toContain("<p>Person name</p>");
|
|
31
|
+
expect(result).toContain("<code>integer</code>");
|
|
32
|
+
expect(result).toContain("<code>string</code>");
|
|
33
|
+
});
|
|
34
|
+
it("includes schema title and description", () => {
|
|
35
|
+
const schema = {
|
|
36
|
+
title: "Test Schema",
|
|
37
|
+
description: "A test schema for validation",
|
|
38
|
+
fields: [
|
|
39
|
+
{
|
|
40
|
+
name: "field1",
|
|
41
|
+
type: "string",
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
const result = convertSchemaToHtml(schema);
|
|
46
|
+
expect(result).toContain('<h1 id="test-schema">Test Schema</h1>');
|
|
47
|
+
expect(result).toContain("<p>A test schema for validation</p>");
|
|
48
|
+
});
|
|
49
|
+
it("handles field constraints", () => {
|
|
50
|
+
const schema = {
|
|
51
|
+
fields: [
|
|
52
|
+
{
|
|
53
|
+
name: "age",
|
|
54
|
+
type: "integer",
|
|
55
|
+
constraints: {
|
|
56
|
+
required: true,
|
|
57
|
+
minimum: 0,
|
|
58
|
+
maximum: 120,
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: "email",
|
|
63
|
+
type: "string",
|
|
64
|
+
constraints: {
|
|
65
|
+
required: true,
|
|
66
|
+
pattern: "^[a-z]+@[a-z]+\\.[a-z]+$",
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
const result = convertSchemaToHtml(schema);
|
|
72
|
+
expect(result).toContain("<strong>Constraints</strong>");
|
|
73
|
+
expect(result).toContain("required:");
|
|
74
|
+
expect(result).toContain("<code>true</code>");
|
|
75
|
+
expect(result).toContain("minimum:");
|
|
76
|
+
expect(result).toContain("<code>0</code>");
|
|
77
|
+
expect(result).toContain("maximum:");
|
|
78
|
+
expect(result).toContain("<code>120</code>");
|
|
79
|
+
expect(result).toContain("pattern:");
|
|
80
|
+
});
|
|
81
|
+
it("handles required field indicator", () => {
|
|
82
|
+
const schema = {
|
|
83
|
+
fields: [
|
|
84
|
+
{
|
|
85
|
+
name: "requiredField",
|
|
86
|
+
type: "string",
|
|
87
|
+
constraints: {
|
|
88
|
+
required: true,
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: "optionalField",
|
|
93
|
+
type: "string",
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
};
|
|
97
|
+
const result = convertSchemaToHtml(schema);
|
|
98
|
+
expect(result).toContain("<strong>requiredField</strong>");
|
|
99
|
+
expect(result).not.toContain("requiredField?");
|
|
100
|
+
expect(result).toContain("<strong>optionalField?</strong>");
|
|
101
|
+
});
|
|
102
|
+
it("handles empty fields array", () => {
|
|
103
|
+
const schema = {
|
|
104
|
+
fields: [],
|
|
105
|
+
};
|
|
106
|
+
const result = convertSchemaToHtml(schema);
|
|
107
|
+
expect(result).toContain("<h2>Fields</h2>");
|
|
108
|
+
expect(result).toContain("<table>");
|
|
109
|
+
expect(result).toContain("</table>");
|
|
110
|
+
});
|
|
111
|
+
it("escapes HTML special characters", () => {
|
|
112
|
+
const schema = {
|
|
113
|
+
title: "Test & <Schema>",
|
|
114
|
+
description: 'Description with "quotes" and <tags>',
|
|
115
|
+
fields: [
|
|
116
|
+
{
|
|
117
|
+
name: "field",
|
|
118
|
+
type: "string",
|
|
119
|
+
description: "Description with <script>alert('xss')</script>",
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
};
|
|
123
|
+
const result = convertSchemaToHtml(schema);
|
|
124
|
+
expect(result).toContain("Test & <Schema>");
|
|
125
|
+
expect(result).toContain("Description with "quotes" and <tags>");
|
|
126
|
+
expect(result).toContain("Description with <script>alert('xss')</script>");
|
|
127
|
+
});
|
|
128
|
+
it("handles fields with enum constraints", () => {
|
|
129
|
+
const schema = {
|
|
130
|
+
fields: [
|
|
131
|
+
{
|
|
132
|
+
name: "status",
|
|
133
|
+
type: "string",
|
|
134
|
+
constraints: {
|
|
135
|
+
enum: ["active", "inactive", "pending"],
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
};
|
|
140
|
+
const result = convertSchemaToHtml(schema);
|
|
141
|
+
expect(result).toContain("enum:");
|
|
142
|
+
expect(result).toContain("<code>active, inactive, pending</code>");
|
|
143
|
+
});
|
|
144
|
+
it("handles multiple constraint types", () => {
|
|
145
|
+
const schema = {
|
|
146
|
+
fields: [
|
|
147
|
+
{
|
|
148
|
+
name: "username",
|
|
149
|
+
type: "string",
|
|
150
|
+
constraints: {
|
|
151
|
+
required: true,
|
|
152
|
+
unique: true,
|
|
153
|
+
minLength: 3,
|
|
154
|
+
maxLength: 20,
|
|
155
|
+
pattern: "^[a-zA-Z0-9_]+$",
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
};
|
|
160
|
+
const result = convertSchemaToHtml(schema);
|
|
161
|
+
expect(result).toContain("required:");
|
|
162
|
+
expect(result).toContain("unique:");
|
|
163
|
+
expect(result).toContain("minLength:");
|
|
164
|
+
expect(result).toContain("<code>3</code>");
|
|
165
|
+
expect(result).toContain("maxLength:");
|
|
166
|
+
expect(result).toContain("<code>20</code>");
|
|
167
|
+
expect(result).toContain("pattern:");
|
|
168
|
+
});
|
|
169
|
+
it("handles field examples", () => {
|
|
170
|
+
const schema = {
|
|
171
|
+
fields: [
|
|
172
|
+
{
|
|
173
|
+
name: "email",
|
|
174
|
+
type: "string",
|
|
175
|
+
examples: ["user@example.com", "admin@test.org"],
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
name: "age",
|
|
179
|
+
type: "integer",
|
|
180
|
+
examples: [25, 30],
|
|
181
|
+
},
|
|
182
|
+
],
|
|
183
|
+
};
|
|
184
|
+
const result = convertSchemaToHtml(schema);
|
|
185
|
+
expect(result).toContain("<strong>Examples</strong>");
|
|
186
|
+
expect(result).toContain("<code>user@example.com</code>");
|
|
187
|
+
expect(result).toContain("<code>admin@test.org</code>");
|
|
188
|
+
expect(result).toContain("<code>25</code>");
|
|
189
|
+
expect(result).toContain("<code>30</code>");
|
|
190
|
+
});
|
|
191
|
+
it("handles different field types", () => {
|
|
192
|
+
const schema = {
|
|
193
|
+
fields: [
|
|
194
|
+
{ name: "field1", type: "string" },
|
|
195
|
+
{ name: "field2", type: "integer" },
|
|
196
|
+
{ name: "field3", type: "number" },
|
|
197
|
+
{ name: "field4", type: "boolean" },
|
|
198
|
+
{ name: "field5", type: "datetime" },
|
|
199
|
+
{ name: "field6", type: "any" },
|
|
200
|
+
],
|
|
201
|
+
};
|
|
202
|
+
const result = convertSchemaToHtml(schema);
|
|
203
|
+
expect(result).toContain("<code>string</code>");
|
|
204
|
+
expect(result).toContain("<code>integer</code>");
|
|
205
|
+
expect(result).toContain("<code>number</code>");
|
|
206
|
+
expect(result).toContain("<code>boolean</code>");
|
|
207
|
+
expect(result).toContain("<code>datetime</code>");
|
|
208
|
+
expect(result).toContain("<code>any</code>");
|
|
209
|
+
});
|
|
210
|
+
it("sanitizes IDs for anchors", () => {
|
|
211
|
+
const schema = {
|
|
212
|
+
title: "Test Schema & More!",
|
|
213
|
+
fields: [
|
|
214
|
+
{
|
|
215
|
+
name: "field-with-dashes",
|
|
216
|
+
type: "string",
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
name: "Field With Spaces",
|
|
220
|
+
type: "string",
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
};
|
|
224
|
+
const result = convertSchemaToHtml(schema);
|
|
225
|
+
expect(result).toContain('id="test-schema-more"');
|
|
226
|
+
expect(result).toContain('id="field-with-dashes"');
|
|
227
|
+
expect(result).toContain('id="field-with-spaces"');
|
|
228
|
+
});
|
|
229
|
+
it("does not include top-level html tags", () => {
|
|
230
|
+
const schema = {
|
|
231
|
+
title: "Test",
|
|
232
|
+
fields: [{ name: "field1", type: "string" }],
|
|
233
|
+
};
|
|
234
|
+
const result = convertSchemaToHtml(schema);
|
|
235
|
+
expect(result).not.toContain("<!DOCTYPE");
|
|
236
|
+
expect(result).not.toContain("<html>");
|
|
237
|
+
expect(result).not.toContain("<head>");
|
|
238
|
+
expect(result).not.toContain("<body>");
|
|
239
|
+
expect(result).not.toContain("<style>");
|
|
240
|
+
});
|
|
241
|
+
it("handles schema without title", () => {
|
|
242
|
+
const schema = {
|
|
243
|
+
description: "Description only",
|
|
244
|
+
fields: [{ name: "field1", type: "string" }],
|
|
245
|
+
};
|
|
246
|
+
const result = convertSchemaToHtml(schema);
|
|
247
|
+
expect(result).toContain("<p>Description only</p>");
|
|
248
|
+
expect(result).not.toContain("<h2 id=");
|
|
249
|
+
expect(result).toContain("<h2>Fields</h2>");
|
|
250
|
+
});
|
|
251
|
+
it("handles field without description", () => {
|
|
252
|
+
const schema = {
|
|
253
|
+
fields: [
|
|
254
|
+
{
|
|
255
|
+
name: "field1",
|
|
256
|
+
type: "string",
|
|
257
|
+
},
|
|
258
|
+
],
|
|
259
|
+
};
|
|
260
|
+
const result = convertSchemaToHtml(schema);
|
|
261
|
+
expect(result).toContain("<strong>field1?</strong>");
|
|
262
|
+
expect(result).toContain("<code>string</code>");
|
|
263
|
+
});
|
|
264
|
+
it("uses frontmatter when frontmatter option is true", () => {
|
|
265
|
+
const schema = {
|
|
266
|
+
title: "Test Schema",
|
|
267
|
+
description: "A test schema with frontmatter",
|
|
268
|
+
fields: [
|
|
269
|
+
{
|
|
270
|
+
name: "field1",
|
|
271
|
+
type: "string",
|
|
272
|
+
},
|
|
273
|
+
],
|
|
274
|
+
};
|
|
275
|
+
const result = convertSchemaToHtml(schema, { frontmatter: true });
|
|
276
|
+
expect(result).toContain("---");
|
|
277
|
+
expect(result).toContain("Test Schema");
|
|
278
|
+
expect(result).not.toContain("<h1");
|
|
279
|
+
expect(result).toContain("<p>A test schema with frontmatter</p>");
|
|
280
|
+
});
|
|
281
|
+
it("uses H1 heading when frontmatter option is false or not provided", () => {
|
|
282
|
+
const schema = {
|
|
283
|
+
title: "Test Schema",
|
|
284
|
+
fields: [
|
|
285
|
+
{
|
|
286
|
+
name: "field1",
|
|
287
|
+
type: "string",
|
|
288
|
+
},
|
|
289
|
+
],
|
|
290
|
+
};
|
|
291
|
+
const result = convertSchemaToHtml(schema, { frontmatter: false });
|
|
292
|
+
expect(result).toContain('<h1 id="test-schema">Test Schema</h1>');
|
|
293
|
+
expect(result).not.toContain("title: Test Schema");
|
|
294
|
+
expect(result.startsWith("<h1")).toBe(true);
|
|
295
|
+
});
|
|
296
|
+
it("handles schema with primary key", () => {
|
|
297
|
+
const schema = {
|
|
298
|
+
fields: [
|
|
299
|
+
{
|
|
300
|
+
name: "id",
|
|
301
|
+
type: "integer",
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
name: "name",
|
|
305
|
+
type: "string",
|
|
306
|
+
},
|
|
307
|
+
],
|
|
308
|
+
primaryKey: ["id"],
|
|
309
|
+
};
|
|
310
|
+
const result = convertSchemaToHtml(schema);
|
|
311
|
+
expect(result).toContain("<h2>Primary Key</h2>");
|
|
312
|
+
expect(result).toContain("<code>id</code>");
|
|
313
|
+
});
|
|
314
|
+
it("handles schema with composite primary key", () => {
|
|
315
|
+
const schema = {
|
|
316
|
+
fields: [
|
|
317
|
+
{
|
|
318
|
+
name: "user_id",
|
|
319
|
+
type: "integer",
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
name: "project_id",
|
|
323
|
+
type: "integer",
|
|
324
|
+
},
|
|
325
|
+
],
|
|
326
|
+
primaryKey: ["user_id", "project_id"],
|
|
327
|
+
};
|
|
328
|
+
const result = convertSchemaToHtml(schema);
|
|
329
|
+
expect(result).toContain("<h2>Primary Key</h2>");
|
|
330
|
+
expect(result).toContain("<code>user_id, project_id</code>");
|
|
331
|
+
});
|
|
332
|
+
it("handles schema with foreign keys", () => {
|
|
333
|
+
const schema = {
|
|
334
|
+
fields: [
|
|
335
|
+
{
|
|
336
|
+
name: "user_id",
|
|
337
|
+
type: "integer",
|
|
338
|
+
},
|
|
339
|
+
],
|
|
340
|
+
foreignKeys: [
|
|
341
|
+
{
|
|
342
|
+
fields: ["user_id"],
|
|
343
|
+
reference: {
|
|
344
|
+
resource: "users",
|
|
345
|
+
fields: ["id"],
|
|
346
|
+
},
|
|
347
|
+
},
|
|
348
|
+
],
|
|
349
|
+
};
|
|
350
|
+
const result = convertSchemaToHtml(schema);
|
|
351
|
+
expect(result).toContain("<h2>Foreign Keys</h2>");
|
|
352
|
+
expect(result).toContain("<th>Fields</th>");
|
|
353
|
+
expect(result).toContain("<th>Reference Resource</th>");
|
|
354
|
+
expect(result).toContain("<th>Reference Fields</th>");
|
|
355
|
+
expect(result).toContain("<code>user_id</code>");
|
|
356
|
+
expect(result).toContain("<code>users</code>");
|
|
357
|
+
expect(result).toContain("<code>id</code>");
|
|
358
|
+
});
|
|
359
|
+
it("handles schema with multiple foreign keys", () => {
|
|
360
|
+
const schema = {
|
|
361
|
+
fields: [
|
|
362
|
+
{
|
|
363
|
+
name: "user_id",
|
|
364
|
+
type: "integer",
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
name: "project_id",
|
|
368
|
+
type: "integer",
|
|
369
|
+
},
|
|
370
|
+
],
|
|
371
|
+
foreignKeys: [
|
|
372
|
+
{
|
|
373
|
+
fields: ["user_id"],
|
|
374
|
+
reference: {
|
|
375
|
+
resource: "users",
|
|
376
|
+
fields: ["id"],
|
|
377
|
+
},
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
fields: ["project_id"],
|
|
381
|
+
reference: {
|
|
382
|
+
resource: "projects",
|
|
383
|
+
fields: ["id"],
|
|
384
|
+
},
|
|
385
|
+
},
|
|
386
|
+
],
|
|
387
|
+
};
|
|
388
|
+
const result = convertSchemaToHtml(schema);
|
|
389
|
+
expect(result).toContain("<h2>Foreign Keys</h2>");
|
|
390
|
+
expect(result).toContain("<code>user_id</code>");
|
|
391
|
+
expect(result).toContain("<code>users</code>");
|
|
392
|
+
expect(result).toContain("<code>project_id</code>");
|
|
393
|
+
expect(result).toContain("<code>projects</code>");
|
|
394
|
+
});
|
|
395
|
+
it("handles foreign key without resource specified", () => {
|
|
396
|
+
const schema = {
|
|
397
|
+
fields: [
|
|
398
|
+
{
|
|
399
|
+
name: "parent_id",
|
|
400
|
+
type: "integer",
|
|
401
|
+
},
|
|
402
|
+
],
|
|
403
|
+
foreignKeys: [
|
|
404
|
+
{
|
|
405
|
+
fields: ["parent_id"],
|
|
406
|
+
reference: {
|
|
407
|
+
fields: ["id"],
|
|
408
|
+
},
|
|
409
|
+
},
|
|
410
|
+
],
|
|
411
|
+
};
|
|
412
|
+
const result = convertSchemaToHtml(schema);
|
|
413
|
+
expect(result).toContain("<h2>Foreign Keys</h2>");
|
|
414
|
+
expect(result).toContain("<code>parent_id</code>");
|
|
415
|
+
expect(result).toContain("<code>-</code>");
|
|
416
|
+
expect(result).toContain("<code>id</code>");
|
|
417
|
+
});
|
|
418
|
+
it("does not render primary key or foreign keys sections when not present", () => {
|
|
419
|
+
const schema = {
|
|
420
|
+
fields: [
|
|
421
|
+
{
|
|
422
|
+
name: "field1",
|
|
423
|
+
type: "string",
|
|
424
|
+
},
|
|
425
|
+
],
|
|
426
|
+
};
|
|
427
|
+
const result = convertSchemaToHtml(schema);
|
|
428
|
+
expect(result).not.toContain("<h2>Primary Key</h2>");
|
|
429
|
+
expect(result).not.toContain("<h2>Foreign Keys</h2>");
|
|
430
|
+
});
|
|
431
|
+
});
|
|
432
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9IdG1sLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zY2hlbWEvY29udmVydC90b0h0bWwuc3BlYy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWMsQ0FBQTtBQUVsRCxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO0lBQ25DLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLEVBQUU7UUFDaEQsTUFBTSxNQUFNLEdBQVc7WUFDckIsTUFBTSxFQUFFO2dCQUNOO29CQUNFLElBQUksRUFBRSxJQUFJO29CQUNWLElBQUksRUFBRSxTQUFTO29CQUNmLEtBQUssRUFBRSxZQUFZO29CQUNuQixXQUFXLEVBQUUsbUJBQW1CO2lCQUNqQztnQkFDRDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsUUFBUTtvQkFDZCxLQUFLLEVBQUUsTUFBTTtvQkFDYixXQUFXLEVBQUUsYUFBYTtpQkFDM0I7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUUxQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFDM0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNuQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQ3pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQTtRQUMvQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQ3pDLE1BQU0s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b0JBQ0UsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDO29CQUNyQixTQUFTLEVBQUU7d0JBQ1QsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO3FCQUNmO2lCQUNGO2FBQ0Y7U0FDRixDQUFBO1FBRUQsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFMUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1FBQ2pELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUNsRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDMUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQzdDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHVFQUF1RSxFQUFFLEdBQUcsRUFBRTtRQUMvRSxNQUFNLE1BQU0sR0FBVztZQUNyQixNQUFNLEVBQUU7Z0JBQ047b0JBQ0UsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLFFBQVE7aUJBQ2Y7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUUxQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO1FBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUE7SUFDdkQsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGNvbnZlcnRTY2hlbWFUb0h0bWwgfSBmcm9tIFwiLi90b0h0bWwudHN4XCJcblxuZGVzY3JpYmUoXCJjb252ZXJ0U2NoZW1hVG9IdG1sXCIsICgpID0+IHtcbiAgaXQoXCJjb252ZXJ0cyBhIHNpbXBsZSBzY2hlbWEgdG8gaHRtbCB0YWJsZVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICB0aXRsZTogXCJJZGVudGlmaWVyXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiVW5pcXVlIGlkZW50aWZpZXJcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgdGl0bGU6IFwiTmFtZVwiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlBlcnNvbiBuYW1lXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGgyPkZpZWxkczwvaDI+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHRhYmxlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjx0aD5OYW1lPC90aD5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8dGg+RGVmaW5pdGlvbjwvdGg+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHRoPlR5cGU8L3RoPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxzdHJvbmc+aWQ/PC9zdHJvbmc+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHN0cm9uZz5uYW1lPzwvc3Ryb25nPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxwPlVuaXF1ZSBpZGVudGlmaWVyPC9wPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxwPlBlcnNvbiBuYW1lPC9wPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmludGVnZXI8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+c3RyaW5nPC9jb2RlPlwiKVxuICB9KVxuXG4gIGl0KFwiaW5jbHVkZXMgc2NoZW1hIHRpdGxlIGFuZCBkZXNjcmlwdGlvblwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICB0aXRsZTogXCJUZXN0IFNjaGVtYVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQSB0ZXN0IHNjaGVtYSBmb3IgdmFsaWRhdGlvblwiLFxuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImZpZWxkMVwiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKCc8aDEgaWQ9XCJ0ZXN0LXNjaGVtYVwiPlRlc3QgU2NoZW1hPC9oMT4nKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxwPkEgdGVzdCBzY2hlbWEgZm9yIHZhbGlkYXRpb248L3A+XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGZpZWxkIGNvbnN0cmFpbnRzXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJhZ2VcIixcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgICAgbWF4aW11bTogMTIwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImVtYWlsXCIsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBwYXR0ZXJuOiBcIl5bYS16XStAW2Etel0rXFxcXC5bYS16XSskXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8c3Ryb25nPkNvbnN0cmFpbnRzPC9zdHJvbmc+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwicmVxdWlyZWQ6XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+dHJ1ZTwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJtaW5pbXVtOlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPjA8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwibWF4aW11bTpcIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT4xMjA8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwicGF0dGVybjpcIilcbiAgfSlcblxuICBpdChcImhhbmRsZXMgcmVxdWlyZWQgZmllbGQgaW5kaWNhdG9yXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyZXF1aXJlZEZpZWxkXCIsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwib3B0aW9uYWxGaWVsZFwiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHN0cm9uZz5yZXF1aXJlZEZpZWxkPC9zdHJvbmc+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcInJlcXVpcmVkRmllbGQ/XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHN0cm9uZz5vcHRpb25hbEZpZWxkPzwvc3Ryb25nPlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBlbXB0eSBmaWVsZHMgYXJyYXlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0U2NoZW1hVG9IdG1sKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxoMj5GaWVsZHM8L2gyPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjx0YWJsZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8L3RhYmxlPlwiKVxuICB9KVxuXG4gIGl0KFwiZXNjYXBlcyBIVE1MIHNwZWNpYWwgY2hhcmFjdGVyc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICB0aXRsZTogXCJUZXN0ICYgPFNjaGVtYT5cIixcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGVzY3JpcHRpb24gd2l0aCBcInF1b3Rlc1wiIGFuZCA8dGFncz4nLFxuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImZpZWxkXCIsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJEZXNjcmlwdGlvbiB3aXRoIDxzY3JpcHQ+YWxlcnQoJ3hzcycpPC9zY3JpcHQ+XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiVGVzdCAmYW1wOyAmbHQ7U2NoZW1hJmd0O1wiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcbiAgICAgIFwiRGVzY3JpcHRpb24gd2l0aCAmcXVvdDtxdW90ZXMmcXVvdDsgYW5kICZsdDt0YWdzJmd0O1wiLFxuICAgIClcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXG4gICAgICBcIkRlc2NyaXB0aW9uIHdpdGggJmx0O3NjcmlwdCZndDthbGVydCgmI3gyNzt4c3MmI3gyNzspJmx0Oy9zY3JpcHQmZ3Q7XCIsXG4gICAgKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBmaWVsZHMgd2l0aCBlbnVtIGNvbnN0cmFpbnRzXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJzdGF0dXNcIixcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgIGNvbnN0cmFpbnRzOiB7XG4gICAgICAgICAgICBlbnVtOiBbXCJhY3RpdmVcIiwgXCJpbmFjdGl2ZVwiLCBcInBlbmRpbmdcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJlbnVtOlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmFjdGl2ZSwgaW5hY3RpdmUsIHBlbmRpbmc8L2NvZGU+XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIG11bHRpcGxlIGNvbnN0cmFpbnQgdHlwZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInVzZXJuYW1lXCIsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICB1bmlxdWU6IHRydWUsXG4gICAgICAgICAgICBtaW5MZW5ndGg6IDMsXG4gICAgICAgICAgICBtYXhMZW5ndGg6IDIwLFxuICAgICAgICAgICAgcGF0dGVybjogXCJeW2EtekEtWjAtOV9dKyRcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0U2NoZW1hVG9IdG1sKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcInJlcXVpcmVkOlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcInVuaXF1ZTpcIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJtaW5MZW5ndGg6XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+MzwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJtYXhMZW5ndGg6XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+MjA8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwicGF0dGVybjpcIilcbiAgfSlcblxuICBpdChcImhhbmRsZXMgZmllbGQgZXhhbXBsZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImVtYWlsXCIsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBleGFtcGxlczogW1widXNlckBleGFtcGxlLmNvbVwiLCBcImFkbWluQHRlc3Qub3JnXCJdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJhZ2VcIixcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICBleGFtcGxlczogWzI1LCAzMF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHN0cm9uZz5FeGFtcGxlczwvc3Ryb25nPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPnVzZXJAZXhhbXBsZS5jb208L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+YWRtaW5AdGVzdC5vcmc8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+MjU8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+MzA8L2NvZGU+XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGRpZmZlcmVudCBmaWVsZCB0eXBlc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcImZpZWxkMVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJmaWVsZDJcIiwgdHlwZTogXCJpbnRlZ2VyXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImZpZWxkM1wiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJmaWVsZDRcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImZpZWxkNVwiLCB0eXBlOiBcImRhdGV0aW1lXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImZpZWxkNlwiLCB0eXBlOiBcImFueVwiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+c3RyaW5nPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmludGVnZXI8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+bnVtYmVyPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmJvb2xlYW48L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+ZGF0ZXRpbWU8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+YW55PC9jb2RlPlwiKVxuICB9KVxuXG4gIGl0KFwic2FuaXRpemVzIElEcyBmb3IgYW5jaG9yc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICB0aXRsZTogXCJUZXN0IFNjaGVtYSAmIE1vcmUhXCIsXG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiZmllbGQtd2l0aC1kYXNoZXNcIixcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJGaWVsZCBXaXRoIFNwYWNlc1wiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKCdpZD1cInRlc3Qtc2NoZW1hLW1vcmVcIicpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKCdpZD1cImZpZWxkLXdpdGgtZGFzaGVzXCInKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbignaWQ9XCJmaWVsZC13aXRoLXNwYWNlc1wiJylcbiAgfSlcblxuICBpdChcImRvZXMgbm90IGluY2x1ZGUgdG9wLWxldmVsIGh0bWwgdGFnc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICB0aXRsZTogXCJUZXN0XCIsXG4gICAgICBmaWVsZHM6IFt7IG5hbWU6IFwiZmllbGQxXCIsIHR5cGU6IFwic3RyaW5nXCIgfV0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS5ub3QudG9Db250YWluKFwiPCFET0NUWVBFXCIpXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIjxodG1sPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0NvbnRhaW4oXCI8aGVhZD5cIilcbiAgICBleHBlY3QocmVzdWx0KS5ub3QudG9Db250YWluKFwiPGJvZHk+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIjxzdHlsZT5cIilcbiAgfSlcblxuICBpdChcImhhbmRsZXMgc2NoZW1hIHdpdGhvdXQgdGl0bGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZGVzY3JpcHRpb246IFwiRGVzY3JpcHRpb24gb25seVwiLFxuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcImZpZWxkMVwiLCB0eXBlOiBcInN0cmluZ1wiIH1dLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHA+RGVzY3JpcHRpb24gb25seTwvcD5cIilcbiAgICBleHBlY3QocmVzdWx0KS5ub3QudG9Db250YWluKFwiPGgyIGlkPVwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxoMj5GaWVsZHM8L2gyPlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBmaWVsZCB3aXRob3V0IGRlc2NyaXB0aW9uXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJmaWVsZDFcIixcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0U2NoZW1hVG9IdG1sKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxzdHJvbmc+ZmllbGQxPzwvc3Ryb25nPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPnN0cmluZzwvY29kZT5cIilcbiAgfSlcblxuICBpdChcInVzZXMgZnJvbnRtYXR0ZXIgd2hlbiBmcm9udG1hdHRlciBvcHRpb24gaXMgdHJ1ZVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICB0aXRsZTogXCJUZXN0IFNjaGVtYVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQSB0ZXN0IHNjaGVtYSB3aXRoIGZyb250bWF0dGVyXCIsXG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiZmllbGQxXCIsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFNjaGVtYVRvSHRtbChzY2hlbWEsIHsgZnJvbnRtYXR0ZXI6IHRydWUgfSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIi0tLVwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIlRlc3QgU2NoZW1hXCIpXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIjxoMVwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxwPkEgdGVzdCBzY2hlbWEgd2l0aCBmcm9udG1hdHRlcjwvcD5cIilcbiAgfSlcblxuICBpdChcInVzZXMgSDEgaGVhZGluZyB3aGVuIGZyb250bWF0dGVyIG9wdGlvbiBpcyBmYWxzZSBvciBub3QgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgdGl0bGU6IFwiVGVzdCBTY2hlbWFcIixcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJmaWVsZDFcIixcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0U2NoZW1hVG9IdG1sKHNjaGVtYSwgeyBmcm9udG1hdHRlcjogZmFsc2UgfSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbignPGgxIGlkPVwidGVzdC1zY2hlbWFcIj5UZXN0IFNjaGVtYTwvaDE+JylcbiAgICBleHBlY3QocmVzdWx0KS5ub3QudG9Db250YWluKFwidGl0bGU6IFRlc3QgU2NoZW1hXCIpXG4gICAgZXhwZWN0KHJlc3VsdC5zdGFydHNXaXRoKFwiPGgxXCIpKS50b0JlKHRydWUpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIHNjaGVtYSB3aXRoIHByaW1hcnkga2V5XCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJuYW1lXCIsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBwcmltYXJ5S2V5OiBbXCJpZFwiXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0U2NoZW1hVG9IdG1sKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxoMj5QcmltYXJ5IEtleTwvaDI+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+aWQ8L2NvZGU+XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIHNjaGVtYSB3aXRoIGNvbXBvc2l0ZSBwcmltYXJ5IGtleVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidXNlcl9pZFwiLFxuICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJwcm9qZWN0X2lkXCIsXG4gICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcHJpbWFyeUtleTogW1widXNlcl9pZFwiLCBcInByb2plY3RfaWRcIl0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8aDI+UHJpbWFyeSBLZXk8L2gyPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPnVzZXJfaWQsIHByb2plY3RfaWQ8L2NvZGU+XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIHNjaGVtYSB3aXRoIGZvcmVpZ24ga2V5c1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidXNlcl9pZFwiLFxuICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGZvcmVpZ25LZXlzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWVsZHM6IFtcInVzZXJfaWRcIl0sXG4gICAgICAgICAgcmVmZXJlbmNlOiB7XG4gICAgICAgICAgICByZXNvdXJjZTogXCJ1c2Vyc1wiLFxuICAgICAgICAgICAgZmllbGRzOiBbXCJpZFwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0U2NoZW1hVG9IdG1sKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxoMj5Gb3JlaWduIEtleXM8L2gyPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjx0aD5GaWVsZHM8L3RoPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjx0aD5SZWZlcmVuY2UgUmVzb3VyY2U8L3RoPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjx0aD5SZWZlcmVuY2UgRmllbGRzPC90aD5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT51c2VyX2lkPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPnVzZXJzPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmlkPC9jb2RlPlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBzY2hlbWEgd2l0aCBtdWx0aXBsZSBmb3JlaWduIGtleXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInVzZXJfaWRcIixcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicHJvamVjdF9pZFwiLFxuICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGZvcmVpZ25LZXlzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWVsZHM6IFtcInVzZXJfaWRcIl0sXG4gICAgICAgICAgcmVmZXJlbmNlOiB7XG4gICAgICAgICAgICByZXNvdXJjZTogXCJ1c2Vyc1wiLFxuICAgICAgICAgICAgZmllbGRzOiBbXCJpZFwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZmllbGRzOiBbXCJwcm9qZWN0X2lkXCJdLFxuICAgICAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICAgICAgcmVzb3VyY2U6IFwicHJvamVjdHNcIixcbiAgICAgICAgICAgIGZpZWxkczogW1wiaWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8aDI+Rm9yZWlnbiBLZXlzPC9oMj5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT51c2VyX2lkPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPnVzZXJzPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPnByb2plY3RfaWQ8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+cHJvamVjdHM8L2NvZGU+XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGZvcmVpZ24ga2V5IHdpdGhvdXQgcmVzb3VyY2Ugc3BlY2lmaWVkXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJwYXJlbnRfaWRcIixcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBmb3JlaWduS2V5czogW1xuICAgICAgICB7XG4gICAgICAgICAgZmllbGRzOiBbXCJwYXJlbnRfaWRcIl0sXG4gICAgICAgICAgcmVmZXJlbmNlOiB7XG4gICAgICAgICAgICBmaWVsZHM6IFtcImlkXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGgyPkZvcmVpZ24gS2V5czwvaDI+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+cGFyZW50X2lkPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPi08L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+aWQ8L2NvZGU+XCIpXG4gIH0pXG5cbiAgaXQoXCJkb2VzIG5vdCByZW5kZXIgcHJpbWFyeSBrZXkgb3IgZm9yZWlnbiBrZXlzIHNlY3Rpb25zIHdoZW4gbm90IHByZXNlbnRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImZpZWxkMVwiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIjxoMj5QcmltYXJ5IEtleTwvaDI+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIjxoMj5Gb3JlaWduIEtleXM8L2gyPlwiKVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export function convertSchemaToMarkdown(schema, options) {
|
|
2
|
+
const rows = [];
|
|
3
|
+
rows.push("");
|
|
4
|
+
rows.push("## Fields");
|
|
5
|
+
rows.push("");
|
|
6
|
+
rows.push("| Name | Type | Title | Description | Constraints |");
|
|
7
|
+
rows.push("|------|------|-------|-------------|-------------|");
|
|
8
|
+
for (const field of schema.fields) {
|
|
9
|
+
const name = field.name || "";
|
|
10
|
+
const type = field.type || "any";
|
|
11
|
+
const title = field.title || "";
|
|
12
|
+
const description = field.description || "";
|
|
13
|
+
const constraints = [];
|
|
14
|
+
if ("required" in field && field.required) {
|
|
15
|
+
constraints.push("required");
|
|
16
|
+
}
|
|
17
|
+
if ("constraints" in field && field.constraints) {
|
|
18
|
+
const c = field.constraints;
|
|
19
|
+
if (c.required)
|
|
20
|
+
constraints.push("required");
|
|
21
|
+
if (c.unique)
|
|
22
|
+
constraints.push("unique");
|
|
23
|
+
if (c.minimum !== undefined)
|
|
24
|
+
constraints.push(`min: ${c.minimum}`);
|
|
25
|
+
if (c.maximum !== undefined)
|
|
26
|
+
constraints.push(`max: ${c.maximum}`);
|
|
27
|
+
if (c.minLength !== undefined)
|
|
28
|
+
constraints.push(`minLength: ${c.minLength}`);
|
|
29
|
+
if (c.maxLength !== undefined)
|
|
30
|
+
constraints.push(`maxLength: ${c.maxLength}`);
|
|
31
|
+
if (c.pattern)
|
|
32
|
+
constraints.push(`pattern: ${c.pattern}`);
|
|
33
|
+
if (c.enum)
|
|
34
|
+
constraints.push(`enum: ${c.enum.join(", ")}`);
|
|
35
|
+
}
|
|
36
|
+
const constraintsStr = constraints.join(", ");
|
|
37
|
+
const escapedName = escapeMarkdown(name);
|
|
38
|
+
const escapedTitle = escapeMarkdown(title);
|
|
39
|
+
const escapedDescription = escapeMarkdown(description);
|
|
40
|
+
const escapedConstraints = escapeMarkdown(constraintsStr);
|
|
41
|
+
rows.push(`| ${escapedName} | ${type} | ${escapedTitle} | ${escapedDescription} | ${escapedConstraints} |`);
|
|
42
|
+
}
|
|
43
|
+
let markdown = `${rows.join("\n")}\n`;
|
|
44
|
+
if (schema.title || schema.description) {
|
|
45
|
+
const header = [];
|
|
46
|
+
if (options?.frontmatter) {
|
|
47
|
+
header.push("---");
|
|
48
|
+
if (schema.title) {
|
|
49
|
+
header.push(`title: ${schema.title}`);
|
|
50
|
+
}
|
|
51
|
+
header.push("---");
|
|
52
|
+
header.push("");
|
|
53
|
+
if (schema.description) {
|
|
54
|
+
header.push(schema.description);
|
|
55
|
+
header.push("");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
if (schema.title) {
|
|
60
|
+
header.push(`# ${schema.title}`);
|
|
61
|
+
header.push("");
|
|
62
|
+
}
|
|
63
|
+
if (schema.description) {
|
|
64
|
+
header.push(schema.description);
|
|
65
|
+
header.push("");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
markdown = header.join("\n") + markdown;
|
|
69
|
+
}
|
|
70
|
+
return markdown;
|
|
71
|
+
}
|
|
72
|
+
function escapeMarkdown(text) {
|
|
73
|
+
return text.replace(/\n/g, " ");
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9NYXJrZG93bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NjaGVtYS9jb252ZXJ0L3RvTWFya2Rvd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxNQUFjLEVBQ2QsT0FBbUM7SUFFbkMsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFBO0lBRXpCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUE7SUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxxREFBcUQsQ0FBQyxDQUFBO0lBRWhFLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO1FBQzdCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFBO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFBO1FBQy9CLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFBO1FBRTNDLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQTtRQUNoQyxJQUFJLFVBQVUsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDOUIsQ0FBQztRQUNELElBQUksYUFBYSxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQWtCLENBQUE7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O1lBQ2pCLENBQUM7WUFFRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7Z0JBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDakIsQ0FBQztRQUNILENBQUM7UUFFRCxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUE7SUFDekMsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFBO0FBQ2pCLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFZO0lBQ2xDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFNjaGVtYVRvTWFya2Rvd24oXG4gIHNjaGVtYTogU2NoZW1hLFxuICBvcHRpb25zPzogeyBmcm9udG1hdHRlcj86IGJvb2xlYW4gfSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHJvd3M6IHN0cmluZ1tdID0gW11cblxuICByb3dzLnB1c2goXCJcIilcbiAgcm93cy5wdXNoKFwiIyMgRmllbGRzXCIpXG4gIHJvd3MucHVzaChcIlwiKVxuICByb3dzLnB1c2goXCJ8IE5hbWUgfCBUeXBlIHwgVGl0bGUgfCBEZXNjcmlwdGlvbiB8IENvbnN0cmFpbnRzIHxcIilcbiAgcm93cy5wdXNoKFwifC0tLS0tLXwtLS0tLS18LS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18XCIpXG5cbiAgZm9yIChjb25zdCBmaWVsZCBvZiBzY2hlbWEuZmllbGRzKSB7XG4gICAgY29uc3QgbmFtZSA9IGZpZWxkLm5hbWUgfHwgXCJcIlxuICAgIGNvbnN0IHR5cGUgPSBmaWVsZC50eXBlIHx8IFwiYW55XCJcbiAgICBjb25zdCB0aXRsZSA9IGZpZWxkLnRpdGxlIHx8IFwiXCJcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGZpZWxkLmRlc2NyaXB0aW9uIHx8IFwiXCJcblxuICAgIGNvbnN0IGNvbnN0cmFpbnRzOiBzdHJpbmdbXSA9IFtdXG4gICAgaWYgKFwicmVxdWlyZWRcIiBpbiBmaWVsZCAmJiBmaWVsZC5yZXF1aXJlZCkge1xuICAgICAgY29uc3RyYWludHMucHVzaChcInJlcXVpcmVkXCIpXG4gICAgfVxuICAgIGlmIChcImNvbnN0cmFpbnRzXCIgaW4gZmllbGQgJiYgZmllbGQuY29uc3RyYWludHMpIHtcbiAgICAgIGNvbnN0IGMgPSBmaWVsZC5jb25zdHJhaW50cyBhcyBhbnlcbiAgICAgIGlmIChjLnJlcXVpcmVkKSBjb25zdHJhaW50cy5wdXNoKFwicmVxdWlyZWRcIilcbiAgICAgIGlmIChjLnVuaXF1ZSkgY29uc3RyYWludHMucHVzaChcInVuaXF1ZVwiKVxuICAgICAgaWYgKGMubWluaW11bSAhPT0gdW5kZWZpbmVkKSBjb25zdHJhaW50cy5wdXNoKGBtaW46ICR7Yy5taW5pbXVtfWApXG4gICAgICBpZiAoYy5tYXhpbXVtICE9PSB1bmRlZmluZWQpIGNvbnN0cmFpbnRzLnB1c2goYG1heDogJHtjLm1heGltdW19YClcbiAgICAgIGlmIChjLm1pbkxlbmd0aCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBjb25zdHJhaW50cy5wdXNoKGBtaW5MZW5ndGg6ICR7Yy5taW5MZW5ndGh9YClcbiAgICAgIGlmIChjLm1heExlbmd0aCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBjb25zdHJhaW50cy5wdXNoKGBtYXhMZW5ndGg6ICR7Yy5tYXhMZW5ndGh9YClcbiAgICAgIGlmIChjLnBhdHRlcm4pIGNvbnN0cmFpbnRzLnB1c2goYHBhdHRlcm46ICR7Yy5wYXR0ZXJufWApXG4gICAgICBpZiAoYy5lbnVtKSBjb25zdHJhaW50cy5wdXNoKGBlbnVtOiAke2MuZW51bS5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBjb25zdCBjb25zdHJhaW50c1N0ciA9IGNvbnN0cmFpbnRzLmpvaW4oXCIsIFwiKVxuXG4gICAgY29uc3QgZXNjYXBlZE5hbWUgPSBlc2NhcGVNYXJrZG93bihuYW1lKVxuICAgIGNvbnN0IGVzY2FwZWRUaXRsZSA9IGVzY2FwZU1hcmtkb3duKHRpdGxlKVxuICAgIGNvbnN0IGVzY2FwZWREZXNjcmlwdGlvbiA9IGVzY2FwZU1hcmtkb3duKGRlc2NyaXB0aW9uKVxuICAgIGNvbnN0IGVzY2FwZWRDb25zdHJhaW50cyA9IGVzY2FwZU1hcmtkb3duKGNvbnN0cmFpbnRzU3RyKVxuXG4gICAgcm93cy5wdXNoKFxuICAgICAgYHwgJHtlc2NhcGVkTmFtZX0gfCAke3R5cGV9IHwgJHtlc2NhcGVkVGl0bGV9IHwgJHtlc2NhcGVkRGVzY3JpcHRpb259IHwgJHtlc2NhcGVkQ29uc3RyYWludHN9IHxgLFxuICAgIClcbiAgfVxuXG4gIGxldCBtYXJrZG93biA9IGAke3Jvd3Muam9pbihcIlxcblwiKX1cXG5gXG5cbiAgaWYgKHNjaGVtYS50aXRsZSB8fCBzY2hlbWEuZGVzY3JpcHRpb24pIHtcbiAgICBjb25zdCBoZWFkZXI6IHN0cmluZ1tdID0gW11cblxuICAgIGlmIChvcHRpb25zPy5mcm9udG1hdHRlcikge1xuICAgICAgaGVhZGVyLnB1c2goXCItLS1cIilcbiAgICAgIGlmIChzY2hlbWEudGl0bGUpIHtcbiAgICAgICAgaGVhZGVyLnB1c2goYHRpdGxlOiAke3NjaGVtYS50aXRsZX1gKVxuICAgICAgfVxuICAgICAgaGVhZGVyLnB1c2goXCItLS1cIilcbiAgICAgIGhlYWRlci5wdXNoKFwiXCIpXG5cbiAgICAgIGlmIChzY2hlbWEuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgaGVhZGVyLnB1c2goc2NoZW1hLmRlc2NyaXB0aW9uKVxuICAgICAgICBoZWFkZXIucHVzaChcIlwiKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2NoZW1hLnRpdGxlKSB7XG4gICAgICAgIGhlYWRlci5wdXNoKGAjICR7c2NoZW1hLnRpdGxlfWApXG4gICAgICAgIGhlYWRlci5wdXNoKFwiXCIpXG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgaGVhZGVyLnB1c2goc2NoZW1hLmRlc2NyaXB0aW9uKVxuICAgICAgICBoZWFkZXIucHVzaChcIlwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIG1hcmtkb3duID0gaGVhZGVyLmpvaW4oXCJcXG5cIikgKyBtYXJrZG93blxuICB9XG5cbiAgcmV0dXJuIG1hcmtkb3duXG59XG5cbmZ1bmN0aW9uIGVzY2FwZU1hcmtkb3duKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcbi9nLCBcIiBcIilcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { convertSchemaToMarkdown } from "./toMarkdown.js";
|
|
3
|
+
describe("convertSchemaToMarkdown", () => {
|
|
4
|
+
it("converts a simple schema to markdown table", () => {
|
|
5
|
+
const schema = {
|
|
6
|
+
fields: [
|
|
7
|
+
{
|
|
8
|
+
name: "id",
|
|
9
|
+
type: "integer",
|
|
10
|
+
title: "Identifier",
|
|
11
|
+
description: "Unique identifier",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: "name",
|
|
15
|
+
type: "string",
|
|
16
|
+
title: "Name",
|
|
17
|
+
description: "Person name",
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
const result = convertSchemaToMarkdown(schema);
|
|
22
|
+
expect(result).toContain("| Name | Type | Title | Description | Constraints |");
|
|
23
|
+
expect(result).toContain("| id | integer | Identifier | Unique identifier |");
|
|
24
|
+
expect(result).toContain("| name | string | Name | Person name |");
|
|
25
|
+
});
|
|
26
|
+
it("includes schema title and description", () => {
|
|
27
|
+
const schema = {
|
|
28
|
+
title: "Test Schema",
|
|
29
|
+
description: "A test schema for validation",
|
|
30
|
+
fields: [
|
|
31
|
+
{
|
|
32
|
+
name: "field1",
|
|
33
|
+
type: "string",
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
const result = convertSchemaToMarkdown(schema);
|
|
38
|
+
expect(result).toContain("# Test Schema");
|
|
39
|
+
expect(result).toContain("A test schema for validation");
|
|
40
|
+
});
|
|
41
|
+
it("handles field constraints", () => {
|
|
42
|
+
const schema = {
|
|
43
|
+
fields: [
|
|
44
|
+
{
|
|
45
|
+
name: "age",
|
|
46
|
+
type: "integer",
|
|
47
|
+
constraints: {
|
|
48
|
+
required: true,
|
|
49
|
+
minimum: 0,
|
|
50
|
+
maximum: 120,
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: "email",
|
|
55
|
+
type: "string",
|
|
56
|
+
constraints: {
|
|
57
|
+
required: true,
|
|
58
|
+
pattern: "^[a-z]+@[a-z]+\\.[a-z]+$",
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
const result = convertSchemaToMarkdown(schema);
|
|
64
|
+
expect(result).toContain("required");
|
|
65
|
+
expect(result).toContain("min: 0");
|
|
66
|
+
expect(result).toContain("max: 120");
|
|
67
|
+
expect(result).toContain("pattern:");
|
|
68
|
+
});
|
|
69
|
+
it("handles empty fields array", () => {
|
|
70
|
+
const schema = {
|
|
71
|
+
fields: [],
|
|
72
|
+
};
|
|
73
|
+
const result = convertSchemaToMarkdown(schema);
|
|
74
|
+
expect(result).toContain("| Name | Type | Title | Description | Constraints |");
|
|
75
|
+
});
|
|
76
|
+
it("handles pipe characters in field values", () => {
|
|
77
|
+
const schema = {
|
|
78
|
+
fields: [
|
|
79
|
+
{
|
|
80
|
+
name: "field",
|
|
81
|
+
type: "string",
|
|
82
|
+
description: "Description with pipe character",
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
const result = convertSchemaToMarkdown(schema);
|
|
87
|
+
expect(result).toContain("Description with pipe character");
|
|
88
|
+
});
|
|
89
|
+
it("handles fields with enum constraints", () => {
|
|
90
|
+
const schema = {
|
|
91
|
+
fields: [
|
|
92
|
+
{
|
|
93
|
+
name: "status",
|
|
94
|
+
type: "string",
|
|
95
|
+
constraints: {
|
|
96
|
+
enum: ["active", "inactive", "pending"],
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
};
|
|
101
|
+
const result = convertSchemaToMarkdown(schema);
|
|
102
|
+
expect(result).toContain("enum: active, inactive, pending");
|
|
103
|
+
});
|
|
104
|
+
it("uses frontmatter when frontmatter option is true", () => {
|
|
105
|
+
const schema = {
|
|
106
|
+
title: "Test Schema",
|
|
107
|
+
description: "A test schema with frontmatter",
|
|
108
|
+
fields: [
|
|
109
|
+
{
|
|
110
|
+
name: "field1",
|
|
111
|
+
type: "string",
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
};
|
|
115
|
+
const result = convertSchemaToMarkdown(schema, { frontmatter: true });
|
|
116
|
+
expect(result).toContain("---");
|
|
117
|
+
expect(result).toContain("title: Test Schema");
|
|
118
|
+
expect(result).not.toContain("# Test Schema");
|
|
119
|
+
expect(result).toContain("A test schema with frontmatter");
|
|
120
|
+
});
|
|
121
|
+
it("uses H1 heading when frontmatter option is false or not provided", () => {
|
|
122
|
+
const schema = {
|
|
123
|
+
title: "Test Schema",
|
|
124
|
+
fields: [
|
|
125
|
+
{
|
|
126
|
+
name: "field1",
|
|
127
|
+
type: "string",
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
};
|
|
131
|
+
const result = convertSchemaToMarkdown(schema, { frontmatter: false });
|
|
132
|
+
expect(result).toContain("# Test Schema");
|
|
133
|
+
expect(result).not.toContain("title: Test Schema");
|
|
134
|
+
expect(result.startsWith("# Test Schema")).toBe(true);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9NYXJrZG93bi5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc2NoZW1hL2NvbnZlcnQvdG9NYXJrZG93bi5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUV6RCxRQUFRLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO0lBQ3ZDLEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxHQUFHLEVBQUU7UUFDcEQsTUFBTSxNQUFNLEdBQVc7WUFDckIsTUFBTSxFQUFFO2dCQUNOO29CQUNFLElBQUksRUFBRSxJQUFJO29CQUNWLElBQUksRUFBRSxTQUFTO29CQUNmLEtBQUssRUFBRSxZQUFZO29CQUNuQixXQUFXLEVBQUUsbUJBQW1CO2lCQUNqQztnQkFDRDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsUUFBUTtvQkFDZCxLQUFLLEVBQUUsTUFBTTtvQkFDYixXQUFXLEVBQUUsYUFBYTtpQkFDM0I7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUU5QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUN0QixxREFBcUQsQ0FDdEQsQ0FBQTtRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQ3RCLG1EQUFtRCxDQUNwRCxDQUFBO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFBO0lBQ3BFLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtRQUMvQyxNQUFNLE1BQU0sR0FBVztZQUNyQixLQUFLLEVBQUUsYUFBYTtZQUNwQixXQUFX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ZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdkQsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGNvbnZlcnRTY2hlbWFUb01hcmtkb3duIH0gZnJvbSBcIi4vdG9NYXJrZG93bi50c1wiXG5cbmRlc2NyaWJlKFwiY29udmVydFNjaGVtYVRvTWFya2Rvd25cIiwgKCkgPT4ge1xuICBpdChcImNvbnZlcnRzIGEgc2ltcGxlIHNjaGVtYSB0byBtYXJrZG93biB0YWJsZVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICB0aXRsZTogXCJJZGVudGlmaWVyXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiVW5pcXVlIGlkZW50aWZpZXJcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgdGl0bGU6IFwiTmFtZVwiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlBlcnNvbiBuYW1lXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb01hcmtkb3duKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcbiAgICAgIFwifCBOYW1lIHwgVHlwZSB8IFRpdGxlIHwgRGVzY3JpcHRpb24gfCBDb25zdHJhaW50cyB8XCIsXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcbiAgICAgIFwifCBpZCB8IGludGVnZXIgfCBJZGVudGlmaWVyIHwgVW5pcXVlIGlkZW50aWZpZXIgfFwiLFxuICAgIClcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJ8IG5hbWUgfCBzdHJpbmcgfCBOYW1lIHwgUGVyc29uIG5hbWUgfFwiKVxuICB9KVxuXG4gIGl0KFwiaW5jbHVkZXMgc2NoZW1hIHRpdGxlIGFuZCBkZXNjcmlwdGlvblwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICB0aXRsZTogXCJUZXN0IFNjaGVtYVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQSB0ZXN0IHNjaGVtYSBmb3IgdmFsaWRhdGlvblwiLFxuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImZpZWxkMVwiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb01hcmtkb3duKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIiMgVGVzdCBTY2hlbWFcIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJBIHRlc3Qgc2NoZW1hIGZvciB2YWxpZGF0aW9uXCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGZpZWxkIGNvbnN0cmFpbnRzXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJhZ2VcIixcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgICAgbWF4aW11bTogMTIwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImVtYWlsXCIsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBwYXR0ZXJuOiBcIl5bYS16XStAW2Etel0rXFxcXC5bYS16XSskXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFNjaGVtYVRvTWFya2Rvd24oc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwicmVxdWlyZWRcIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJtaW46IDBcIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJtYXg6IDEyMFwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcInBhdHRlcm46XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGVtcHR5IGZpZWxkcyBhcnJheVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb01hcmtkb3duKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcbiAgICAgIFwifCBOYW1lIHwgVHlwZSB8IFRpdGxlIHwgRGVzY3JpcHRpb24gfCBDb25zdHJhaW50cyB8XCIsXG4gICAgKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBwaXBlIGNoYXJhY3RlcnMgaW4gZmllbGQgdmFsdWVzXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJmaWVsZFwiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiRGVzY3JpcHRpb24gd2l0aCBwaXBlIGNoYXJhY3RlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0U2NoZW1hVG9NYXJrZG93bihzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJEZXNjcmlwdGlvbiB3aXRoIHBpcGUgY2hhcmFjdGVyXCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGZpZWxkcyB3aXRoIGVudW0gY29uc3RyYWludHNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInN0YXR1c1wiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIGVudW06IFtcImFjdGl2ZVwiLCBcImluYWN0aXZlXCIsIFwicGVuZGluZ1wiXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0U2NoZW1hVG9NYXJrZG93bihzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJlbnVtOiBhY3RpdmUsIGluYWN0aXZlLCBwZW5kaW5nXCIpXG4gIH0pXG5cbiAgaXQoXCJ1c2VzIGZyb250bWF0dGVyIHdoZW4gZnJvbnRtYXR0ZXIgb3B0aW9uIGlzIHRydWVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgdGl0bGU6IFwiVGVzdCBTY2hlbWFcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkEgdGVzdCBzY2hlbWEgd2l0aCBmcm9udG1hdHRlclwiLFxuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImZpZWxkMVwiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb01hcmtkb3duKHNjaGVtYSwgeyBmcm9udG1hdHRlcjogdHJ1ZSB9KVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiLS0tXCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwidGl0bGU6IFRlc3QgU2NoZW1hXCIpXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIiMgVGVzdCBTY2hlbWFcIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJBIHRlc3Qgc2NoZW1hIHdpdGggZnJvbnRtYXR0ZXJcIilcbiAgfSlcblxuICBpdChcInVzZXMgSDEgaGVhZGluZyB3aGVuIGZyb250bWF0dGVyIG9wdGlvbiBpcyBmYWxzZSBvciBub3QgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgdGl0bGU6IFwiVGVzdCBTY2hlbWFcIixcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJmaWVsZDFcIixcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0U2NoZW1hVG9NYXJrZG93bihzY2hlbWEsIHsgZnJvbnRtYXR0ZXI6IGZhbHNlIH0pXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCIjIFRlc3QgU2NoZW1hXCIpXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcInRpdGxlOiBUZXN0IFNjaGVtYVwiKVxuICAgIGV4cGVjdChyZXN1bHQuc3RhcnRzV2l0aChcIiMgVGVzdCBTY2hlbWFcIikpLnRvQmUodHJ1ZSlcbiAgfSlcbn0pXG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { convertSchemaToHtml } from "./convert/toHtml.js";
|
|
2
|
+
export { convertSchemaToMarkdown } from "./convert/toMarkdown.js";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zY2hlbWEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXNCLENBQUE7QUFDMUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBjb252ZXJ0U2NoZW1hVG9IdG1sIH0gZnJvbSBcIi4vY29udmVydC90b0h0bWwudHN4XCJcbmV4cG9ydCB7IGNvbnZlcnRTY2hlbWFUb01hcmtkb3duIH0gZnJvbSBcIi4vY29udmVydC90b01hcmtkb3duLnRzXCJcbiJdfQ==
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@frictionless-ts/document",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "1.0.1",
|
|
5
|
+
"exports": "./build/index.js",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"files": [
|
|
8
|
+
"build"
|
|
9
|
+
],
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"author": "Evgeny Karev",
|
|
12
|
+
"repository": "https://github.com/frictionlessdata/frictionless-ts",
|
|
13
|
+
"description": "Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"frictionless",
|
|
16
|
+
"data",
|
|
17
|
+
"polars",
|
|
18
|
+
"dataframe",
|
|
19
|
+
"datapackage",
|
|
20
|
+
"tableschema",
|
|
21
|
+
"typescript",
|
|
22
|
+
"validation",
|
|
23
|
+
"quality",
|
|
24
|
+
"fair",
|
|
25
|
+
"document",
|
|
26
|
+
"html"
|
|
27
|
+
],
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"htmlfy": "^1.0.0",
|
|
30
|
+
"react": "^19.2.0",
|
|
31
|
+
"react-dom": "^19.2.0",
|
|
32
|
+
"remark": "^15.0.1",
|
|
33
|
+
"remark-gfm": "^4.0.0",
|
|
34
|
+
"@frictionless-ts/metadata": "1.0.1",
|
|
35
|
+
"@frictionless-ts/dataset": "1.0.1"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/mdast": "^4.0.0",
|
|
39
|
+
"@types/react": "^19.2.0",
|
|
40
|
+
"@types/react-dom": "^19.2.0"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc"
|
|
44
|
+
}
|
|
45
|
+
}
|