@angular/ssr 17.0.0-next.3 → 17.0.0-next.4
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/esm2022/src/common-engine.mjs +6 -3
- package/esm2022/src/inline-css-processor.mjs +50 -46
- package/fesm2022/ssr.mjs +54 -47
- package/fesm2022/ssr.mjs.map +1 -1
- package/package.json +4 -1
- package/schematics/ng-add/files/application-builder/server.ts.template +53 -0
- package/schematics/ng-add/files/{server.ts.template → server-builder/server.ts.template} +2 -2
- package/schematics/ng-add/index.d.ts +2 -2
- package/schematics/ng-add/index.js +75 -32
- package/schematics/ng-add/index.mjs +76 -33
- package/schematics/ng-add/schema.d.ts +0 -12
- package/schematics/ng-add/schema.js +1 -1
- package/schematics/ng-add/schema.json +0 -17
- package/schematics/ng-add/schema.mjs +1 -1
|
@@ -17,11 +17,14 @@ const SSG_MARKER_REGEXP = /ng-server-context=["']\w*\|?ssg\|?\w*["']/;
|
|
|
17
17
|
* the document loader
|
|
18
18
|
*/
|
|
19
19
|
export class CommonEngine {
|
|
20
|
+
bootstrap;
|
|
21
|
+
providers;
|
|
22
|
+
templateCache = new Map();
|
|
23
|
+
inlineCriticalCssProcessor;
|
|
24
|
+
pageIsSSG = new Map();
|
|
20
25
|
constructor(bootstrap, providers = []) {
|
|
21
26
|
this.bootstrap = bootstrap;
|
|
22
27
|
this.providers = providers;
|
|
23
|
-
this.templateCache = new Map();
|
|
24
|
-
this.pageIsSSG = new Map();
|
|
25
28
|
this.inlineCriticalCssProcessor = new InlineCriticalCssProcessor({
|
|
26
29
|
minify: false,
|
|
27
30
|
});
|
|
@@ -128,4 +131,4 @@ function canParseUrl(url) {
|
|
|
128
131
|
return false;
|
|
129
132
|
}
|
|
130
133
|
}
|
|
131
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLWVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXIvc3NyL3NyYy9jb21tb24tZW5naW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUdILE9BQU8sRUFDTCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixlQUFlLEdBQ2hCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDN0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRSxNQUFNLGlCQUFpQixHQUFHLDJDQUEyQyxDQUFDO0FBb0J0RTs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFLdkIsWUFDVSxTQUFzRCxFQUN0RCxZQUE4QixFQUFFO1FBRGhDLGNBQVMsR0FBVCxTQUFTLENBQTZDO1FBQ3RELGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBTnpCLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFFMUMsY0FBUyxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO1FBTXRELElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLDBCQUEwQixDQUFDO1lBQy9ELE1BQU0sRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBK0I7UUFDMUMsTUFBTSxFQUFFLGlCQUFpQixHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFL0MsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFB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QztRQUVsRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBQUMsTUFBTTtRQUNOLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7QUFDSCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxtRkFBbUY7SUFDbkYsT0FBTyxPQUFPLEtBQUssS0FBSyxVQUFVLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLFNBQVMsV0FBVyxDQUFDLEdBQVc7SUFDOUIsSUFBSTtRQUNGLE9BQU8sQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3ZCO0lBQUMsTUFBTTtRQUNOLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7IEFwcGxpY2F0aW9uUmVmLCBTdGF0aWNQcm92aWRlciwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSU5JVElBTF9DT05GSUcsXG4gIHJlbmRlckFwcGxpY2F0aW9uLFxuICByZW5kZXJNb2R1bGUsXG4gIMm1U0VSVkVSX0NPTlRFWFQsXG59IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLXNlcnZlcic7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGRpcm5hbWUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzb3IgfSBmcm9tICcuL2lubGluZS1jc3MtcHJvY2Vzc29yJztcblxuY29uc3QgU1NHX01BUktFUl9SRUdFWFAgPSAvbmctc2VydmVyLWNvbnRleHQ9W1wiJ11cXHcqXFx8P3NzZ1xcfD9cXHcqW1wiJ10vO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbkVuZ2luZVJlbmRlck9wdGlvbnMge1xuICBib290c3RyYXA/OiBUeXBlPHt9PiB8ICgoKSA9PiBQcm9taXNlPEFwcGxpY2F0aW9uUmVmPik7XG4gIHByb3ZpZGVycz86IFN0YXRpY1Byb3ZpZGVyW107XG4gIHVybD86IHN0cmluZztcbiAgZG9jdW1lbnQ/OiBzdHJpbmc7XG4gIGRvY3VtZW50RmlsZVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZWR1Y2UgcmVuZGVyIGJsb2NraW5nIHJlcXVlc3RzIGJ5IGlubGluaW5nIGNyaXRpY2FsIENTUy5cbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICovXG4gIGlubGluZUNyaXRpY2FsQ3NzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBsb2NhdGlvbiBvZiBpbmRleCBmaWxlLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgJ2RvY3VtZW50RmlsZVBhdGgnIGRpcm5hbWUgd2hlbiBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBwdWJsaWNQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgY29tbW9uIHJlbmRlcmluZyBlbmdpbmUgdXRpbGl0eS4gVGhpcyBhYnN0cmFjdHMgdGhlIGxvZ2ljXG4gKiBmb3IgaGFuZGxpbmcgdGhlIHBsYXRmb3JtU2VydmVyIGNvbXBpbGVyLCB0aGUgbW9kdWxlIGNhY2hlLCBhbmRcbiAqIHRoZSBkb2N1bWVudCBsb2FkZXJcbiAqL1xuZXhwb3J0IGNsYXNzIENvbW1vbkVuZ2luZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzb3I6IElubGluZUNyaXRpY2FsQ3NzUHJvY2Vzc29yO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VJc1NTRyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYm9vdHN0cmFwPzogVHlwZTx7fT4gfCAoKCkgPT4gUHJvbWlzZTxBcHBsaWNhdGlvblJlZj4pLFxuICAgIHByaXZhdGUgcHJvdmlkZXJzOiBTdGF0aWNQcm92aWRlcltdID0gW10sXG4gICkge1xuICAgIHRoaXMuaW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzb3IgPSBuZXcgSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzb3Ioe1xuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYW4gSFRNTCBkb2N1bWVudCBmb3IgYSBzcGVjaWZpYyBVUkwgd2l0aCBzcGVjaWZpZWRcbiAgICogcmVuZGVyIG9wdGlvbnNcbiAgICovXG4gIGFzeW5jIHJlbmRlcihvcHRzOiBDb21tb25FbmdpbmVSZW5kZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGlubGluZUNyaXRpY2FsQ3NzID0gdHJ1ZSwgdXJsIH0gPSBvcHRzO1xuXG4gICAgaWYgKG9wdHMucHVibGljUGF0aCAmJiBvcHRzLmRvY3VtZW50RmlsZVBhdGggJiYgdXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHBhdGhuYW1lID0gY2FuUGFyc2VVcmwodXJsKSA/IG5ldyBVUkwodXJsKS5wYXRobmFtZSA6IHVybDtcbiAgICAgIC8vIFJlbW92ZSBsZWFkaW5nIGZvcndhcmQgc2xhc2guXG4gICAgICBjb25zdCBwYWdlUGF0aCA9IHJlc29sdmUob3B0cy5wdWJsaWNQYXRoLCBwYXRobmFtZS5zdWJzdHJpbmcoMSksICdpbmRleC5odG1sJyk7XG5cbiAgICAgIGlmIChwYWdlUGF0aCAhPT0gcmVzb2x2ZShvcHRzLmRvY3VtZW50RmlsZVBhdGgpKSB7XG4gICAgICAgIC8vIFZpZXcgcGF0aCBkb2Vzbid0IG1hdGNoIHdpdGggcHJlcmVuZGVyIHBhdGguXG4gICAgICAgIGNvbnN0IHBhZ2VJc1NTRyA9IHRoaXMucGFnZUlzU1NHLmdldChwYWdlUGF0aCk7XG4gICAgICAgIGlmIChwYWdlSXNTU0cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChhd2FpdCBleGlzdHMocGFnZVBhdGgpKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFnZVBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgICAgY29uc3QgaXNTU0cgPSBTU0dfTUFSS0VSX1JFR0VYUC50ZXN0KGNvbnRlbnQpO1xuICAgICAgICAgICAgdGhpcy5wYWdlSXNTU0cuc2V0KHBhZ2VQYXRoLCBpc1NTRyk7XG5cbiAgICAgICAgICAgIGlmIChpc1NTRykge1xuICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYWdlSXNTU0cuc2V0KHBhZ2VQYXRoLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhZ2VJc1NTRykge1xuICAgICAgICAgIC8vIFNlcnZlIHByZS1yZW5kZXJlZCBwYWdlLlxuICAgICAgICAgIHJldHVybiBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWdlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiBvcHRzLmRvY3VtZW50IGRvc2VuJ3QgZXhpc3QgdGhlbiBvcHRzLmRvY3VtZW50RmlsZVBhdGggbXVzdFxuICAgIGNvbnN0IGV4dHJhUHJvdmlkZXJzOiBTdGF0aWNQcm92aWRlcltdID0gW1xuICAgICAgeyBwcm92aWRlOiDJtVNFUlZFUl9DT05URVhULCB1c2VWYWx1ZTogJ3NzcicgfSxcbiAgICAgIC4uLihvcHRzLnByb3ZpZGVycyA/PyBbXSksXG4gICAgICAuLi50aGlzLnByb3ZpZGVycyxcbiAgICBdO1xuXG4gICAgbGV0IGRvY3VtZW50ID0gb3B0cy5kb2N1bWVudDtcbiAgICBpZiAoIWRvY3VtZW50ICYmIG9wdHMuZG9jdW1lbnRGaWxlUGF0aCkge1xuICAgICAgZG9jdW1lbnQgPSBhd2FpdCB0aGlzLmdldERvY3VtZW50KG9wdHMuZG9jdW1lbnRGaWxlUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3VtZW50KSB7XG4gICAgICBleHRyYVByb3ZpZGVycy5wdXNoKHtcbiAgICAgICAgcHJvdmlkZTogSU5JVElBTF9DT05GSUcsXG4gICAgICAgIHVzZVZhbHVlOiB7XG4gICAgICAgICAgZG9jdW1lbnQsXG4gICAgICAgICAgdXJsOiBvcHRzLnVybCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZHVsZU9yRmFjdG9yeSA9IHRoaXMuYm9vdHN0cmFwIHx8IG9wdHMuYm9vdHN0cmFwO1xuICAgIGlmICghbW9kdWxlT3JGYWN0b3J5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgbW9kdWxlIG9yIGJvb3RzdHJhcCBvcHRpb24gbXVzdCBiZSBwcm92aWRlZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBodG1sID0gYXdhaXQgKGlzQm9vdHN0cmFwRm4obW9kdWxlT3JGYWN0b3J5KVxuICAgICAgPyByZW5kZXJBcHBsaWNhdGlvbihtb2R1bGVPckZhY3RvcnksIHsgcGxhdGZvcm1Qcm92aWRlcnM6IGV4dHJhUHJvdmlkZXJzIH0pXG4gICAgICA6IHJlbmRlck1vZHVsZShtb2R1bGVPckZhY3RvcnksIHsgZXh0cmFQcm92aWRlcnMgfSkpO1xuXG4gICAgaWYgKCFpbmxpbmVDcml0aWNhbENzcykge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb250ZW50LCBlcnJvcnMsIHdhcm5pbmdzIH0gPSBhd2FpdCB0aGlzLmlubGluZUNyaXRpY2FsQ3NzUHJvY2Vzc29yLnByb2Nlc3MoaHRtbCwge1xuICAgICAgb3V0cHV0UGF0aDogb3B0cy5wdWJsaWNQYXRoID8/IChvcHRzLmRvY3VtZW50RmlsZVBhdGggPyBkaXJuYW1lKG9wdHMuZG9jdW1lbnRGaWxlUGF0aCkgOiAnJyksXG4gICAgfSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIHdhcm5pbmdzPy5mb3JFYWNoKChtKSA9PiBjb25zb2xlLndhcm4obSkpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgZXJyb3JzPy5mb3JFYWNoKChtKSA9PiBjb25zb2xlLmVycm9yKG0pKTtcblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgLyoqIFJldHJpZXZlIHRoZSBkb2N1bWVudCBmcm9tIHRoZSBjYWNoZSBvciB0aGUgZmlsZXN5c3RlbSAqL1xuICBwcml2YXRlIGFzeW5jIGdldERvY3VtZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBkb2MgPSB0aGlzLnRlbXBsYXRlQ2FjaGUuZ2V0KGZpbGVQYXRoKTtcblxuICAgIGlmICghZG9jKSB7XG4gICAgICBkb2MgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICB0aGlzLnRlbXBsYXRlQ2FjaGUuc2V0KGZpbGVQYXRoLCBkb2MpO1xuICAgIH1cblxuICAgIHJldHVybiBkb2M7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhpc3RzKHBhdGg6IGZzLlBhdGhMaWtlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuYWNjZXNzKHBhdGgsIGZzLmNvbnN0YW50cy5GX09LKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNCb290c3RyYXBGbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzICgpID0+IFByb21pc2U8QXBwbGljYXRpb25SZWY+IHtcbiAgLy8gV2UgY2FuIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG1vZHVsZSBhbmQgYSBib290c3RyYXAgZnVuY3Rpb24gYnkgcmVhZGluZyBgY21wYDpcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhKCfJtW1vZCcgaW4gdmFsdWUpO1xufVxuXG4vLyBUaGUgYmVsb3cgY2FuIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgVVJMLmNhblBhcnNlKCkgd2hlbiBOb2RlLmpzIDE4IGlzIGRyb3BwZWRcbmZ1bmN0aW9uIGNhblBhcnNlVXJsKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhbmV3IFVSTCh1cmwpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLWVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXIvc3NyL3NyYy9jb21tb24tZW5naW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUdILE9BQU8sRUFDTCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixlQUFlLEdBQ2hCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDN0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRSxNQUFNLGlCQUFpQixHQUFHLDJDQUEyQyxDQUFDO0FBb0J0RTs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFNYjtJQUNBO0lBTk8sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQzFDLDBCQUEwQixDQUE2QjtJQUN2RCxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFFeEQsWUFDVSxTQUFzRCxFQUN0RCxZQUE4QixFQUFFO1FBRGhDLGNBQVMsR0FBVCxTQUFTLENBQTZDO1FBQ3RELGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBRXhDLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLDBCQUEwQixDQUFDO1lBQy9ELE1BQU0sRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBK0I7UUFDMUMsTUFBTSxFQUFFLGlCQUFpQixHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFL0MsSUFBSSxJQUFJLENBQUMsVUFB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QUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBQUMsTUFBTTtRQUNOLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7QUFDSCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxtRkFBbUY7SUFDbkYsT0FBTyxPQUFPLEtBQUssS0FBSyxVQUFVLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLFNBQVMsV0FBVyxDQUFDLEdBQVc7SUFDOUIsSUFBSTtRQUNGLE9BQU8sQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3ZCO0lBQUMsTUFBTTtRQUNOLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7IEFwcGxpY2F0aW9uUmVmLCBTdGF0aWNQcm92aWRlciwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSU5JVElBTF9DT05GSUcsXG4gIHJlbmRlckFwcGxpY2F0aW9uLFxuICByZW5kZXJNb2R1bGUsXG4gIMm1U0VSVkVSX0NPTlRFWFQsXG59IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLXNlcnZlcic7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGRpcm5hbWUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzb3IgfSBmcm9tICcuL2lubGluZS1jc3MtcHJvY2Vzc29yJztcblxuY29uc3QgU1NHX01BUktFUl9SRUdFWFAgPSAvbmctc2VydmVyLWNvbnRleHQ9W1wiJ11cXHcqXFx8P3NzZ1xcfD9cXHcqW1wiJ10vO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbkVuZ2luZVJlbmRlck9wdGlvbnMge1xuICBib290c3RyYXA/OiBUeXBlPHt9PiB8ICgoKSA9PiBQcm9taXNlPEFwcGxpY2F0aW9uUmVmPik7XG4gIHByb3ZpZGVycz86IFN0YXRpY1Byb3ZpZGVyW107XG4gIHVybD86IHN0cmluZztcbiAgZG9jdW1lbnQ/OiBzdHJpbmc7XG4gIGRvY3VtZW50RmlsZVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZWR1Y2UgcmVuZGVyIGJsb2NraW5nIHJlcXVlc3RzIGJ5IGlubGluaW5nIGNyaXRpY2FsIENTUy5cbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICovXG4gIGlubGluZUNyaXRpY2FsQ3NzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBsb2NhdGlvbiBvZiBpbmRleCBmaWxlLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgJ2RvY3VtZW50RmlsZVBhdGgnIGRpcm5hbWUgd2hlbiBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBwdWJsaWNQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgY29tbW9uIHJlbmRlcmluZyBlbmdpbmUgdXRpbGl0eS4gVGhpcyBhYnN0cmFjdHMgdGhlIGxvZ2ljXG4gKiBmb3IgaGFuZGxpbmcgdGhlIHBsYXRmb3JtU2VydmVyIGNvbXBpbGVyLCB0aGUgbW9kdWxlIGNhY2hlLCBhbmRcbiAqIHRoZSBkb2N1bWVudCBsb2FkZXJcbiAqL1xuZXhwb3J0IGNsYXNzIENvbW1vbkVuZ2luZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzb3I6IElubGluZUNyaXRpY2FsQ3NzUHJvY2Vzc29yO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VJc1NTRyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYm9vdHN0cmFwPzogVHlwZTx7fT4gfCAoKCkgPT4gUHJvbWlzZTxBcHBsaWNhdGlvblJlZj4pLFxuICAgIHByaXZhdGUgcHJvdmlkZXJzOiBTdGF0aWNQcm92aWRlcltdID0gW10sXG4gICkge1xuICAgIHRoaXMuaW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzb3IgPSBuZXcgSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzb3Ioe1xuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYW4gSFRNTCBkb2N1bWVudCBmb3IgYSBzcGVjaWZpYyBVUkwgd2l0aCBzcGVjaWZpZWRcbiAgICogcmVuZGVyIG9wdGlvbnNcbiAgICovXG4gIGFzeW5jIHJlbmRlcihvcHRzOiBDb21tb25FbmdpbmVSZW5kZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGlubGluZUNyaXRpY2FsQ3NzID0gdHJ1ZSwgdXJsIH0gPSBvcHRzO1xuXG4gICAgaWYgKG9wdHMucHVibGljUGF0aCAmJiBvcHRzLmRvY3VtZW50RmlsZVBhdGggJiYgdXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHBhdGhuYW1lID0gY2FuUGFyc2VVcmwodXJsKSA/IG5ldyBVUkwodXJsKS5wYXRobmFtZSA6IHVybDtcbiAgICAgIC8vIFJlbW92ZSBsZWFkaW5nIGZvcndhcmQgc2xhc2guXG4gICAgICBjb25zdCBwYWdlUGF0aCA9IHJlc29sdmUob3B0cy5wdWJsaWNQYXRoLCBwYXRobmFtZS5zdWJzdHJpbmcoMSksICdpbmRleC5odG1sJyk7XG5cbiAgICAgIGlmIChwYWdlUGF0aCAhPT0gcmVzb2x2ZShvcHRzLmRvY3VtZW50RmlsZVBhdGgpKSB7XG4gICAgICAgIC8vIFZpZXcgcGF0aCBkb2Vzbid0IG1hdGNoIHdpdGggcHJlcmVuZGVyIHBhdGguXG4gICAgICAgIGNvbnN0IHBhZ2VJc1NTRyA9IHRoaXMucGFnZUlzU1NHLmdldChwYWdlUGF0aCk7XG4gICAgICAgIGlmIChwYWdlSXNTU0cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChhd2FpdCBleGlzdHMocGFnZVBhdGgpKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFnZVBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgICAgY29uc3QgaXNTU0cgPSBTU0dfTUFSS0VSX1JFR0VYUC50ZXN0KGNvbnRlbnQpO1xuICAgICAgICAgICAgdGhpcy5wYWdlSXNTU0cuc2V0KHBhZ2VQYXRoLCBpc1NTRyk7XG5cbiAgICAgICAgICAgIGlmIChpc1NTRykge1xuICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYWdlSXNTU0cuc2V0KHBhZ2VQYXRoLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhZ2VJc1NTRykge1xuICAgICAgICAgIC8vIFNlcnZlIHByZS1yZW5kZXJlZCBwYWdlLlxuICAgICAgICAgIHJldHVybiBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWdlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiBvcHRzLmRvY3VtZW50IGRvc2VuJ3QgZXhpc3QgdGhlbiBvcHRzLmRvY3VtZW50RmlsZVBhdGggbXVzdFxuICAgIGNvbnN0IGV4dHJhUHJvdmlkZXJzOiBTdGF0aWNQcm92aWRlcltdID0gW1xuICAgICAgeyBwcm92aWRlOiDJtVNFUlZFUl9DT05URVhULCB1c2VWYWx1ZTogJ3NzcicgfSxcbiAgICAgIC4uLihvcHRzLnByb3ZpZGVycyA/PyBbXSksXG4gICAgICAuLi50aGlzLnByb3ZpZGVycyxcbiAgICBdO1xuXG4gICAgbGV0IGRvY3VtZW50ID0gb3B0cy5kb2N1bWVudDtcbiAgICBpZiAoIWRvY3VtZW50ICYmIG9wdHMuZG9jdW1lbnRGaWxlUGF0aCkge1xuICAgICAgZG9jdW1lbnQgPSBhd2FpdCB0aGlzLmdldERvY3VtZW50KG9wdHMuZG9jdW1lbnRGaWxlUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3VtZW50KSB7XG4gICAgICBleHRyYVByb3ZpZGVycy5wdXNoKHtcbiAgICAgICAgcHJvdmlkZTogSU5JVElBTF9DT05GSUcsXG4gICAgICAgIHVzZVZhbHVlOiB7XG4gICAgICAgICAgZG9jdW1lbnQsXG4gICAgICAgICAgdXJsOiBvcHRzLnVybCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZHVsZU9yRmFjdG9yeSA9IHRoaXMuYm9vdHN0cmFwIHx8IG9wdHMuYm9vdHN0cmFwO1xuICAgIGlmICghbW9kdWxlT3JGYWN0b3J5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgbW9kdWxlIG9yIGJvb3RzdHJhcCBvcHRpb24gbXVzdCBiZSBwcm92aWRlZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBodG1sID0gYXdhaXQgKGlzQm9vdHN0cmFwRm4obW9kdWxlT3JGYWN0b3J5KVxuICAgICAgPyByZW5kZXJBcHBsaWNhdGlvbihtb2R1bGVPckZhY3RvcnksIHsgcGxhdGZvcm1Qcm92aWRlcnM6IGV4dHJhUHJvdmlkZXJzIH0pXG4gICAgICA6IHJlbmRlck1vZHVsZShtb2R1bGVPckZhY3RvcnksIHsgZXh0cmFQcm92aWRlcnMgfSkpO1xuXG4gICAgaWYgKCFpbmxpbmVDcml0aWNhbENzcykge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb250ZW50LCBlcnJvcnMsIHdhcm5pbmdzIH0gPSBhd2FpdCB0aGlzLmlubGluZUNyaXRpY2FsQ3NzUHJvY2Vzc29yLnByb2Nlc3MoaHRtbCwge1xuICAgICAgb3V0cHV0UGF0aDogb3B0cy5wdWJsaWNQYXRoID8/IChvcHRzLmRvY3VtZW50RmlsZVBhdGggPyBkaXJuYW1lKG9wdHMuZG9jdW1lbnRGaWxlUGF0aCkgOiAnJyksXG4gICAgfSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIHdhcm5pbmdzPy5mb3JFYWNoKChtKSA9PiBjb25zb2xlLndhcm4obSkpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgZXJyb3JzPy5mb3JFYWNoKChtKSA9PiBjb25zb2xlLmVycm9yKG0pKTtcblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgLyoqIFJldHJpZXZlIHRoZSBkb2N1bWVudCBmcm9tIHRoZSBjYWNoZSBvciB0aGUgZmlsZXN5c3RlbSAqL1xuICBwcml2YXRlIGFzeW5jIGdldERvY3VtZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBkb2MgPSB0aGlzLnRlbXBsYXRlQ2FjaGUuZ2V0KGZpbGVQYXRoKTtcblxuICAgIGlmICghZG9jKSB7XG4gICAgICBkb2MgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICB0aGlzLnRlbXBsYXRlQ2FjaGUuc2V0KGZpbGVQYXRoLCBkb2MpO1xuICAgIH1cblxuICAgIHJldHVybiBkb2M7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhpc3RzKHBhdGg6IGZzLlBhdGhMaWtlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuYWNjZXNzKHBhdGgsIGZzLmNvbnN0YW50cy5GX09LKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNCb290c3RyYXBGbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzICgpID0+IFByb21pc2U8QXBwbGljYXRpb25SZWY+IHtcbiAgLy8gV2UgY2FuIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG1vZHVsZSBhbmQgYSBib290c3RyYXAgZnVuY3Rpb24gYnkgcmVhZGluZyBgY21wYDpcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhKCfJtW1vZCcgaW4gdmFsdWUpO1xufVxuXG4vLyBUaGUgYmVsb3cgY2FuIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgVVJMLmNhblBhcnNlKCkgd2hlbiBOb2RlLmpzIDE4IGlzIGRyb3BwZWRcbmZ1bmN0aW9uIGNhblBhcnNlVXJsKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhbmV3IFVSTCh1cmwpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -36,6 +36,13 @@ const LINK_LOAD_SCRIPT_CONTENT = [
|
|
|
36
36
|
`})();`,
|
|
37
37
|
].join('\n');
|
|
38
38
|
class CrittersExtended extends Critters {
|
|
39
|
+
optionsExtended;
|
|
40
|
+
resourceCache;
|
|
41
|
+
warnings = [];
|
|
42
|
+
errors = [];
|
|
43
|
+
initialEmbedLinkedStylesheet;
|
|
44
|
+
addedCspScriptsDocuments = new WeakSet();
|
|
45
|
+
documentNonces = new WeakMap();
|
|
39
46
|
constructor(optionsExtended, resourceCache) {
|
|
40
47
|
super({
|
|
41
48
|
logger: {
|
|
@@ -58,50 +65,6 @@ class CrittersExtended extends Critters {
|
|
|
58
65
|
});
|
|
59
66
|
this.optionsExtended = optionsExtended;
|
|
60
67
|
this.resourceCache = resourceCache;
|
|
61
|
-
this.warnings = [];
|
|
62
|
-
this.errors = [];
|
|
63
|
-
this.addedCspScriptsDocuments = new WeakSet();
|
|
64
|
-
this.documentNonces = new WeakMap();
|
|
65
|
-
/**
|
|
66
|
-
* Override of the Critters `embedLinkedStylesheet` method
|
|
67
|
-
* that makes it work with Angular's CSP APIs.
|
|
68
|
-
*/
|
|
69
|
-
this.embedLinkedStylesheetOverride = async (link, document) => {
|
|
70
|
-
if (link.getAttribute('media') === 'print' && link.next?.name === 'noscript') {
|
|
71
|
-
// Workaround for https://github.com/GoogleChromeLabs/critters/issues/64
|
|
72
|
-
// NB: this is only needed for the webpack based builders.
|
|
73
|
-
const media = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);
|
|
74
|
-
if (media) {
|
|
75
|
-
link.removeAttribute('onload');
|
|
76
|
-
link.setAttribute('media', media[1]);
|
|
77
|
-
link?.next?.remove();
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
const returnValue = await this.initialEmbedLinkedStylesheet(link, document);
|
|
81
|
-
const cspNonce = this.findCspNonce(document);
|
|
82
|
-
if (cspNonce) {
|
|
83
|
-
const crittersMedia = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);
|
|
84
|
-
if (crittersMedia) {
|
|
85
|
-
// If there's a Critters-generated `onload` handler and the file has an Angular CSP nonce,
|
|
86
|
-
// we have to remove the handler, because it's incompatible with CSP. We save the value
|
|
87
|
-
// in a different attribute and we generate a script tag with the nonce that uses
|
|
88
|
-
// `addEventListener` to apply the media query instead.
|
|
89
|
-
link.removeAttribute('onload');
|
|
90
|
-
link.setAttribute(CSP_MEDIA_ATTR, crittersMedia[1]);
|
|
91
|
-
this.conditionallyInsertCspLoadingScript(document, cspNonce);
|
|
92
|
-
}
|
|
93
|
-
// Ideally we would hook in at the time Critters inserts the `style` tags, but there isn't
|
|
94
|
-
// a way of doing that at the moment so we fall back to doing it any time a `link` tag is
|
|
95
|
-
// inserted. We mitigate it by only iterating the direct children of the `<head>` which
|
|
96
|
-
// should be pretty shallow.
|
|
97
|
-
document.head.children.forEach((child) => {
|
|
98
|
-
if (child.tagName === 'style' && !child.hasAttribute('nonce')) {
|
|
99
|
-
child.setAttribute('nonce', cspNonce);
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
return returnValue;
|
|
104
|
-
};
|
|
105
68
|
// We can't use inheritance to override `embedLinkedStylesheet`, because it's not declared in
|
|
106
69
|
// the `Critters` .d.ts which means that we can't call the `super` implementation. TS doesn't
|
|
107
70
|
// allow for `super` to be cast to a different type.
|
|
@@ -116,6 +79,46 @@ class CrittersExtended extends Critters {
|
|
|
116
79
|
}
|
|
117
80
|
return resourceContent;
|
|
118
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Override of the Critters `embedLinkedStylesheet` method
|
|
84
|
+
* that makes it work with Angular's CSP APIs.
|
|
85
|
+
*/
|
|
86
|
+
embedLinkedStylesheetOverride = async (link, document) => {
|
|
87
|
+
if (link.getAttribute('media') === 'print' && link.next?.name === 'noscript') {
|
|
88
|
+
// Workaround for https://github.com/GoogleChromeLabs/critters/issues/64
|
|
89
|
+
// NB: this is only needed for the webpack based builders.
|
|
90
|
+
const media = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);
|
|
91
|
+
if (media) {
|
|
92
|
+
link.removeAttribute('onload');
|
|
93
|
+
link.setAttribute('media', media[1]);
|
|
94
|
+
link?.next?.remove();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const returnValue = await this.initialEmbedLinkedStylesheet(link, document);
|
|
98
|
+
const cspNonce = this.findCspNonce(document);
|
|
99
|
+
if (cspNonce) {
|
|
100
|
+
const crittersMedia = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);
|
|
101
|
+
if (crittersMedia) {
|
|
102
|
+
// If there's a Critters-generated `onload` handler and the file has an Angular CSP nonce,
|
|
103
|
+
// we have to remove the handler, because it's incompatible with CSP. We save the value
|
|
104
|
+
// in a different attribute and we generate a script tag with the nonce that uses
|
|
105
|
+
// `addEventListener` to apply the media query instead.
|
|
106
|
+
link.removeAttribute('onload');
|
|
107
|
+
link.setAttribute(CSP_MEDIA_ATTR, crittersMedia[1]);
|
|
108
|
+
this.conditionallyInsertCspLoadingScript(document, cspNonce);
|
|
109
|
+
}
|
|
110
|
+
// Ideally we would hook in at the time Critters inserts the `style` tags, but there isn't
|
|
111
|
+
// a way of doing that at the moment so we fall back to doing it any time a `link` tag is
|
|
112
|
+
// inserted. We mitigate it by only iterating the direct children of the `<head>` which
|
|
113
|
+
// should be pretty shallow.
|
|
114
|
+
document.head.children.forEach((child) => {
|
|
115
|
+
if (child.tagName === 'style' && !child.hasAttribute('nonce')) {
|
|
116
|
+
child.setAttribute('nonce', cspNonce);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return returnValue;
|
|
121
|
+
};
|
|
119
122
|
/**
|
|
120
123
|
* Finds the CSP nonce for a specific document.
|
|
121
124
|
*/
|
|
@@ -153,9 +156,10 @@ class CrittersExtended extends Critters {
|
|
|
153
156
|
}
|
|
154
157
|
}
|
|
155
158
|
export class InlineCriticalCssProcessor {
|
|
159
|
+
options;
|
|
160
|
+
resourceCache = new Map();
|
|
156
161
|
constructor(options) {
|
|
157
162
|
this.options = options;
|
|
158
|
-
this.resourceCache = new Map();
|
|
159
163
|
}
|
|
160
164
|
async process(html, options) {
|
|
161
165
|
const critters = new CrittersExtended({ ...this.options, ...options }, this.resourceCache);
|
|
@@ -167,4 +171,4 @@ export class InlineCriticalCssProcessor {
|
|
|
167
171
|
};
|
|
168
172
|
}
|
|
169
173
|
}
|
|
170
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLWNzcy1wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyL3Nzci9zcmMvaW5saW5lLWNzcy1wcm9jZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxRQUFRLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU1Qzs7R0FFRztBQUNILE1BQU0seUJBQXlCLEdBQUcsOEJBQThCLENBQUM7QUFFakU7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUM7QUFFcEM7O0dBRUc7QUFDSCxNQUFNLHdCQUF3QixHQUFHO0lBQy9CLFVBQVU7SUFDViw4RUFBOEU7SUFDOUUseUZBQXlGO0lBQ3pGLG9FQUFvRTtJQUNwRSw0Q0FBNEM7SUFDNUMsNkRBQTZEO0lBQzdELCtFQUErRTtJQUMvRSx3REFBd0QsY0FBYyxNQUFNO0lBQzVFLG1FQUFtRTtJQUNuRSx1REFBdUQ7SUFDdkQsK0NBQStDO0lBQy9DLGdDQUFnQztJQUNoQywyQkFBMkIsY0FBYywrQ0FBK0M7SUFDeEYsS0FBSztJQUNMLE9BQU87Q0FDUixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQThDYixNQUFNLGdCQUFpQixTQUFRLFFBQVE7SUFVckMsWUFDVyxlQUFvRixFQUM1RSxhQUFrQztRQUVuRCxLQUFLLENBQUM7WUFDSixNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLEtBQUssRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLEVBQUUsR0FBRyxFQUFF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TSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzVELFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUNuRSxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCBDcml0dGVycyBmcm9tICdjcml0dGVycyc7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG4vKipcbiAqIFBhdHRlcm4gdXNlZCB0byBleHRyYWN0IHRoZSBtZWRpYSBxdWVyeSBzZXQgYnkgQ3JpdHRlcnMgaW4gYW4gYG9ubG9hZGAgaGFuZGxlci5cbiAqL1xuY29uc3QgTUVESUFfU0VUX0hBTkRMRVJfUEFUVEVSTiA9IC9edGhpc1xcLm1lZGlhPVtcIiddKC4qKVtcIiddOz8kLztcblxuLyoqXG4gKiBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdXNlZCB0byBzYXZlIHRoZSBDcml0dGVycyBtZWRpYSBxdWVyeSBzbyBpdCBjYW4gYmUgcmUtYXNzaWduZWQgb24gbG9hZC5cbiAqL1xuY29uc3QgQ1NQX01FRElBX0FUVFIgPSAnbmdDc3BNZWRpYSc7XG5cbi8qKlxuICogU2NyaXB0IHRleHQgdXNlZCB0byBjaGFuZ2UgdGhlIG1lZGlhIHZhbHVlIG9mIHRoZSBsaW5rIHRhZ3MuXG4gKi9cbmNvbnN0IExJTktfTE9BRF9TQ1JJUFRfQ09OVEVOVCA9IFtcbiAgYCgoKSA9PiB7YCxcbiAgLy8gU2F2ZSB0aGUgYGNoaWxkcmVuYCBpbiBhIHZhcmlhYmxlIHNpbmNlIHRoZXkncmUgYSBsaXZlIERPTSBub2RlIGNvbGxlY3Rpb24uXG4gIC8vIFdlIGl0ZXJhdGUgb3ZlciB0aGUgZGlyZWN0IGRlc2NlbmRhbnRzLCBpbnN0ZWFkIG9mIGdvaW5nIHRocm91Z2ggYSBgcXVlcnlTZWxlY3RvckFsbGAsXG4gIC8vIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSB0YWdzIHdpbGwgYmUgZGlyZWN0bHkgaW5zaWRlIHRoZSBgaGVhZGAuXG4gIGAgIGNvbnN0IGNoaWxkcmVuID0gZG9jdW1lbnQuaGVhZC5jaGlsZHJlbjtgLFxuICAvLyBEZWNsYXJlIGBvbkxvYWRgIG91dHNpZGUgdGhlIGxvb3AgdG8gYXZvaWQgbGVha2luZyBtZW1vcnkuXG4gIC8vIENhbid0IGJlIGFuIGFycm93IGZ1bmN0aW9uLCBiZWNhdXNlIHdlIG5lZWQgYHRoaXNgIHRvIHJlZmVyIHRvIHRoZSBET00gbm9kZS5cbiAgYCAgZnVuY3Rpb24gb25Mb2FkKCkge3RoaXMubWVkaWEgPSB0aGlzLmdldEF0dHJpYnV0ZSgnJHtDU1BfTUVESUFfQVRUUn0nKTt9YCxcbiAgLy8gSGFzIHRvIHVzZSBhIHBsYWluIGZvciBsb29wLCBiZWNhdXNlIHNvbWUgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydFxuICAvLyBgZm9yRWFjaGAgb24gYGNoaWxkcmVuYCB3aGljaCBpcyBhIGBIVE1MQ29sbGVjdGlvbmAuXG4gIGAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtgLFxuICBgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07YCxcbiAgYCAgICBjaGlsZC5oYXNBdHRyaWJ1dGUoJyR7Q1NQX01FRElBX0FUVFJ9JykgJiYgY2hpbGQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7YCxcbiAgYCAgfWAsXG4gIGB9KSgpO2AsXG5dLmpvaW4oJ1xcbicpO1xuXG5leHBvcnQgaW50ZXJmYWNlIElubGluZUNyaXRpY2FsQ3NzUHJvY2Vzc09wdGlvbnMge1xuICBvdXRwdXRQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElubGluZUNyaXRpY2FsQ3NzUHJvY2Vzc29yT3B0aW9ucyB7XG4gIG1pbmlmeT86IGJvb2xlYW47XG4gIGRlcGxveVVybD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVDcml0aWNhbENzc1Jlc3VsdCB7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgd2FybmluZ3M/OiBzdHJpbmdbXTtcbiAgZXJyb3JzPzogc3RyaW5nW107XG59XG5cbi8qKiBQYXJ0aWFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGBIVE1MRWxlbWVudGAuICovXG5pbnRlcmZhY2UgUGFydGlhbEhUTUxFbGVtZW50IHtcbiAgZ2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGw7XG4gIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkO1xuICBoYXNBdHRyaWJ1dGUobmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgcmVtb3ZlQXR0cmlidXRlKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG4gIGFwcGVuZENoaWxkKGNoaWxkOiBQYXJ0aWFsSFRNTEVsZW1lbnQpOiB2b2lkO1xuICByZW1vdmUoKTogdm9pZDtcbiAgbmFtZTogc3RyaW5nO1xuICB0ZXh0Q29udGVudDogc3RyaW5nO1xuICB0YWdOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBjaGlsZHJlbjogUGFydGlhbEhUTUxFbGVtZW50W107XG4gIG5leHQ6IFBhcnRpYWxIVE1MRWxlbWVudCB8IG51bGw7XG4gIHByZXY6IFBhcnRpYWxIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbi8qKiBQYXJ0aWFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIEhUTUwgYERvY3VtZW50YC4gKi9cbmludGVyZmFjZSBQYXJ0aWFsRG9jdW1lbnQge1xuICBoZWFkOiBQYXJ0aWFsSFRNTEVsZW1lbnQ7XG4gIGNyZWF0ZUVsZW1lbnQodGFnTmFtZTogc3RyaW5nKTogUGFydGlhbEhUTUxFbGVtZW50O1xuICBxdWVyeVNlbGVjdG9yKHNlbGVjdG9yOiBzdHJpbmcpOiBQYXJ0aWFsSFRNTEVsZW1lbnQgfCBudWxsO1xufVxuXG4vKiogU2lnbmF0dXJlIG9mIHRoZSBgQ3JpdHRlcnMuZW1iZWRMaW5rZWRTdHlsZXNoZWV0YCBtZXRob2QuICovXG50eXBlIEVtYmVkTGlua2VkU3R5bGVzaGVldEZuID0gKFxuICBsaW5rOiBQYXJ0aWFsSFRNTEVsZW1lbnQsXG4gIGRvY3VtZW50OiBQYXJ0aWFsRG9jdW1lbnQsXG4pID0+IFByb21pc2U8dW5rbm93bj47XG5cbmNsYXNzIENyaXR0ZXJzRXh0ZW5kZWQgZXh0ZW5kcyBDcml0dGVycyB7XG4gIHJlYWRvbmx5IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICByZWFkb25seSBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgaW5pdGlhbEVtYmVkTGlua2VkU3R5bGVzaGVldDogRW1iZWRMaW5rZWRTdHlsZXNoZWV0Rm47XG4gIHByaXZhdGUgYWRkZWRDc3BTY3JpcHRzRG9jdW1lbnRzID0gbmV3IFdlYWtTZXQ8UGFydGlhbERvY3VtZW50PigpO1xuICBwcml2YXRlIGRvY3VtZW50Tm9uY2VzID0gbmV3IFdlYWtNYXA8UGFydGlhbERvY3VtZW50LCBzdHJpbmcgfCBudWxsPigpO1xuXG4gIC8vIEluaGVyaXRlZCBmcm9tIGBDcml0dGVyc2AsIGJ1dCBub3QgZXhwb3NlZCBpbiB0aGUgdHlwaW5ncy5cbiAgcHJvdGVjdGVkIGVtYmVkTGlua2VkU3R5bGVzaGVldCE6IEVtYmVkTGlua2VkU3R5bGVzaGVldEZuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IG9wdGlvbnNFeHRlbmRlZDogSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzb3JPcHRpb25zICYgSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzT3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlQ2FjaGU6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4gICkge1xuICAgIHN1cGVyKHtcbiAgICAgIGxvZ2dlcjoge1xuICAgICAgICB3YXJuOiAoczogc3RyaW5nKSA9PiB0aGlzLndhcm5pbmdzLnB1c2gocyksXG4gICAgICAgIGVycm9yOiAoczogc3RyaW5nKSA9PiB0aGlzLmVycm9ycy5wdXNoKHMpLFxuICAgICAgICBpbmZvOiAoKSA9PiB7fSxcbiAgICAgIH0sXG4gICAgICBsb2dMZXZlbDogJ3dhcm4nLFxuICAgICAgcGF0aDogb3B0aW9uc0V4dGVuZGVkLm91dHB1dFBhdGgsXG4gICAgICBwdWJsaWNQYXRoOiBvcHRpb25zRXh0ZW5kZWQuZGVwbG95VXJsLFxuICAgICAgY29tcHJlc3M6ICEhb3B0aW9uc0V4dGVuZGVkLm1pbmlmeSxcbiAgICAgIHBydW5lU291cmNlOiBmYWxzZSxcbiAgICAgIHJlZHVjZUlubGluZVN0eWxlczogZmFsc2UsXG4gICAgICBtZXJnZVN0eWxlc2hlZXRzOiBmYWxzZSxcbiAgICAgIC8vIE5vdGU6IGlmIGBwcmVsb2FkYCBjaGFuZ2VzIHRvIGFueXRoaW5nIG90aGVyIHRoYW4gYG1lZGlhYCwgdGhlIGxvZ2ljIGluXG4gICAgICAvLyBgZW1iZWRMaW5rZWRTdHlsZXNoZWV0T3ZlcnJpZGVgIHdpbGwgaGF2ZSB0byBiZSB1cGRhdGVkLlxuICAgICAgcHJlbG9hZDogJ21lZGlhJyxcbiAgICAgIG5vc2NyaXB0RmFsbGJhY2s6IHRydWUsXG4gICAgICBpbmxpbmVGb250czogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFdlIGNhbid0IHVzZSBpbmhlcml0YW5jZSB0byBvdmVycmlkZSBgZW1iZWRMaW5rZWRTdHlsZXNoZWV0YCwgYmVjYXVzZSBpdCdzIG5vdCBkZWNsYXJlZCBpblxuICAgIC8vIHRoZSBgQ3JpdHRlcnNgIC5kLnRzIHdoaWNoIG1lYW5zIHRoYXQgd2UgY2FuJ3QgY2FsbCB0aGUgYHN1cGVyYCBpbXBsZW1lbnRhdGlvbi4gVFMgZG9lc24ndFxuICAgIC8vIGFsbG93IGZvciBgc3VwZXJgIHRvIGJlIGNhc3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAgICB0aGlzLmluaXRpYWxFbWJlZExpbmtlZFN0eWxlc2hlZXQgPSB0aGlzLmVtYmVkTGlua2VkU3R5bGVzaGVldDtcbiAgICB0aGlzLmVtYmVkTGlua2VkU3R5bGVzaGVldCA9IHRoaXMuZW1iZWRMaW5rZWRTdHlsZXNoZWV0T3ZlcnJpZGU7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgcmVhZEZpbGUocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgcmVzb3VyY2VDb250ZW50ID0gdGhpcy5yZXNvdXJjZUNhY2hlLmdldChwYXRoKTtcbiAgICBpZiAocmVzb3VyY2VDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc291cmNlQ29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICAgICAgdGhpcy5yZXNvdXJjZUNhY2hlLnNldChwYXRoLCByZXNvdXJjZUNvbnRlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNvdXJjZUNvbnRlbnQ7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgb2YgdGhlIENyaXR0ZXJzIGBlbWJlZExpbmtlZFN0eWxlc2hlZXRgIG1ldGhvZFxuICAgKiB0aGF0IG1ha2VzIGl0IHdvcmsgd2l0aCBBbmd1bGFyJ3MgQ1NQIEFQSXMuXG4gICAqL1xuICBwcml2YXRlIGVtYmVkTGlua2VkU3R5bGVzaGVldE92ZXJyaWRlOiBFbWJlZExpbmtlZFN0eWxlc2hlZXRGbiA9IGFzeW5jIChsaW5rLCBkb2N1bWVudCkgPT4ge1xuICAgIGlmIChsaW5rLmdldEF0dHJpYnV0ZSgnbWVkaWEnKSA9PT0gJ3ByaW50JyAmJiBsaW5rLm5leHQ/Lm5hbWUgPT09ICdub3NjcmlwdCcpIHtcbiAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWVMYWJzL2NyaXR0ZXJzL2lzc3Vlcy82NFxuICAgICAgLy8gTkI6IHRoaXMgaXMgb25seSBuZWVkZWQgZm9yIHRoZSB3ZWJwYWNrIGJhc2VkIGJ1aWxkZXJzLlxuICAgICAgY29uc3QgbWVkaWEgPSBsaW5rLmdldEF0dHJpYnV0ZSgnb25sb2FkJyk/Lm1hdGNoKE1FRElBX1NFVF9IQU5ETEVSX1BBVFRFUk4pO1xuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGxpbmsucmVtb3ZlQXR0cmlidXRlKCdvbmxvYWQnKTtcbiAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ21lZGlhJywgbWVkaWFbMV0pO1xuICAgICAgICBsaW5rPy5uZXh0Py5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGF3YWl0IHRoaXMuaW5pdGlhbEVtYmVkTGlua2VkU3R5bGVzaGVldChsaW5rLCBkb2N1bWVudCk7XG4gICAgY29uc3QgY3NwTm9uY2UgPSB0aGlzLmZpbmRDc3BOb25jZShkb2N1bWVudCk7XG5cbiAgICBpZiAoY3NwTm9uY2UpIHtcbiAgICAgIGNvbnN0IGNyaXR0ZXJzTWVkaWEgPSBsaW5rLmdldEF0dHJpYnV0ZSgnb25sb2FkJyk/Lm1hdGNoKE1FRElBX1NFVF9IQU5ETEVSX1BBVFRFUk4pO1xuXG4gICAgICBpZiAoY3JpdHRlcnNNZWRpYSkge1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGEgQ3JpdHRlcnMtZ2VuZXJhdGVkIGBvbmxvYWRgIGhhbmRsZXIgYW5kIHRoZSBmaWxlIGhhcyBhbiBBbmd1bGFyIENTUCBub25jZSxcbiAgICAgICAgLy8gd2UgaGF2ZSB0byByZW1vdmUgdGhlIGhhbmRsZXIsIGJlY2F1c2UgaXQncyBpbmNvbXBhdGlibGUgd2l0aCBDU1AuIFdlIHNhdmUgdGhlIHZhbHVlXG4gICAgICAgIC8vIGluIGEgZGlmZmVyZW50IGF0dHJpYnV0ZSBhbmQgd2UgZ2VuZXJhdGUgYSBzY3JpcHQgdGFnIHdpdGggdGhlIG5vbmNlIHRoYXQgdXNlc1xuICAgICAgICAvLyBgYWRkRXZlbnRMaXN0ZW5lcmAgdG8gYXBwbHkgdGhlIG1lZGlhIHF1ZXJ5IGluc3RlYWQuXG4gICAgICAgIGxpbmsucmVtb3ZlQXR0cmlidXRlKCdvbmxvYWQnKTtcbiAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoQ1NQX01FRElBX0FUVFIsIGNyaXR0ZXJzTWVkaWFbMV0pO1xuICAgICAgICB0aGlzLmNvbmRpdGlvbmFsbHlJbnNlcnRDc3BMb2FkaW5nU2NyaXB0KGRvY3VtZW50LCBjc3BOb25jZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgaG9vayBpbiBhdCB0aGUgdGltZSBDcml0dGVycyBpbnNlcnRzIHRoZSBgc3R5bGVgIHRhZ3MsIGJ1dCB0aGVyZSBpc24ndFxuICAgICAgLy8gYSB3YXkgb2YgZG9pbmcgdGhhdCBhdCB0aGUgbW9tZW50IHNvIHdlIGZhbGwgYmFjayB0byBkb2luZyBpdCBhbnkgdGltZSBhIGBsaW5rYCB0YWcgaXNcbiAgICAgIC8vIGluc2VydGVkLiBXZSBtaXRpZ2F0ZSBpdCBieSBvbmx5IGl0ZXJhdGluZyB0aGUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoZSBgPGhlYWQ+YCB3aGljaFxuICAgICAgLy8gc2hvdWxkIGJlIHByZXR0eSBzaGFsbG93LlxuICAgICAgZG9jdW1lbnQuaGVhZC5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQudGFnTmFtZSA9PT0gJ3N0eWxlJyAmJiAhY2hpbGQuaGFzQXR0cmlidXRlKCdub25jZScpKSB7XG4gICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCdub25jZScsIGNzcE5vbmNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgQ1NQIG5vbmNlIGZvciBhIHNwZWNpZmljIGRvY3VtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kQ3NwTm9uY2UoZG9jdW1lbnQ6IFBhcnRpYWxEb2N1bWVudCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmRvY3VtZW50Tm9uY2VzLmhhcyhkb2N1bWVudCkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICByZXR1cm4gdGhpcy5kb2N1bWVudE5vbmNlcy5nZXQoZG9jdW1lbnQpITtcbiAgICB9XG5cbiAgICAvLyBIVE1MIGF0dHJpYnV0ZSBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgYnV0IHRoZSBwYXJzZXIgdXNlZCBieSBDcml0dGVycyBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICBjb25zdCBub25jZUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbmdDc3BOb25jZV0sIFtuZ2NzcG5vbmNlXScpO1xuICAgIGNvbnN0IGNzcE5vbmNlID1cbiAgICAgIG5vbmNlRWxlbWVudD8uZ2V0QXR0cmlidXRlKCduZ0NzcE5vbmNlJykgfHwgbm9uY2VFbGVtZW50Py5nZXRBdHRyaWJ1dGUoJ25nY3Nwbm9uY2UnKSB8fCBudWxsO1xuXG4gICAgdGhpcy5kb2N1bWVudE5vbmNlcy5zZXQoZG9jdW1lbnQsIGNzcE5vbmNlKTtcblxuICAgIHJldHVybiBjc3BOb25jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIHRoZSBgc2NyaXB0YCB0YWcgdGhhdCBzd2FwcyB0aGUgY3JpdGljYWwgQ1NTIGF0IHJ1bnRpbWUsXG4gICAqIGlmIG9uZSBoYXNuJ3QgYmVlbiBpbnNlcnRlZCBpbnRvIHRoZSBkb2N1bWVudCBhbHJlYWR5LlxuICAgKi9cbiAgcHJpdmF0ZSBjb25kaXRpb25hbGx5SW5zZXJ0Q3NwTG9hZGluZ1NjcmlwdChkb2N1bWVudDogUGFydGlhbERvY3VtZW50LCBub25jZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWRkZWRDc3BTY3JpcHRzRG9jdW1lbnRzLmhhcyhkb2N1bWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZG9jdW1lbnQuaGVhZC50ZXh0Q29udGVudC5pbmNsdWRlcyhMSU5LX0xPQURfU0NSSVBUX0NPTlRFTlQpKSB7XG4gICAgICAvLyBTY3JpcHQgd2FzIGFscmVhZHkgYWRkZWQgZHVyaW5nIHRoZSBidWlsZC5cbiAgICAgIHRoaXMuYWRkZWRDc3BTY3JpcHRzRG9jdW1lbnRzLmFkZChkb2N1bWVudCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTtcbiAgICBzY3JpcHQudGV4dENvbnRlbnQgPSBMSU5LX0xPQURfU0NSSVBUX0NPTlRFTlQ7XG4gICAgLy8gQXBwZW5kIHRoZSBzY3JpcHQgdG8gdGhlIGhlYWQgc2luY2UgaXQgbmVlZHMgdG9cbiAgICAvLyBydW4gYXMgZWFybHkgYXMgcG9zc2libGUsIGFmdGVyIHRoZSBgbGlua2AgdGFncy5cbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgdGhpcy5hZGRlZENzcFNjcmlwdHNEb2N1bWVudHMuYWRkKGRvY3VtZW50KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzb3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zOiBJbmxpbmVDcml0aWNhbENzc1Byb2Nlc3Nvck9wdGlvbnMpIHt9XG5cbiAgYXN5bmMgcHJvY2VzcyhcbiAgICBodG1sOiBzdHJpbmcsXG4gICAgb3B0aW9uczogSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxJbmxpbmVDcml0aWNhbENzc1Jlc3VsdD4ge1xuICAgIGNvbnN0IGNyaXR0ZXJzID0gbmV3IENyaXR0ZXJzRXh0ZW5kZWQoeyAuLi50aGlzLm9wdGlvbnMsIC4uLm9wdGlvbnMgfSwgdGhpcy5yZXNvdXJjZUNhY2hlKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgY3JpdHRlcnMucHJvY2VzcyhodG1sKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50LFxuICAgICAgZXJyb3JzOiBjcml0dGVycy5lcnJvcnMubGVuZ3RoID8gY3JpdHRlcnMuZXJyb3JzIDogdW5kZWZpbmVkLFxuICAgICAgd2FybmluZ3M6IGNyaXR0ZXJzLndhcm5pbmdzLmxlbmd0aCA/IGNyaXR0ZXJzLndhcm5pbmdzIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLWNzcy1wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyL3Nzci9zcmMvaW5saW5lLWNzcy1wcm9jZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxRQUFRLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU1Qzs7R0FFRztBQUNILE1BQU0seUJBQXlCLEdBQUcsOEJBQThCLENBQUM7QUFFakU7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUM7QUFFcEM7O0dBRUc7QUFDSCxNQUFNLHdCQUF3QixHQUFHO0lBQy9CLFVBQVU7SUFDViw4RUFBOEU7SUFDOUUseUZBQXlGO0lBQ3pGLG9FQUFvRTtJQUNwRSw0Q0FBNEM7SUFDNUMsNkRBQTZEO0lBQzdELCtFQUErRTtJQUMvRSx3REFBd0QsY0FBYyxNQUFNO0lBQzVFLG1FQUFtRTtJQUNuRSx1REFBdUQ7SUFDdkQsK0NBQStDO0lBQy9DLGdDQUFnQztJQUNoQywyQkFBMkIsY0FBYywrQ0FBK0M7SUFDeEYsS0FBSztJQUNMLE9BQU87Q0FDUixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQThDYixNQUFNLGdCQUFpQixTQUFRLFFBQVE7SUFXMUI7SUFDUTtJQVhWLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFDeEIsTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUN2Qiw0QkFBNEIsQ0FBMEI7SUFDdEQsd0JBQXdCLEdBQUcsSUFBSSxPQUFPLEVBQW1CLENBQUM7SUFDMUQsY0FBYyxHQUFHLElBQUksT0FBTyxFQUFrQyxDQUFDO0lBS3ZFLFlBQ1csZUFBb0YsRUFDNUUsYUFBa0M7UUFFbkQsS0FBSyxDQUFDO1lBQ0osTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxDQUFDLENBQVMsRUFBRSxF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LFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDNUQsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ25FLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IENyaXR0ZXJzIGZyb20gJ2NyaXR0ZXJzJztcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbi8qKlxuICogUGF0dGVybiB1c2VkIHRvIGV4dHJhY3QgdGhlIG1lZGlhIHF1ZXJ5IHNldCBieSBDcml0dGVycyBpbiBhbiBgb25sb2FkYCBoYW5kbGVyLlxuICovXG5jb25zdCBNRURJQV9TRVRfSEFORExFUl9QQVRURVJOID0gL150aGlzXFwubWVkaWE9W1wiJ10oLiopW1wiJ107PyQvO1xuXG4vKipcbiAqIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB1c2VkIHRvIHNhdmUgdGhlIENyaXR0ZXJzIG1lZGlhIHF1ZXJ5IHNvIGl0IGNhbiBiZSByZS1hc3NpZ25lZCBvbiBsb2FkLlxuICovXG5jb25zdCBDU1BfTUVESUFfQVRUUiA9ICduZ0NzcE1lZGlhJztcblxuLyoqXG4gKiBTY3JpcHQgdGV4dCB1c2VkIHRvIGNoYW5nZSB0aGUgbWVkaWEgdmFsdWUgb2YgdGhlIGxpbmsgdGFncy5cbiAqL1xuY29uc3QgTElOS19MT0FEX1NDUklQVF9DT05URU5UID0gW1xuICBgKCgpID0+IHtgLFxuICAvLyBTYXZlIHRoZSBgY2hpbGRyZW5gIGluIGEgdmFyaWFibGUgc2luY2UgdGhleSdyZSBhIGxpdmUgRE9NIG5vZGUgY29sbGVjdGlvbi5cbiAgLy8gV2UgaXRlcmF0ZSBvdmVyIHRoZSBkaXJlY3QgZGVzY2VuZGFudHMsIGluc3RlYWQgb2YgZ29pbmcgdGhyb3VnaCBhIGBxdWVyeVNlbGVjdG9yQWxsYCxcbiAgLy8gYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlIHRhZ3Mgd2lsbCBiZSBkaXJlY3RseSBpbnNpZGUgdGhlIGBoZWFkYC5cbiAgYCAgY29uc3QgY2hpbGRyZW4gPSBkb2N1bWVudC5oZWFkLmNoaWxkcmVuO2AsXG4gIC8vIERlY2xhcmUgYG9uTG9hZGAgb3V0c2lkZSB0aGUgbG9vcCB0byBhdm9pZCBsZWFraW5nIG1lbW9yeS5cbiAgLy8gQ2FuJ3QgYmUgYW4gYXJyb3cgZnVuY3Rpb24sIGJlY2F1c2Ugd2UgbmVlZCBgdGhpc2AgdG8gcmVmZXIgdG8gdGhlIERPTSBub2RlLlxuICBgICBmdW5jdGlvbiBvbkxvYWQoKSB7dGhpcy5tZWRpYSA9IHRoaXMuZ2V0QXR0cmlidXRlKCcke0NTUF9NRURJQV9BVFRSfScpO31gLFxuICAvLyBIYXMgdG8gdXNlIGEgcGxhaW4gZm9yIGxvb3AsIGJlY2F1c2Ugc29tZSBicm93c2VycyBkb24ndCBzdXBwb3J0XG4gIC8vIGBmb3JFYWNoYCBvbiBgY2hpbGRyZW5gIHdoaWNoIGlzIGEgYEhUTUxDb2xsZWN0aW9uYC5cbiAgYCAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge2AsXG4gIGAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtgLFxuICBgICAgIGNoaWxkLmhhc0F0dHJpYnV0ZSgnJHtDU1BfTUVESUFfQVRUUn0nKSAmJiBjaGlsZC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtgLFxuICBgICB9YCxcbiAgYH0pKCk7YCxcbl0uam9pbignXFxuJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzT3B0aW9ucyB7XG4gIG91dHB1dFBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzb3JPcHRpb25zIHtcbiAgbWluaWZ5PzogYm9vbGVhbjtcbiAgZGVwbG95VXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElubGluZUNyaXRpY2FsQ3NzUmVzdWx0IHtcbiAgY29udGVudDogc3RyaW5nO1xuICB3YXJuaW5ncz86IHN0cmluZ1tdO1xuICBlcnJvcnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqIFBhcnRpYWwgcmVwcmVzZW50YXRpb24gb2YgYW4gYEhUTUxFbGVtZW50YC4gKi9cbmludGVyZmFjZSBQYXJ0aWFsSFRNTEVsZW1lbnQge1xuICBnZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbDtcbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG4gIGhhc0F0dHJpYnV0ZShuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuICByZW1vdmVBdHRyaWJ1dGUobmFtZTogc3RyaW5nKTogdm9pZDtcbiAgYXBwZW5kQ2hpbGQoY2hpbGQ6IFBhcnRpYWxIVE1MRWxlbWVudCk6IHZvaWQ7XG4gIHJlbW92ZSgpOiB2b2lkO1xuICBuYW1lOiBzdHJpbmc7XG4gIHRleHRDb250ZW50OiBzdHJpbmc7XG4gIHRhZ05hbWU6IHN0cmluZyB8IG51bGw7XG4gIGNoaWxkcmVuOiBQYXJ0aWFsSFRNTEVsZW1lbnRbXTtcbiAgbmV4dDogUGFydGlhbEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgcHJldjogUGFydGlhbEhUTUxFbGVtZW50IHwgbnVsbDtcbn1cblxuLyoqIFBhcnRpYWwgcmVwcmVzZW50YXRpb24gb2YgYW4gSFRNTCBgRG9jdW1lbnRgLiAqL1xuaW50ZXJmYWNlIFBhcnRpYWxEb2N1bWVudCB7XG4gIGhlYWQ6IFBhcnRpYWxIVE1MRWxlbWVudDtcbiAgY3JlYXRlRWxlbWVudCh0YWdOYW1lOiBzdHJpbmcpOiBQYXJ0aWFsSFRNTEVsZW1lbnQ7XG4gIHF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3I6IHN0cmluZyk6IFBhcnRpYWxIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbi8qKiBTaWduYXR1cmUgb2YgdGhlIGBDcml0dGVycy5lbWJlZExpbmtlZFN0eWxlc2hlZXRgIG1ldGhvZC4gKi9cbnR5cGUgRW1iZWRMaW5rZWRTdHlsZXNoZWV0Rm4gPSAoXG4gIGxpbms6IFBhcnRpYWxIVE1MRWxlbWVudCxcbiAgZG9jdW1lbnQ6IFBhcnRpYWxEb2N1bWVudCxcbikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuY2xhc3MgQ3JpdHRlcnNFeHRlbmRlZCBleHRlbmRzIENyaXR0ZXJzIHtcbiAgcmVhZG9ubHkgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gIHJlYWRvbmx5IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBpbml0aWFsRW1iZWRMaW5rZWRTdHlsZXNoZWV0OiBFbWJlZExpbmtlZFN0eWxlc2hlZXRGbjtcbiAgcHJpdmF0ZSBhZGRlZENzcFNjcmlwdHNEb2N1bWVudHMgPSBuZXcgV2Vha1NldDxQYXJ0aWFsRG9jdW1lbnQ+KCk7XG4gIHByaXZhdGUgZG9jdW1lbnROb25jZXMgPSBuZXcgV2Vha01hcDxQYXJ0aWFsRG9jdW1lbnQsIHN0cmluZyB8IG51bGw+KCk7XG5cbiAgLy8gSW5oZXJpdGVkIGZyb20gYENyaXR0ZXJzYCwgYnV0IG5vdCBleHBvc2VkIGluIHRoZSB0eXBpbmdzLlxuICBwcm90ZWN0ZWQgZGVjbGFyZSBlbWJlZExpbmtlZFN0eWxlc2hlZXQ6IEVtYmVkTGlua2VkU3R5bGVzaGVldEZuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IG9wdGlvbnNFeHRlbmRlZDogSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzb3JPcHRpb25zICYgSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzT3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlQ2FjaGU6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4gICkge1xuICAgIHN1cGVyKHtcbiAgICAgIGxvZ2dlcjoge1xuICAgICAgICB3YXJuOiAoczogc3RyaW5nKSA9PiB0aGlzLndhcm5pbmdzLnB1c2gocyksXG4gICAgICAgIGVycm9yOiAoczogc3RyaW5nKSA9PiB0aGlzLmVycm9ycy5wdXNoKHMpLFxuICAgICAgICBpbmZvOiAoKSA9PiB7fSxcbiAgICAgIH0sXG4gICAgICBsb2dMZXZlbDogJ3dhcm4nLFxuICAgICAgcGF0aDogb3B0aW9uc0V4dGVuZGVkLm91dHB1dFBhdGgsXG4gICAgICBwdWJsaWNQYXRoOiBvcHRpb25zRXh0ZW5kZWQuZGVwbG95VXJsLFxuICAgICAgY29tcHJlc3M6ICEhb3B0aW9uc0V4dGVuZGVkLm1pbmlmeSxcbiAgICAgIHBydW5lU291cmNlOiBmYWxzZSxcbiAgICAgIHJlZHVjZUlubGluZVN0eWxlczogZmFsc2UsXG4gICAgICBtZXJnZVN0eWxlc2hlZXRzOiBmYWxzZSxcbiAgICAgIC8vIE5vdGU6IGlmIGBwcmVsb2FkYCBjaGFuZ2VzIHRvIGFueXRoaW5nIG90aGVyIHRoYW4gYG1lZGlhYCwgdGhlIGxvZ2ljIGluXG4gICAgICAvLyBgZW1iZWRMaW5rZWRTdHlsZXNoZWV0T3ZlcnJpZGVgIHdpbGwgaGF2ZSB0byBiZSB1cGRhdGVkLlxuICAgICAgcHJlbG9hZDogJ21lZGlhJyxcbiAgICAgIG5vc2NyaXB0RmFsbGJhY2s6IHRydWUsXG4gICAgICBpbmxpbmVGb250czogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFdlIGNhbid0IHVzZSBpbmhlcml0YW5jZSB0byBvdmVycmlkZSBgZW1iZWRMaW5rZWRTdHlsZXNoZWV0YCwgYmVjYXVzZSBpdCdzIG5vdCBkZWNsYXJlZCBpblxuICAgIC8vIHRoZSBgQ3JpdHRlcnNgIC5kLnRzIHdoaWNoIG1lYW5zIHRoYXQgd2UgY2FuJ3QgY2FsbCB0aGUgYHN1cGVyYCBpbXBsZW1lbnRhdGlvbi4gVFMgZG9lc24ndFxuICAgIC8vIGFsbG93IGZvciBgc3VwZXJgIHRvIGJlIGNhc3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAgICB0aGlzLmluaXRpYWxFbWJlZExpbmtlZFN0eWxlc2hlZXQgPSB0aGlzLmVtYmVkTGlua2VkU3R5bGVzaGVldDtcbiAgICB0aGlzLmVtYmVkTGlua2VkU3R5bGVzaGVldCA9IHRoaXMuZW1iZWRMaW5rZWRTdHlsZXNoZWV0T3ZlcnJpZGU7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgcmVhZEZpbGUocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgcmVzb3VyY2VDb250ZW50ID0gdGhpcy5yZXNvdXJjZUNhY2hlLmdldChwYXRoKTtcbiAgICBpZiAocmVzb3VyY2VDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc291cmNlQ29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICAgICAgdGhpcy5yZXNvdXJjZUNhY2hlLnNldChwYXRoLCByZXNvdXJjZUNvbnRlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNvdXJjZUNvbnRlbnQ7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgb2YgdGhlIENyaXR0ZXJzIGBlbWJlZExpbmtlZFN0eWxlc2hlZXRgIG1ldGhvZFxuICAgKiB0aGF0IG1ha2VzIGl0IHdvcmsgd2l0aCBBbmd1bGFyJ3MgQ1NQIEFQSXMuXG4gICAqL1xuICBwcml2YXRlIGVtYmVkTGlua2VkU3R5bGVzaGVldE92ZXJyaWRlOiBFbWJlZExpbmtlZFN0eWxlc2hlZXRGbiA9IGFzeW5jIChsaW5rLCBkb2N1bWVudCkgPT4ge1xuICAgIGlmIChsaW5rLmdldEF0dHJpYnV0ZSgnbWVkaWEnKSA9PT0gJ3ByaW50JyAmJiBsaW5rLm5leHQ/Lm5hbWUgPT09ICdub3NjcmlwdCcpIHtcbiAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWVMYWJzL2NyaXR0ZXJzL2lzc3Vlcy82NFxuICAgICAgLy8gTkI6IHRoaXMgaXMgb25seSBuZWVkZWQgZm9yIHRoZSB3ZWJwYWNrIGJhc2VkIGJ1aWxkZXJzLlxuICAgICAgY29uc3QgbWVkaWEgPSBsaW5rLmdldEF0dHJpYnV0ZSgnb25sb2FkJyk/Lm1hdGNoKE1FRElBX1NFVF9IQU5ETEVSX1BBVFRFUk4pO1xuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGxpbmsucmVtb3ZlQXR0cmlidXRlKCdvbmxvYWQnKTtcbiAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ21lZGlhJywgbWVkaWFbMV0pO1xuICAgICAgICBsaW5rPy5uZXh0Py5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGF3YWl0IHRoaXMuaW5pdGlhbEVtYmVkTGlua2VkU3R5bGVzaGVldChsaW5rLCBkb2N1bWVudCk7XG4gICAgY29uc3QgY3NwTm9uY2UgPSB0aGlzLmZpbmRDc3BOb25jZShkb2N1bWVudCk7XG5cbiAgICBpZiAoY3NwTm9uY2UpIHtcbiAgICAgIGNvbnN0IGNyaXR0ZXJzTWVkaWEgPSBsaW5rLmdldEF0dHJpYnV0ZSgnb25sb2FkJyk/Lm1hdGNoKE1FRElBX1NFVF9IQU5ETEVSX1BBVFRFUk4pO1xuXG4gICAgICBpZiAoY3JpdHRlcnNNZWRpYSkge1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGEgQ3JpdHRlcnMtZ2VuZXJhdGVkIGBvbmxvYWRgIGhhbmRsZXIgYW5kIHRoZSBmaWxlIGhhcyBhbiBBbmd1bGFyIENTUCBub25jZSxcbiAgICAgICAgLy8gd2UgaGF2ZSB0byByZW1vdmUgdGhlIGhhbmRsZXIsIGJlY2F1c2UgaXQncyBpbmNvbXBhdGlibGUgd2l0aCBDU1AuIFdlIHNhdmUgdGhlIHZhbHVlXG4gICAgICAgIC8vIGluIGEgZGlmZmVyZW50IGF0dHJpYnV0ZSBhbmQgd2UgZ2VuZXJhdGUgYSBzY3JpcHQgdGFnIHdpdGggdGhlIG5vbmNlIHRoYXQgdXNlc1xuICAgICAgICAvLyBgYWRkRXZlbnRMaXN0ZW5lcmAgdG8gYXBwbHkgdGhlIG1lZGlhIHF1ZXJ5IGluc3RlYWQuXG4gICAgICAgIGxpbmsucmVtb3ZlQXR0cmlidXRlKCdvbmxvYWQnKTtcbiAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoQ1NQX01FRElBX0FUVFIsIGNyaXR0ZXJzTWVkaWFbMV0pO1xuICAgICAgICB0aGlzLmNvbmRpdGlvbmFsbHlJbnNlcnRDc3BMb2FkaW5nU2NyaXB0KGRvY3VtZW50LCBjc3BOb25jZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgaG9vayBpbiBhdCB0aGUgdGltZSBDcml0dGVycyBpbnNlcnRzIHRoZSBgc3R5bGVgIHRhZ3MsIGJ1dCB0aGVyZSBpc24ndFxuICAgICAgLy8gYSB3YXkgb2YgZG9pbmcgdGhhdCBhdCB0aGUgbW9tZW50IHNvIHdlIGZhbGwgYmFjayB0byBkb2luZyBpdCBhbnkgdGltZSBhIGBsaW5rYCB0YWcgaXNcbiAgICAgIC8vIGluc2VydGVkLiBXZSBtaXRpZ2F0ZSBpdCBieSBvbmx5IGl0ZXJhdGluZyB0aGUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoZSBgPGhlYWQ+YCB3aGljaFxuICAgICAgLy8gc2hvdWxkIGJlIHByZXR0eSBzaGFsbG93LlxuICAgICAgZG9jdW1lbnQuaGVhZC5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQudGFnTmFtZSA9PT0gJ3N0eWxlJyAmJiAhY2hpbGQuaGFzQXR0cmlidXRlKCdub25jZScpKSB7XG4gICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCdub25jZScsIGNzcE5vbmNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgQ1NQIG5vbmNlIGZvciBhIHNwZWNpZmljIGRvY3VtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kQ3NwTm9uY2UoZG9jdW1lbnQ6IFBhcnRpYWxEb2N1bWVudCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmRvY3VtZW50Tm9uY2VzLmhhcyhkb2N1bWVudCkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICByZXR1cm4gdGhpcy5kb2N1bWVudE5vbmNlcy5nZXQoZG9jdW1lbnQpITtcbiAgICB9XG5cbiAgICAvLyBIVE1MIGF0dHJpYnV0ZSBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgYnV0IHRoZSBwYXJzZXIgdXNlZCBieSBDcml0dGVycyBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICBjb25zdCBub25jZUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbmdDc3BOb25jZV0sIFtuZ2NzcG5vbmNlXScpO1xuICAgIGNvbnN0IGNzcE5vbmNlID1cbiAgICAgIG5vbmNlRWxlbWVudD8uZ2V0QXR0cmlidXRlKCduZ0NzcE5vbmNlJykgfHwgbm9uY2VFbGVtZW50Py5nZXRBdHRyaWJ1dGUoJ25nY3Nwbm9uY2UnKSB8fCBudWxsO1xuXG4gICAgdGhpcy5kb2N1bWVudE5vbmNlcy5zZXQoZG9jdW1lbnQsIGNzcE5vbmNlKTtcblxuICAgIHJldHVybiBjc3BOb25jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIHRoZSBgc2NyaXB0YCB0YWcgdGhhdCBzd2FwcyB0aGUgY3JpdGljYWwgQ1NTIGF0IHJ1bnRpbWUsXG4gICAqIGlmIG9uZSBoYXNuJ3QgYmVlbiBpbnNlcnRlZCBpbnRvIHRoZSBkb2N1bWVudCBhbHJlYWR5LlxuICAgKi9cbiAgcHJpdmF0ZSBjb25kaXRpb25hbGx5SW5zZXJ0Q3NwTG9hZGluZ1NjcmlwdChkb2N1bWVudDogUGFydGlhbERvY3VtZW50LCBub25jZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWRkZWRDc3BTY3JpcHRzRG9jdW1lbnRzLmhhcyhkb2N1bWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZG9jdW1lbnQuaGVhZC50ZXh0Q29udGVudC5pbmNsdWRlcyhMSU5LX0xPQURfU0NSSVBUX0NPTlRFTlQpKSB7XG4gICAgICAvLyBTY3JpcHQgd2FzIGFscmVhZHkgYWRkZWQgZHVyaW5nIHRoZSBidWlsZC5cbiAgICAgIHRoaXMuYWRkZWRDc3BTY3JpcHRzRG9jdW1lbnRzLmFkZChkb2N1bWVudCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTtcbiAgICBzY3JpcHQudGV4dENvbnRlbnQgPSBMSU5LX0xPQURfU0NSSVBUX0NPTlRFTlQ7XG4gICAgLy8gQXBwZW5kIHRoZSBzY3JpcHQgdG8gdGhlIGhlYWQgc2luY2UgaXQgbmVlZHMgdG9cbiAgICAvLyBydW4gYXMgZWFybHkgYXMgcG9zc2libGUsIGFmdGVyIHRoZSBgbGlua2AgdGFncy5cbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgdGhpcy5hZGRlZENzcFNjcmlwdHNEb2N1bWVudHMuYWRkKGRvY3VtZW50KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzb3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zOiBJbmxpbmVDcml0aWNhbENzc1Byb2Nlc3Nvck9wdGlvbnMpIHt9XG5cbiAgYXN5bmMgcHJvY2VzcyhcbiAgICBodG1sOiBzdHJpbmcsXG4gICAgb3B0aW9uczogSW5saW5lQ3JpdGljYWxDc3NQcm9jZXNzT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxJbmxpbmVDcml0aWNhbENzc1Jlc3VsdD4ge1xuICAgIGNvbnN0IGNyaXR0ZXJzID0gbmV3IENyaXR0ZXJzRXh0ZW5kZWQoeyAuLi50aGlzLm9wdGlvbnMsIC4uLm9wdGlvbnMgfSwgdGhpcy5yZXNvdXJjZUNhY2hlKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgY3JpdHRlcnMucHJvY2VzcyhodG1sKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50LFxuICAgICAgZXJyb3JzOiBjcml0dGVycy5lcnJvcnMubGVuZ3RoID8gY3JpdHRlcnMuZXJyb3JzIDogdW5kZWZpbmVkLFxuICAgICAgd2FybmluZ3M6IGNyaXR0ZXJzLndhcm5pbmdzLmxlbmd0aCA/IGNyaXR0ZXJzLndhcm5pbmdzIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
package/fesm2022/ssr.mjs
CHANGED
|
@@ -34,6 +34,13 @@ const LINK_LOAD_SCRIPT_CONTENT = [
|
|
|
34
34
|
`})();`,
|
|
35
35
|
].join('\n');
|
|
36
36
|
class CrittersExtended extends Critters {
|
|
37
|
+
optionsExtended;
|
|
38
|
+
resourceCache;
|
|
39
|
+
warnings = [];
|
|
40
|
+
errors = [];
|
|
41
|
+
initialEmbedLinkedStylesheet;
|
|
42
|
+
addedCspScriptsDocuments = new WeakSet();
|
|
43
|
+
documentNonces = new WeakMap();
|
|
37
44
|
constructor(optionsExtended, resourceCache) {
|
|
38
45
|
super({
|
|
39
46
|
logger: {
|
|
@@ -56,50 +63,6 @@ class CrittersExtended extends Critters {
|
|
|
56
63
|
});
|
|
57
64
|
this.optionsExtended = optionsExtended;
|
|
58
65
|
this.resourceCache = resourceCache;
|
|
59
|
-
this.warnings = [];
|
|
60
|
-
this.errors = [];
|
|
61
|
-
this.addedCspScriptsDocuments = new WeakSet();
|
|
62
|
-
this.documentNonces = new WeakMap();
|
|
63
|
-
/**
|
|
64
|
-
* Override of the Critters `embedLinkedStylesheet` method
|
|
65
|
-
* that makes it work with Angular's CSP APIs.
|
|
66
|
-
*/
|
|
67
|
-
this.embedLinkedStylesheetOverride = async (link, document) => {
|
|
68
|
-
if (link.getAttribute('media') === 'print' && link.next?.name === 'noscript') {
|
|
69
|
-
// Workaround for https://github.com/GoogleChromeLabs/critters/issues/64
|
|
70
|
-
// NB: this is only needed for the webpack based builders.
|
|
71
|
-
const media = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);
|
|
72
|
-
if (media) {
|
|
73
|
-
link.removeAttribute('onload');
|
|
74
|
-
link.setAttribute('media', media[1]);
|
|
75
|
-
link?.next?.remove();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
const returnValue = await this.initialEmbedLinkedStylesheet(link, document);
|
|
79
|
-
const cspNonce = this.findCspNonce(document);
|
|
80
|
-
if (cspNonce) {
|
|
81
|
-
const crittersMedia = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);
|
|
82
|
-
if (crittersMedia) {
|
|
83
|
-
// If there's a Critters-generated `onload` handler and the file has an Angular CSP nonce,
|
|
84
|
-
// we have to remove the handler, because it's incompatible with CSP. We save the value
|
|
85
|
-
// in a different attribute and we generate a script tag with the nonce that uses
|
|
86
|
-
// `addEventListener` to apply the media query instead.
|
|
87
|
-
link.removeAttribute('onload');
|
|
88
|
-
link.setAttribute(CSP_MEDIA_ATTR, crittersMedia[1]);
|
|
89
|
-
this.conditionallyInsertCspLoadingScript(document, cspNonce);
|
|
90
|
-
}
|
|
91
|
-
// Ideally we would hook in at the time Critters inserts the `style` tags, but there isn't
|
|
92
|
-
// a way of doing that at the moment so we fall back to doing it any time a `link` tag is
|
|
93
|
-
// inserted. We mitigate it by only iterating the direct children of the `<head>` which
|
|
94
|
-
// should be pretty shallow.
|
|
95
|
-
document.head.children.forEach((child) => {
|
|
96
|
-
if (child.tagName === 'style' && !child.hasAttribute('nonce')) {
|
|
97
|
-
child.setAttribute('nonce', cspNonce);
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
return returnValue;
|
|
102
|
-
};
|
|
103
66
|
// We can't use inheritance to override `embedLinkedStylesheet`, because it's not declared in
|
|
104
67
|
// the `Critters` .d.ts which means that we can't call the `super` implementation. TS doesn't
|
|
105
68
|
// allow for `super` to be cast to a different type.
|
|
@@ -114,6 +77,46 @@ class CrittersExtended extends Critters {
|
|
|
114
77
|
}
|
|
115
78
|
return resourceContent;
|
|
116
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Override of the Critters `embedLinkedStylesheet` method
|
|
82
|
+
* that makes it work with Angular's CSP APIs.
|
|
83
|
+
*/
|
|
84
|
+
embedLinkedStylesheetOverride = async (link, document) => {
|
|
85
|
+
if (link.getAttribute('media') === 'print' && link.next?.name === 'noscript') {
|
|
86
|
+
// Workaround for https://github.com/GoogleChromeLabs/critters/issues/64
|
|
87
|
+
// NB: this is only needed for the webpack based builders.
|
|
88
|
+
const media = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);
|
|
89
|
+
if (media) {
|
|
90
|
+
link.removeAttribute('onload');
|
|
91
|
+
link.setAttribute('media', media[1]);
|
|
92
|
+
link?.next?.remove();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const returnValue = await this.initialEmbedLinkedStylesheet(link, document);
|
|
96
|
+
const cspNonce = this.findCspNonce(document);
|
|
97
|
+
if (cspNonce) {
|
|
98
|
+
const crittersMedia = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);
|
|
99
|
+
if (crittersMedia) {
|
|
100
|
+
// If there's a Critters-generated `onload` handler and the file has an Angular CSP nonce,
|
|
101
|
+
// we have to remove the handler, because it's incompatible with CSP. We save the value
|
|
102
|
+
// in a different attribute and we generate a script tag with the nonce that uses
|
|
103
|
+
// `addEventListener` to apply the media query instead.
|
|
104
|
+
link.removeAttribute('onload');
|
|
105
|
+
link.setAttribute(CSP_MEDIA_ATTR, crittersMedia[1]);
|
|
106
|
+
this.conditionallyInsertCspLoadingScript(document, cspNonce);
|
|
107
|
+
}
|
|
108
|
+
// Ideally we would hook in at the time Critters inserts the `style` tags, but there isn't
|
|
109
|
+
// a way of doing that at the moment so we fall back to doing it any time a `link` tag is
|
|
110
|
+
// inserted. We mitigate it by only iterating the direct children of the `<head>` which
|
|
111
|
+
// should be pretty shallow.
|
|
112
|
+
document.head.children.forEach((child) => {
|
|
113
|
+
if (child.tagName === 'style' && !child.hasAttribute('nonce')) {
|
|
114
|
+
child.setAttribute('nonce', cspNonce);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return returnValue;
|
|
119
|
+
};
|
|
117
120
|
/**
|
|
118
121
|
* Finds the CSP nonce for a specific document.
|
|
119
122
|
*/
|
|
@@ -151,9 +154,10 @@ class CrittersExtended extends Critters {
|
|
|
151
154
|
}
|
|
152
155
|
}
|
|
153
156
|
class InlineCriticalCssProcessor {
|
|
157
|
+
options;
|
|
158
|
+
resourceCache = new Map();
|
|
154
159
|
constructor(options) {
|
|
155
160
|
this.options = options;
|
|
156
|
-
this.resourceCache = new Map();
|
|
157
161
|
}
|
|
158
162
|
async process(html, options) {
|
|
159
163
|
const critters = new CrittersExtended({ ...this.options, ...options }, this.resourceCache);
|
|
@@ -173,11 +177,14 @@ const SSG_MARKER_REGEXP = /ng-server-context=["']\w*\|?ssg\|?\w*["']/;
|
|
|
173
177
|
* the document loader
|
|
174
178
|
*/
|
|
175
179
|
class CommonEngine {
|
|
180
|
+
bootstrap;
|
|
181
|
+
providers;
|
|
182
|
+
templateCache = new Map();
|
|
183
|
+
inlineCriticalCssProcessor;
|
|
184
|
+
pageIsSSG = new Map();
|
|
176
185
|
constructor(bootstrap, providers = []) {
|
|
177
186
|
this.bootstrap = bootstrap;
|
|
178
187
|
this.providers = providers;
|
|
179
|
-
this.templateCache = new Map();
|
|
180
|
-
this.pageIsSSG = new Map();
|
|
181
188
|
this.inlineCriticalCssProcessor = new InlineCriticalCssProcessor({
|
|
182
189
|
minify: false,
|
|
183
190
|
});
|
package/fesm2022/ssr.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr.mjs","sources":["../../../../../../../packages/angular/ssr/src/inline-css-processor.ts","../../../../../../../packages/angular/ssr/src/common-engine.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport Critters from 'critters';\nimport { readFile } from 'node:fs/promises';\n\n/**\n * Pattern used to extract the media query set by Critters in an `onload` handler.\n */\nconst MEDIA_SET_HANDLER_PATTERN = /^this\\.media=[\"'](.*)[\"'];?$/;\n\n/**\n * Name of the attribute used to save the Critters media query so it can be re-assigned on load.\n */\nconst CSP_MEDIA_ATTR = 'ngCspMedia';\n\n/**\n * Script text used to change the media value of the link tags.\n */\nconst LINK_LOAD_SCRIPT_CONTENT = [\n `(() => {`,\n // Save the `children` in a variable since they're a live DOM node collection.\n // We iterate over the direct descendants, instead of going through a `querySelectorAll`,\n // because we know that the tags will be directly inside the `head`.\n ` const children = document.head.children;`,\n // Declare `onLoad` outside the loop to avoid leaking memory.\n // Can't be an arrow function, because we need `this` to refer to the DOM node.\n ` function onLoad() {this.media = this.getAttribute('${CSP_MEDIA_ATTR}');}`,\n // Has to use a plain for loop, because some browsers don't support\n // `forEach` on `children` which is a `HTMLCollection`.\n ` for (let i = 0; i < children.length; i++) {`,\n ` const child = children[i];`,\n ` child.hasAttribute('${CSP_MEDIA_ATTR}') && child.addEventListener('load', onLoad);`,\n ` }`,\n `})();`,\n].join('\\n');\n\nexport interface InlineCriticalCssProcessOptions {\n outputPath?: string;\n}\n\nexport interface InlineCriticalCssProcessorOptions {\n minify?: boolean;\n deployUrl?: string;\n}\n\nexport interface InlineCriticalCssResult {\n content: string;\n warnings?: string[];\n errors?: string[];\n}\n\n/** Partial representation of an `HTMLElement`. */\ninterface PartialHTMLElement {\n getAttribute(name: string): string | null;\n setAttribute(name: string, value: string): void;\n hasAttribute(name: string): boolean;\n removeAttribute(name: string): void;\n appendChild(child: PartialHTMLElement): void;\n remove(): void;\n name: string;\n textContent: string;\n tagName: string | null;\n children: PartialHTMLElement[];\n next: PartialHTMLElement | null;\n prev: PartialHTMLElement | null;\n}\n\n/** Partial representation of an HTML `Document`. */\ninterface PartialDocument {\n head: PartialHTMLElement;\n createElement(tagName: string): PartialHTMLElement;\n querySelector(selector: string): PartialHTMLElement | null;\n}\n\n/** Signature of the `Critters.embedLinkedStylesheet` method. */\ntype EmbedLinkedStylesheetFn = (\n link: PartialHTMLElement,\n document: PartialDocument,\n) => Promise<unknown>;\n\nclass CrittersExtended extends Critters {\n readonly warnings: string[] = [];\n readonly errors: string[] = [];\n private initialEmbedLinkedStylesheet: EmbedLinkedStylesheetFn;\n private addedCspScriptsDocuments = new WeakSet<PartialDocument>();\n private documentNonces = new WeakMap<PartialDocument, string | null>();\n\n // Inherited from `Critters`, but not exposed in the typings.\n protected embedLinkedStylesheet!: EmbedLinkedStylesheetFn;\n\n constructor(\n readonly optionsExtended: InlineCriticalCssProcessorOptions & InlineCriticalCssProcessOptions,\n private readonly resourceCache: Map<string, string>,\n ) {\n super({\n logger: {\n warn: (s: string) => this.warnings.push(s),\n error: (s: string) => this.errors.push(s),\n info: () => {},\n },\n logLevel: 'warn',\n path: optionsExtended.outputPath,\n publicPath: optionsExtended.deployUrl,\n compress: !!optionsExtended.minify,\n pruneSource: false,\n reduceInlineStyles: false,\n mergeStylesheets: false,\n // Note: if `preload` changes to anything other than `media`, the logic in\n // `embedLinkedStylesheetOverride` will have to be updated.\n preload: 'media',\n noscriptFallback: true,\n inlineFonts: true,\n });\n\n // We can't use inheritance to override `embedLinkedStylesheet`, because it's not declared in\n // the `Critters` .d.ts which means that we can't call the `super` implementation. TS doesn't\n // allow for `super` to be cast to a different type.\n this.initialEmbedLinkedStylesheet = this.embedLinkedStylesheet;\n this.embedLinkedStylesheet = this.embedLinkedStylesheetOverride;\n }\n\n public override async readFile(path: string): Promise<string> {\n let resourceContent = this.resourceCache.get(path);\n if (resourceContent === undefined) {\n resourceContent = await readFile(path, 'utf-8');\n this.resourceCache.set(path, resourceContent);\n }\n\n return resourceContent;\n }\n\n /**\n * Override of the Critters `embedLinkedStylesheet` method\n * that makes it work with Angular's CSP APIs.\n */\n private embedLinkedStylesheetOverride: EmbedLinkedStylesheetFn = async (link, document) => {\n if (link.getAttribute('media') === 'print' && link.next?.name === 'noscript') {\n // Workaround for https://github.com/GoogleChromeLabs/critters/issues/64\n // NB: this is only needed for the webpack based builders.\n const media = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);\n if (media) {\n link.removeAttribute('onload');\n link.setAttribute('media', media[1]);\n link?.next?.remove();\n }\n }\n\n const returnValue = await this.initialEmbedLinkedStylesheet(link, document);\n const cspNonce = this.findCspNonce(document);\n\n if (cspNonce) {\n const crittersMedia = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);\n\n if (crittersMedia) {\n // If there's a Critters-generated `onload` handler and the file has an Angular CSP nonce,\n // we have to remove the handler, because it's incompatible with CSP. We save the value\n // in a different attribute and we generate a script tag with the nonce that uses\n // `addEventListener` to apply the media query instead.\n link.removeAttribute('onload');\n link.setAttribute(CSP_MEDIA_ATTR, crittersMedia[1]);\n this.conditionallyInsertCspLoadingScript(document, cspNonce);\n }\n\n // Ideally we would hook in at the time Critters inserts the `style` tags, but there isn't\n // a way of doing that at the moment so we fall back to doing it any time a `link` tag is\n // inserted. We mitigate it by only iterating the direct children of the `<head>` which\n // should be pretty shallow.\n document.head.children.forEach((child) => {\n if (child.tagName === 'style' && !child.hasAttribute('nonce')) {\n child.setAttribute('nonce', cspNonce);\n }\n });\n }\n\n return returnValue;\n };\n\n /**\n * Finds the CSP nonce for a specific document.\n */\n private findCspNonce(document: PartialDocument): string | null {\n if (this.documentNonces.has(document)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.documentNonces.get(document)!;\n }\n\n // HTML attribute are case-insensitive, but the parser used by Critters is case-sensitive.\n const nonceElement = document.querySelector('[ngCspNonce], [ngcspnonce]');\n const cspNonce =\n nonceElement?.getAttribute('ngCspNonce') || nonceElement?.getAttribute('ngcspnonce') || null;\n\n this.documentNonces.set(document, cspNonce);\n\n return cspNonce;\n }\n\n /**\n * Inserts the `script` tag that swaps the critical CSS at runtime,\n * if one hasn't been inserted into the document already.\n */\n private conditionallyInsertCspLoadingScript(document: PartialDocument, nonce: string): void {\n if (this.addedCspScriptsDocuments.has(document)) {\n return;\n }\n\n if (document.head.textContent.includes(LINK_LOAD_SCRIPT_CONTENT)) {\n // Script was already added during the build.\n this.addedCspScriptsDocuments.add(document);\n\n return;\n }\n\n const script = document.createElement('script');\n script.setAttribute('nonce', nonce);\n script.textContent = LINK_LOAD_SCRIPT_CONTENT;\n // Append the script to the head since it needs to\n // run as early as possible, after the `link` tags.\n document.head.appendChild(script);\n this.addedCspScriptsDocuments.add(document);\n }\n}\n\nexport class InlineCriticalCssProcessor {\n private readonly resourceCache = new Map<string, string>();\n\n constructor(protected readonly options: InlineCriticalCssProcessorOptions) {}\n\n async process(\n html: string,\n options: InlineCriticalCssProcessOptions,\n ): Promise<InlineCriticalCssResult> {\n const critters = new CrittersExtended({ ...this.options, ...options }, this.resourceCache);\n const content = await critters.process(html);\n\n return {\n content,\n errors: critters.errors.length ? critters.errors : undefined,\n warnings: critters.warnings.length ? critters.warnings : undefined,\n };\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport { ApplicationRef, StaticProvider, Type } from '@angular/core';\nimport {\n INITIAL_CONFIG,\n renderApplication,\n renderModule,\n ɵSERVER_CONTEXT,\n} from '@angular/platform-server';\nimport * as fs from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { URL } from 'node:url';\nimport { InlineCriticalCssProcessor } from './inline-css-processor';\n\nconst SSG_MARKER_REGEXP = /ng-server-context=[\"']\\w*\\|?ssg\\|?\\w*[\"']/;\n\nexport interface CommonEngineRenderOptions {\n bootstrap?: Type<{}> | (() => Promise<ApplicationRef>);\n providers?: StaticProvider[];\n url?: string;\n document?: string;\n documentFilePath?: string;\n /**\n * Reduce render blocking requests by inlining critical CSS.\n * Defaults to true.\n */\n inlineCriticalCss?: boolean;\n /**\n * Base path location of index file.\n * Defaults to the 'documentFilePath' dirname when not provided.\n */\n publicPath?: string;\n}\n\n/**\n * A common rendering engine utility. This abstracts the logic\n * for handling the platformServer compiler, the module cache, and\n * the document loader\n */\nexport class CommonEngine {\n private readonly templateCache = new Map<string, string>();\n private readonly inlineCriticalCssProcessor: InlineCriticalCssProcessor;\n private readonly pageIsSSG = new Map<string, boolean>();\n\n constructor(\n private bootstrap?: Type<{}> | (() => Promise<ApplicationRef>),\n private providers: StaticProvider[] = [],\n ) {\n this.inlineCriticalCssProcessor = new InlineCriticalCssProcessor({\n minify: false,\n });\n }\n\n /**\n * Render an HTML document for a specific URL with specified\n * render options\n */\n async render(opts: CommonEngineRenderOptions): Promise<string> {\n const { inlineCriticalCss = true, url } = opts;\n\n if (opts.publicPath && opts.documentFilePath && url !== undefined) {\n const pathname = canParseUrl(url) ? new URL(url).pathname : url;\n // Remove leading forward slash.\n const pagePath = resolve(opts.publicPath, pathname.substring(1), 'index.html');\n\n if (pagePath !== resolve(opts.documentFilePath)) {\n // View path doesn't match with prerender path.\n const pageIsSSG = this.pageIsSSG.get(pagePath);\n if (pageIsSSG === undefined) {\n if (await exists(pagePath)) {\n const content = await fs.promises.readFile(pagePath, 'utf-8');\n const isSSG = SSG_MARKER_REGEXP.test(content);\n this.pageIsSSG.set(pagePath, isSSG);\n\n if (isSSG) {\n return content;\n }\n } else {\n this.pageIsSSG.set(pagePath, false);\n }\n } else if (pageIsSSG) {\n // Serve pre-rendered page.\n return fs.promises.readFile(pagePath, 'utf-8');\n }\n }\n }\n\n // if opts.document dosen't exist then opts.documentFilePath must\n const extraProviders: StaticProvider[] = [\n { provide: ɵSERVER_CONTEXT, useValue: 'ssr' },\n ...(opts.providers ?? []),\n ...this.providers,\n ];\n\n let document = opts.document;\n if (!document && opts.documentFilePath) {\n document = await this.getDocument(opts.documentFilePath);\n }\n\n if (document) {\n extraProviders.push({\n provide: INITIAL_CONFIG,\n useValue: {\n document,\n url: opts.url,\n },\n });\n }\n\n const moduleOrFactory = this.bootstrap || opts.bootstrap;\n if (!moduleOrFactory) {\n throw new Error('A module or bootstrap option must be provided.');\n }\n\n const html = await (isBootstrapFn(moduleOrFactory)\n ? renderApplication(moduleOrFactory, { platformProviders: extraProviders })\n : renderModule(moduleOrFactory, { extraProviders }));\n\n if (!inlineCriticalCss) {\n return html;\n }\n\n const { content, errors, warnings } = await this.inlineCriticalCssProcessor.process(html, {\n outputPath: opts.publicPath ?? (opts.documentFilePath ? dirname(opts.documentFilePath) : ''),\n });\n\n // eslint-disable-next-line no-console\n warnings?.forEach((m) => console.warn(m));\n // eslint-disable-next-line no-console\n errors?.forEach((m) => console.error(m));\n\n return content;\n }\n\n /** Retrieve the document from the cache or the filesystem */\n private async getDocument(filePath: string): Promise<string> {\n let doc = this.templateCache.get(filePath);\n\n if (!doc) {\n doc = await fs.promises.readFile(filePath, 'utf-8');\n this.templateCache.set(filePath, doc);\n }\n\n return doc;\n }\n}\n\nasync function exists(path: fs.PathLike): Promise<boolean> {\n try {\n await fs.promises.access(path, fs.constants.F_OK);\n\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isBootstrapFn(value: unknown): value is () => Promise<ApplicationRef> {\n // We can differentiate between a module and a bootstrap function by reading `cmp`:\n return typeof value === 'function' && !('ɵmod' in value);\n}\n\n// The below can be removed in favor of URL.canParse() when Node.js 18 is dropped\nfunction canParseUrl(url: string): boolean {\n try {\n return !!new URL(url);\n } catch {\n return false;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ssr.mjs","sources":["../../../../../../../packages/angular/ssr/src/inline-css-processor.ts","../../../../../../../packages/angular/ssr/src/common-engine.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport Critters from 'critters';\nimport { readFile } from 'node:fs/promises';\n\n/**\n * Pattern used to extract the media query set by Critters in an `onload` handler.\n */\nconst MEDIA_SET_HANDLER_PATTERN = /^this\\.media=[\"'](.*)[\"'];?$/;\n\n/**\n * Name of the attribute used to save the Critters media query so it can be re-assigned on load.\n */\nconst CSP_MEDIA_ATTR = 'ngCspMedia';\n\n/**\n * Script text used to change the media value of the link tags.\n */\nconst LINK_LOAD_SCRIPT_CONTENT = [\n `(() => {`,\n // Save the `children` in a variable since they're a live DOM node collection.\n // We iterate over the direct descendants, instead of going through a `querySelectorAll`,\n // because we know that the tags will be directly inside the `head`.\n ` const children = document.head.children;`,\n // Declare `onLoad` outside the loop to avoid leaking memory.\n // Can't be an arrow function, because we need `this` to refer to the DOM node.\n ` function onLoad() {this.media = this.getAttribute('${CSP_MEDIA_ATTR}');}`,\n // Has to use a plain for loop, because some browsers don't support\n // `forEach` on `children` which is a `HTMLCollection`.\n ` for (let i = 0; i < children.length; i++) {`,\n ` const child = children[i];`,\n ` child.hasAttribute('${CSP_MEDIA_ATTR}') && child.addEventListener('load', onLoad);`,\n ` }`,\n `})();`,\n].join('\\n');\n\nexport interface InlineCriticalCssProcessOptions {\n outputPath?: string;\n}\n\nexport interface InlineCriticalCssProcessorOptions {\n minify?: boolean;\n deployUrl?: string;\n}\n\nexport interface InlineCriticalCssResult {\n content: string;\n warnings?: string[];\n errors?: string[];\n}\n\n/** Partial representation of an `HTMLElement`. */\ninterface PartialHTMLElement {\n getAttribute(name: string): string | null;\n setAttribute(name: string, value: string): void;\n hasAttribute(name: string): boolean;\n removeAttribute(name: string): void;\n appendChild(child: PartialHTMLElement): void;\n remove(): void;\n name: string;\n textContent: string;\n tagName: string | null;\n children: PartialHTMLElement[];\n next: PartialHTMLElement | null;\n prev: PartialHTMLElement | null;\n}\n\n/** Partial representation of an HTML `Document`. */\ninterface PartialDocument {\n head: PartialHTMLElement;\n createElement(tagName: string): PartialHTMLElement;\n querySelector(selector: string): PartialHTMLElement | null;\n}\n\n/** Signature of the `Critters.embedLinkedStylesheet` method. */\ntype EmbedLinkedStylesheetFn = (\n link: PartialHTMLElement,\n document: PartialDocument,\n) => Promise<unknown>;\n\nclass CrittersExtended extends Critters {\n readonly warnings: string[] = [];\n readonly errors: string[] = [];\n private initialEmbedLinkedStylesheet: EmbedLinkedStylesheetFn;\n private addedCspScriptsDocuments = new WeakSet<PartialDocument>();\n private documentNonces = new WeakMap<PartialDocument, string | null>();\n\n // Inherited from `Critters`, but not exposed in the typings.\n protected declare embedLinkedStylesheet: EmbedLinkedStylesheetFn;\n\n constructor(\n readonly optionsExtended: InlineCriticalCssProcessorOptions & InlineCriticalCssProcessOptions,\n private readonly resourceCache: Map<string, string>,\n ) {\n super({\n logger: {\n warn: (s: string) => this.warnings.push(s),\n error: (s: string) => this.errors.push(s),\n info: () => {},\n },\n logLevel: 'warn',\n path: optionsExtended.outputPath,\n publicPath: optionsExtended.deployUrl,\n compress: !!optionsExtended.minify,\n pruneSource: false,\n reduceInlineStyles: false,\n mergeStylesheets: false,\n // Note: if `preload` changes to anything other than `media`, the logic in\n // `embedLinkedStylesheetOverride` will have to be updated.\n preload: 'media',\n noscriptFallback: true,\n inlineFonts: true,\n });\n\n // We can't use inheritance to override `embedLinkedStylesheet`, because it's not declared in\n // the `Critters` .d.ts which means that we can't call the `super` implementation. TS doesn't\n // allow for `super` to be cast to a different type.\n this.initialEmbedLinkedStylesheet = this.embedLinkedStylesheet;\n this.embedLinkedStylesheet = this.embedLinkedStylesheetOverride;\n }\n\n public override async readFile(path: string): Promise<string> {\n let resourceContent = this.resourceCache.get(path);\n if (resourceContent === undefined) {\n resourceContent = await readFile(path, 'utf-8');\n this.resourceCache.set(path, resourceContent);\n }\n\n return resourceContent;\n }\n\n /**\n * Override of the Critters `embedLinkedStylesheet` method\n * that makes it work with Angular's CSP APIs.\n */\n private embedLinkedStylesheetOverride: EmbedLinkedStylesheetFn = async (link, document) => {\n if (link.getAttribute('media') === 'print' && link.next?.name === 'noscript') {\n // Workaround for https://github.com/GoogleChromeLabs/critters/issues/64\n // NB: this is only needed for the webpack based builders.\n const media = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);\n if (media) {\n link.removeAttribute('onload');\n link.setAttribute('media', media[1]);\n link?.next?.remove();\n }\n }\n\n const returnValue = await this.initialEmbedLinkedStylesheet(link, document);\n const cspNonce = this.findCspNonce(document);\n\n if (cspNonce) {\n const crittersMedia = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);\n\n if (crittersMedia) {\n // If there's a Critters-generated `onload` handler and the file has an Angular CSP nonce,\n // we have to remove the handler, because it's incompatible with CSP. We save the value\n // in a different attribute and we generate a script tag with the nonce that uses\n // `addEventListener` to apply the media query instead.\n link.removeAttribute('onload');\n link.setAttribute(CSP_MEDIA_ATTR, crittersMedia[1]);\n this.conditionallyInsertCspLoadingScript(document, cspNonce);\n }\n\n // Ideally we would hook in at the time Critters inserts the `style` tags, but there isn't\n // a way of doing that at the moment so we fall back to doing it any time a `link` tag is\n // inserted. We mitigate it by only iterating the direct children of the `<head>` which\n // should be pretty shallow.\n document.head.children.forEach((child) => {\n if (child.tagName === 'style' && !child.hasAttribute('nonce')) {\n child.setAttribute('nonce', cspNonce);\n }\n });\n }\n\n return returnValue;\n };\n\n /**\n * Finds the CSP nonce for a specific document.\n */\n private findCspNonce(document: PartialDocument): string | null {\n if (this.documentNonces.has(document)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.documentNonces.get(document)!;\n }\n\n // HTML attribute are case-insensitive, but the parser used by Critters is case-sensitive.\n const nonceElement = document.querySelector('[ngCspNonce], [ngcspnonce]');\n const cspNonce =\n nonceElement?.getAttribute('ngCspNonce') || nonceElement?.getAttribute('ngcspnonce') || null;\n\n this.documentNonces.set(document, cspNonce);\n\n return cspNonce;\n }\n\n /**\n * Inserts the `script` tag that swaps the critical CSS at runtime,\n * if one hasn't been inserted into the document already.\n */\n private conditionallyInsertCspLoadingScript(document: PartialDocument, nonce: string): void {\n if (this.addedCspScriptsDocuments.has(document)) {\n return;\n }\n\n if (document.head.textContent.includes(LINK_LOAD_SCRIPT_CONTENT)) {\n // Script was already added during the build.\n this.addedCspScriptsDocuments.add(document);\n\n return;\n }\n\n const script = document.createElement('script');\n script.setAttribute('nonce', nonce);\n script.textContent = LINK_LOAD_SCRIPT_CONTENT;\n // Append the script to the head since it needs to\n // run as early as possible, after the `link` tags.\n document.head.appendChild(script);\n this.addedCspScriptsDocuments.add(document);\n }\n}\n\nexport class InlineCriticalCssProcessor {\n private readonly resourceCache = new Map<string, string>();\n\n constructor(protected readonly options: InlineCriticalCssProcessorOptions) {}\n\n async process(\n html: string,\n options: InlineCriticalCssProcessOptions,\n ): Promise<InlineCriticalCssResult> {\n const critters = new CrittersExtended({ ...this.options, ...options }, this.resourceCache);\n const content = await critters.process(html);\n\n return {\n content,\n errors: critters.errors.length ? critters.errors : undefined,\n warnings: critters.warnings.length ? critters.warnings : undefined,\n };\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport { ApplicationRef, StaticProvider, Type } from '@angular/core';\nimport {\n INITIAL_CONFIG,\n renderApplication,\n renderModule,\n ɵSERVER_CONTEXT,\n} from '@angular/platform-server';\nimport * as fs from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { URL } from 'node:url';\nimport { InlineCriticalCssProcessor } from './inline-css-processor';\n\nconst SSG_MARKER_REGEXP = /ng-server-context=[\"']\\w*\\|?ssg\\|?\\w*[\"']/;\n\nexport interface CommonEngineRenderOptions {\n bootstrap?: Type<{}> | (() => Promise<ApplicationRef>);\n providers?: StaticProvider[];\n url?: string;\n document?: string;\n documentFilePath?: string;\n /**\n * Reduce render blocking requests by inlining critical CSS.\n * Defaults to true.\n */\n inlineCriticalCss?: boolean;\n /**\n * Base path location of index file.\n * Defaults to the 'documentFilePath' dirname when not provided.\n */\n publicPath?: string;\n}\n\n/**\n * A common rendering engine utility. This abstracts the logic\n * for handling the platformServer compiler, the module cache, and\n * the document loader\n */\nexport class CommonEngine {\n private readonly templateCache = new Map<string, string>();\n private readonly inlineCriticalCssProcessor: InlineCriticalCssProcessor;\n private readonly pageIsSSG = new Map<string, boolean>();\n\n constructor(\n private bootstrap?: Type<{}> | (() => Promise<ApplicationRef>),\n private providers: StaticProvider[] = [],\n ) {\n this.inlineCriticalCssProcessor = new InlineCriticalCssProcessor({\n minify: false,\n });\n }\n\n /**\n * Render an HTML document for a specific URL with specified\n * render options\n */\n async render(opts: CommonEngineRenderOptions): Promise<string> {\n const { inlineCriticalCss = true, url } = opts;\n\n if (opts.publicPath && opts.documentFilePath && url !== undefined) {\n const pathname = canParseUrl(url) ? new URL(url).pathname : url;\n // Remove leading forward slash.\n const pagePath = resolve(opts.publicPath, pathname.substring(1), 'index.html');\n\n if (pagePath !== resolve(opts.documentFilePath)) {\n // View path doesn't match with prerender path.\n const pageIsSSG = this.pageIsSSG.get(pagePath);\n if (pageIsSSG === undefined) {\n if (await exists(pagePath)) {\n const content = await fs.promises.readFile(pagePath, 'utf-8');\n const isSSG = SSG_MARKER_REGEXP.test(content);\n this.pageIsSSG.set(pagePath, isSSG);\n\n if (isSSG) {\n return content;\n }\n } else {\n this.pageIsSSG.set(pagePath, false);\n }\n } else if (pageIsSSG) {\n // Serve pre-rendered page.\n return fs.promises.readFile(pagePath, 'utf-8');\n }\n }\n }\n\n // if opts.document dosen't exist then opts.documentFilePath must\n const extraProviders: StaticProvider[] = [\n { provide: ɵSERVER_CONTEXT, useValue: 'ssr' },\n ...(opts.providers ?? []),\n ...this.providers,\n ];\n\n let document = opts.document;\n if (!document && opts.documentFilePath) {\n document = await this.getDocument(opts.documentFilePath);\n }\n\n if (document) {\n extraProviders.push({\n provide: INITIAL_CONFIG,\n useValue: {\n document,\n url: opts.url,\n },\n });\n }\n\n const moduleOrFactory = this.bootstrap || opts.bootstrap;\n if (!moduleOrFactory) {\n throw new Error('A module or bootstrap option must be provided.');\n }\n\n const html = await (isBootstrapFn(moduleOrFactory)\n ? renderApplication(moduleOrFactory, { platformProviders: extraProviders })\n : renderModule(moduleOrFactory, { extraProviders }));\n\n if (!inlineCriticalCss) {\n return html;\n }\n\n const { content, errors, warnings } = await this.inlineCriticalCssProcessor.process(html, {\n outputPath: opts.publicPath ?? (opts.documentFilePath ? dirname(opts.documentFilePath) : ''),\n });\n\n // eslint-disable-next-line no-console\n warnings?.forEach((m) => console.warn(m));\n // eslint-disable-next-line no-console\n errors?.forEach((m) => console.error(m));\n\n return content;\n }\n\n /** Retrieve the document from the cache or the filesystem */\n private async getDocument(filePath: string): Promise<string> {\n let doc = this.templateCache.get(filePath);\n\n if (!doc) {\n doc = await fs.promises.readFile(filePath, 'utf-8');\n this.templateCache.set(filePath, doc);\n }\n\n return doc;\n }\n}\n\nasync function exists(path: fs.PathLike): Promise<boolean> {\n try {\n await fs.promises.access(path, fs.constants.F_OK);\n\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isBootstrapFn(value: unknown): value is () => Promise<ApplicationRef> {\n // We can differentiate between a module and a bootstrap function by reading `cmp`:\n return typeof value === 'function' && !('ɵmod' in value);\n}\n\n// The below can be removed in favor of URL.canParse() when Node.js 18 is dropped\nfunction canParseUrl(url: string): boolean {\n try {\n return !!new URL(url);\n } catch {\n return false;\n }\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@angular/ssr",
|
|
3
|
-
"version": "17.0.0-next.
|
|
3
|
+
"version": "17.0.0-next.4",
|
|
4
4
|
"description": "Angular server side rendering utilities",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/angular/angular-cli",
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
"ssr",
|
|
10
10
|
"universal"
|
|
11
11
|
],
|
|
12
|
+
"ng-add": {
|
|
13
|
+
"save": "dependencies"
|
|
14
|
+
},
|
|
12
15
|
"dependencies": {
|
|
13
16
|
"critters": "0.0.20",
|
|
14
17
|
"tslib": "^2.3.0"
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { APP_BASE_HREF } from '@angular/common';
|
|
2
|
+
import { CommonEngine } from '@angular/ssr';
|
|
3
|
+
import express from 'express';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { dirname, join } from 'node:path';
|
|
6
|
+
import <% if (isStandalone) { %>bootstrap<% } else { %>AppServerModule<% } %> from './src/main.server';
|
|
7
|
+
|
|
8
|
+
// The Express app is exported so that it can be used by serverless Functions.
|
|
9
|
+
export function app(): express.Express {
|
|
10
|
+
const server = express();
|
|
11
|
+
const browserDistFolder = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const indexHtml = join(browserDistFolder, 'index.server.html');
|
|
13
|
+
|
|
14
|
+
const commonEngine = new CommonEngine();
|
|
15
|
+
|
|
16
|
+
server.set('view engine', 'html');
|
|
17
|
+
server.set('views', browserDistFolder);
|
|
18
|
+
|
|
19
|
+
// Example Express Rest API endpoints
|
|
20
|
+
// server.get('/api/**', (req, res) => { });
|
|
21
|
+
// Serve static files from /browser
|
|
22
|
+
server.get('*.*', express.static(browserDistFolder, {
|
|
23
|
+
maxAge: '1y'
|
|
24
|
+
}));
|
|
25
|
+
|
|
26
|
+
// All regular routes use the Angular engine
|
|
27
|
+
server.get('*', (req, res, next) => {
|
|
28
|
+
commonEngine
|
|
29
|
+
.render({
|
|
30
|
+
<% if (isStandalone) { %>bootstrap<% } else { %>bootstrap: AppServerModule<% } %>,
|
|
31
|
+
documentFilePath: indexHtml,
|
|
32
|
+
url: req.originalUrl,
|
|
33
|
+
publicPath: browserDistFolder,
|
|
34
|
+
providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }],
|
|
35
|
+
})
|
|
36
|
+
.then((html) => res.send(html))
|
|
37
|
+
.catch((err) => next(err));
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
return server;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function run(): void {
|
|
44
|
+
const port = process.env['PORT'] || 4000;
|
|
45
|
+
|
|
46
|
+
// Start up the Node server
|
|
47
|
+
const server = app();
|
|
48
|
+
server.listen(port, () => {
|
|
49
|
+
console.log(`Node Express server listening on http://localhost:${port}`);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
run();
|
|
@@ -5,7 +5,7 @@ import { CommonEngine } from '@angular/ssr';
|
|
|
5
5
|
import * as express from 'express';
|
|
6
6
|
import { existsSync } from 'node:fs';
|
|
7
7
|
import { join } from 'node:path';
|
|
8
|
-
import <% if (isStandalone) { %>bootstrap<% } else { %>
|
|
8
|
+
import <% if (isStandalone) { %>bootstrap<% } else { %>AppServerModule<% } %> from './src/main.server';
|
|
9
9
|
|
|
10
10
|
// The Express app is exported so that it can be used by serverless Functions.
|
|
11
11
|
export function app(): express.Express {
|
|
@@ -64,4 +64,4 @@ if (moduleFilename === __filename || moduleFilename.includes('iisnode')) {
|
|
|
64
64
|
run();
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
<% if (isStandalone) { %>export default bootstrap;<% } else { %>export * from './src
|
|
67
|
+
<% if (isStandalone) { %>export default bootstrap;<% } else { %>export * from './src/main.server';<% } %>
|