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.
- package/CHANGELOG.md +5 -0
- package/README.ja.md +22 -2
- package/README.md +21 -1
- package/package.json +25 -21
- package/build/main/adhoc.d.ts +0 -2
- package/build/main/adhoc.js +0 -48
- package/build/main/command.d.ts +0 -2
- package/build/main/command.js +0 -103
- package/build/main/common-types.d.ts +0 -41
- package/build/main/common-types.js +0 -3
- package/build/main/content-encoding.d.ts +0 -11
- package/build/main/content-encoding.js +0 -51
- package/build/main/encoding.d.ts +0 -11
- package/build/main/encoding.js +0 -51
- package/build/main/formatting.d.ts +0 -8
- package/build/main/formatting.js +0 -64
- package/build/main/http.d.ts +0 -27
- package/build/main/http.js +0 -106
- package/build/main/index.d.ts +0 -9
- package/build/main/index.js +0 -26
- package/build/main/inventory.d.ts +0 -39
- package/build/main/inventory.js +0 -171
- package/build/main/logger.d.ts +0 -20
- package/build/main/logger.js +0 -22
- package/build/main/playback/inventory.d.ts +0 -0
- package/build/main/playback/inventory.js +0 -47
- package/build/main/playback.d.ts +0 -22
- package/build/main/playback.js +0 -111
- package/build/main/proxy.d.ts +0 -40
- package/build/main/proxy.js +0 -111
- package/build/main/recording/proxy.d.ts +0 -28
- package/build/main/recording/proxy.js +0 -90
- package/build/main/recording.d.ts +0 -28
- package/build/main/recording.js +0 -95
- package/build/main/throttling.d.ts +0 -34
- package/build/main/throttling.js +0 -88
- package/build/main/url.d.ts +0 -3
- package/build/main/url.js +0 -67
- package/build/module/adhoc.d.ts +0 -2
- package/build/module/adhoc.js +0 -40
- package/build/module/command.d.ts +0 -2
- package/build/module/command.js +0 -98
- package/build/module/common-types.d.ts +0 -41
- package/build/module/common-types.js +0 -2
- package/build/module/content-encoding.d.ts +0 -11
- package/build/module/content-encoding.js +0 -43
- package/build/module/encoding.d.ts +0 -11
- package/build/module/encoding.js +0 -43
- package/build/module/formatting.d.ts +0 -8
- package/build/module/formatting.js +0 -55
- package/build/module/http.d.ts +0 -27
- package/build/module/http.js +0 -96
- package/build/module/index.d.ts +0 -9
- package/build/module/index.js +0 -10
- package/build/module/inventory.d.ts +0 -39
- package/build/module/inventory.js +0 -165
- package/build/module/logger.d.ts +0 -20
- package/build/module/logger.js +0 -15
- package/build/module/playback/inventory.d.ts +0 -0
- package/build/module/playback/inventory.js +0 -47
- package/build/module/playback.d.ts +0 -22
- package/build/module/playback.js +0 -102
- package/build/module/proxy.d.ts +0 -40
- package/build/module/proxy.js +0 -111
- package/build/module/recording/proxy.d.ts +0 -28
- package/build/module/recording/proxy.js +0 -85
- package/build/module/recording.d.ts +0 -28
- package/build/module/recording.js +0 -92
- package/build/module/throttling.d.ts +0 -34
- package/build/module/throttling.js +0 -89
- package/build/module/url.d.ts +0 -3
- package/build/module/url.js +0 -59
package/CHANGELOG.md
ADDED
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
|
|
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
|
|
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.
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"description": "A framework for efficient web front-end speed improvement",
|
|
5
|
-
"main": "build/
|
|
6
|
-
"typings": "build/
|
|
7
|
-
"module": "build/
|
|
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/
|
|
17
|
+
"psq": "build/command.js"
|
|
17
18
|
},
|
|
18
19
|
"scripts": {
|
|
19
20
|
"build": "run-p build:*",
|
|
20
|
-
"build:
|
|
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": "
|
|
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/
|
|
48
|
-
"command": "yarn build && node build/
|
|
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": "^
|
|
57
|
-
"get-port": "^
|
|
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": "^
|
|
61
|
+
"lighthouse": "^12.2.1",
|
|
62
|
+
"loadshow": "^1.0.9",
|
|
62
63
|
"node-watch": "^0.7.4",
|
|
63
|
-
"pino": "^
|
|
64
|
-
"pino-pretty": "^
|
|
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": "^
|
|
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": "^
|
|
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
|
|
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/
|
|
107
|
+
"src/": "build/"
|
|
107
108
|
}
|
|
108
109
|
},
|
|
110
|
+
"environmentVariables": {
|
|
111
|
+
"LOG_LEVEL": "error"
|
|
112
|
+
},
|
|
109
113
|
"files": [
|
|
110
|
-
"!build
|
|
114
|
+
"!build/**"
|
|
111
115
|
]
|
|
112
116
|
},
|
|
113
117
|
"config": {
|
package/build/main/adhoc.d.ts
DELETED
package/build/main/adhoc.js
DELETED
|
@@ -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=
|
package/build/main/command.d.ts
DELETED
package/build/main/command.js
DELETED
|
@@ -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
|
package/build/main/encoding.d.ts
DELETED
|
@@ -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>;
|
package/build/main/encoding.js
DELETED
|
@@ -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>;
|
package/build/main/formatting.js
DELETED
|
@@ -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
|
package/build/main/http.d.ts
DELETED
|
@@ -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;
|