@prairielearn/browser-utils 2.6.2 → 2.7.0
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/CHANGELOG.md +18 -0
- package/dist/downloads.d.ts +0 -8
- package/dist/downloads.d.ts.map +1 -1
- package/dist/downloads.js +1 -1
- package/dist/downloads.js.map +1 -1
- package/dist/execute-scripts.d.ts +7 -0
- package/dist/execute-scripts.d.ts.map +1 -0
- package/dist/execute-scripts.js +16 -0
- package/dist/execute-scripts.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/downloads.ts +1 -1
- package/src/execute-scripts.ts +15 -0
- package/src/index.ts +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @prairielearn/browser-utils
|
|
2
2
|
|
|
3
|
+
## 2.7.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- ad329f9: Add `executeScripts` helper to re-execute script tags after innerHTML insertion
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- 7b937fb: Remove unused exports, add `@knipignore` for intentionally public exports, and re-export newly used symbols from `@prairielearn/formatter`.
|
|
12
|
+
|
|
13
|
+
## 2.6.3
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- 8bdf6ea: Upgrade all JavaScript dependencies
|
|
18
|
+
- Updated dependencies [8bdf6ea]
|
|
19
|
+
- @prairielearn/html@5.0.1
|
|
20
|
+
|
|
3
21
|
## 2.6.2
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
package/dist/downloads.d.ts
CHANGED
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Triggers a browser download of a text-based file.
|
|
3
|
-
*
|
|
4
|
-
* @param content The content of the file.
|
|
5
|
-
* @param filename The desired filename.
|
|
6
|
-
* @param mimeType The MIME type of the file.
|
|
7
|
-
*/
|
|
8
|
-
export declare function downloadTextFile(content: string, filename: string, mimeType: string): void;
|
|
9
1
|
/**
|
|
10
2
|
* Triggers a browser download of a JSON file.
|
|
11
3
|
*
|
package/dist/downloads.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloads.d.ts","sourceRoot":"","sources":["../src/downloads.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"downloads.d.ts","sourceRoot":"","sources":["../src/downloads.ts"],"names":[],"mappings":"AAsBA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGhE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGzF","sourcesContent":["import { stringify } from 'csv-stringify/browser/esm/sync';\n\n/**\n * Triggers a browser download of a text-based file.\n *\n * @param content The content of the file.\n * @param filename The desired filename.\n * @param mimeType The MIME type of the file.\n */\nfunction downloadTextFile(content: string, filename: string, mimeType: string): void {\n if (typeof window === 'undefined') return;\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.append(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n}\n\n/**\n * Triggers a browser download of a JSON file.\n *\n * @param data The data to be included in the JSON file.\n * @param filename The desired filename.\n */\nexport function downloadAsJSON(data: any, filename: string): void {\n const jsonContent = JSON.stringify(data, null, 2);\n downloadTextFile(jsonContent, filename, 'application/json');\n}\n\n/**\n * Triggers a browser download of a CSV file.\n *\n * @param header The header row of the CSV.\n * @param data The data rows of the CSV.\n * @param filename The desired filename.\n */\nexport function downloadAsCSV(header: string[], data: unknown[][], filename: string): void {\n const csvContent = stringify(data, { header: true, columns: header });\n downloadTextFile(csvContent, filename, 'text/csv');\n}\n"]}
|
package/dist/downloads.js
CHANGED
|
@@ -6,7 +6,7 @@ import { stringify } from 'csv-stringify/browser/esm/sync';
|
|
|
6
6
|
* @param filename The desired filename.
|
|
7
7
|
* @param mimeType The MIME type of the file.
|
|
8
8
|
*/
|
|
9
|
-
|
|
9
|
+
function downloadTextFile(content, filename, mimeType) {
|
|
10
10
|
if (typeof window === 'undefined')
|
|
11
11
|
return;
|
|
12
12
|
const blob = new Blob([content], { type: mimeType });
|
package/dist/downloads.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloads.js","sourceRoot":"","sources":["../src/downloads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D;;;;;;GAMG;AACH,
|
|
1
|
+
{"version":3,"file":"downloads.js","sourceRoot":"","sources":["../src/downloads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,OAAe,EAAE,QAAgB,EAAE,QAAgB,EAAQ;IACnF,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;IACb,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,KAAK,EAAE,CAAC;IACV,CAAC,CAAC,MAAM,EAAE,CAAC;IACX,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AAAA,CAC1B;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAS,EAAE,QAAgB,EAAQ;IAChE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAClD,gBAAgB,CAAC,WAAW,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AAAA,CAC7D;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,MAAgB,EAAE,IAAiB,EAAE,QAAgB,EAAQ;IACzF,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,gBAAgB,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAAA,CACpD","sourcesContent":["import { stringify } from 'csv-stringify/browser/esm/sync';\n\n/**\n * Triggers a browser download of a text-based file.\n *\n * @param content The content of the file.\n * @param filename The desired filename.\n * @param mimeType The MIME type of the file.\n */\nfunction downloadTextFile(content: string, filename: string, mimeType: string): void {\n if (typeof window === 'undefined') return;\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.append(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n}\n\n/**\n * Triggers a browser download of a JSON file.\n *\n * @param data The data to be included in the JSON file.\n * @param filename The desired filename.\n */\nexport function downloadAsJSON(data: any, filename: string): void {\n const jsonContent = JSON.stringify(data, null, 2);\n downloadTextFile(jsonContent, filename, 'application/json');\n}\n\n/**\n * Triggers a browser download of a CSV file.\n *\n * @param header The header row of the CSV.\n * @param data The data rows of the CSV.\n * @param filename The desired filename.\n */\nexport function downloadAsCSV(header: string[], data: unknown[][], filename: string): void {\n const csvContent = stringify(data, { header: true, columns: header });\n downloadTextFile(csvContent, filename, 'text/csv');\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-creates script elements within a container so the browser executes them.
|
|
3
|
+
* This is necessary because scripts inserted via `innerHTML` are not executed
|
|
4
|
+
* by the browser.
|
|
5
|
+
*/
|
|
6
|
+
export declare function executeScripts(container: Element): void;
|
|
7
|
+
//# sourceMappingURL=execute-scripts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-scripts.d.ts","sourceRoot":"","sources":["../src/execute-scripts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,OAAO,QAShD","sourcesContent":["/**\n * Re-creates script elements within a container so the browser executes them.\n * This is necessary because scripts inserted via `innerHTML` are not executed\n * by the browser.\n */\nexport function executeScripts(container: Element) {\n container.querySelectorAll('script').forEach((oldScript) => {\n const newScript = document.createElement('script');\n Array.from(oldScript.attributes).forEach((attr) => {\n newScript.setAttribute(attr.name, attr.value);\n });\n newScript.textContent = oldScript.textContent;\n oldScript.replaceWith(newScript);\n });\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-creates script elements within a container so the browser executes them.
|
|
3
|
+
* This is necessary because scripts inserted via `innerHTML` are not executed
|
|
4
|
+
* by the browser.
|
|
5
|
+
*/
|
|
6
|
+
export function executeScripts(container) {
|
|
7
|
+
container.querySelectorAll('script').forEach((oldScript) => {
|
|
8
|
+
const newScript = document.createElement('script');
|
|
9
|
+
Array.from(oldScript.attributes).forEach((attr) => {
|
|
10
|
+
newScript.setAttribute(attr.name, attr.value);
|
|
11
|
+
});
|
|
12
|
+
newScript.textContent = oldScript.textContent;
|
|
13
|
+
oldScript.replaceWith(newScript);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=execute-scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-scripts.js","sourceRoot":"","sources":["../src/execute-scripts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,SAAkB,EAAE;IACjD,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACjD,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAAA,CAC/C,CAAC,CAAC;QACH,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;QAC9C,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAAA,CAClC,CAAC,CAAC;AAAA,CACJ","sourcesContent":["/**\n * Re-creates script elements within a container so the browser executes them.\n * This is necessary because scripts inserted via `innerHTML` are not executed\n * by the browser.\n */\nexport function executeScripts(container: Element) {\n container.querySelectorAll('script').forEach((oldScript) => {\n const newScript = document.createElement('script');\n Array.from(oldScript.attributes).forEach((attr) => {\n newScript.setAttribute(attr.name, attr.value);\n });\n newScript.textContent = oldScript.textContent;\n oldScript.replaceWith(newScript);\n });\n}\n"]}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["export { onDocumentReady } from './on-document-ready.js';\nexport { parseHTML, parseHTMLElement } from './parse-html.js';\nexport { EncodedData, decodeData } from './encode-data.js';\nexport { templateFromAttributes } from './template-from-attributes.js';\nexport { type FocusTrap, trapFocus, focusFirstFocusableChild } from './focus.js';\nexport { downloadAsCSV, downloadAsJSON } from './downloads.js';\n"]}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["export { executeScripts } from './execute-scripts.js';\nexport { onDocumentReady } from './on-document-ready.js';\nexport { parseHTML, parseHTMLElement } from './parse-html.js';\nexport { EncodedData, decodeData } from './encode-data.js';\nexport { templateFromAttributes } from './template-from-attributes.js';\nexport { type FocusTrap, trapFocus, focusFirstFocusableChild } from './focus.js';\nexport { downloadAsCSV, downloadAsJSON } from './downloads.js';\n"]}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAkB,SAAS,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["export { onDocumentReady } from './on-document-ready.js';\nexport { parseHTML, parseHTMLElement } from './parse-html.js';\nexport { EncodedData, decodeData } from './encode-data.js';\nexport { templateFromAttributes } from './template-from-attributes.js';\nexport { type FocusTrap, trapFocus, focusFirstFocusableChild } from './focus.js';\nexport { downloadAsCSV, downloadAsJSON } from './downloads.js';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAkB,SAAS,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["export { executeScripts } from './execute-scripts.js';\nexport { onDocumentReady } from './on-document-ready.js';\nexport { parseHTML, parseHTMLElement } from './parse-html.js';\nexport { EncodedData, decodeData } from './encode-data.js';\nexport { templateFromAttributes } from './template-from-attributes.js';\nexport { type FocusTrap, trapFocus, focusFirstFocusableChild } from './focus.js';\nexport { downloadAsCSV, downloadAsJSON } from './downloads.js';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prairielearn/browser-utils",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.7.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
"dev": "tsgo --watch --preserveWatchOutput"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@prairielearn/html": "^5.0.
|
|
16
|
+
"@prairielearn/html": "^5.0.1",
|
|
17
17
|
"csv-stringify": "^6.6.0",
|
|
18
18
|
"js-base64": "^3.7.8"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@prairielearn/tsconfig": "^
|
|
22
|
-
"@typescript/native-preview": "^7.0.0-dev.
|
|
21
|
+
"@prairielearn/tsconfig": "^2.0.0",
|
|
22
|
+
"@typescript/native-preview": "^7.0.0-dev.20260203.1",
|
|
23
23
|
"typescript": "^5.9.3"
|
|
24
24
|
},
|
|
25
25
|
"sideEffects": false
|
package/src/downloads.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { stringify } from 'csv-stringify/browser/esm/sync';
|
|
|
7
7
|
* @param filename The desired filename.
|
|
8
8
|
* @param mimeType The MIME type of the file.
|
|
9
9
|
*/
|
|
10
|
-
|
|
10
|
+
function downloadTextFile(content: string, filename: string, mimeType: string): void {
|
|
11
11
|
if (typeof window === 'undefined') return;
|
|
12
12
|
const blob = new Blob([content], { type: mimeType });
|
|
13
13
|
const url = URL.createObjectURL(blob);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-creates script elements within a container so the browser executes them.
|
|
3
|
+
* This is necessary because scripts inserted via `innerHTML` are not executed
|
|
4
|
+
* by the browser.
|
|
5
|
+
*/
|
|
6
|
+
export function executeScripts(container: Element) {
|
|
7
|
+
container.querySelectorAll('script').forEach((oldScript) => {
|
|
8
|
+
const newScript = document.createElement('script');
|
|
9
|
+
Array.from(oldScript.attributes).forEach((attr) => {
|
|
10
|
+
newScript.setAttribute(attr.name, attr.value);
|
|
11
|
+
});
|
|
12
|
+
newScript.textContent = oldScript.textContent;
|
|
13
|
+
oldScript.replaceWith(newScript);
|
|
14
|
+
});
|
|
15
|
+
}
|
package/src/index.ts
CHANGED