From f11190042e949ec0c3176ccec5473196547c5e2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20=C5=BDilinskas?= Date: Sun, 9 Jul 2017 02:16:08 +0300 Subject: [PATCH 1/6] Added json2md types. --- types/json2md/index.d.ts | 66 +++++++++++ types/json2md/json2md-tests.ts | 202 +++++++++++++++++++++++++++++++++ types/json2md/tsconfig.json | 22 ++++ types/json2md/tslint.json | 1 + 4 files changed, 291 insertions(+) create mode 100644 types/json2md/index.d.ts create mode 100644 types/json2md/json2md-tests.ts create mode 100644 types/json2md/tsconfig.json create mode 100644 types/json2md/tslint.json diff --git a/types/json2md/index.d.ts b/types/json2md/index.d.ts new file mode 100644 index 0000000000..ec40a753b5 --- /dev/null +++ b/types/json2md/index.d.ts @@ -0,0 +1,66 @@ +// Type definitions for json2md 1.5 +// Project: https://github.com/IonicaBizau/json2md#readme +// Definitions by: MartynasZilinskas +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.3 + +export = json2md; + +declare function json2md(data: json2md.ConverterObject | json2md.ConverterObject[] | string | string[], prefix?: string): string; +type json2md = typeof json2md; + +declare namespace json2md { + interface ConverterObject { + [converter: string]: any; + blockquote?: string | string[]; + code?: CodeInput; + h1?: string | string[]; + h2?: string | string[]; + h3?: string | string[]; + h4?: string | string[]; + h5?: string | string[]; + h6?: string | string[]; + img?: ImgInput | ImgInput[]; + ol?: string[]; + p?: string | string[]; + table?: TableInput; + ul?: string[]; + } + + type ConverterCallback = (input: TInput, json2md: json2md) => string; + + const converters: ConvertersMethods; + + interface ConvertersMethods { + [converter: string]: ConverterCallback; + + blockquote(input: string | string[], json2md: json2md): string; + code(input: CodeInput, json2md: json2md): string; + h1(input: string, json2md: json2md): string; + h2(input: string, json2md: json2md): string; + h3(input: string, json2md: json2md): string; + h4(input: string, json2md: json2md): string; + h5(input: string, json2md: json2md): string; + h6(input: string, json2md: json2md): string; + img(input: ImgInput | ImgInput[] | string, json2md: json2md): string; + ol(input: string, json2md: json2md): string; + p(input: string, json2md: json2md): string; + table(input: TableInput, json2md: json2md): string; + ul(input: string, json2md: json2md): string; + } + + interface ImgInput { + title: string; + source: string; + } + + interface CodeInput { + language?: string; + content: string | string[]; + } + + interface TableInput { + headers: string[]; + rows: Array<{ [column: string]: string }> | string[][]; + } +} diff --git a/types/json2md/json2md-tests.ts b/types/json2md/json2md-tests.ts new file mode 100644 index 0000000000..bdb071517b --- /dev/null +++ b/types/json2md/json2md-tests.ts @@ -0,0 +1,202 @@ +import * as json2md from 'json2md'; + +declare function describe(desc: string, f: () => void): void; +declare function it(desc: string, f: () => void): void; + +const exampleString: string = "example string"; +const exampleStringArray: string[] = ["A", "B"]; + +describe("Default elements", () => { + it("Headings", () => { + json2md([ + { + h1: exampleString + }, + { + h2: exampleString + }, + { + h3: exampleString + }, + { + h4: exampleString + }, + { + h5: exampleString + }, + { + h6: exampleString + } + ]); + }); + + it("Paragraphs", () => { + json2md([{ + p: exampleString + }]); + + json2md([{ + p: exampleStringArray + }]); + }); + + it("Blockquote", () => { + json2md([{ + blockquote: exampleString + }]); + + json2md([{ + blockquote: exampleStringArray + }]); + }); + + it("Image", () => { + json2md([{ + img: { + title: exampleString, + source: exampleString + } + }]); + + json2md([{ + img: [ + { + title: exampleString, + source: exampleString + } + ] + }]); + }); + + it("Unordered list", () => { + json2md([ + { + ul: exampleStringArray + } + ]); + }); + + it("Ordered list", () => { + json2md([ + { + ol: exampleStringArray + } + ]); + }); + + it("Code block element", () => { + json2md([ + { + code: { + language: "js", + content: exampleString + } + } + ]); + }); + + it("Table", () => { + json2md([ + { + table: { + headers: exampleStringArray, + rows: [ + { + A: exampleString, + B: exampleString + } + ] + } + } + ]); + + json2md([ + { + table: { + headers: exampleStringArray, + rows: [ + exampleStringArray + ] + } + } + ]); + }); +}); + +it("Custom types", () => { + const customConverter: json2md.ConverterCallback = (input, json2md) => { + return `Hello ${input} world!`; + }; + + json2md.converters.customConverter = customConverter; + + json2md([ + { + customConverter: exampleString + } + ]); +}); + +it("Big example", () => { + const md: string = json2md([ + { + h1: "JSON To Markdown" + }, + { + blockquote: "A JSON to Markdown converter." + }, + { + img: [ + { + title: "Some image", + source: "https://example.com/some-image.png" + }, + { + title: "Another image", + source: "https://example.com/some-image1.png" + }, + { + title: "Yet another image", + source: "https://example.com/some-image2.png" + } + ] + }, + { + h2: "Features" + }, + { + ul: [ + "Easy to use", + "You can programatically generate Markdown content", + "..." + ] + }, + { + h2: "How to contribute" + }, + { + ol: [ + "Fork the project", + "Create your branch", + "Raise a pull request" + ] + }, + { + h2: "Code blocks" + }, + { + p: "Below you can see a code block example." + }, + { + code: { + language: "js", + content: [ + "function sum (a, b) {", + " return a + b;", + "}", + "sum(1, 2);" + ] + } + } + ]); +}); diff --git a/types/json2md/tsconfig.json b/types/json2md/tsconfig.json new file mode 100644 index 0000000000..8fec5e6f49 --- /dev/null +++ b/types/json2md/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "json2md-tests.ts" + ] +} diff --git a/types/json2md/tslint.json b/types/json2md/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/json2md/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" } From 8ab835ba1b61ef6dc63a03a6fa4303ffe15c127b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20=C5=BDilinskas?= Date: Sun, 9 Jul 2017 02:17:16 +0300 Subject: [PATCH 2/6] Renamed interface. --- types/json2md/index.d.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/types/json2md/index.d.ts b/types/json2md/index.d.ts index ec40a753b5..c07e065629 100644 --- a/types/json2md/index.d.ts +++ b/types/json2md/index.d.ts @@ -6,11 +6,13 @@ export = json2md; -declare function json2md(data: json2md.ConverterObject | json2md.ConverterObject[] | string | string[], prefix?: string): string; +declare function json2md(data: json2md.DataObject | json2md.DataObject[] | string | string[], prefix?: string): string; type json2md = typeof json2md; declare namespace json2md { - interface ConverterObject { + const converters: ConvertersMethods; + + interface DataObject { [converter: string]: any; blockquote?: string | string[]; code?: CodeInput; @@ -29,8 +31,6 @@ declare namespace json2md { type ConverterCallback = (input: TInput, json2md: json2md) => string; - const converters: ConvertersMethods; - interface ConvertersMethods { [converter: string]: ConverterCallback; From 111de6049efdfc4ad096e01ec9cebba2a4ee828a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20=C5=BDilinskas?= Date: Mon, 10 Jul 2017 13:49:18 +0300 Subject: [PATCH 3/6] Updated types. --- types/json2md/index.d.ts | 84 ++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 46 deletions(-) diff --git a/types/json2md/index.d.ts b/types/json2md/index.d.ts index c07e065629..712edf15b0 100644 --- a/types/json2md/index.d.ts +++ b/types/json2md/index.d.ts @@ -12,55 +12,47 @@ type json2md = typeof json2md; declare namespace json2md { const converters: ConvertersMethods; - interface DataObject { - [converter: string]: any; - blockquote?: string | string[]; - code?: CodeInput; - h1?: string | string[]; - h2?: string | string[]; - h3?: string | string[]; - h4?: string | string[]; - h5?: string | string[]; - h6?: string | string[]; - img?: ImgInput | ImgInput[]; - ol?: string[]; - p?: string | string[]; - table?: TableInput; - ul?: string[]; + namespace DefaultConverters { + interface Converters { + [converter: string]: any; + blockquote: string | string[]; + code: CodeInput; + h1: string | string[]; + h2: string | string[]; + h3: string | string[]; + h4: string | string[]; + h5: string | string[]; + h6: string | string[]; + img: ImgInput | ImgInput[]; + ol: string[]; + p: string | string[]; + table: TableInput; + ul: string[]; + } + + interface ImgInput { + title: string; + source: string; + } + + interface CodeInput { + language?: string; + content: string | string[]; + } + + interface TableInput { + headers: string[]; + rows: Array<{ [column: string]: string }> | string[][]; + } + } + + type DataObject = { + [TConverter in keyof DefaultConverters.Converters]?: DefaultConverters.Converters[TConverter] } type ConverterCallback = (input: TInput, json2md: json2md) => string; - interface ConvertersMethods { - [converter: string]: ConverterCallback; - - blockquote(input: string | string[], json2md: json2md): string; - code(input: CodeInput, json2md: json2md): string; - h1(input: string, json2md: json2md): string; - h2(input: string, json2md: json2md): string; - h3(input: string, json2md: json2md): string; - h4(input: string, json2md: json2md): string; - h5(input: string, json2md: json2md): string; - h6(input: string, json2md: json2md): string; - img(input: ImgInput | ImgInput[] | string, json2md: json2md): string; - ol(input: string, json2md: json2md): string; - p(input: string, json2md: json2md): string; - table(input: TableInput, json2md: json2md): string; - ul(input: string, json2md: json2md): string; - } - - interface ImgInput { - title: string; - source: string; - } - - interface CodeInput { - language?: string; - content: string | string[]; - } - - interface TableInput { - headers: string[]; - rows: Array<{ [column: string]: string }> | string[][]; + type ConvertersMethods = { + [TConverter in keyof DefaultConverters.Converters]: ConverterCallback } } From 87055a635e938726e436d61fba3ae1692c6c1a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20=C5=BDilinskas?= Date: Mon, 10 Jul 2017 13:52:03 +0300 Subject: [PATCH 4/6] Updated tests. --- types/json2md/json2md-tests.ts | 58 +++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/types/json2md/json2md-tests.ts b/types/json2md/json2md-tests.ts index bdb071517b..1b10c2d6f1 100644 --- a/types/json2md/json2md-tests.ts +++ b/types/json2md/json2md-tests.ts @@ -3,66 +3,66 @@ import * as json2md from 'json2md'; declare function describe(desc: string, f: () => void): void; declare function it(desc: string, f: () => void): void; -const exampleString: string = "example string"; -const exampleStringArray: string[] = ["A", "B"]; +const EXAMPLE_STRING: string = "example string"; +const EXAMPLE_STRING_ARRAY: string[] = ["A", "B"]; describe("Default elements", () => { it("Headings", () => { json2md([ { - h1: exampleString + h1: EXAMPLE_STRING }, { - h2: exampleString + h2: EXAMPLE_STRING }, { - h3: exampleString + h3: EXAMPLE_STRING }, { - h4: exampleString + h4: EXAMPLE_STRING }, { - h5: exampleString + h5: EXAMPLE_STRING }, { - h6: exampleString + h6: EXAMPLE_STRING } ]); }); it("Paragraphs", () => { json2md([{ - p: exampleString + p: EXAMPLE_STRING }]); json2md([{ - p: exampleStringArray + p: EXAMPLE_STRING_ARRAY }]); }); it("Blockquote", () => { json2md([{ - blockquote: exampleString + blockquote: EXAMPLE_STRING }]); json2md([{ - blockquote: exampleStringArray + blockquote: EXAMPLE_STRING_ARRAY }]); }); it("Image", () => { json2md([{ img: { - title: exampleString, - source: exampleString + title: EXAMPLE_STRING, + source: EXAMPLE_STRING } }]); json2md([{ img: [ { - title: exampleString, - source: exampleString + title: EXAMPLE_STRING, + source: EXAMPLE_STRING } ] }]); @@ -71,7 +71,7 @@ describe("Default elements", () => { it("Unordered list", () => { json2md([ { - ul: exampleStringArray + ul: EXAMPLE_STRING_ARRAY } ]); }); @@ -79,7 +79,7 @@ describe("Default elements", () => { it("Ordered list", () => { json2md([ { - ol: exampleStringArray + ol: EXAMPLE_STRING_ARRAY } ]); }); @@ -89,7 +89,7 @@ describe("Default elements", () => { { code: { language: "js", - content: exampleString + content: EXAMPLE_STRING } } ]); @@ -99,11 +99,11 @@ describe("Default elements", () => { json2md([ { table: { - headers: exampleStringArray, + headers: EXAMPLE_STRING_ARRAY, rows: [ { - A: exampleString, - B: exampleString + A: EXAMPLE_STRING, + B: EXAMPLE_STRING } ] } @@ -113,9 +113,9 @@ describe("Default elements", () => { json2md([ { table: { - headers: exampleStringArray, + headers: EXAMPLE_STRING_ARRAY, rows: [ - exampleStringArray + EXAMPLE_STRING_ARRAY ] } } @@ -132,7 +132,7 @@ it("Custom types", () => { json2md([ { - customConverter: exampleString + customConverter: EXAMPLE_STRING } ]); }); @@ -200,3 +200,11 @@ it("Big example", () => { } ]); }); + +it("Use converter", () => { + const blockquote: string = json2md.converters.blockquote(EXAMPLE_STRING, json2md); + const img: string = json2md.converters.img({ + title: EXAMPLE_STRING, + source: EXAMPLE_STRING + }, json2md); +}); From e041ed6c42930b848a840d01b5a6b1c4f4d0c3ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20=C5=BDilinskas?= Date: Mon, 10 Jul 2017 13:52:58 +0300 Subject: [PATCH 5/6] Fixed dtslint errors. --- types/json2md/index.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/types/json2md/index.d.ts b/types/json2md/index.d.ts index 712edf15b0..37bdd0d2c8 100644 --- a/types/json2md/index.d.ts +++ b/types/json2md/index.d.ts @@ -48,11 +48,11 @@ declare namespace json2md { type DataObject = { [TConverter in keyof DefaultConverters.Converters]?: DefaultConverters.Converters[TConverter] - } + }; type ConverterCallback = (input: TInput, json2md: json2md) => string; type ConvertersMethods = { [TConverter in keyof DefaultConverters.Converters]: ConverterCallback - } + }; } From 4e606f4948a0b65fc9099a583720547da9cefac4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20=C5=BDilinskas?= Date: Mon, 10 Jul 2017 13:54:04 +0300 Subject: [PATCH 6/6] Added JSDoc. --- types/json2md/index.d.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/types/json2md/index.d.ts b/types/json2md/index.d.ts index 37bdd0d2c8..ce15a5909e 100644 --- a/types/json2md/index.d.ts +++ b/types/json2md/index.d.ts @@ -6,6 +6,13 @@ export = json2md; +/** + * Converts a JSON input to markdown. + * + * @param data The input JSON data. + * @param prefix A snippet to add before each line. + * @return The generated markdown result. + */ declare function json2md(data: json2md.DataObject | json2md.DataObject[] | string | string[], prefix?: string): string; type json2md = typeof json2md;