@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 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
+ import type { JsonDocument } from "./types/Json.ts";
2
+ export type Document = JsonDocument;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kb2N1bWVudC9Eb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBKc29uRG9jdW1lbnQgfSBmcm9tIFwiLi90eXBlcy9Kc29uLnRzXCJcblxuZXhwb3J0IHR5cGUgRG9jdW1lbnQgPSBKc29uRG9jdW1lbnRcbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export type { Document } from "./Document.ts";
2
+ export { validateDocument } from "./validate.ts";
3
+ export * from "./types/Json.ts";
@@ -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,3 @@
1
+ export interface BaseDocument {
2
+ type: string;
3
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RvY3VtZW50L3R5cGVzL0Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQmFzZURvY3VtZW50IHtcbiAgdHlwZTogc3RyaW5nXG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ import type { BaseDocument } from "./Base.ts";
2
+ export interface JsonDocument extends BaseDocument {
3
+ type: "json";
4
+ data: Record<string, any>;
5
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSnNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RvY3VtZW50L3R5cGVzL0pzb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQmFzZURvY3VtZW50IH0gZnJvbSBcIi4vQmFzZS50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbkRvY3VtZW50IGV4dGVuZHMgQmFzZURvY3VtZW50IHtcbiAgdHlwZTogXCJqc29uXCJcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PlxufVxuIl19
@@ -0,0 +1,5 @@
1
+ import type { Resource } from "@frictionless-ts/metadata";
2
+ export declare function validateDocument(resource: Partial<Resource>): Promise<{
3
+ errors: import("@frictionless-ts/metadata").FrictionlessError[];
4
+ valid: boolean;
5
+ }>;
@@ -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=
@@ -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 {};
@@ -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,4 @@
1
+ import type { Schema } from "@frictionless-ts/metadata";
2
+ export declare function convertSchemaToHtml(schema: Schema, options?: {
3
+ frontmatter?: boolean;
4
+ }): string;
@@ -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 &amp; &lt;Schema&gt;");
125
+ expect(result).toContain("Description with &quot;quotes&quot; and &lt;tags&gt;");
126
+ expect(result).toContain("Description with &lt;script&gt;alert(&#x27;xss&#x27;)&lt;/script&gt;");
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,4 @@
1
+ import type { Schema } from "@frictionless-ts/metadata";
2
+ export declare function convertSchemaToMarkdown(schema: Schema, options?: {
3
+ frontmatter?: boolean;
4
+ }): string;
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9NYXJrZG93bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NjaGVtYS9jb252ZXJ0L3RvTWFya2Rvd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxNQUFjLEVBQ2QsT0FBbUM7SUFFbkMsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFBO0lBRXpCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUE7SUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxxREFBcUQsQ0FBQyxDQUFBO0lBRWhFLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO1FBQzdCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFBO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFBO1FBQy9CLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFBO1FBRTNDLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQTtRQUNoQyxJQUFJLFVBQVUsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDOUIsQ0FBQztRQUNELElBQUksYUFBYSxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQWtCLENBQUE7WUFDbEMsSUFBSSxDQUFDLENBQUMsUUFBUTtnQkFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQzVDLElBQUksQ0FBQyxDQUFDLE1BQU07Z0JBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN4QyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssU0FBUztnQkFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFDbEUsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLFNBQVM7Z0JBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1lBQ2xFLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTO2dCQUMzQixXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7WUFDL0MsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVM7Z0JBQzNCLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtZQUMvQyxJQUFJLENBQUMsQ0FBQyxPQUFPO2dCQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUN4RCxJQUFJLENBQUMsQ0FBQyxJQUFJO2dCQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDNUQsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFN0MsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMxQyxNQUFNLGtCQUFrQixHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUN0RCxNQUFNLGtCQUFrQixHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUV6RCxJQUFJLENBQUMsSUFBSSxDQUNQLEtBQUssV0FBVyxNQUFNLElBQUksTUFBTSxZQUFZLE1BQU0sa0JBQWtCLE1BQU0sa0JBQWtCLElBQUksQ0FDakcsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQTtJQUVyQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQTtRQUUzQixJQUFJLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2xCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7WUFDdkMsQ0FBQztZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUVmLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtnQkFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNqQixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO2dCQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ2pCLENBQUM7WUFFRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7Z0JBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDakIsQ0FBQztRQUNILENBQUM7UUFFRCxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUE7SUFDekMsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFBO0FBQ2pCLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFZO0lBQ2xDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFNjaGVtYVRvTWFya2Rvd24oXG4gIHNjaGVtYTogU2NoZW1hLFxuICBvcHRpb25zPzogeyBmcm9udG1hdHRlcj86IGJvb2xlYW4gfSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHJvd3M6IHN0cmluZ1tdID0gW11cblxuICByb3dzLnB1c2goXCJcIilcbiAgcm93cy5wdXNoKFwiIyMgRmllbGRzXCIpXG4gIHJvd3MucHVzaChcIlwiKVxuICByb3dzLnB1c2goXCJ8IE5hbWUgfCBUeXBlIHwgVGl0bGUgfCBEZXNjcmlwdGlvbiB8IENvbnN0cmFpbnRzIHxcIilcbiAgcm93cy5wdXNoKFwifC0tLS0tLXwtLS0tLS18LS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18XCIpXG5cbiAgZm9yIChjb25zdCBmaWVsZCBvZiBzY2hlbWEuZmllbGRzKSB7XG4gICAgY29uc3QgbmFtZSA9IGZpZWxkLm5hbWUgfHwgXCJcIlxuICAgIGNvbnN0IHR5cGUgPSBmaWVsZC50eXBlIHx8IFwiYW55XCJcbiAgICBjb25zdCB0aXRsZSA9IGZpZWxkLnRpdGxlIHx8IFwiXCJcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGZpZWxkLmRlc2NyaXB0aW9uIHx8IFwiXCJcblxuICAgIGNvbnN0IGNvbnN0cmFpbnRzOiBzdHJpbmdbXSA9IFtdXG4gICAgaWYgKFwicmVxdWlyZWRcIiBpbiBmaWVsZCAmJiBmaWVsZC5yZXF1aXJlZCkge1xuICAgICAgY29uc3RyYWludHMucHVzaChcInJlcXVpcmVkXCIpXG4gICAgfVxuICAgIGlmIChcImNvbnN0cmFpbnRzXCIgaW4gZmllbGQgJiYgZmllbGQuY29uc3RyYWludHMpIHtcbiAgICAgIGNvbnN0IGMgPSBmaWVsZC5jb25zdHJhaW50cyBhcyBhbnlcbiAgICAgIGlmIChjLnJlcXVpcmVkKSBjb25zdHJhaW50cy5wdXNoKFwicmVxdWlyZWRcIilcbiAgICAgIGlmIChjLnVuaXF1ZSkgY29uc3RyYWludHMucHVzaChcInVuaXF1ZVwiKVxuICAgICAgaWYgKGMubWluaW11bSAhPT0gdW5kZWZpbmVkKSBjb25zdHJhaW50cy5wdXNoKGBtaW46ICR7Yy5taW5pbXVtfWApXG4gICAgICBpZiAoYy5tYXhpbXVtICE9PSB1bmRlZmluZWQpIGNvbnN0cmFpbnRzLnB1c2goYG1heDogJHtjLm1heGltdW19YClcbiAgICAgIGlmIChjLm1pbkxlbmd0aCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBjb25zdHJhaW50cy5wdXNoKGBtaW5MZW5ndGg6ICR7Yy5taW5MZW5ndGh9YClcbiAgICAgIGlmIChjLm1heExlbmd0aCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBjb25zdHJhaW50cy5wdXNoKGBtYXhMZW5ndGg6ICR7Yy5tYXhMZW5ndGh9YClcbiAgICAgIGlmIChjLnBhdHRlcm4pIGNvbnN0cmFpbnRzLnB1c2goYHBhdHRlcm46ICR7Yy5wYXR0ZXJufWApXG4gICAgICBpZiAoYy5lbnVtKSBjb25zdHJhaW50cy5wdXNoKGBlbnVtOiAke2MuZW51bS5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBjb25zdCBjb25zdHJhaW50c1N0ciA9IGNvbnN0cmFpbnRzLmpvaW4oXCIsIFwiKVxuXG4gICAgY29uc3QgZXNjYXBlZE5hbWUgPSBlc2NhcGVNYXJrZG93bihuYW1lKVxuICAgIGNvbnN0IGVzY2FwZWRUaXRsZSA9IGVzY2FwZU1hcmtkb3duKHRpdGxlKVxuICAgIGNvbnN0IGVzY2FwZWREZXNjcmlwdGlvbiA9IGVzY2FwZU1hcmtkb3duKGRlc2NyaXB0aW9uKVxuICAgIGNvbnN0IGVzY2FwZWRDb25zdHJhaW50cyA9IGVzY2FwZU1hcmtkb3duKGNvbnN0cmFpbnRzU3RyKVxuXG4gICAgcm93cy5wdXNoKFxuICAgICAgYHwgJHtlc2NhcGVkTmFtZX0gfCAke3R5cGV9IHwgJHtlc2NhcGVkVGl0bGV9IHwgJHtlc2NhcGVkRGVzY3JpcHRpb259IHwgJHtlc2NhcGVkQ29uc3RyYWludHN9IHxgLFxuICAgIClcbiAgfVxuXG4gIGxldCBtYXJrZG93biA9IGAke3Jvd3Muam9pbihcIlxcblwiKX1cXG5gXG5cbiAgaWYgKHNjaGVtYS50aXRsZSB8fCBzY2hlbWEuZGVzY3JpcHRpb24pIHtcbiAgICBjb25zdCBoZWFkZXI6IHN0cmluZ1tdID0gW11cblxuICAgIGlmIChvcHRpb25zPy5mcm9udG1hdHRlcikge1xuICAgICAgaGVhZGVyLnB1c2goXCItLS1cIilcbiAgICAgIGlmIChzY2hlbWEudGl0bGUpIHtcbiAgICAgICAgaGVhZGVyLnB1c2goYHRpdGxlOiAke3NjaGVtYS50aXRsZX1gKVxuICAgICAgfVxuICAgICAgaGVhZGVyLnB1c2goXCItLS1cIilcbiAgICAgIGhlYWRlci5wdXNoKFwiXCIpXG5cbiAgICAgIGlmIChzY2hlbWEuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgaGVhZGVyLnB1c2goc2NoZW1hLmRlc2NyaXB0aW9uKVxuICAgICAgICBoZWFkZXIucHVzaChcIlwiKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2NoZW1hLnRpdGxlKSB7XG4gICAgICAgIGhlYWRlci5wdXNoKGAjICR7c2NoZW1hLnRpdGxlfWApXG4gICAgICAgIGhlYWRlci5wdXNoKFwiXCIpXG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgaGVhZGVyLnB1c2goc2NoZW1hLmRlc2NyaXB0aW9uKVxuICAgICAgICBoZWFkZXIucHVzaChcIlwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIG1hcmtkb3duID0gaGVhZGVyLmpvaW4oXCJcXG5cIikgKyBtYXJrZG93blxuICB9XG5cbiAgcmV0dXJuIG1hcmtkb3duXG59XG5cbmZ1bmN0aW9uIGVzY2FwZU1hcmtkb3duKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcbi9nLCBcIiBcIilcbn1cbiJdfQ==
@@ -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,2 @@
1
+ export { convertSchemaToHtml } from "./convert/toHtml.tsx";
2
+ export { convertSchemaToMarkdown } from "./convert/toMarkdown.ts";
@@ -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
+ }