pagespeed-quest 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.ja.md +22 -2
  3. package/README.md +21 -1
  4. package/package.json +25 -21
  5. package/build/main/adhoc.d.ts +0 -2
  6. package/build/main/adhoc.js +0 -48
  7. package/build/main/command.d.ts +0 -2
  8. package/build/main/command.js +0 -103
  9. package/build/main/common-types.d.ts +0 -41
  10. package/build/main/common-types.js +0 -3
  11. package/build/main/content-encoding.d.ts +0 -11
  12. package/build/main/content-encoding.js +0 -51
  13. package/build/main/encoding.d.ts +0 -11
  14. package/build/main/encoding.js +0 -51
  15. package/build/main/formatting.d.ts +0 -8
  16. package/build/main/formatting.js +0 -64
  17. package/build/main/http.d.ts +0 -27
  18. package/build/main/http.js +0 -106
  19. package/build/main/index.d.ts +0 -9
  20. package/build/main/index.js +0 -26
  21. package/build/main/inventory.d.ts +0 -39
  22. package/build/main/inventory.js +0 -171
  23. package/build/main/logger.d.ts +0 -20
  24. package/build/main/logger.js +0 -22
  25. package/build/main/playback/inventory.d.ts +0 -0
  26. package/build/main/playback/inventory.js +0 -47
  27. package/build/main/playback.d.ts +0 -22
  28. package/build/main/playback.js +0 -111
  29. package/build/main/proxy.d.ts +0 -40
  30. package/build/main/proxy.js +0 -111
  31. package/build/main/recording/proxy.d.ts +0 -28
  32. package/build/main/recording/proxy.js +0 -90
  33. package/build/main/recording.d.ts +0 -28
  34. package/build/main/recording.js +0 -95
  35. package/build/main/throttling.d.ts +0 -34
  36. package/build/main/throttling.js +0 -88
  37. package/build/main/url.d.ts +0 -3
  38. package/build/main/url.js +0 -67
  39. package/build/module/adhoc.d.ts +0 -2
  40. package/build/module/adhoc.js +0 -40
  41. package/build/module/command.d.ts +0 -2
  42. package/build/module/command.js +0 -98
  43. package/build/module/common-types.d.ts +0 -41
  44. package/build/module/common-types.js +0 -2
  45. package/build/module/content-encoding.d.ts +0 -11
  46. package/build/module/content-encoding.js +0 -43
  47. package/build/module/encoding.d.ts +0 -11
  48. package/build/module/encoding.js +0 -43
  49. package/build/module/formatting.d.ts +0 -8
  50. package/build/module/formatting.js +0 -55
  51. package/build/module/http.d.ts +0 -27
  52. package/build/module/http.js +0 -96
  53. package/build/module/index.d.ts +0 -9
  54. package/build/module/index.js +0 -10
  55. package/build/module/inventory.d.ts +0 -39
  56. package/build/module/inventory.js +0 -165
  57. package/build/module/logger.d.ts +0 -20
  58. package/build/module/logger.js +0 -15
  59. package/build/module/playback/inventory.d.ts +0 -0
  60. package/build/module/playback/inventory.js +0 -47
  61. package/build/module/playback.d.ts +0 -22
  62. package/build/module/playback.js +0 -102
  63. package/build/module/proxy.d.ts +0 -40
  64. package/build/module/proxy.js +0 -111
  65. package/build/module/recording/proxy.d.ts +0 -28
  66. package/build/module/recording/proxy.js +0 -85
  67. package/build/module/recording.d.ts +0 -28
  68. package/build/module/recording.js +0 -92
  69. package/build/module/throttling.d.ts +0 -34
  70. package/build/module/throttling.js +0 -89
  71. package/build/module/url.d.ts +0 -3
  72. package/build/module/url.js +0 -59
package/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
+
5
+ ### 0.2.1 (2024-09-11)
package/README.ja.md CHANGED
@@ -24,7 +24,7 @@ Web APIのモックツールである[VCR](https://github.com/vcr/vcr)をご存
24
24
 
25
25
  ## 使い方
26
26
 
27
- Node JS 18以上が必要です。
27
+ Node JS 20以上が必要です。
28
28
 
29
29
  ### プロジェクトの作成
30
30
 
@@ -62,6 +62,26 @@ yarn psq lighthouse playback
62
62
 
63
63
  レポートページが自動で表示されます。レポートファイル等は`artifacts`ディレクトリに作成されます。
64
64
 
65
+ ### loadshowによる読み込み過程の動画の作成
66
+
67
+ 次の`loadshow`サブコマンドを使うと、[loadshow](https://github.com/ideamans/loadshow)を用い、再生したWebページの読み込み過程を動画として出力できます。
68
+
69
+ ```sh
70
+ yarn psq loadshow playback
71
+ ```
72
+
73
+ 動画は`artifacts/loadshow.mp4`として出力されます。
74
+
75
+ また、Webページの記録においてもloadshowを利用できます。
76
+
77
+ ```sh
78
+ yarn psq loadshow recording https://exmaple.com/
79
+ ```
80
+
81
+ Lighthouseとloadshowでは、Webページの読み込みに関するブラウザの挙動が少し違います。
82
+
83
+ 動画によるスピード改善の確認が主な目的である場合は、`loadshow recording`サブコマンドを利用することを推奨します。
84
+
65
85
  ## 再生プロキシの起動
66
86
 
67
87
  次のコマンドでWebページを再生するプロキシのみを起動できます。
@@ -87,4 +107,4 @@ PageSpeed Questは、Webアプリケーションのリリースを必要とし
87
107
 
88
108
  ## 連絡先
89
109
 
90
- 技術サポートやビジネス利用に関しては contact@ideamans.com まで連絡ください。
110
+ 技術サポートやビジネス利用に関しては <contact@ideamans.com> まで連絡ください。
package/README.md CHANGED
@@ -24,7 +24,7 @@ Thanks to this mechanism, instead of actually modifying the application, you can
24
24
 
25
25
  ## How to use
26
26
 
27
- Node JS 18 or higher is required.
27
+ Node JS 20 or higher is required.
28
28
 
29
29
  ### Creating a project
30
30
 
@@ -62,6 +62,26 @@ yarn psq lighthouse playback
62
62
 
63
63
  A report page is automatically displayed. Report files and the like are created in the `artifacts` directory.
64
64
 
65
+ ### Creating a video of the loading process with loadshow
66
+
67
+ By using the following `loadshow` subcommand, you can output the playback process of a loaded web page as a video using loadshow.
68
+
69
+ ```sh
70
+ yarn psq loadshow playback
71
+ ```
72
+
73
+ The video will be output as artifacts/loadshow.mp4.
74
+
75
+ You can also use loadshow to record the loading of a web page.
76
+
77
+ ```sh
78
+ yarn psq loadshow recording <https://example.com/>
79
+ ```
80
+
81
+ Lighthouse and loadshow behave slightly differently when it comes to how the browser handles web page loading.
82
+
83
+ If the main goal is to check speed improvements through video, it is recommended to use the `loadshow recording` subcommand.
84
+
65
85
  ## Launching the playback proxy
66
86
 
67
87
  You can launch only the proxy that plays back the web page with the following command.
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "pagespeed-quest",
3
- "version": "0.1.2",
3
+ "version": "0.3.0",
4
+ "type": "module",
4
5
  "description": "A framework for efficient web front-end speed improvement",
5
- "main": "build/main/index.js",
6
- "typings": "build/main/index.d.ts",
7
- "module": "build/module/index.js",
6
+ "main": "build/index.js",
7
+ "typings": "build/index.d.ts",
8
+ "module": "build/index.js",
8
9
  "repository": "https://github.com/ideamans/pagespeed-quest",
9
10
  "license": "GPL-3.0-or-later",
10
11
  "keywords": [
@@ -13,12 +14,11 @@
13
14
  "Lighthouse"
14
15
  ],
15
16
  "bin": {
16
- "psq": "build/main/command.js"
17
+ "psq": "build/command.js"
17
18
  },
18
19
  "scripts": {
19
20
  "build": "run-p build:*",
20
- "build:main": "tsc -p tsconfig.json",
21
- "build:module": "tsc -p tsconfig.module.json",
21
+ "build:module": "tsc -p tsconfig.json",
22
22
  "fix": "run-s fix:*",
23
23
  "fix:prettier": "prettier \"src/**/*.ts\" --write",
24
24
  "fix:lint": "eslint src --ext .ts --fix",
@@ -26,7 +26,7 @@
26
26
  "test:lint": "eslint src --ext .ts",
27
27
  "test:prettier": "prettier \"src/**/*.ts\" --list-different",
28
28
  "test:spelling": "cspell \"{README.md,.github/*.md,src/**/*.ts}\"",
29
- "test:unit": "LOG_LEVEL=error nyc --silent ava",
29
+ "test:unit": "nyc --silent ava",
30
30
  "check-cli": "run-s test diff-integration-tests check-integration-tests",
31
31
  "check-integration-tests": "run-s check-integration-test:*",
32
32
  "diff-integration-tests": "mkdir -p diff && rm -rf diff/test && cp -r test diff/test && rm -rf diff/test/test-*/.git && cd diff && git init --quiet && git add -A && git commit --quiet --no-verify --allow-empty -m 'WIP' && echo '\\n\\nCommitted most recent integration test output in the \"diff\" directory. Review the changes with \"cd diff && git diff HEAD\" or your preferred git diff viewer.'",
@@ -44,8 +44,8 @@
44
44
  "version": "standard-version",
45
45
  "reset-hard": "git clean -dfx && git reset --hard && yarn",
46
46
  "prepare-release": "run-s reset-hard test cov:check doc:html version doc:publish",
47
- "adhoc": "yarn build && node build/main/adhoc.js",
48
- "command": "yarn build && node build/main/command.js"
47
+ "adhoc": "yarn build && node build/adhoc.js",
48
+ "command": "yarn build && node build/command.js"
49
49
  },
50
50
  "engines": {
51
51
  "node": ">=18"
@@ -53,25 +53,26 @@
53
53
  "dependencies": {
54
54
  "@bitauth/libauth": "^1.17.1",
55
55
  "commander": "^11.1.0",
56
- "execa": "^5.0.0",
57
- "get-port": "^5.0.0",
56
+ "execa": "^9.3.1",
57
+ "get-port": "^7.1.0",
58
58
  "http-mitm-proxy": "^0.9.0",
59
59
  "iconv-lite": "^0.6.3",
60
60
  "jschardet": "^3.0.0",
61
- "lighthouse": "^11.2.0",
61
+ "lighthouse": "^12.2.1",
62
+ "loadshow": "^1.0.9",
62
63
  "node-watch": "^0.7.4",
63
- "pino": "^8.16.1",
64
- "pino-pretty": "^10.2.3",
64
+ "pino": "^9.4.0",
65
+ "pino-pretty": "^11.2.2",
65
66
  "prettier": "^2.1.1",
66
67
  "tmp-promise": "^3.0.3"
67
68
  },
68
69
  "devDependencies": {
69
- "@ava/typescript": "^1.1.1",
70
+ "@ava/typescript": "^5.0.0",
70
71
  "@istanbuljs/nyc-config-typescript": "^1.0.1",
71
72
  "@types/node": "^20.8.9",
72
73
  "@typescript-eslint/eslint-plugin": "^4.0.1",
73
74
  "@typescript-eslint/parser": "^4.0.1",
74
- "ava": "^3.12.1",
75
+ "ava": "^6.1.3",
75
76
  "axios": "^1.5.1",
76
77
  "codecov": "^3.5.0",
77
78
  "cspell": "^4.1.0",
@@ -90,8 +91,7 @@
90
91
  "typescript": "^4.0.2"
91
92
  },
92
93
  "files": [
93
- "build/main",
94
- "build/module",
94
+ "build",
95
95
  "!**/*.spec.*",
96
96
  "!**/*.json",
97
97
  "CHANGELOG.md",
@@ -102,12 +102,16 @@
102
102
  "failFast": true,
103
103
  "timeout": "60s",
104
104
  "typescript": {
105
+ "compile": false,
105
106
  "rewritePaths": {
106
- "src/": "build/main/"
107
+ "src/": "build/"
107
108
  }
108
109
  },
110
+ "environmentVariables": {
111
+ "LOG_LEVEL": "error"
112
+ },
109
113
  "files": [
110
- "!build/module/**"
114
+ "!build/**"
111
115
  ]
112
116
  },
113
117
  "config": {
@@ -1,2 +0,0 @@
1
- export declare function recording(): Promise<void>;
2
- export declare function playback(): Promise<void>;
@@ -1,48 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.playback = exports.recording = void 0;
7
- const promises_1 = __importDefault(require("fs/promises"));
8
- const execa_1 = __importDefault(require("execa"));
9
- const playback_1 = require("./playback");
10
- const recording_1 = require("./recording");
11
- async function runLighthouse(url, port) {
12
- await (0, execa_1.default)('./node_modules/.bin/lighthouse', [
13
- '--output=html',
14
- '--output-path=tmp/lighthouse.html',
15
- '--only-categories=performance',
16
- '--form-factor=mobile',
17
- `--chrome-flags="--ignore-certificate-errors --proxy-server=http://localhost:${port}"`,
18
- '--view',
19
- url,
20
- ]);
21
- }
22
- async function recording() {
23
- const sampleUrl = 'https://www.gov-online.go.jp/';
24
- // const sampleUrl = 'https://blog.ideamans.com/'
25
- await promises_1.default.mkdir('./tmp', { recursive: true });
26
- await (0, recording_1.withRecordingProxy)(async (proxy) => {
27
- proxy.entryUrl = sampleUrl;
28
- await runLighthouse(sampleUrl, proxy.port);
29
- }, {
30
- dirPath: './tmp',
31
- });
32
- }
33
- exports.recording = recording;
34
- async function playback() {
35
- await (0, playback_1.withPlaybackProxy)(async (proxy) => {
36
- if (!proxy.entryUrl)
37
- throw new Error('proxy.entryUrl is empty');
38
- await runLighthouse(proxy.entryUrl, proxy.port);
39
- }, {
40
- dirPath: './tmp',
41
- throttling: {
42
- mbps: 1.6,
43
- },
44
- });
45
- }
46
- exports.playback = playback;
47
- playback();
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRob2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRob2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkRBQTZCO0FBRTdCLGtEQUF5QjtBQUV6Qix5Q0FBOEM7QUFDOUMsMkNBQWdEO0FBRWhELEtBQUssVUFBVSxhQUFhLENBQUMsR0FBVyxFQUFFLElBQVk7SUFDcEQsTUFBTSxJQUFBLGVBQUssRUFBQyxnQ0FBZ0MsRUFBRTtRQUM1QyxlQUFlO1FBQ2YsbUNBQW1DO1FBQ25DLCtCQUErQjtRQUMvQixzQkFBc0I7UUFDdEIsK0VBQStFLElBQUksR0FBRztRQUN0RixRQUFRO1FBQ1IsR0FBRztLQUNKLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFTSxLQUFLLFVBQVUsU0FBUztJQUM3QixNQUFNLFNBQVMsR0FBRywrQkFBK0IsQ0FBQTtJQUNqRCxpREFBaUQ7SUFFakQsTUFBTSxrQkFBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUM3QyxNQUFNLElBQUEsOEJBQWtCLEVBQ3RCLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNkLEtBQUssQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFBO1FBQzFCLE1BQU0sYUFBYSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDNUMsQ0FBQyxFQUNEO1FBQ0UsT0FBTyxFQUFFLE9BQU87S0FDakIsQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQWRELDhCQWNDO0FBRU0sS0FBSyxVQUFVLFFBQVE7SUFDNUIsTUFBTSxJQUFBLDRCQUFpQixFQUNyQixLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUE7UUFDL0QsTUFBTSxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDakQsQ0FBQyxFQUNEO1FBQ0UsT0FBTyxFQUFFLE9BQU87UUFDaEIsVUFBVSxFQUFFO1lBQ1YsSUFBSSxFQUFFLEdBQUc7U0FDVjtLQUNGLENBQ0YsQ0FBQTtBQUNILENBQUM7QUFiRCw0QkFhQztBQUVELFFBQVEsRUFBRSxDQUFBIn0=
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
@@ -1,103 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const promises_1 = __importDefault(require("fs/promises"));
8
- const commander_1 = require("commander");
9
- const execa_1 = __importDefault(require("execa"));
10
- const node_watch_1 = __importDefault(require("node-watch"));
11
- const index_1 = require("./index");
12
- async function runLighthouse(opts) {
13
- await promises_1.default.mkdir('./artifacts', { recursive: true });
14
- const formFactor = opts.formFactor || 'mobile';
15
- const args = [
16
- opts.url,
17
- '--save-assets',
18
- '--output=html,json',
19
- '--output-path=./artifacts/lighthouse',
20
- '--only-categories=performance',
21
- `--form-factor=${formFactor}`,
22
- ];
23
- if (opts.noThrottling) {
24
- args.push('--throttling.rttMs=0', '--throttling.throughputKbps=0', '--throttling.downloadThroughputKbps=0', '--throttling.uploadThroughputKbps=0', '--throttling.cpuSlowdownMultiplier=1');
25
- }
26
- else if (opts.cpuMultiplier)
27
- args.push(`--throttling.cpuSlowdownMultiplier=${opts.cpuMultiplier}`);
28
- const chromeFlags = ['--ignore-certificate-errors', `--proxy-server=http://localhost:${opts.proxyPort}`];
29
- args.push(`--chrome-flags="${chromeFlags.join(' ')}"`);
30
- if (opts.view)
31
- args.push('--view');
32
- await (0, execa_1.default)('./node_modules/.bin/lighthouse', args);
33
- }
34
- const main = new commander_1.Command();
35
- function lighthouseCommands() {
36
- const lighthouse = main.command('lighthouse');
37
- lighthouse.description('Run Lighthouse (performance category) via a proxy');
38
- lighthouse.option('-f, --form-factor <mobile|desktop>', 'Lighthouse form factor', 'mobile');
39
- const recording = lighthouse.command('recording');
40
- recording.description('Record contents by lighthouse');
41
- recording.argument('<url>', 'Url to measure performance');
42
- recording.action(async (url) => {
43
- await (0, index_1.withRecordingProxy)(async (proxy) => {
44
- const formFactor = lighthouse.opts().formFactor;
45
- await runLighthouse({ url, proxyPort: proxy.port, formFactor, noThrottling: true, view: false });
46
- (0, index_1.logger)().info('Lighthouse completed. Saving inventory...');
47
- }, {
48
- entryUrl: url,
49
- });
50
- });
51
- const playback = lighthouse.command('playback');
52
- playback.description('Playback contents for lighthouse');
53
- playback.option('-c, --cpu-multiplier <number>', 'Lighthouse CPU multiplier', '4');
54
- playback.action(async () => {
55
- const cpuMultiplier = playback.opts().cpuMultiplier;
56
- await (0, index_1.withPlaybackProxy)(async (proxy) => {
57
- const url = proxy.entryUrl;
58
- await runLighthouse({ url, proxyPort: proxy.port, cpuMultiplier, view: true });
59
- (0, index_1.logger)().info('Lighthouse completed');
60
- }, {
61
- throttling: {
62
- mbps: 1.6,
63
- },
64
- });
65
- });
66
- }
67
- function proxyCommands() {
68
- const proxy = main.command('proxy');
69
- proxy.option('-d, --inventory-dir <path>', 'Inventory directory');
70
- proxy.option('-p, --port <number>', 'Proxy port', '8080');
71
- proxy.option('-t, --throughput <number>', 'Throttle network throughput (Mbps)');
72
- proxy.action(async () => {
73
- const proxyOptions = {};
74
- if (proxy.opts().inventoryDir) {
75
- proxyOptions.dirPath = proxy.opts().inventoryDir;
76
- }
77
- if (proxy.opts().port) {
78
- proxyOptions.port = Number(proxy.opts().port);
79
- }
80
- if (proxy.opts().throughput) {
81
- proxyOptions.throttling = {
82
- mbps: Number(proxy.opts().throughput),
83
- };
84
- }
85
- // eslint-disable-next-line no-constant-condition
86
- while (true) {
87
- await (0, index_1.withPlaybackProxy)(async (proxy) => {
88
- const watcher = (0, node_watch_1.default)(proxy.inventoryDirPath, { recursive: true });
89
- return new Promise((ok) => {
90
- watcher.on('change', () => {
91
- watcher.close();
92
- (0, index_1.logger)().info('Inventory changed. Restarting proxy...');
93
- ok();
94
- });
95
- });
96
- }, proxyOptions);
97
- }
98
- });
99
- }
100
- lighthouseCommands();
101
- proxyCommands();
102
- main.parse(process.argv);
103
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLDJEQUE2QjtBQUU3Qix5Q0FBbUM7QUFDbkMsa0RBQXlCO0FBQ3pCLDREQUE4QjtBQUU5QixtQ0FBeUY7QUFhekYsS0FBSyxVQUFVLGFBQWEsQ0FBQyxJQUF1QjtJQUNsRCxNQUFNLGtCQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRW5ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFBO0lBQzlDLE1BQU0sSUFBSSxHQUFhO1FBQ3JCLElBQUksQ0FBQyxHQUFHO1FBQ1IsZUFBZTtRQUNmLG9CQUFvQjtRQUNwQixzQ0FBc0M7UUFDdEMsK0JBQStCO1FBQy9CLGlCQUFpQixVQUFVLEVBQUU7S0FDOUIsQ0FBQTtJQUVELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUNQLHNCQUFzQixFQUN0QiwrQkFBK0IsRUFDL0IsdUNBQXVDLEVBQ3ZDLHFDQUFxQyxFQUNyQyxzQ0FBc0MsQ0FDdkMsQ0FBQTtLQUNGO1NBQU0sSUFBSSxJQUFJLENBQUMsYUFBYTtRQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsc0NBQXNDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFBO0lBRXBHLE1BQU0sV0FBVyxHQUFhLENBQUMsNkJBQTZCLEVBQUUsbUNBQW1DLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBQ2xILElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRXRELElBQUksSUFBSSxDQUFDLElBQUk7UUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lB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
@@ -1,41 +0,0 @@
1
- /// <reference types="node" />
2
- export type ContentEncodingType = 'gzip' | 'compress' | 'deflate' | 'br' | 'identity';
3
- export type HttpHeaders = {
4
- [key: string]: string;
5
- };
6
- export interface ResourceMeta {
7
- method: string;
8
- url: string;
9
- ttfbMs?: number;
10
- mbps?: number;
11
- statusCode?: number;
12
- contentType?: string;
13
- contentEncoding?: ContentEncodingType;
14
- headers?: HttpHeaders;
15
- minify?: boolean;
16
- }
17
- export interface InventoryResource extends ResourceMeta {
18
- contentFilePath: string;
19
- }
20
- export interface RecordingResource extends ResourceMeta {
21
- contentChunks: Buffer[];
22
- requestStartedAtMs: number;
23
- responseStartedAtMs?: number;
24
- responseEndedAtMs?: number;
25
- transferBytes?: number;
26
- error?: string;
27
- }
28
- export interface PlaybackResource extends ResourceMeta {
29
- contentChunks: Buffer[];
30
- contentLength: number;
31
- durationMs: number;
32
- }
33
- export interface ContentChunks {
34
- contentFilePath: string;
35
- contentEncoding: ContentEncodingType;
36
- chunks: Buffer[];
37
- durationMs: number;
38
- }
39
- export interface Inventory {
40
- resources: InventoryResource[];
41
- }
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1vbi10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -1,11 +0,0 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
- import Zlib from 'zlib';
4
- import { ContentEncodingType } from './common-types';
5
- export interface ContentEncodingPair {
6
- compress: typeof Zlib.gzip;
7
- decompress: typeof Zlib.gunzip;
8
- }
9
- export declare const ContentEncodingMap: Map<ContentEncodingType, ContentEncodingPair>;
10
- export declare function compress(type: ContentEncodingType, buffer: Buffer): Promise<Buffer>;
11
- export declare function decompress(type: ContentEncodingType, buffer: Buffer): Promise<Buffer>;
@@ -1,51 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.decompress = exports.compress = exports.ContentEncodingMap = void 0;
7
- const zlib_1 = __importDefault(require("zlib"));
8
- exports.ContentEncodingMap = new Map();
9
- exports.ContentEncodingMap.set('gzip', {
10
- compress: zlib_1.default.gzip,
11
- decompress: zlib_1.default.gunzip,
12
- });
13
- exports.ContentEncodingMap.set('compress', {
14
- compress: zlib_1.default.gzip,
15
- decompress: zlib_1.default.gunzip,
16
- });
17
- exports.ContentEncodingMap.set('deflate', {
18
- compress: zlib_1.default.deflate,
19
- decompress: zlib_1.default.inflate,
20
- });
21
- exports.ContentEncodingMap.set('br', {
22
- compress: zlib_1.default.brotliCompress,
23
- decompress: zlib_1.default.brotliDecompress,
24
- });
25
- async function compress(type, buffer) {
26
- const pair = exports.ContentEncodingMap.get(type);
27
- if (!pair)
28
- return Buffer.from(buffer);
29
- return new Promise((resolve, reject) => {
30
- pair.compress(buffer, (err, result) => {
31
- if (err)
32
- return reject(err);
33
- resolve(result);
34
- });
35
- });
36
- }
37
- exports.compress = compress;
38
- async function decompress(type, buffer) {
39
- const pair = exports.ContentEncodingMap.get(type);
40
- if (!pair)
41
- return Buffer.from(buffer);
42
- return new Promise((resolve, reject) => {
43
- pair.decompress(buffer, (err, result) => {
44
- if (err)
45
- return reject(err);
46
- resolve(result);
47
- });
48
- });
49
- }
50
- exports.decompress = decompress;
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1lbmNvZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZW50LWVuY29kaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQVNYLFFBQUEsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBR3RDLENBQUM7QUFFSiwwQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFO0lBQzdCLFFBQVEsRUFBRSxjQUFJLENBQUMsSUFBSTtJQUNuQixVQUFVLEVBQUUsY0FBSSxDQUFDLE1BQU07Q0FDeEIsQ0FBQyxDQUFDO0FBRUgsMEJBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtJQUNqQyxRQUFRLEVBQUUsY0FBSSxDQUFDLElBQUk7SUFDbkIsVUFBVSxFQUFFLGNBQUksQ0FBQyxNQUFNO0NBQ3hCLENBQUMsQ0FBQztBQUVILDBCQUFrQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUU7SUFDaEMsUUFBUSxFQUFFLGNBQUksQ0FBQyxPQUFPO0lBQ3RCLFVBQVUsRUFBRSxjQUFJLENBQUMsT0FBTztDQUN6QixDQUFDLENBQUM7QUFFSCwwQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO0lBQzNCLFFBQVEsRUFBRSxjQUFJLENBQUMsY0FBYztJQUM3QixVQUFVLEVBQUUsY0FBSSxDQUFDLGdCQUFnQjtDQUNsQyxDQUFDLENBQUM7QUFFSSxLQUFLLFVBQVUsUUFBUSxDQUM1QixJQUF5QixFQUN6QixNQUFjO0lBRWQsTUFBTSxJQUFJLEdBQUcsMEJBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXRDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDcEMsSUFBSSxHQUFHO2dCQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQWJELDRCQWFDO0FBRU0sS0FBSyxVQUFVLFVBQVUsQ0FDOUIsSUFBeUIsRUFDekIsTUFBYztJQUVkLE1BQU0sSUFBSSxHQUFHLDBCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV0QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLElBQUksR0FBRztnQkFBRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFiRCxnQ0FhQyJ9
@@ -1,11 +0,0 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
- import Zlib from 'zlib';
4
- export type ContentEncodingType = 'gzip' | 'compress' | 'deflate' | 'br' | 'identity';
5
- export interface ContentEncodingPair {
6
- compress: typeof Zlib.gzip;
7
- decompress: typeof Zlib.gunzip;
8
- }
9
- export declare const ContentEncodingMap: Map<ContentEncodingType, ContentEncodingPair>;
10
- export declare function compress(type: ContentEncodingType, buffer: Buffer): Promise<Buffer>;
11
- export declare function decompress(type: ContentEncodingType, buffer: Buffer): Promise<Buffer>;
@@ -1,51 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.decompress = exports.compress = exports.ContentEncodingMap = void 0;
7
- const zlib_1 = __importDefault(require("zlib"));
8
- exports.ContentEncodingMap = new Map();
9
- exports.ContentEncodingMap.set('gzip', {
10
- compress: zlib_1.default.gzip,
11
- decompress: zlib_1.default.gunzip,
12
- });
13
- exports.ContentEncodingMap.set('compress', {
14
- compress: zlib_1.default.gzip,
15
- decompress: zlib_1.default.gunzip,
16
- });
17
- exports.ContentEncodingMap.set('deflate', {
18
- compress: zlib_1.default.deflate,
19
- decompress: zlib_1.default.inflate,
20
- });
21
- exports.ContentEncodingMap.set('br', {
22
- compress: zlib_1.default.brotliCompress,
23
- decompress: zlib_1.default.brotliDecompress,
24
- });
25
- async function compress(type, buffer) {
26
- const pair = exports.ContentEncodingMap.get(type);
27
- if (!pair)
28
- return Buffer.from(buffer);
29
- return new Promise((resolve, reject) => {
30
- pair.compress(buffer, (err, result) => {
31
- if (err)
32
- return reject(err);
33
- resolve(result);
34
- });
35
- });
36
- }
37
- exports.compress = compress;
38
- async function decompress(type, buffer) {
39
- const pair = exports.ContentEncodingMap.get(type);
40
- if (!pair)
41
- return Buffer.from(buffer);
42
- return new Promise((resolve, reject) => {
43
- pair.decompress(buffer, (err, result) => {
44
- if (err)
45
- return reject(err);
46
- resolve(result);
47
- });
48
- });
49
- }
50
- exports.decompress = decompress;
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0RBQXVCO0FBU1YsUUFBQSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBNEMsQ0FBQTtBQUVyRiwwQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFO0lBQzdCLFFBQVEsRUFBRSxjQUFJLENBQUMsSUFBSTtJQUNuQixVQUFVLEVBQUUsY0FBSSxDQUFDLE1BQU07Q0FDeEIsQ0FBQyxDQUFBO0FBRUYsMEJBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtJQUNqQyxRQUFRLEVBQUUsY0FBSSxDQUFDLElBQUk7SUFDbkIsVUFBVSxFQUFFLGNBQUksQ0FBQyxNQUFNO0NBQ3hCLENBQUMsQ0FBQTtBQUVGLDBCQUFrQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUU7SUFDaEMsUUFBUSxFQUFFLGNBQUksQ0FBQyxPQUFPO0lBQ3RCLFVBQVUsRUFBRSxjQUFJLENBQUMsT0FBTztDQUN6QixDQUFDLENBQUE7QUFFRiwwQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO0lBQzNCLFFBQVEsRUFBRSxjQUFJLENBQUMsY0FBYztJQUM3QixVQUFVLEVBQUUsY0FBSSxDQUFDLGdCQUFnQjtDQUNsQyxDQUFDLENBQUE7QUFFSyxLQUFLLFVBQVUsUUFBUSxDQUFDLElBQXlCLEVBQUUsTUFBYztJQUN0RSxNQUFNLElBQUksR0FBRywwQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFckMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNwQyxJQUFJLEdBQUc7Z0JBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDM0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2pCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBVkQsNEJBVUM7QUFFTSxLQUFLLFVBQVUsVUFBVSxDQUFDLElBQXlCLEVBQUUsTUFBYztJQUN4RSxNQUFNLElBQUksR0FBRywwQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFckMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN0QyxJQUFJLEdBQUc7Z0JBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDM0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2pCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBVkQsZ0NBVUMifQ==
@@ -1,8 +0,0 @@
1
- /// <reference types="node" />
2
- export declare function ensureUtf8String(buffer: Buffer, charset: string): string;
3
- export declare function isText(mimeType: string): boolean;
4
- export interface BeautifyResult {
5
- content: Buffer;
6
- charset?: string;
7
- }
8
- export declare function convertEditableText(content: Buffer, contentTypeMime: string, contentTypeCharset?: string): Promise<Buffer>;
@@ -1,64 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.convertEditableText = exports.isText = exports.ensureUtf8String = void 0;
7
- const iconv_lite_1 = __importDefault(require("iconv-lite"));
8
- const prettier_1 = __importDefault(require("prettier"));
9
- const PrettierDefaultOptions = { printWidth: 120 };
10
- function ensureUtf8String(buffer, charset) {
11
- if (charset.match(/utf-?8/i) || charset.match(/ascii/i))
12
- return buffer.toString('utf8');
13
- const converted = iconv_lite_1.default.decode(buffer, charset);
14
- return converted;
15
- }
16
- exports.ensureUtf8String = ensureUtf8String;
17
- function isHtml(mimeType) {
18
- if (!mimeType)
19
- return false;
20
- return mimeType === 'text/html';
21
- }
22
- function isCss(mimeType) {
23
- if (!mimeType)
24
- return false;
25
- return mimeType === 'text/css';
26
- }
27
- function isJs(mimeType) {
28
- if (!mimeType)
29
- return false;
30
- return (mimeType === 'text/javascript' || mimeType === 'application/javascript' || mimeType === 'application/x-javascript');
31
- }
32
- function isText(mimeType) {
33
- return isHtml(mimeType) || isCss(mimeType) || isJs(mimeType);
34
- }
35
- exports.isText = isText;
36
- async function convertEditableText(content, contentTypeMime, contentTypeCharset) {
37
- const charset = contentTypeCharset || 'utf-8';
38
- if (isHtml(contentTypeMime)) {
39
- const utf8 = ensureUtf8String(content, charset);
40
- const withoutCharsetMeta = utf8.replace(/<meta charset="[^"]*">/, '');
41
- const withoutScriptCharsetAttr = withoutCharsetMeta.replace(/<script(?:.*)>/gi, (scriptTag) => {
42
- return scriptTag.replace(/\s*charset\s*=\s*(?:"[^"]*"|'[^']*'|[^ ]+)/i, '');
43
- });
44
- // TODO: consider charset attribute in link[rel=stylesheet]
45
- const html = await prettier_1.default.format(withoutScriptCharsetAttr, Object.assign(Object.assign({}, PrettierDefaultOptions), { parser: 'html' }));
46
- return html;
47
- }
48
- else if (isCss(contentTypeMime)) {
49
- const utf8 = ensureUtf8String(content, charset);
50
- const withoutCharsetDirective = utf8.replace(/@charset "[^"]*";/, '');
51
- const css = await prettier_1.default.format(withoutCharsetDirective, Object.assign(Object.assign({}, PrettierDefaultOptions), { parser: 'css' }));
52
- return css;
53
- }
54
- else if (isJs(contentTypeMime)) {
55
- const utf8 = ensureUtf8String(content, charset);
56
- const js = await prettier_1.default.format(utf8, Object.assign(Object.assign({}, PrettierDefaultOptions), { parser: 'babel' }));
57
- return js;
58
- }
59
- else {
60
- throw new Error(`${contentTypeMime} is not supported text content type`);
61
- }
62
- }
63
- exports.convertEditableText = convertEditableText;
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mb3JtYXR0aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDREQUFrQztBQUNsQyx3REFBK0I7QUFFL0IsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQTtBQUVsRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsT0FBZTtJQUM5RCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdkYsTUFBTSxTQUFTLEdBQUcsb0JBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ25ELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQVMsTUFBTSxDQUFDLFFBQWdCO0lBQzlCLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDM0IsT0FBTyxRQUFRLEtBQUssV0FBVyxDQUFBO0FBQ2pDLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxRQUFnQjtJQUM3QixJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQzNCLE9BQU8sUUFBUSxLQUFLLFVBQVUsQ0FBQTtBQUNoQyxDQUFDO0FBRUQsU0FBUyxJQUFJLENBQUMsUUFBZ0I7SUFDNUIsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUMzQixPQUFPLENBQ0wsUUFBUSxLQUFLLGlCQUFpQixJQUFJLFFBQVEsS0FBSyx3QkFBd0IsSUFBSSxRQUFRLEtBQUssMEJBQTBCLENBQ25ILENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsTUFBTSxDQUFDLFFBQWdCO0lBQ3JDLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7QUFDOUQsQ0FBQztBQUZELHdCQUVDO0FBT00sS0FBSyxVQUFVLG1CQUFtQixDQUN2QyxPQUFlLEVBQ2YsZUFBdUIsRUFDdkIsa0JBQTJCO0lBRTNCLE1BQU0sT0FBTyxHQUFHLGtCQUFrQixJQUFJLE9BQU8sQ0FBQTtJQUM3QyxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRTtRQUMzQixNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDL0MsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sd0JBQXdCLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDNUYsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLDZDQUE2QyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQzdFLENBQUMsQ0FBQyxDQUFBO1FBQ0YsMkRBQTJEO1FBQzNELE1BQU0sSUFBSSxHQUFHLE1BQU0sa0JBQVEsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLGtDQUFPLHNCQUFzQixLQUFFLE1BQU0sRUFBRSxNQUFNLElBQUcsQ0FBQTtRQUMzRyxPQUFPLElBQUksQ0FBQTtLQUNaO1NBQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDakMsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQy9DLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNyRSxNQUFNLEdBQUcsR0FBRyxNQUFNLGtCQUFRLENBQUMsTUFBTSxDQUFDLHVCQUF1QixrQ0FBTyxzQkFBc0IsS0FBRSxNQUFNLEVBQUUsS0FBSyxJQUFHLENBQUE7UUFDeEcsT0FBTyxHQUFHLENBQUE7S0FDWDtTQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMvQyxNQUFNLEVBQUUsR0FBRyxNQUFNLGtCQUFRLENBQUMsTUFBTSxDQUFDLElBQUksa0NBQU8sc0JBQXNCLEtBQUUsTUFBTSxFQUFFLE9BQU8sSUFBRyxDQUFBO1FBQ3RGLE9BQU8sRUFBRSxDQUFBO0tBQ1Y7U0FBTTtRQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxlQUFlLHFDQUFxQyxDQUFDLENBQUE7S0FDekU7QUFDSCxDQUFDO0FBM0JELGtEQTJCQyJ9
@@ -1,27 +0,0 @@
1
- /// <reference types="node" />
2
- export type HttpHeaders = {
3
- [key: string]: string;
4
- };
5
- /**
6
- * Remove IgnoreParams from URL
7
- * Default: ts (timestamp) assumed different for each request
8
- * @param url
9
- * @returns
10
- */
11
- export declare function normalizeUrl(url: string | URL): URL;
12
- /**
13
- * Convert URL to content file path
14
- * For example:
15
- * https://example.com/foo/bar.html?hoge=123 -> example.com/foo/bar~hoge=123.html
16
- * - Add directory index (index.html) if URL ends with slash
17
- * - Shorten too long basename with short hash
18
- * - Ignore dynamic params for example: ts=123
19
- * @param url
20
- * @returns
21
- */
22
- export declare function requestContentFilePath(method: string, url: string | URL): string;
23
- export declare function parseContentTypeHeader(contentType: string): {
24
- mime: string;
25
- charset: string;
26
- };
27
- export declare function stringifyContentTypeHeader(mime?: string, charset?: string, original?: string): string;