pagespeed-quest 0.1.2 → 0.2.1

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 (70) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/package.json +24 -21
  3. package/build/main/adhoc.d.ts +0 -2
  4. package/build/main/adhoc.js +0 -48
  5. package/build/main/command.d.ts +0 -2
  6. package/build/main/command.js +0 -103
  7. package/build/main/common-types.d.ts +0 -41
  8. package/build/main/common-types.js +0 -3
  9. package/build/main/content-encoding.d.ts +0 -11
  10. package/build/main/content-encoding.js +0 -51
  11. package/build/main/encoding.d.ts +0 -11
  12. package/build/main/encoding.js +0 -51
  13. package/build/main/formatting.d.ts +0 -8
  14. package/build/main/formatting.js +0 -64
  15. package/build/main/http.d.ts +0 -27
  16. package/build/main/http.js +0 -106
  17. package/build/main/index.d.ts +0 -9
  18. package/build/main/index.js +0 -26
  19. package/build/main/inventory.d.ts +0 -39
  20. package/build/main/inventory.js +0 -171
  21. package/build/main/logger.d.ts +0 -20
  22. package/build/main/logger.js +0 -22
  23. package/build/main/playback/inventory.d.ts +0 -0
  24. package/build/main/playback/inventory.js +0 -47
  25. package/build/main/playback.d.ts +0 -22
  26. package/build/main/playback.js +0 -111
  27. package/build/main/proxy.d.ts +0 -40
  28. package/build/main/proxy.js +0 -111
  29. package/build/main/recording/proxy.d.ts +0 -28
  30. package/build/main/recording/proxy.js +0 -90
  31. package/build/main/recording.d.ts +0 -28
  32. package/build/main/recording.js +0 -95
  33. package/build/main/throttling.d.ts +0 -34
  34. package/build/main/throttling.js +0 -88
  35. package/build/main/url.d.ts +0 -3
  36. package/build/main/url.js +0 -67
  37. package/build/module/adhoc.d.ts +0 -2
  38. package/build/module/adhoc.js +0 -40
  39. package/build/module/command.d.ts +0 -2
  40. package/build/module/command.js +0 -98
  41. package/build/module/common-types.d.ts +0 -41
  42. package/build/module/common-types.js +0 -2
  43. package/build/module/content-encoding.d.ts +0 -11
  44. package/build/module/content-encoding.js +0 -43
  45. package/build/module/encoding.d.ts +0 -11
  46. package/build/module/encoding.js +0 -43
  47. package/build/module/formatting.d.ts +0 -8
  48. package/build/module/formatting.js +0 -55
  49. package/build/module/http.d.ts +0 -27
  50. package/build/module/http.js +0 -96
  51. package/build/module/index.d.ts +0 -9
  52. package/build/module/index.js +0 -10
  53. package/build/module/inventory.d.ts +0 -39
  54. package/build/module/inventory.js +0 -165
  55. package/build/module/logger.d.ts +0 -20
  56. package/build/module/logger.js +0 -15
  57. package/build/module/playback/inventory.d.ts +0 -0
  58. package/build/module/playback/inventory.js +0 -47
  59. package/build/module/playback.d.ts +0 -22
  60. package/build/module/playback.js +0 -102
  61. package/build/module/proxy.d.ts +0 -40
  62. package/build/module/proxy.js +0 -111
  63. package/build/module/recording/proxy.d.ts +0 -28
  64. package/build/module/recording/proxy.js +0 -85
  65. package/build/module/recording.d.ts +0 -28
  66. package/build/module/recording.js +0 -92
  67. package/build/module/throttling.d.ts +0 -34
  68. package/build/module/throttling.js +0 -89
  69. package/build/module/url.d.ts +0 -3
  70. package/build/module/url.js +0 -59
@@ -1,40 +0,0 @@
1
- import Fsp from 'fs/promises';
2
- import Execa from 'execa';
3
- import { withPlaybackProxy } from './playback';
4
- import { withRecordingProxy } from './recording';
5
- async function runLighthouse(url, port) {
6
- await Execa('./node_modules/.bin/lighthouse', [
7
- '--output=html',
8
- '--output-path=tmp/lighthouse.html',
9
- '--only-categories=performance',
10
- '--form-factor=mobile',
11
- `--chrome-flags="--ignore-certificate-errors --proxy-server=http://localhost:${port}"`,
12
- '--view',
13
- url,
14
- ]);
15
- }
16
- export async function recording() {
17
- const sampleUrl = 'https://www.gov-online.go.jp/';
18
- // const sampleUrl = 'https://blog.ideamans.com/'
19
- await Fsp.mkdir('./tmp', { recursive: true });
20
- await withRecordingProxy(async (proxy) => {
21
- proxy.entryUrl = sampleUrl;
22
- await runLighthouse(sampleUrl, proxy.port);
23
- }, {
24
- dirPath: './tmp',
25
- });
26
- }
27
- export async function playback() {
28
- await withPlaybackProxy(async (proxy) => {
29
- if (!proxy.entryUrl)
30
- throw new Error('proxy.entryUrl is empty');
31
- await runLighthouse(proxy.entryUrl, proxy.port);
32
- }, {
33
- dirPath: './tmp',
34
- throttling: {
35
- mbps: 1.6,
36
- },
37
- });
38
- }
39
- playback();
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRob2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRob2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFBO0FBRTdCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUV6QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRWhELEtBQUssVUFBVSxhQUFhLENBQUMsR0FBVyxFQUFFLElBQVk7SUFDcEQsTUFBTSxLQUFLLENBQUMsZ0NBQWdDLEVBQUU7UUFDNUMsZUFBZTtRQUNmLG1DQUFtQztRQUNuQywrQkFBK0I7UUFDL0Isc0JBQXNCO1FBQ3RCLCtFQUErRSxJQUFJLEdBQUc7UUFDdEYsUUFBUTtRQUNSLEdBQUc7S0FDSixDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTO0lBQzdCLE1BQU0sU0FBUyxHQUFHLCtCQUErQixDQUFBO0lBQ2pELGlEQUFpRDtJQUVqRCxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDN0MsTUFBTSxrQkFBa0IsQ0FDdEIsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ2QsS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUE7UUFDMUIsTUFBTSxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM1QyxDQUFDLEVBQ0Q7UUFDRSxPQUFPLEVBQUUsT0FBTztLQUNqQixDQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxRQUFRO0lBQzVCLE1BQU0saUJBQWlCLENBQ3JCLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQTtRQUMvRCxNQUFNLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNqRCxDQUFDLEVBQ0Q7UUFDRSxPQUFPLEVBQUUsT0FBTztRQUNoQixVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUUsR0FBRztTQUNWO0tBQ0YsQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELFFBQVEsRUFBRSxDQUFBIn0=
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
@@ -1,98 +0,0 @@
1
- #!/usr/bin/env node
2
- import Fsp from 'fs/promises';
3
- import { Command } from 'commander';
4
- import Execa from 'execa';
5
- import Watch from 'node-watch';
6
- import { logger, withPlaybackProxy, withRecordingProxy } from './index';
7
- async function runLighthouse(opts) {
8
- await Fsp.mkdir('./artifacts', { recursive: true });
9
- const formFactor = opts.formFactor || 'mobile';
10
- const args = [
11
- opts.url,
12
- '--save-assets',
13
- '--output=html,json',
14
- '--output-path=./artifacts/lighthouse',
15
- '--only-categories=performance',
16
- `--form-factor=${formFactor}`,
17
- ];
18
- if (opts.noThrottling) {
19
- args.push('--throttling.rttMs=0', '--throttling.throughputKbps=0', '--throttling.downloadThroughputKbps=0', '--throttling.uploadThroughputKbps=0', '--throttling.cpuSlowdownMultiplier=1');
20
- }
21
- else if (opts.cpuMultiplier)
22
- args.push(`--throttling.cpuSlowdownMultiplier=${opts.cpuMultiplier}`);
23
- const chromeFlags = ['--ignore-certificate-errors', `--proxy-server=http://localhost:${opts.proxyPort}`];
24
- args.push(`--chrome-flags="${chromeFlags.join(' ')}"`);
25
- if (opts.view)
26
- args.push('--view');
27
- await Execa('./node_modules/.bin/lighthouse', args);
28
- }
29
- const main = new Command();
30
- function lighthouseCommands() {
31
- const lighthouse = main.command('lighthouse');
32
- lighthouse.description('Run Lighthouse (performance category) via a proxy');
33
- lighthouse.option('-f, --form-factor <mobile|desktop>', 'Lighthouse form factor', 'mobile');
34
- const recording = lighthouse.command('recording');
35
- recording.description('Record contents by lighthouse');
36
- recording.argument('<url>', 'Url to measure performance');
37
- recording.action(async (url) => {
38
- await withRecordingProxy(async (proxy) => {
39
- const formFactor = lighthouse.opts().formFactor;
40
- await runLighthouse({ url, proxyPort: proxy.port, formFactor, noThrottling: true, view: false });
41
- logger().info('Lighthouse completed. Saving inventory...');
42
- }, {
43
- entryUrl: url,
44
- });
45
- });
46
- const playback = lighthouse.command('playback');
47
- playback.description('Playback contents for lighthouse');
48
- playback.option('-c, --cpu-multiplier <number>', 'Lighthouse CPU multiplier', '4');
49
- playback.action(async () => {
50
- const cpuMultiplier = playback.opts().cpuMultiplier;
51
- await withPlaybackProxy(async (proxy) => {
52
- const url = proxy.entryUrl;
53
- await runLighthouse({ url, proxyPort: proxy.port, cpuMultiplier, view: true });
54
- logger().info('Lighthouse completed');
55
- }, {
56
- throttling: {
57
- mbps: 1.6,
58
- },
59
- });
60
- });
61
- }
62
- function proxyCommands() {
63
- const proxy = main.command('proxy');
64
- proxy.option('-d, --inventory-dir <path>', 'Inventory directory');
65
- proxy.option('-p, --port <number>', 'Proxy port', '8080');
66
- proxy.option('-t, --throughput <number>', 'Throttle network throughput (Mbps)');
67
- proxy.action(async () => {
68
- const proxyOptions = {};
69
- if (proxy.opts().inventoryDir) {
70
- proxyOptions.dirPath = proxy.opts().inventoryDir;
71
- }
72
- if (proxy.opts().port) {
73
- proxyOptions.port = Number(proxy.opts().port);
74
- }
75
- if (proxy.opts().throughput) {
76
- proxyOptions.throttling = {
77
- mbps: Number(proxy.opts().throughput),
78
- };
79
- }
80
- // eslint-disable-next-line no-constant-condition
81
- while (true) {
82
- await withPlaybackProxy(async (proxy) => {
83
- const watcher = Watch(proxy.inventoryDirPath, { recursive: true });
84
- return new Promise((ok) => {
85
- watcher.on('change', () => {
86
- watcher.close();
87
- logger().info('Inventory changed. Restarting proxy...');
88
- ok();
89
- });
90
- });
91
- }, proxyOptions);
92
- }
93
- });
94
- }
95
- lighthouseCommands();
96
- proxyCommands();
97
- main.parse(process.argv);
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUE7QUFFN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFDekIsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFBO0FBRTlCLE9BQU8sRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQW9CLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFBO0FBYXpGLEtBQUssVUFBVSxhQUFhLENBQUMsSUFBdUI7SUFDbEQsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRW5ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFBO0lBQzlDLE1BQU0sSUFBSSxHQUFhO1FBQ3JCLElBQUksQ0FBQyxHQUFHO1FBQ1IsZUFBZTtRQUNmLG9CQUFvQjtRQUNwQixzQ0FBc0M7UUFDdEMsK0JBQStCO1FBQy9CLGlCQUFpQixVQUFVLEVBQUU7S0FDOUIsQ0FBQTtJQUVELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUNQLHNCQUFzQixFQUN0QiwrQkFBK0IsRUFDL0IsdUNBQXVDLEVBQ3ZDLHFDQUFxQyxFQUNyQyxzQ0FBc0MsQ0FDdkMsQ0FBQTtLQUNGO1NBQU0sSUFBSSxJQUFJLENBQUMsYUFBYTtRQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsc0NBQXNDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFBO0lBRXBHLE1BQU0sV0FBVyxHQUFhLENBQUMsNkJBQTZCLEVBQUUsbUNBQW1DLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBQ2xILElBQUksQ0FBQyxJ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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,2 +0,0 @@
1
- export {};
2
- //# 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,43 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1lbmNvZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZW50LWVuY29kaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQVN4QixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFHdEMsQ0FBQztBQUVKLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7SUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJO0lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTTtDQUN4QixDQUFDLENBQUM7QUFFSCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO0lBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSTtJQUNuQixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU07Q0FDeEIsQ0FBQyxDQUFDO0FBRUgsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRTtJQUNoQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU87SUFDdEIsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPO0NBQ3pCLENBQUMsQ0FBQztBQUVILGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7SUFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjO0lBQzdCLFVBQVUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO0NBQ2xDLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUM1QixJQUF5QixFQUN6QixNQUFjO0lBRWQsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXRDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDcEMsSUFBSSxHQUFHO2dCQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsVUFBVSxDQUM5QixJQUF5QixFQUN6QixNQUFjO0lBRWQsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXRDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxHQUFHO2dCQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
@@ -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,43 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBU3ZCLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUE0QyxDQUFBO0FBRXJGLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7SUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJO0lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTTtDQUN4QixDQUFDLENBQUE7QUFFRixrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO0lBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSTtJQUNuQixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU07Q0FDeEIsQ0FBQyxDQUFBO0FBRUYsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRTtJQUNoQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU87SUFDdEIsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPO0NBQ3pCLENBQUMsQ0FBQTtBQUVGLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7SUFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjO0lBQzdCLFVBQVUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO0NBQ2xDLENBQUMsQ0FBQTtBQUVGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUFDLElBQXlCLEVBQUUsTUFBYztJQUN0RSxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFckMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNwQyxJQUFJLEdBQUc7Z0JBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDM0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2pCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQUMsSUFBeUIsRUFBRSxNQUFjO0lBQ3hFLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN6QyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUVyQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLElBQUksR0FBRztnQkFBRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUMzQixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDakIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMifQ==
@@ -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,55 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mb3JtYXR0aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQTtBQUNsQyxPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUE7QUFFL0IsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQTtBQUVsRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBYyxFQUFFLE9BQWU7SUFDOUQsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3ZGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ25ELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxRQUFnQjtJQUM5QixJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQzNCLE9BQU8sUUFBUSxLQUFLLFdBQVcsQ0FBQTtBQUNqQyxDQUFDO0FBRUQsU0FBUyxLQUFLLENBQUMsUUFBZ0I7SUFDN0IsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUMzQixPQUFPLFFBQVEsS0FBSyxVQUFVLENBQUE7QUFDaEMsQ0FBQztBQUVELFNBQVMsSUFBSSxDQUFDLFFBQWdCO0lBQzVCLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDM0IsT0FBTyxDQUNMLFFBQVEsS0FBSyxpQkFBaUIsSUFBSSxRQUFRLEtBQUssd0JBQXdCLElBQUksUUFBUSxLQUFLLDBCQUEwQixDQUNuSCxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxNQUFNLENBQUMsUUFBZ0I7SUFDckMsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUM5RCxDQUFDO0FBT0QsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FDdkMsT0FBZSxFQUNmLGVBQXVCLEVBQ3ZCLGtCQUEyQjtJQUUzQixNQUFNLE9BQU8sR0FBRyxrQkFBa0IsSUFBSSxPQUFPLENBQUE7SUFDN0MsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDM0IsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQy9DLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNyRSxNQUFNLHdCQUF3QixHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQzVGLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyw2Q0FBNkMsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUM3RSxDQUFDLENBQUMsQ0FBQTtRQUNGLDJEQUEyRDtRQUMzRCxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQzNHLE9BQU8sSUFBSSxDQUFBO0tBQ1o7U0FBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRTtRQUNqQyxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDL0MsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sR0FBRyxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEdBQUcsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDeEcsT0FBTyxHQUFHLENBQUE7S0FDWDtTQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMvQyxNQUFNLEVBQUUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUN0RixPQUFPLEVBQUUsQ0FBQTtLQUNWO1NBQU07UUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsZUFBZSxxQ0FBcUMsQ0FBQyxDQUFBO0tBQ3pFO0FBQ0gsQ0FBQyJ9
@@ -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;
@@ -1,96 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQTtBQUMzQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFFdkIsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFBO0FBQ25DLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFBO0FBQzdCLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQTtBQUNwQixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUE7QUFDdEQsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBSTFHOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFpQjtJQUM1QyxNQUFNLE1BQU0sR0FBRyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUE7SUFFM0Qsd0JBQXdCO0lBQ3hCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7UUFDeEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDOUQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUMvQixDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0tBQ2xCO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNH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
@@ -1,9 +0,0 @@
1
- export * from './encoding';
2
- export * from './formatting';
3
- export * from './http';
4
- export * from './inventory';
5
- export * from './logger';
6
- export * from './playback';
7
- export * from './proxy';
8
- export * from './recording';
9
- export * from './throttling';
@@ -1,10 +0,0 @@
1
- export * from './encoding';
2
- export * from './formatting';
3
- export * from './http';
4
- export * from './inventory';
5
- export * from './logger';
6
- export * from './playback';
7
- export * from './proxy';
8
- export * from './recording';
9
- export * from './throttling';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxZQUFZLENBQUE7QUFDMUIsY0FBYyxjQUFjLENBQUE7QUFDNUIsY0FBYyxRQUFRLENBQUE7QUFDdEIsY0FBYyxhQUFhLENBQUE7QUFDM0IsY0FBYyxVQUFVLENBQUE7QUFDeEIsY0FBYyxZQUFZLENBQUE7QUFDMUIsY0FBYyxTQUFTLENBQUE7QUFDdkIsY0FBYyxhQUFhLENBQUE7QUFDM0IsY0FBYyxjQUFjLENBQUEifQ==
@@ -1,39 +0,0 @@
1
- /// <reference types="node" />
2
- import { ContentEncodingType } from './encoding';
3
- import { HttpHeaders } from './http';
4
- export interface Resource {
5
- method: string;
6
- url: string;
7
- ttfbMs: number;
8
- mbps?: number;
9
- statusCode?: number;
10
- errorMessage?: string;
11
- rawHeaders?: HttpHeaders;
12
- contentEncoding?: ContentEncodingType;
13
- contentTypeMime?: string;
14
- contentTypeCharset?: string;
15
- contentFilePath?: string;
16
- minify?: boolean;
17
- }
18
- export interface Transaction {
19
- method: string;
20
- url: string;
21
- ttfbMs: number;
22
- statusCode?: number;
23
- errorMessage?: string;
24
- rawHeaders?: HttpHeaders;
25
- content?: Buffer;
26
- durationMs?: number;
27
- }
28
- export interface Inventory {
29
- entryUrl?: string;
30
- resources: Resource[];
31
- }
32
- export declare class InventoryRepository {
33
- dirPath: string;
34
- constructor(dirPath?: string);
35
- saveInventory(inventory: Inventory): Promise<void>;
36
- loadInventory(): Promise<Inventory>;
37
- saveTransactions(transactions: Transaction[]): Promise<Resource[]>;
38
- loadTransactions(resources: Resource[]): Promise<Transaction[]>;
39
- }