@eggjs/koa-static-cache 7.0.0-beta.19 → 7.0.0-beta.21
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/dist/index.d.ts +92 -94
- package/dist/index.js +219 -153
- package/package.json +6 -6
package/dist/index.d.ts
CHANGED
|
@@ -1,101 +1,99 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
length?: number;
|
|
1
|
+
export type FileFilter = (path: string) => boolean;
|
|
2
|
+
export interface FileMeta {
|
|
3
|
+
maxAge?: number;
|
|
4
|
+
cacheControl?: string | ((path: string) => string);
|
|
5
|
+
buffer?: Buffer;
|
|
6
|
+
zipBuffer?: Buffer;
|
|
7
|
+
type?: string;
|
|
8
|
+
mime?: string;
|
|
9
|
+
mtime?: Date;
|
|
10
|
+
path?: string;
|
|
11
|
+
md5?: string;
|
|
12
|
+
length?: number;
|
|
14
13
|
}
|
|
15
|
-
interface FileMap {
|
|
16
|
-
|
|
14
|
+
export interface FileMap {
|
|
15
|
+
[path: string]: FileMeta;
|
|
17
16
|
}
|
|
18
|
-
interface FileStore {
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
export interface FileStore {
|
|
18
|
+
get(key: string): unknown;
|
|
19
|
+
set(key: string, value: unknown): void;
|
|
21
20
|
}
|
|
22
|
-
interface Options {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
21
|
+
export interface Options {
|
|
22
|
+
/**
|
|
23
|
+
* The root directory from which to serve static assets
|
|
24
|
+
* Default to `process.cwd`
|
|
25
|
+
*/
|
|
26
|
+
dir?: string;
|
|
27
|
+
/**
|
|
28
|
+
* The max age for cache control
|
|
29
|
+
* Default to `0`
|
|
30
|
+
*/
|
|
31
|
+
maxAge?: number;
|
|
32
|
+
/**
|
|
33
|
+
* The cache control header for static files
|
|
34
|
+
* Default to `undefined`
|
|
35
|
+
* Overrides `options.maxAge`
|
|
36
|
+
*/
|
|
37
|
+
cacheControl?: string | ((path: string) => string);
|
|
38
|
+
/**
|
|
39
|
+
* store the files in memory instead of streaming from the filesystem on each request
|
|
40
|
+
*/
|
|
41
|
+
buffer?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* when request's accept-encoding include gzip, files will compressed by gzip
|
|
44
|
+
* Default to `false`
|
|
45
|
+
*/
|
|
46
|
+
gzip?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* try use gzip files, loaded from disk, like nginx gzip_static
|
|
49
|
+
* Default to `false`
|
|
50
|
+
*/
|
|
51
|
+
usePrecompiledGzip?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* object map of aliases
|
|
54
|
+
* Default to `{}`
|
|
55
|
+
*/
|
|
56
|
+
alias?: Record<string, string>;
|
|
57
|
+
/**
|
|
58
|
+
* the url prefix you wish to add
|
|
59
|
+
* Default to `''`
|
|
60
|
+
*/
|
|
61
|
+
prefix?: string;
|
|
62
|
+
/**
|
|
63
|
+
* filter files at init dir, for example - skip non build (source) files.
|
|
64
|
+
* If array set - allow only listed files
|
|
65
|
+
* Default to `undefined`
|
|
66
|
+
*/
|
|
67
|
+
filter?: FileFilter | string[];
|
|
68
|
+
/**
|
|
69
|
+
* dynamic load file which not cached on initialization
|
|
70
|
+
* Default to `false
|
|
71
|
+
*/
|
|
72
|
+
dynamic?: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* caches the assets on initialization or not,
|
|
75
|
+
* always work together with `options.dynamic`
|
|
76
|
+
* Default to `true`
|
|
77
|
+
*/
|
|
78
|
+
preload?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* file store for caching
|
|
81
|
+
* Default to `undefined`
|
|
82
|
+
*/
|
|
83
|
+
files?: FileMap | FileStore;
|
|
85
84
|
}
|
|
86
85
|
type Next = () => Promise<void>;
|
|
87
|
-
declare class FileManager {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
86
|
+
export declare class FileManager {
|
|
87
|
+
store?: FileStore;
|
|
88
|
+
map?: FileMap;
|
|
89
|
+
constructor(store?: FileStore | FileMap);
|
|
90
|
+
get(key: string): unknown;
|
|
91
|
+
set(key: string, value: FileMeta): void;
|
|
93
92
|
}
|
|
94
93
|
type MiddlewareFunc = (ctx: any, next: Next) => Promise<void> | void;
|
|
95
|
-
declare function staticCache(): MiddlewareFunc;
|
|
96
|
-
declare function staticCache(dir: string): MiddlewareFunc;
|
|
97
|
-
declare function staticCache(options: Options): MiddlewareFunc;
|
|
98
|
-
declare function staticCache(dir: string, options: Options): MiddlewareFunc;
|
|
99
|
-
declare function staticCache(dir: string, options: Options, files: FileMap | FileStore): MiddlewareFunc;
|
|
100
|
-
|
|
101
|
-
export { FileFilter, FileManager, FileMap, FileMeta, FileStore, Options, staticCache };
|
|
94
|
+
export declare function staticCache(): MiddlewareFunc;
|
|
95
|
+
export declare function staticCache(dir: string): MiddlewareFunc;
|
|
96
|
+
export declare function staticCache(options: Options): MiddlewareFunc;
|
|
97
|
+
export declare function staticCache(dir: string, options: Options): MiddlewareFunc;
|
|
98
|
+
export declare function staticCache(dir: string, options: Options, files: FileMap | FileStore): MiddlewareFunc;
|
|
99
|
+
export {};
|
package/dist/index.js
CHANGED
|
@@ -1,158 +1,224 @@
|
|
|
1
|
-
import crypto from
|
|
2
|
-
import { debuglog, promisify } from
|
|
3
|
-
import fs from
|
|
4
|
-
import { createReadStream,
|
|
5
|
-
import zlib from
|
|
6
|
-
import path from
|
|
7
|
-
import mime from
|
|
8
|
-
import { compressible } from
|
|
9
|
-
import readDir from
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
//#region src/index.ts
|
|
13
|
-
const debug = debuglog("egg/koa-static-cache");
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import { debuglog, promisify } from 'node:util';
|
|
3
|
+
import fs from 'node:fs/promises';
|
|
4
|
+
import { createReadStream, statSync, readFileSync } from 'node:fs';
|
|
5
|
+
import zlib from 'node:zlib';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import mime from 'mime-types';
|
|
8
|
+
import { compressible } from '@eggjs/compressible';
|
|
9
|
+
import readDir from 'fs-readdir-recursive';
|
|
10
|
+
import { exists, decodeURIComponent as safeDecodeURIComponent } from 'utility';
|
|
11
|
+
const debug = debuglog('egg/koa-static-cache');
|
|
14
12
|
const gzip = promisify(zlib.gzip);
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
13
|
+
export class FileManager {
|
|
14
|
+
store;
|
|
15
|
+
map;
|
|
16
|
+
constructor(store) {
|
|
17
|
+
if (store && typeof store.set === 'function' && typeof store.get === 'function') {
|
|
18
|
+
this.store = store;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
this.map = store || Object.create(null);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
get(key) {
|
|
25
|
+
return this.store ? this.store.get(key) : this.map[key];
|
|
26
|
+
}
|
|
27
|
+
set(key, value) {
|
|
28
|
+
if (this.store) {
|
|
29
|
+
return this.store.set(key, value);
|
|
30
|
+
}
|
|
31
|
+
this.map[key] = value;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function staticCache(dirOrOptions, options = {}, filesStoreOrMap) {
|
|
35
|
+
let dir = '';
|
|
36
|
+
if (typeof dirOrOptions === 'string') {
|
|
37
|
+
// dir priority than options.dir
|
|
38
|
+
dir = dirOrOptions;
|
|
39
|
+
}
|
|
40
|
+
else if (dirOrOptions) {
|
|
41
|
+
options = dirOrOptions;
|
|
42
|
+
}
|
|
43
|
+
if (!dir && options.dir) {
|
|
44
|
+
dir = options.dir;
|
|
45
|
+
}
|
|
46
|
+
if (!dir) {
|
|
47
|
+
// default to process.cwd
|
|
48
|
+
dir = process.cwd();
|
|
49
|
+
}
|
|
50
|
+
dir = path.normalize(dir);
|
|
51
|
+
debug('staticCache dir: %s', dir);
|
|
52
|
+
// prefix must be ASCII code
|
|
53
|
+
options.prefix = (options.prefix ?? '').replace(/\/*$/, '/');
|
|
54
|
+
const files = new FileManager(filesStoreOrMap ?? options.files);
|
|
55
|
+
const enableGzip = !!options.gzip;
|
|
56
|
+
const filePrefix = path.normalize(options.prefix.replace(/^\//, ''));
|
|
57
|
+
// option.filter
|
|
58
|
+
let fileFilter = () => {
|
|
59
|
+
return true;
|
|
60
|
+
};
|
|
61
|
+
if (Array.isArray(options.filter)) {
|
|
62
|
+
fileFilter = (file) => {
|
|
63
|
+
return options.filter.includes(file);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (typeof options.filter === 'function') {
|
|
67
|
+
fileFilter = options.filter;
|
|
68
|
+
}
|
|
69
|
+
if (options.preload !== false) {
|
|
70
|
+
debug('preload: %s', dir);
|
|
71
|
+
readDir(dir, filename => {
|
|
72
|
+
// ignore dot files and node_modules
|
|
73
|
+
return !filename.startsWith('.') && filename !== 'node_modules';
|
|
74
|
+
})
|
|
75
|
+
.filter(fileFilter)
|
|
76
|
+
.forEach(name => {
|
|
77
|
+
loadFile(name, dir, options, files);
|
|
78
|
+
});
|
|
79
|
+
debug('preload end');
|
|
80
|
+
}
|
|
81
|
+
debug('prepare middleware');
|
|
82
|
+
return async (ctx, next) => {
|
|
83
|
+
// only accept HEAD and GET
|
|
84
|
+
if (ctx.method !== 'HEAD' && ctx.method !== 'GET')
|
|
85
|
+
return await next();
|
|
86
|
+
// check prefix first to avoid calculate
|
|
87
|
+
if (!ctx.path.startsWith(options.prefix))
|
|
88
|
+
return await next();
|
|
89
|
+
// decode for `/%E4%B8%AD%E6%96%87`
|
|
90
|
+
// normalize for `//index`
|
|
91
|
+
let filename = path.normalize(safeDecodeURIComponent(ctx.path));
|
|
92
|
+
// check alias
|
|
93
|
+
if (options.alias && options.alias[filename]) {
|
|
94
|
+
filename = options.alias[filename];
|
|
95
|
+
}
|
|
96
|
+
let file = files.get(filename);
|
|
97
|
+
// try to load file
|
|
98
|
+
if (!file) {
|
|
99
|
+
if (!options.dynamic)
|
|
100
|
+
return await next();
|
|
101
|
+
if (path.basename(filename)[0] === '.')
|
|
102
|
+
return await next();
|
|
103
|
+
if (filename.charAt(0) === path.sep) {
|
|
104
|
+
filename = filename.slice(1);
|
|
105
|
+
}
|
|
106
|
+
// trim prefix
|
|
107
|
+
if (options.prefix !== '/') {
|
|
108
|
+
if (filename.indexOf(filePrefix) !== 0) {
|
|
109
|
+
return await next();
|
|
110
|
+
}
|
|
111
|
+
filename = filename.slice(filePrefix.length);
|
|
112
|
+
}
|
|
113
|
+
const fullpath = path.join(dir, filename);
|
|
114
|
+
// files that can be accessed should be under options.dir
|
|
115
|
+
if (!fullpath.startsWith(dir)) {
|
|
116
|
+
return await next();
|
|
117
|
+
}
|
|
118
|
+
const stats = await exists(fullpath);
|
|
119
|
+
if (!stats)
|
|
120
|
+
return await next();
|
|
121
|
+
if (!stats.isFile())
|
|
122
|
+
return await next();
|
|
123
|
+
file = loadFile(filename, dir, options, files);
|
|
124
|
+
}
|
|
125
|
+
ctx.status = 200;
|
|
126
|
+
if (enableGzip)
|
|
127
|
+
ctx.vary('Accept-Encoding');
|
|
128
|
+
if (!file.buffer) {
|
|
129
|
+
const stats = await fs.stat(file.path);
|
|
130
|
+
if (stats.mtime.getTime() !== file.mtime.getTime()) {
|
|
131
|
+
file.mtime = stats.mtime;
|
|
132
|
+
file.md5 = undefined;
|
|
133
|
+
file.length = stats.size;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
ctx.response.lastModified = file.mtime;
|
|
137
|
+
if (file.md5) {
|
|
138
|
+
ctx.response.etag = file.md5;
|
|
139
|
+
}
|
|
140
|
+
if (ctx.fresh) {
|
|
141
|
+
ctx.status = 304;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
ctx.type = file.type;
|
|
145
|
+
ctx.length = file.zipBuffer ? file.zipBuffer.length : file.length;
|
|
146
|
+
ctx.set('cache-control', file.cacheControl ?? 'public, max-age=' + file.maxAge);
|
|
147
|
+
if (file.md5)
|
|
148
|
+
ctx.set('content-md5', file.md5);
|
|
149
|
+
if (ctx.method === 'HEAD') {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const acceptGzip = ctx.acceptsEncodings('gzip') === 'gzip';
|
|
153
|
+
if (file.zipBuffer) {
|
|
154
|
+
if (acceptGzip) {
|
|
155
|
+
ctx.set('content-encoding', 'gzip');
|
|
156
|
+
ctx.body = file.zipBuffer;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
ctx.body = file.buffer;
|
|
160
|
+
}
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const shouldGzip = enableGzip && file.length > 1024 && acceptGzip && file.type && compressible(file.type);
|
|
164
|
+
if (file.buffer) {
|
|
165
|
+
if (shouldGzip) {
|
|
166
|
+
const gzFile = files.get(filename + '.gz');
|
|
167
|
+
if (options.usePrecompiledGzip && gzFile && gzFile.buffer) {
|
|
168
|
+
// if .gz file already read from disk
|
|
169
|
+
file.zipBuffer = gzFile.buffer;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
file.zipBuffer = await gzip(file.buffer);
|
|
173
|
+
}
|
|
174
|
+
ctx.set('content-encoding', 'gzip');
|
|
175
|
+
ctx.body = file.zipBuffer;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
ctx.body = file.buffer;
|
|
179
|
+
}
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const stream = createReadStream(file.path);
|
|
183
|
+
// update file hash
|
|
184
|
+
if (!file.md5) {
|
|
185
|
+
const hash = crypto.createHash('md5');
|
|
186
|
+
stream.on('data', hash.update.bind(hash));
|
|
187
|
+
stream.on('end', () => {
|
|
188
|
+
file.md5 = hash.digest('base64');
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
ctx.body = stream;
|
|
192
|
+
// enable gzip will remove content length
|
|
193
|
+
if (shouldGzip) {
|
|
194
|
+
ctx.remove('content-length');
|
|
195
|
+
ctx.set('content-encoding', 'gzip');
|
|
196
|
+
ctx.body = stream.pipe(zlib.createGzip());
|
|
197
|
+
}
|
|
198
|
+
};
|
|
135
199
|
}
|
|
136
200
|
/**
|
|
137
|
-
* load file and add file content to cache
|
|
138
|
-
*/
|
|
201
|
+
* load file and add file content to cache
|
|
202
|
+
*/
|
|
139
203
|
function loadFile(name, dir, options, fileManager) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
204
|
+
const pathname = path.normalize(path.join(options.prefix, name));
|
|
205
|
+
if (!fileManager.get(pathname)) {
|
|
206
|
+
fileManager.set(pathname, {});
|
|
207
|
+
}
|
|
208
|
+
const obj = fileManager.get(pathname);
|
|
209
|
+
const filename = (obj.path = path.join(dir, name));
|
|
210
|
+
const stats = statSync(filename);
|
|
211
|
+
const buffer = readFileSync(filename);
|
|
212
|
+
obj.cacheControl = typeof options.cacheControl === 'function' ? options.cacheControl(filename) : options.cacheControl; // if cacheControl is a function, it will be called with the filename
|
|
213
|
+
obj.maxAge = (typeof obj.maxAge === 'number' ? obj.maxAge : options.maxAge) || 0;
|
|
214
|
+
obj.type = obj.mime = mime.lookup(pathname) || 'application/octet-stream';
|
|
215
|
+
obj.mtime = stats.mtime;
|
|
216
|
+
obj.length = stats.size;
|
|
217
|
+
obj.md5 = crypto.createHash('md5').update(buffer).digest('base64');
|
|
218
|
+
debug('file: %s', JSON.stringify(obj, null, 2));
|
|
219
|
+
if (options.buffer) {
|
|
220
|
+
obj.buffer = buffer;
|
|
221
|
+
}
|
|
222
|
+
return obj;
|
|
155
223
|
}
|
|
156
|
-
|
|
157
|
-
//#endregion
|
|
158
|
-
export { FileManager, staticCache };
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25FLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFFN0IsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixJQUFJLHNCQUFzQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRS9FLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRS9DLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUE2RmxDLE1BQU0sT0FBTyxXQUFXO0lBQ3RCLEtBQUssQ0FBYTtJQUNsQixHQUFHLENBQVc7SUFFZCxZQUFZLEtBQTJCO1FBQ3JDLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLEdBQUcsS0FBSyxVQUFVLElBQUksT0FBTyxLQUFLLENBQUMsR0FBRyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ2hGLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBa0IsQ0FBQztRQUNsQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxD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
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eggjs/koa-static-cache",
|
|
3
3
|
"description": "Static cache middleware for koa",
|
|
4
|
-
"version": "7.0.0-beta.
|
|
4
|
+
"version": "7.0.0-beta.21",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"koa",
|
|
7
7
|
"middleware",
|
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
"typescript": "^5.9.3",
|
|
42
42
|
"vitest": "4.0.0-beta.16",
|
|
43
43
|
"ylru": "^2.0.0",
|
|
44
|
-
"@eggjs/
|
|
45
|
-
"@eggjs/
|
|
46
|
-
"@eggjs/
|
|
47
|
-
"@eggjs/
|
|
44
|
+
"@eggjs/koa": "3.1.0-beta.21",
|
|
45
|
+
"@eggjs/supertest": "9.0.0-beta.21",
|
|
46
|
+
"@eggjs/bin": "8.0.0-beta.21",
|
|
47
|
+
"@eggjs/tsconfig": "3.1.0-beta.21"
|
|
48
48
|
},
|
|
49
49
|
"type": "module",
|
|
50
50
|
"exports": {
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"main": "./dist/index.js",
|
|
62
62
|
"module": "./dist/index.js",
|
|
63
63
|
"scripts": {
|
|
64
|
-
"build": "tsdown",
|
|
64
|
+
"build": "tsdown && rimraf dist && tsc -b --clean && tsc",
|
|
65
65
|
"typecheck": "tsc --noEmit",
|
|
66
66
|
"lint": "oxlint --type-aware",
|
|
67
67
|
"lint:fix": "npm run lint -- --fix",
|