pagespeed-quest 0.3.2 → 0.3.3
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/build/adhoc.d.ts +2 -0
- package/build/adhoc.js +31 -0
- package/build/command.d.ts +2 -0
- package/build/command.js +121 -0
- package/build/dependency.d.ts +9 -0
- package/build/dependency.js +31 -0
- package/build/encoding.d.ts +11 -0
- package/build/encoding.js +43 -0
- package/build/formatting.d.ts +8 -0
- package/build/formatting.js +55 -0
- package/build/http.d.ts +26 -0
- package/build/http.js +96 -0
- package/build/index.d.ts +8 -0
- package/build/index.js +9 -0
- package/build/inventory.d.ts +46 -0
- package/build/inventory.js +175 -0
- package/build/lighthouse.d.ts +12 -0
- package/build/lighthouse.js +28 -0
- package/build/loadshow.d.ts +19 -0
- package/build/loadshow.js +65 -0
- package/build/playback.d.ts +22 -0
- package/build/playback.js +104 -0
- package/build/proxy.d.ts +35 -0
- package/build/proxy.js +96 -0
- package/build/recording.d.ts +28 -0
- package/build/recording.js +94 -0
- package/build/throttling.d.ts +33 -0
- package/build/throttling.js +89 -0
- package/build/types.d.ts +8 -0
- package/build/types.js +2 -0
- package/package.json +3 -2
package/build/adhoc.d.ts
ADDED
package/build/adhoc.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import Fsp from 'fs/promises';
|
|
2
|
+
import { Dependency } from './dependency.js';
|
|
3
|
+
import { InventoryRepository } from './inventory.js';
|
|
4
|
+
import { execLighthouse } from './lighthouse.js';
|
|
5
|
+
import { withPlaybackProxy } from './playback.js';
|
|
6
|
+
import { withRecordingProxy } from './recording.js';
|
|
7
|
+
const dependency = new Dependency();
|
|
8
|
+
export async function recording() {
|
|
9
|
+
const sampleUrl = 'https://www.gov-online.go.jp/';
|
|
10
|
+
// const sampleUrl = 'https://blog.ideamans.com/'
|
|
11
|
+
await Fsp.mkdir('./tmp', { recursive: true });
|
|
12
|
+
const inventoryRepository = new InventoryRepository('./tmp', dependency);
|
|
13
|
+
await withRecordingProxy({
|
|
14
|
+
inventoryRepository,
|
|
15
|
+
}, dependency, async (proxy) => {
|
|
16
|
+
proxy.entryUrl = sampleUrl;
|
|
17
|
+
await execLighthouse({ url: sampleUrl, proxyPort: proxy.port, headless: false }, dependency);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export async function playback() {
|
|
21
|
+
const inventoryRepository = new InventoryRepository('./tmp', dependency);
|
|
22
|
+
await withPlaybackProxy({
|
|
23
|
+
inventoryRepository,
|
|
24
|
+
}, dependency, async (proxy) => {
|
|
25
|
+
if (!proxy.entryUrl)
|
|
26
|
+
throw new Error('proxy.entryUrl is empty');
|
|
27
|
+
await execLighthouse({ url: proxy.entryUrl, proxyPort: proxy.port, headless: false }, dependency);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
playback();
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRob2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYWRob2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFBO0FBRTdCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRW5ELE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUE7QUFFbkMsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTO0lBQzdCLE1BQU0sU0FBUyxHQUFHLCtCQUErQixDQUFBO0lBQ2pELGlEQUFpRDtJQUVqRCxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDN0MsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUN4RSxNQUFNLGtCQUFrQixDQUN0QjtRQUNFLG1CQUFtQjtLQUNwQixFQUNELFVBQVUsRUFDVixLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDZCxLQUFLLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQTtRQUMxQixNQUFNLGNBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQzlGLENBQUMsQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUTtJQUM1QixNQUFNLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ3hFLE1BQU0saUJBQWlCLENBQ3JCO1FBQ0UsbUJBQW1CO0tBQ3BCLEVBQ0QsVUFBVSxFQUNWLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQTtRQUMvRCxNQUFNLGNBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUNuRyxDQUFDLENBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxRQUFRLEVBQUUsQ0FBQSJ9
|
package/build/command.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import Watch from 'node-watch';
|
|
4
|
+
import { Dependency } from './dependency.js';
|
|
5
|
+
import { execLighthouse } from './lighthouse.js';
|
|
6
|
+
import { execLoadshow } from './loadshow.js';
|
|
7
|
+
import { InventoryRepository, withPlaybackProxy, withRecordingProxy } from './index.js';
|
|
8
|
+
const dependency = new Dependency();
|
|
9
|
+
const main = new Command();
|
|
10
|
+
main.option('-i, --inventory <dir>', 'Inventory directory', './inventory');
|
|
11
|
+
function registerLighthouseCommands(main) {
|
|
12
|
+
const lighthouse = main.command('lighthouse');
|
|
13
|
+
lighthouse.description('Run Lighthouse (performance category) via a proxy');
|
|
14
|
+
lighthouse.option('-a, --artifacts <dir>', 'Artifacts directory', './artifacts');
|
|
15
|
+
lighthouse.option('-q, --quiet', 'Run headless', false);
|
|
16
|
+
const recording = lighthouse.command('recording');
|
|
17
|
+
recording.description('Record contents by lighthouse');
|
|
18
|
+
recording.option('-d, --device <mobile|desktop>', 'Device type', 'mobile');
|
|
19
|
+
recording.argument('<url>', 'Url to measure performance');
|
|
20
|
+
recording.action(async (url) => {
|
|
21
|
+
const inventoryRepository = new InventoryRepository(main.opts().inventory || './inventory');
|
|
22
|
+
const deviceType = recording.opts().device || 'mobile';
|
|
23
|
+
const artifactsDir = lighthouse.opts().artifacts || './artifacts';
|
|
24
|
+
const quiet = !!lighthouse.opts().quiet;
|
|
25
|
+
await withRecordingProxy({
|
|
26
|
+
entryUrl: url,
|
|
27
|
+
deviceType,
|
|
28
|
+
inventoryRepository,
|
|
29
|
+
}, dependency, async (proxy) => {
|
|
30
|
+
await execLighthouse({ url, proxyPort: proxy.port, deviceType, noThrottling: true, view: false, artifactsDir, headless: quiet }, dependency);
|
|
31
|
+
dependency.logger?.info('Lighthouse completed. Saving inventory...');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
const playback = lighthouse.command('playback');
|
|
35
|
+
playback.description('Playback contents for lighthouse');
|
|
36
|
+
playback.action(async () => {
|
|
37
|
+
const inventoryRepository = new InventoryRepository(main.opts().inventory || './inventory');
|
|
38
|
+
const artifactsDir = lighthouse.opts().artifacts || './artifacts';
|
|
39
|
+
const quiet = !!lighthouse.opts().quiet;
|
|
40
|
+
await withPlaybackProxy({
|
|
41
|
+
inventoryRepository,
|
|
42
|
+
}, dependency, async (proxy) => {
|
|
43
|
+
await execLighthouse({
|
|
44
|
+
url: proxy.entryUrl,
|
|
45
|
+
proxyPort: proxy.port,
|
|
46
|
+
deviceType: proxy.deviceType,
|
|
47
|
+
view: !quiet,
|
|
48
|
+
artifactsDir,
|
|
49
|
+
headless: quiet,
|
|
50
|
+
}, dependency);
|
|
51
|
+
dependency.logger?.info('Lighthouse completed');
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function registerLoadshowCommands(main) {
|
|
56
|
+
const loadshow = main.command('loadshow');
|
|
57
|
+
loadshow.description('Run loadshow via a proxy');
|
|
58
|
+
loadshow.option('-a, --artifacts <dir>', 'Artifacts directory', './artifacts');
|
|
59
|
+
const recording = loadshow.command('recording');
|
|
60
|
+
recording.description('Record contents by loadshow');
|
|
61
|
+
recording.option('-d, --device <mobile|desktop>', 'Device type', 'mobile');
|
|
62
|
+
recording.argument('<url>', 'Url to measure performance');
|
|
63
|
+
recording.action(async (url) => {
|
|
64
|
+
const inventoryRepository = new InventoryRepository(main.opts().inventory || './inventory');
|
|
65
|
+
const deviceType = recording.opts().device || 'mobile';
|
|
66
|
+
const artifactsDir = loadshow.opts().artifacts || './artifacts';
|
|
67
|
+
await withRecordingProxy({ entryUrl: url, deviceType, inventoryRepository }, dependency, async (proxy) => {
|
|
68
|
+
await execLoadshow({ url, proxyPort: proxy.port, deviceType, artifactsDir }, dependency);
|
|
69
|
+
dependency.logger?.info('Loadshow completed. Saving inventory...');
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
const playback = loadshow.command('playback');
|
|
73
|
+
playback.description('Playback contents for loadshow');
|
|
74
|
+
playback.option('-l, --lighthouse', 'Loadshow with lighthouse throttling');
|
|
75
|
+
playback.action(async () => {
|
|
76
|
+
const inventoryRepository = new InventoryRepository(main.opts().inventory || './inventory');
|
|
77
|
+
const lighthouse = playback.opts().lighthouse;
|
|
78
|
+
const artifactsDir = loadshow.opts().artifacts || './artifacts';
|
|
79
|
+
await withPlaybackProxy({
|
|
80
|
+
inventoryRepository,
|
|
81
|
+
}, dependency, async (proxy) => {
|
|
82
|
+
await execLoadshow({
|
|
83
|
+
url: proxy.entryUrl,
|
|
84
|
+
proxyPort: proxy.port,
|
|
85
|
+
deviceType: proxy.deviceType,
|
|
86
|
+
syncLighthouseSpec: lighthouse,
|
|
87
|
+
artifactsDir,
|
|
88
|
+
}, dependency);
|
|
89
|
+
dependency.logger?.info('Loadshow completed');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function registerProxyCommands(main) {
|
|
94
|
+
const proxy = main.command('proxy');
|
|
95
|
+
proxy.option('-p, --port <number>', 'Proxy port', '8080');
|
|
96
|
+
proxy.action(async () => {
|
|
97
|
+
const inventoryRepository = new InventoryRepository(main.opts().inventory || './inventory');
|
|
98
|
+
const proxyOptions = {
|
|
99
|
+
inventoryRepository,
|
|
100
|
+
port: Number(proxy.opts().port || '8080'),
|
|
101
|
+
};
|
|
102
|
+
// eslint-disable-next-line no-constant-condition
|
|
103
|
+
while (true) {
|
|
104
|
+
await withPlaybackProxy(proxyOptions, dependency, async () => {
|
|
105
|
+
const watcher = Watch(inventoryRepository.dirPath, { recursive: true });
|
|
106
|
+
return new Promise((ok) => {
|
|
107
|
+
watcher.on('change', () => {
|
|
108
|
+
watcher.close();
|
|
109
|
+
dependency.logger?.info('Inventory changed. Restarting proxy...');
|
|
110
|
+
ok();
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
registerLighthouseCommands(main);
|
|
118
|
+
registerLoadshowCommands(main);
|
|
119
|
+
registerProxyCommands(main);
|
|
120
|
+
main.parse(process.argv);
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ25DLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQTtBQUU5QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFHNUMsT0FBTyxFQUFFLG1CQUFtQixFQUFnQixpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVyRyxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFBO0FBRW5DLE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLENBQUMsQ0FBQTtBQUUxRSxTQUFTLDBCQUEwQixDQUFDLElBQWE7SUFDL0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUM3QyxVQUFVLENBQUMsV0FBVyxDQUFDLG1EQUFtRCxDQUFDLENBQUE7SUFDM0UsVUFBVSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUNoRixVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFFdkQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNqRCxTQUFTLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUFDLENBQUE7SUFDdEQsU0FBUyxDQUFDLE1BQU0sQ0FBQywrQkFB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
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import Pino from 'pino';
|
|
2
|
+
import { DependencyInterface } from './types.js';
|
|
3
|
+
export declare class Dependency implements DependencyInterface {
|
|
4
|
+
logger?: Pino.Logger;
|
|
5
|
+
constructor();
|
|
6
|
+
mkdirp(dirPath: string): Promise<void>;
|
|
7
|
+
executeLighthouse(args: string[]): Promise<void>;
|
|
8
|
+
executeLoadshow(args: string[]): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import Fsp from 'fs/promises';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import Pino from 'pino';
|
|
4
|
+
export class Dependency {
|
|
5
|
+
logger;
|
|
6
|
+
constructor() {
|
|
7
|
+
this.logger = Pino({
|
|
8
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
9
|
+
transport: {
|
|
10
|
+
target: 'pino-pretty',
|
|
11
|
+
options: {
|
|
12
|
+
colorize: true,
|
|
13
|
+
ignore: 'pid,hostname',
|
|
14
|
+
hideObject: !['', '0', 'false', 'no'].includes(process.env.LOG_OBJECTS?.toLowerCase()),
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async mkdirp(dirPath) {
|
|
20
|
+
await Fsp.mkdir(dirPath, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
async executeLighthouse(args) {
|
|
23
|
+
const lighthousePath = process.env.LIGHTHOUSE_PATH || './node_modules/.bin/lighthouse';
|
|
24
|
+
await execa(lighthousePath, args, { stdout: 'inherit', stderr: 'inherit' });
|
|
25
|
+
}
|
|
26
|
+
async executeLoadshow(args) {
|
|
27
|
+
const loadshowPath = process.env.LOADSHOW_PATH || './node_modules/.bin/loadshow';
|
|
28
|
+
await execa(loadshowPath, args, { stdout: 'inherit', stderr: 'inherit' });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwZW5kZW5jeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZXBlbmRlbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQTtBQUU3QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFBO0FBQzdCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUl2QixNQUFNLE9BQU8sVUFBVTtJQUNyQixNQUFNLENBQWM7SUFFcEI7UUFDRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNqQixLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksTUFBTTtZQUN0QyxTQUFTLEVBQUU7Z0JBQ1QsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLE9BQU8sRUFBRTtvQkFDUCxRQUFRLEVBQUUsSUFBSTtvQkFDZCxNQUFNLEVBQUUsY0FBYztvQkFDdEIsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUM7aUJBQ3ZGO2FBQ0Y7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFlO1FBQzFCLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQWM7UUFDcEMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksZ0NBQWdDLENBQUE7UUFDdEYsTUFBTSxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7SUFDN0UsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBYztRQUNsQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSw4QkFBOEIsQ0FBQTtRQUNoRixNQUFNLEtBQUssQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQTtJQUMzRSxDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
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>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import Zlib from 'zlib';
|
|
2
|
+
export const ContentEncodingMap = new Map();
|
|
3
|
+
ContentEncodingMap.set('gzip', {
|
|
4
|
+
compress: Zlib.gzip,
|
|
5
|
+
decompress: Zlib.gunzip,
|
|
6
|
+
});
|
|
7
|
+
ContentEncodingMap.set('compress', {
|
|
8
|
+
compress: Zlib.gzip,
|
|
9
|
+
decompress: Zlib.gunzip,
|
|
10
|
+
});
|
|
11
|
+
ContentEncodingMap.set('deflate', {
|
|
12
|
+
compress: Zlib.deflate,
|
|
13
|
+
decompress: Zlib.inflate,
|
|
14
|
+
});
|
|
15
|
+
ContentEncodingMap.set('br', {
|
|
16
|
+
compress: Zlib.brotliCompress,
|
|
17
|
+
decompress: Zlib.brotliDecompress,
|
|
18
|
+
});
|
|
19
|
+
export async function compress(type, buffer) {
|
|
20
|
+
const pair = ContentEncodingMap.get(type);
|
|
21
|
+
if (!pair)
|
|
22
|
+
return Buffer.from(buffer);
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
pair.compress(buffer, (err, result) => {
|
|
25
|
+
if (err)
|
|
26
|
+
return reject(err);
|
|
27
|
+
resolve(result);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export async function decompress(type, buffer) {
|
|
32
|
+
const pair = ContentEncodingMap.get(type);
|
|
33
|
+
if (!pair)
|
|
34
|
+
return Buffer.from(buffer);
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
pair.decompress(buffer, (err, result) => {
|
|
37
|
+
if (err)
|
|
38
|
+
return reject(err);
|
|
39
|
+
resolve(result);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBU3ZCLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUE0QyxDQUFBO0FBRXJGLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7SUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJO0lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTTtDQUN4QixDQUFDLENBQUE7QUFFRixrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO0lBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSTtJQUNuQixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU07Q0FDeEIsQ0FBQyxDQUFBO0FBRUYsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRTtJQUNoQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU87SUFDdEIsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPO0NBQ3pCLENBQUMsQ0FBQTtBQUVGLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7SUFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjO0lBQzdCLFVBQVUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO0NBQ2xDLENBQUMsQ0FBQTtBQUVGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUFDLElBQXlCLEVBQUUsTUFBYztJQUN0RSxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFckMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNwQyxJQUFJLEdBQUc7Z0JBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDM0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2pCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQUMsSUFBeUIsRUFBRSxNQUFjO0lBQ3hFLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN6QyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUVyQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLElBQUksR0FBRztnQkFBRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUMzQixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDakIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMifQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
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>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import IconvLite from 'iconv-lite';
|
|
2
|
+
import Prettier from 'prettier';
|
|
3
|
+
const PrettierDefaultOptions = { printWidth: 120 };
|
|
4
|
+
export function ensureUtf8String(buffer, charset) {
|
|
5
|
+
if (charset.match(/utf-?8/i) || charset.match(/ascii/i))
|
|
6
|
+
return buffer.toString('utf8');
|
|
7
|
+
const converted = IconvLite.decode(buffer, charset);
|
|
8
|
+
return converted;
|
|
9
|
+
}
|
|
10
|
+
function isHtml(mimeType) {
|
|
11
|
+
if (!mimeType)
|
|
12
|
+
return false;
|
|
13
|
+
return mimeType === 'text/html';
|
|
14
|
+
}
|
|
15
|
+
function isCss(mimeType) {
|
|
16
|
+
if (!mimeType)
|
|
17
|
+
return false;
|
|
18
|
+
return mimeType === 'text/css';
|
|
19
|
+
}
|
|
20
|
+
function isJs(mimeType) {
|
|
21
|
+
if (!mimeType)
|
|
22
|
+
return false;
|
|
23
|
+
return (mimeType === 'text/javascript' || mimeType === 'application/javascript' || mimeType === 'application/x-javascript');
|
|
24
|
+
}
|
|
25
|
+
export function isText(mimeType) {
|
|
26
|
+
return isHtml(mimeType) || isCss(mimeType) || isJs(mimeType);
|
|
27
|
+
}
|
|
28
|
+
export async function convertEditableText(content, contentTypeMime, contentTypeCharset) {
|
|
29
|
+
const charset = contentTypeCharset || 'utf-8';
|
|
30
|
+
if (isHtml(contentTypeMime)) {
|
|
31
|
+
const utf8 = ensureUtf8String(content, charset);
|
|
32
|
+
const withoutCharsetMeta = utf8.replace(/<meta charset="[^"]*">/, '');
|
|
33
|
+
const withoutScriptCharsetAttr = withoutCharsetMeta.replace(/<script(?:.*)>/gi, (scriptTag) => {
|
|
34
|
+
return scriptTag.replace(/\s*charset\s*=\s*(?:"[^"]*"|'[^']*'|[^ ]+)/i, '');
|
|
35
|
+
});
|
|
36
|
+
// TODO: consider charset attribute in link[rel=stylesheet]
|
|
37
|
+
const html = await Prettier.format(withoutScriptCharsetAttr, { ...PrettierDefaultOptions, parser: 'html' });
|
|
38
|
+
return html;
|
|
39
|
+
}
|
|
40
|
+
else if (isCss(contentTypeMime)) {
|
|
41
|
+
const utf8 = ensureUtf8String(content, charset);
|
|
42
|
+
const withoutCharsetDirective = utf8.replace(/@charset "[^"]*";/, '');
|
|
43
|
+
const css = await Prettier.format(withoutCharsetDirective, { ...PrettierDefaultOptions, parser: 'css' });
|
|
44
|
+
return css;
|
|
45
|
+
}
|
|
46
|
+
else if (isJs(contentTypeMime)) {
|
|
47
|
+
const utf8 = ensureUtf8String(content, charset);
|
|
48
|
+
const js = await Prettier.format(utf8, { ...PrettierDefaultOptions, parser: 'babel' });
|
|
49
|
+
return js;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
throw new Error(`${contentTypeMime} is not supported text content type`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mb3JtYXR0aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQTtBQUNsQyxPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUE7QUFFL0IsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQTtBQUVsRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBYyxFQUFFLE9BQWU7SUFDOUQsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3ZGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ25ELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxRQUFnQjtJQUM5QixJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQzNCLE9BQU8sUUFBUSxLQUFLLFdBQVcsQ0FBQTtBQUNqQyxDQUFDO0FBRUQsU0FBUyxLQUFLLENBQUMsUUFBZ0I7SUFDN0IsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUMzQixPQUFPLFFBQVEsS0FBSyxVQUFVLENBQUE7QUFDaEMsQ0FBQztBQUVELFNBQVMsSUFBSSxDQUFDLFFBQWdCO0lBQzVCLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDM0IsT0FBTyxDQUNMLFFBQVEsS0FBSyxpQkFBaUIsSUFBSSxRQUFRLEtBQUssd0JBQXdCLElBQUksUUFBUSxLQUFLLDBCQUEwQixDQUNuSCxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxNQUFNLENBQUMsUUFBZ0I7SUFDckMsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUM5RCxDQUFDO0FBT0QsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FDdkMsT0FBZSxFQUNmLGVBQXVCLEVBQ3ZCLGtCQUEyQjtJQUUzQixNQUFNLE9BQU8sR0FBRyxrQkFBa0IsSUFBSSxPQUFPLENBQUE7SUFDN0MsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDM0IsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQy9DLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNyRSxNQUFNLHdCQUF3QixHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQzVGLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyw2Q0FBNkMsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUM3RSxDQUFDLENBQUMsQ0FBQTtRQUNGLDJEQUEyRDtRQUMzRCxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQzNHLE9BQU8sSUFBSSxDQUFBO0tBQ1o7U0FBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRTtRQUNqQyxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDL0MsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sR0FBRyxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEdBQUcsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDeEcsT0FBTyxHQUFHLENBQUE7S0FDWDtTQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMvQyxNQUFNLEVBQUUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUN0RixPQUFPLEVBQUUsQ0FBQTtLQUNWO1NBQU07UUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsZUFBZSxxQ0FBcUMsQ0FBQyxDQUFBO0tBQ3pFO0FBQ0gsQ0FBQyJ9
|
package/build/http.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type HttpHeaders = {
|
|
2
|
+
[key: string]: string;
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* Remove IgnoreParams from URL
|
|
6
|
+
* Default: ts (timestamp) assumed different for each request
|
|
7
|
+
* @param url
|
|
8
|
+
* @returns
|
|
9
|
+
*/
|
|
10
|
+
export declare function normalizeUrl(url: string | URL): URL;
|
|
11
|
+
/**
|
|
12
|
+
* Convert URL to content file path
|
|
13
|
+
* For example:
|
|
14
|
+
* https://example.com/foo/bar.html?hoge=123 -> example.com/foo/bar~hoge=123.html
|
|
15
|
+
* - Add directory index (index.html) if URL ends with slash
|
|
16
|
+
* - Shorten too long basename with short hash
|
|
17
|
+
* - Ignore dynamic params for example: ts=123
|
|
18
|
+
* @param url
|
|
19
|
+
* @returns
|
|
20
|
+
*/
|
|
21
|
+
export declare function requestContentFilePath(method: string, url: string | URL): string;
|
|
22
|
+
export declare function parseContentTypeHeader(contentType: string): {
|
|
23
|
+
mime: string;
|
|
24
|
+
charset: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function stringifyContentTypeHeader(mime?: string, charset?: string, original?: string): string;
|
package/build/http.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import Crypto from 'crypto';
|
|
2
|
+
import Path from 'path';
|
|
3
|
+
const DirectoryIndex = 'index.html';
|
|
4
|
+
const BasenameMaxLength = 196;
|
|
5
|
+
const HashLength = 8;
|
|
6
|
+
const IgnoreParams = process.env.IGNORE_PARAMS || 'ts';
|
|
7
|
+
const IgnoreParamsRegex = IgnoreParams.split(/\s*,\s*/).map((p) => new RegExp(`(?<=[?&]${p}=)[^&]*`, 'g'));
|
|
8
|
+
/**
|
|
9
|
+
* Remove IgnoreParams from URL
|
|
10
|
+
* Default: ts (timestamp) assumed different for each request
|
|
11
|
+
* @param url
|
|
12
|
+
* @returns
|
|
13
|
+
*/
|
|
14
|
+
export function normalizeUrl(url) {
|
|
15
|
+
const urlObj = typeof url === 'string' ? new URL(url) : url;
|
|
16
|
+
// Remove dynamic params
|
|
17
|
+
if (urlObj.search !== '') {
|
|
18
|
+
urlObj.search = IgnoreParamsRegex.reduce((search, re) => {
|
|
19
|
+
return search.replace(re, '');
|
|
20
|
+
}, urlObj.search);
|
|
21
|
+
}
|
|
22
|
+
return urlObj;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Convert URL to content file path
|
|
26
|
+
* For example:
|
|
27
|
+
* https://example.com/foo/bar.html?hoge=123 -> example.com/foo/bar~hoge=123.html
|
|
28
|
+
* - Add directory index (index.html) if URL ends with slash
|
|
29
|
+
* - Shorten too long basename with short hash
|
|
30
|
+
* - Ignore dynamic params for example: ts=123
|
|
31
|
+
* @param url
|
|
32
|
+
* @returns
|
|
33
|
+
*/
|
|
34
|
+
export function requestContentFilePath(method, url) {
|
|
35
|
+
const urlObj = normalizeUrl(url);
|
|
36
|
+
const protocol = urlObj.protocol.replace(/:/g, '');
|
|
37
|
+
const host = urlObj.host.replace(/:/g, '~');
|
|
38
|
+
// Directory Index (index.html)
|
|
39
|
+
let pathname = urlObj.pathname;
|
|
40
|
+
if (pathname.endsWith('/')) {
|
|
41
|
+
pathname += DirectoryIndex;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
const ext = Path.extname(pathname);
|
|
45
|
+
if (ext === '') {
|
|
46
|
+
pathname = Path.join(pathname, DirectoryIndex);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const dir = Path.dirname(pathname);
|
|
50
|
+
const ext = Path.extname(pathname);
|
|
51
|
+
const base = Path.basename(pathname, ext);
|
|
52
|
+
let filename = base;
|
|
53
|
+
// Search params
|
|
54
|
+
if (urlObj.search !== '') {
|
|
55
|
+
// Remove dynamic params
|
|
56
|
+
const search = IgnoreParamsRegex.reduce((search, re) => {
|
|
57
|
+
return search.replace(re, '');
|
|
58
|
+
}, urlObj.search);
|
|
59
|
+
filename = [filename, search.slice(1)].join('~');
|
|
60
|
+
}
|
|
61
|
+
// Shorten too long basename
|
|
62
|
+
if (filename.length > BasenameMaxLength) {
|
|
63
|
+
const trunk = filename.slice(0, BasenameMaxLength);
|
|
64
|
+
const hash = Crypto.createHash('sha1');
|
|
65
|
+
hash.update(filename);
|
|
66
|
+
const digest = hash.digest('hex').slice(0, HashLength);
|
|
67
|
+
filename = [trunk, digest].join('_');
|
|
68
|
+
}
|
|
69
|
+
// Extension
|
|
70
|
+
filename += ext;
|
|
71
|
+
// Content file relative path
|
|
72
|
+
const relPath = Path.join(dir, filename);
|
|
73
|
+
return Path.join(method, protocol, host, relPath);
|
|
74
|
+
}
|
|
75
|
+
export function parseContentTypeHeader(contentType) {
|
|
76
|
+
const [mime, ...params] = contentType.split(/;/).map((s) => s.trim());
|
|
77
|
+
const charsetParam = params.find((p) => p.startsWith('charset='));
|
|
78
|
+
return {
|
|
79
|
+
mime,
|
|
80
|
+
charset: charsetParam ? charsetParam.slice('charset='.length) : undefined,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function stringifyContentTypeHeader(mime, charset, original) {
|
|
84
|
+
const params = original ? original.split(/;/).map((s) => s.trim()) : [];
|
|
85
|
+
if (mime)
|
|
86
|
+
params[0] = mime;
|
|
87
|
+
if (charset) {
|
|
88
|
+
const charsetParamIndex = params.findIndex((p) => p.startsWith('charset='));
|
|
89
|
+
if (charsetParamIndex >= 0)
|
|
90
|
+
params.splice(charsetParamIndex, 1, `charset=${charset}`);
|
|
91
|
+
else
|
|
92
|
+
params.splice(1, 0, `charset=${charset}`);
|
|
93
|
+
}
|
|
94
|
+
return params.join('; ');
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQTtBQUMzQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFFdkIsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFBO0FBQ25DLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFBO0FBQzdCLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQTtBQUNwQixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUE7QUFDdEQsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBSTFHOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFpQjtJQUM1QyxNQUFNLE1BQU0sR0FBRyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUE7SUFFM0Qsd0JBQXdCO0lBQ3hCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7UUFDeEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDOUQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUMvQixDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0tBQ2xCO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FB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
|
package/build/index.d.ts
ADDED
package/build/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './encoding.js';
|
|
2
|
+
export * from './formatting.js';
|
|
3
|
+
export * from './http.js';
|
|
4
|
+
export * from './inventory.js';
|
|
5
|
+
export * from './playback.js';
|
|
6
|
+
export * from './proxy.js';
|
|
7
|
+
export * from './recording.js';
|
|
8
|
+
export * from './throttling.js';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUE7QUFDN0IsY0FBYyxpQkFBaUIsQ0FBQTtBQUMvQixjQUFjLFdBQVcsQ0FBQTtBQUN6QixjQUFjLGdCQUFnQixDQUFBO0FBQzlCLGNBQWMsZUFBZSxDQUFBO0FBQzdCLGNBQWMsWUFBWSxDQUFBO0FBQzFCLGNBQWMsZ0JBQWdCLENBQUE7QUFDOUIsY0FBYyxpQkFBaUIsQ0FBQSJ9
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ContentEncodingType } from './encoding.js';
|
|
3
|
+
import { HttpHeaders } from './http.js';
|
|
4
|
+
import { DependencyInterface, DeviceType } from './types.js';
|
|
5
|
+
export interface Resource {
|
|
6
|
+
method: string;
|
|
7
|
+
url: string;
|
|
8
|
+
ttfbMs: number;
|
|
9
|
+
mbps?: number;
|
|
10
|
+
statusCode?: number;
|
|
11
|
+
errorMessage?: string;
|
|
12
|
+
rawHeaders?: HttpHeaders;
|
|
13
|
+
contentEncoding?: ContentEncodingType;
|
|
14
|
+
contentTypeMime?: string;
|
|
15
|
+
contentTypeCharset?: string;
|
|
16
|
+
contentFilePath?: string;
|
|
17
|
+
contentUtf8?: string;
|
|
18
|
+
contentBase64?: string;
|
|
19
|
+
minify?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface Transaction {
|
|
22
|
+
method: string;
|
|
23
|
+
url: string;
|
|
24
|
+
ttfbMs: number;
|
|
25
|
+
statusCode?: number;
|
|
26
|
+
errorMessage?: string;
|
|
27
|
+
rawHeaders?: HttpHeaders;
|
|
28
|
+
content?: Buffer;
|
|
29
|
+
durationMs?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface Inventory {
|
|
32
|
+
entryUrl?: string;
|
|
33
|
+
deviceType?: DeviceType;
|
|
34
|
+
resources: Resource[];
|
|
35
|
+
}
|
|
36
|
+
type InventoryRepositoryDependency = Pick<DependencyInterface, 'logger'>;
|
|
37
|
+
export declare class InventoryRepository {
|
|
38
|
+
dirPath: string;
|
|
39
|
+
dependency: InventoryRepositoryDependency;
|
|
40
|
+
constructor(dirPath?: string, dependency?: InventoryRepositoryDependency);
|
|
41
|
+
saveInventory(inventory: Inventory): Promise<void>;
|
|
42
|
+
loadInventory(): Promise<Inventory>;
|
|
43
|
+
saveTransactions(transactions: Transaction[]): Promise<Resource[]>;
|
|
44
|
+
loadTransactions(resources: Resource[]): Promise<Transaction[]>;
|
|
45
|
+
}
|
|
46
|
+
export {};
|