@prairielearn/html 1.0.1 → 1.0.2
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +7 -0
- package/dist/index.js +17 -24
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +30 -35
- package/dist/index.test.js.map +1 -1
- package/package.json +4 -4
- package/tsconfig.json +7 -1
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -2,27 +2,27 @@
|
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
|
-
exports
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.renderEjs = exports.unsafeHtml = exports.escapeHtml = exports.html = exports.HtmlSafeString = void 0;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
const ejs_1 = __importDefault(require("ejs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
9
|
function escapeValue(value) {
|
|
10
10
|
if (value instanceof HtmlSafeString) {
|
|
11
11
|
// Already escaped!
|
|
12
12
|
return value.toString();
|
|
13
13
|
}
|
|
14
14
|
else if (Array.isArray(value)) {
|
|
15
|
-
return value.map(
|
|
15
|
+
return value.map((val) => escapeValue(val)).join('');
|
|
16
16
|
}
|
|
17
17
|
else if (typeof value === 'string' || typeof value === 'number') {
|
|
18
|
-
return ejs_1
|
|
18
|
+
return ejs_1.default.escapeXML(String(value));
|
|
19
19
|
}
|
|
20
20
|
else if (value == null) {
|
|
21
21
|
// undefined or null -- render nothing
|
|
22
22
|
return '';
|
|
23
23
|
}
|
|
24
24
|
else if (typeof value === 'object') {
|
|
25
|
-
throw new Error(
|
|
25
|
+
throw new Error(`Cannot interpolate object in template: ${JSON.stringify(value)}`);
|
|
26
26
|
}
|
|
27
27
|
else {
|
|
28
28
|
// This is boolean - don't render anything here.
|
|
@@ -30,25 +30,19 @@ function escapeValue(value) {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
// Based on https://github.com/Janpot/escape-html-template-tag
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
class HtmlSafeString {
|
|
34
|
+
constructor(strings, values) {
|
|
35
35
|
this.strings = strings;
|
|
36
36
|
this.values = values;
|
|
37
37
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return acc + escapeValue(val) + _this.strings[i + 1];
|
|
38
|
+
toString() {
|
|
39
|
+
return this.values.reduce((acc, val, i) => {
|
|
40
|
+
return acc + escapeValue(val) + this.strings[i + 1];
|
|
42
41
|
}, this.strings[0]);
|
|
43
|
-
};
|
|
44
|
-
return HtmlSafeString;
|
|
45
|
-
}());
|
|
46
|
-
exports.HtmlSafeString = HtmlSafeString;
|
|
47
|
-
function html(strings) {
|
|
48
|
-
var values = [];
|
|
49
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
50
|
-
values[_i - 1] = arguments[_i];
|
|
51
42
|
}
|
|
43
|
+
}
|
|
44
|
+
exports.HtmlSafeString = HtmlSafeString;
|
|
45
|
+
function html(strings, ...values) {
|
|
52
46
|
return new HtmlSafeString(strings, values);
|
|
53
47
|
}
|
|
54
48
|
exports.html = html;
|
|
@@ -58,7 +52,7 @@ exports.html = html;
|
|
|
58
52
|
* popover.
|
|
59
53
|
*/
|
|
60
54
|
function escapeHtml(html) {
|
|
61
|
-
return unsafeHtml(ejs_1
|
|
55
|
+
return unsafeHtml(ejs_1.default.escapeXML(html.toString()));
|
|
62
56
|
}
|
|
63
57
|
exports.escapeHtml = escapeHtml;
|
|
64
58
|
/**
|
|
@@ -84,9 +78,8 @@ exports.unsafeHtml = unsafeHtml;
|
|
|
84
78
|
* @param data Any data to be made available to the template.
|
|
85
79
|
* @returns The rendered EJS.
|
|
86
80
|
*/
|
|
87
|
-
function renderEjs(filename, template, data) {
|
|
88
|
-
|
|
89
|
-
return unsafeHtml(ejs_1["default"].render(template, data, { views: [path_1["default"].dirname(filename)] }));
|
|
81
|
+
function renderEjs(filename, template, data = {}) {
|
|
82
|
+
return unsafeHtml(ejs_1.default.render(template, data, { views: [path_1.default.dirname(filename)] }));
|
|
90
83
|
}
|
|
91
84
|
exports.renderEjs = renderEjs;
|
|
92
85
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAsB;AACtB,gDAAwB;AAExB,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,YAAY,cAAc,EAAE;QACnC,mBAAmB;QACnB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;KACzB;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAC/B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACtD;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QACjE,OAAO,aAAG,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;KACrC;SAAM,IAAI,KAAK,IAAI,IAAI,EAAE;QACxB,sCAAsC;QACtC,OAAO,EAAE,CAAC;KACX;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QACpC,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;KACpF;SAAM;QACL,gDAAgD;QAChD,OAAO,EAAE,CAAC;KACX;AACH,CAAC;AAED,8DAA8D;AAC9D,MAAa,cAAc;IAIzB,YAAY,OAA8B,EAAE,MAAiB;QAC3D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;YAChD,OAAO,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;CACF;AAdD,wCAcC;AAED,SAAgB,IAAI,CAAC,OAA6B,EAAE,GAAG,MAAa;IAClE,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAFD,oBAEC;AAED;;;;GAIG;AACH,SAAgB,UAAU,CAAC,IAAoB;IAC7C,OAAO,UAAU,CAAC,aAAG,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC;AAFD,gCAEC;AAED;;;;;;GAMG;AACH,SAAgB,UAAU,CAAC,KAAa;IACtC,OAAO,IAAI,cAAc,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAFD,gCAEC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,SAAS,CAAC,QAAgB,EAAE,QAAgB,EAAE,OAAY,EAAE;IAC1E,OAAO,UAAU,CAAC,aAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACrF,CAAC;AAFD,8BAEC"}
|
package/dist/index.test.js
CHANGED
|
@@ -1,55 +1,50 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
chai_1.assert.equal((0, index_1.html)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["<p>", " and ", "</p>"], ["<p>", " and ", "</p>"])), 'cats', 'dogs').toString(), '<p>cats and dogs</p>');
|
|
15
|
-
});
|
|
16
|
-
it('escapes values when rendering array', function () {
|
|
17
|
-
var arr = ['cats>', '<dogs'];
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chai_1 = require("chai");
|
|
4
|
+
const index_1 = require("./index");
|
|
5
|
+
describe('html', () => {
|
|
6
|
+
it('escapes string value', () => {
|
|
7
|
+
chai_1.assert.equal((0, index_1.html) `<p>${'<script>'}</p>`.toString(), '<p><script></p>');
|
|
8
|
+
});
|
|
9
|
+
it('interpolates multiple values', () => {
|
|
10
|
+
chai_1.assert.equal((0, index_1.html) `<p>${'cats'} and ${'dogs'}</p>`.toString(), '<p>cats and dogs</p>');
|
|
11
|
+
});
|
|
12
|
+
it('escapes values when rendering array', () => {
|
|
13
|
+
const arr = ['cats>', '<dogs'];
|
|
18
14
|
chai_1.assert.equal(
|
|
19
15
|
// prettier-ignore
|
|
20
|
-
(0, index_1.html)
|
|
16
|
+
(0, index_1.html) `<ul>${arr}</ul>`.toString(), '<ul>cats><dogs</ul>');
|
|
21
17
|
});
|
|
22
|
-
it('does not double-escape values when rendering array',
|
|
23
|
-
|
|
18
|
+
it('does not double-escape values when rendering array', () => {
|
|
19
|
+
const arr = ['cats', 'dogs'];
|
|
24
20
|
chai_1.assert.equal(
|
|
25
21
|
// prettier-ignore
|
|
26
|
-
(0, index_1.html)
|
|
22
|
+
(0, index_1.html) `<ul>${arr.map((e) => (0, index_1.html) `<li>${e}</li>`)}</ul>`.toString(), '<ul><li>cats</li><li>dogs</li></ul>');
|
|
27
23
|
});
|
|
28
|
-
it('errors when interpolating object',
|
|
29
|
-
chai_1.assert.throws(
|
|
24
|
+
it('errors when interpolating object', () => {
|
|
25
|
+
chai_1.assert.throws(() => (0, index_1.html) `<p>${{ foo: 'bar' }}</p>`.toString(), 'Cannot interpolate object in template');
|
|
30
26
|
});
|
|
31
|
-
it('omits boolean values from template',
|
|
32
|
-
chai_1.assert.equal((0, index_1.html)
|
|
27
|
+
it('omits boolean values from template', () => {
|
|
28
|
+
chai_1.assert.equal((0, index_1.html) `<p>${true}${false}</p>`.toString(), '<p></p>');
|
|
33
29
|
});
|
|
34
|
-
it('omits nullish values from template',
|
|
35
|
-
chai_1.assert.equal((0, index_1.html)
|
|
30
|
+
it('omits nullish values from template', () => {
|
|
31
|
+
chai_1.assert.equal((0, index_1.html) `<p>${null}${undefined}</p>`.toString(), '<p></p>');
|
|
36
32
|
});
|
|
37
33
|
});
|
|
38
|
-
describe('escapeHtml',
|
|
39
|
-
it('escapes rendered HTML',
|
|
40
|
-
chai_1.assert.equal((0, index_1.escapeHtml)((0, index_1.html)
|
|
34
|
+
describe('escapeHtml', () => {
|
|
35
|
+
it('escapes rendered HTML', () => {
|
|
36
|
+
chai_1.assert.equal((0, index_1.escapeHtml)((0, index_1.html) `<p>Hello</p>`).toString(), '<p>Hello</p>');
|
|
41
37
|
});
|
|
42
|
-
it('works when nested inside html tag',
|
|
43
|
-
chai_1.assert.equal((0, index_1.html)
|
|
38
|
+
it('works when nested inside html tag', () => {
|
|
39
|
+
chai_1.assert.equal((0, index_1.html) `a${(0, index_1.escapeHtml)((0, index_1.html) `<p></p>`)}b`.toString(), 'a<p></p>b');
|
|
44
40
|
});
|
|
45
41
|
});
|
|
46
|
-
describe('renderEjs',
|
|
47
|
-
it('renders EJS template without data',
|
|
42
|
+
describe('renderEjs', () => {
|
|
43
|
+
it('renders EJS template without data', () => {
|
|
48
44
|
chai_1.assert.equal((0, index_1.renderEjs)(__filename, '<p>Hello</p>', {}).toString(), '<p>Hello</p>');
|
|
49
45
|
});
|
|
50
|
-
it('renders EJS template with data',
|
|
46
|
+
it('renders EJS template with data', () => {
|
|
51
47
|
chai_1.assert.equal((0, index_1.renderEjs)(__filename, '<p>Hello <%= name %></p>', { name: 'Divya' }).toString(), '<p>Hello Divya</p>');
|
|
52
48
|
});
|
|
53
49
|
});
|
|
54
|
-
var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9, templateObject_10, templateObject_11;
|
|
55
50
|
//# sourceMappingURL=index.test.js.map
|
package/dist/index.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prairielearn/html",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "tsc",
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
14
|
"@types/ejs": "^3.1.0",
|
|
15
|
-
"mocha": "^9.2.
|
|
16
|
-
"ts-node": "^10.
|
|
17
|
-
"typescript": "^4.
|
|
15
|
+
"mocha": "^9.2.2",
|
|
16
|
+
"ts-node": "^10.7.0",
|
|
17
|
+
"typescript": "^4.6.3"
|
|
18
18
|
}
|
|
19
19
|
}
|
package/tsconfig.json
CHANGED
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
"esModuleInterop": true,
|
|
6
6
|
"outDir": "./dist",
|
|
7
7
|
"rootDir": "src/",
|
|
8
|
-
"sourceMap": true
|
|
8
|
+
"sourceMap": true,
|
|
9
|
+
// This package will only be used server-side on Node 14+, so target the
|
|
10
|
+
// newest version of the ES spec that Node 14 supports.
|
|
11
|
+
"target": "ES2020",
|
|
12
|
+
// However, we don't yet make extensive use of ES Modules, so specifically
|
|
13
|
+
// compile `import`/`export` down to CommonJS.
|
|
14
|
+
"module": "CommonJS",
|
|
9
15
|
}
|
|
10
16
|
}
|