1 |
|
2 | var {describe, it} = require("mocha"),
|
3 | chai = require("chai"),
|
4 | {assert} = chai,
|
5 | proxyquire = require("proxyquire"),
|
6 | sinon = require("sinon"),
|
7 | conf = require("../.inline.js");
|
8 |
|
9 | chai.use(require("chai-subset"));
|
10 |
|
11 | var content = "";
|
12 |
|
13 | var fs = {
|
14 | readFileSync: sinon.spy(() => content)
|
15 | };
|
16 |
|
17 | var fsExtra = {
|
18 | outputFileSync: sinon.spy()
|
19 | };
|
20 |
|
21 | var {
|
22 | inlines, inline, parseInline, createShortcuts
|
23 | } = proxyquire("../index", {fs, "fs-extra": fsExtra});
|
24 |
|
25 | describe("parseInline", () => {
|
26 |
|
27 | it(".shortcut", () => {
|
28 | var parsed = parseInline("$inline.shortcut('a', 'b')");
|
29 | assert.containSubset(parsed, {
|
30 | type: "$inline.shortcut",
|
31 | params: ["a", "b"]
|
32 | });
|
33 | });
|
34 | });
|
35 |
|
36 | describe("createShortcuts", () => {
|
37 |
|
38 | var prepare = (name, expand) => {
|
39 | var shortcuts = createShortcuts();
|
40 | shortcuts.addGlobal({name, expand});
|
41 | return shortcuts;
|
42 | };
|
43 |
|
44 | it("basic", () => {
|
45 | var shortcuts = prepare("test", "a.txt|tr:$1");
|
46 | assert.equal(shortcuts.expand("", "test:abc"), "a.txt|tr:abc");
|
47 | });
|
48 |
|
49 | it("multiple arguments", () => {
|
50 | var shortcuts = prepare("test", "a.txt|tr:$1|tr2:$2");
|
51 | assert.equal(shortcuts.expand("", "test:abc,123"), "a.txt|tr:abc|tr2:123");
|
52 | });
|
53 |
|
54 | it("$&", () => {
|
55 | var shortcuts = prepare("test", "a.txt|tr:$&");
|
56 | assert.equal(shortcuts.expand("", "test:abc,123"), "a.txt|tr:abc,123");
|
57 | });
|
58 |
|
59 | it("additional pipes", () => {
|
60 | var shortcuts = prepare("test", "a.txt|tr");
|
61 | assert.equal(shortcuts.expand("", "test|tr2|tr3"), "a.txt|tr|tr2|tr3");
|
62 | });
|
63 |
|
64 | });
|
65 |
|
66 | describe("inlines", () => {
|
67 |
|
68 | it("$inline", () => {
|
69 | var [parsed] = [...inlines("$inline('path/to/file')")];
|
70 | assert.containSubset(parsed, {
|
71 | type: "$inline",
|
72 | start: 0,
|
73 | end: 23
|
74 | });
|
75 | });
|
76 |
|
77 | it(".start .end", () => {
|
78 | var [parsed] = [...inlines("$inline.start('./a.txt')\ntest\n$inline.end")];
|
79 | assert.containSubset(parsed, {
|
80 | type: "$inline.start",
|
81 | start: 25,
|
82 | end: 29
|
83 | });
|
84 | });
|
85 |
|
86 | it(".line", () => {
|
87 | var [parsed] = [...inlines("test\ntest$inline.line('path/to/file')test\ntest")];
|
88 | assert.containSubset(parsed, {
|
89 | type: "$inline.line",
|
90 | start: 5,
|
91 | end: 41
|
92 | });
|
93 | });
|
94 |
|
95 | it(".shortcut", () => {
|
96 | var [parsed] = [...inlines("$inline.shortcut('test', 'file|t1:$2,$1')")];
|
97 | assert.containSubset(parsed, {
|
98 | type: "$inline.shortcut",
|
99 | params: ["test", "file|t1:$2,$1"]
|
100 | });
|
101 | });
|
102 |
|
103 | });
|
104 |
|
105 | describe("inline", () => {
|
106 | it("maxDepth", () => {
|
107 | var resourceCenter = {
|
108 | read: sinon.spy(() => {
|
109 | assert.isBelow(resourceCenter.read.callCount, 20);
|
110 | return "$inline('./self')";
|
111 | })
|
112 | };
|
113 | assert.throws(() => {
|
114 | inline({
|
115 | resourceCenter,
|
116 | resource: {name: "file", args: "./self"},
|
117 | maxDepth: 10, depth: 0
|
118 | });
|
119 | }, "Max recursion depth 10");
|
120 | });
|
121 |
|
122 | it("shortcut", () => {
|
123 | var resourceCenter = {
|
124 | read() {
|
125 | this.read = this.read2;
|
126 | return "$inline.shortcut('pkg', '../package.json|parse:$1')\n$inline('pkg:test')";
|
127 | },
|
128 | read2() {
|
129 | return JSON.stringify({test: "OK"});
|
130 | }
|
131 | };
|
132 | var transformer = {
|
133 | transform({resource, transforms = [], content}) {
|
134 | assert.equal(resource.args, "../package.json");
|
135 | assert.deepEqual(transforms, [{
|
136 | name: "parse",
|
137 | args: "test"
|
138 | }]);
|
139 | this.transform = this.transform2;
|
140 | return JSON.parse(content).test;
|
141 | },
|
142 | transform2({resource, content}) {
|
143 | assert.equal(resource.args, "entry");
|
144 | return content;
|
145 | }
|
146 | };
|
147 | assert.equal(inline({
|
148 | resourceCenter,
|
149 | resource: {name: "file", args: "entry"},
|
150 | transformer
|
151 | }).split("\n")[1], "OK");
|
152 | });
|
153 | });
|
154 |
|
155 | describe("transforms", () => {
|
156 | var tr = {};
|
157 | conf.transforms.forEach(tf => tr[tf.name] = tf.transform);
|
158 |
|
159 | it("eval", () => {
|
160 | assert.equal(
|
161 | tr.eval(null, '{"hello": 123}', "JSON.parse($0).hello"),
|
162 | 123
|
163 | );
|
164 | });
|
165 |
|
166 | it("parse", () => {
|
167 | var content = '{"version": "1.2.3","nested": {"prop": 123}}';
|
168 | assert.equal(tr.parse(null, content, "version"), "1.2.3");
|
169 | assert.equal(tr.parse(null, content, "nested", "prop"), 123);
|
170 | });
|
171 |
|
172 | it("markdown", () => {
|
173 | var content = "some text";
|
174 | assert.equal(tr.markdown(null, content, "codeblock"), "```\nsome text\n```");
|
175 | assert.equal(tr.markdown(null, content, "code"), "`some text`");
|
176 | assert.equal(tr.markdown(null, content, "quote"), "> some text");
|
177 | });
|
178 |
|
179 | it("base64", () => {
|
180 | const fs = require("fs");
|
181 | let content, result;
|
182 | content = fs.readFileSync(`${__dirname}/base64/test.css`);
|
183 | result = fs.readFileSync(`${__dirname}/base64/test.css-base64.txt`, "utf8");
|
184 | assert.equal(tr.dataurl("test.css", content), result);
|
185 |
|
186 | content = fs.readFileSync(`${__dirname}/base64/test.png`);
|
187 | result = fs.readFileSync(`${__dirname}/base64/test.png-base64.txt`, "utf8");
|
188 | assert.equal(tr.dataurl("test.png", content), result);
|
189 | });
|
190 | });
|