@eggjs/koa-static-cache 6.1.0 → 7.0.0-beta.13

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.
@@ -1,225 +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.FileManager = void 0;
7
- exports.staticCache = staticCache;
8
- const node_crypto_1 = __importDefault(require("node:crypto"));
9
- const node_util_1 = require("node:util");
10
- const promises_1 = __importDefault(require("node:fs/promises"));
11
- const node_fs_1 = require("node:fs");
12
- const node_zlib_1 = __importDefault(require("node:zlib"));
13
- const node_path_1 = __importDefault(require("node:path"));
14
- const mime_types_1 = __importDefault(require("mime-types"));
15
- const compressible_1 = require("@eggjs/compressible");
16
- const fs_readdir_recursive_1 = __importDefault(require("fs-readdir-recursive"));
17
- const utility_1 = require("utility");
18
- const debug = (0, node_util_1.debuglog)('@eggjs/koa-static-cache');
19
- const gzip = (0, node_util_1.promisify)(node_zlib_1.default.gzip);
20
- class FileManager {
21
- store;
22
- map;
23
- constructor(store) {
24
- if (store && typeof store.set === 'function' && typeof store.get === 'function') {
25
- this.store = store;
26
- }
27
- else {
28
- this.map = store || Object.create(null);
29
- }
30
- }
31
- get(key) {
32
- return this.store ? this.store.get(key) : this.map[key];
33
- }
34
- set(key, value) {
35
- if (this.store) {
36
- return this.store.set(key, value);
37
- }
38
- this.map[key] = value;
39
- }
40
- }
41
- exports.FileManager = FileManager;
42
- function staticCache(dirOrOptions, options = {}, filesStoreOrMap) {
43
- let dir = '';
44
- if (typeof dirOrOptions === 'string') {
45
- // dir priority than options.dir
46
- dir = dirOrOptions;
47
- }
48
- else if (dirOrOptions) {
49
- options = dirOrOptions;
50
- }
51
- if (!dir && options.dir) {
52
- dir = options.dir;
53
- }
54
- if (!dir) {
55
- // default to process.cwd
56
- dir = process.cwd();
57
- }
58
- dir = node_path_1.default.normalize(dir);
59
- debug('staticCache dir: %s', dir);
60
- // prefix must be ASCII code
61
- options.prefix = (options.prefix ?? '').replace(/\/*$/, '/');
62
- const files = new FileManager(filesStoreOrMap ?? options.files);
63
- const enableGzip = !!options.gzip;
64
- const filePrefix = node_path_1.default.normalize(options.prefix.replace(/^\//, ''));
65
- // option.filter
66
- let fileFilter = () => { return true; };
67
- if (Array.isArray(options.filter)) {
68
- fileFilter = (file) => {
69
- return options.filter.includes(file);
70
- };
71
- }
72
- if (typeof options.filter === 'function') {
73
- fileFilter = options.filter;
74
- }
75
- if (options.preload !== false) {
76
- (0, fs_readdir_recursive_1.default)(dir).filter(fileFilter).forEach(name => {
77
- loadFile(name, dir, options, files);
78
- });
79
- }
80
- return async (ctx, next) => {
81
- // only accept HEAD and GET
82
- if (ctx.method !== 'HEAD' && ctx.method !== 'GET')
83
- return await next();
84
- // check prefix first to avoid calculate
85
- if (!ctx.path.startsWith(options.prefix))
86
- return await next();
87
- // decode for `/%E4%B8%AD%E6%96%87`
88
- // normalize for `//index`
89
- let filename = node_path_1.default.normalize((0, utility_1.decodeURIComponent)(ctx.path));
90
- // check alias
91
- if (options.alias && options.alias[filename]) {
92
- filename = options.alias[filename];
93
- }
94
- let file = files.get(filename);
95
- // try to load file
96
- if (!file) {
97
- if (!options.dynamic)
98
- return await next();
99
- if (node_path_1.default.basename(filename)[0] === '.')
100
- return await next();
101
- if (filename.charAt(0) === node_path_1.default.sep) {
102
- filename = filename.slice(1);
103
- }
104
- // trim prefix
105
- if (options.prefix !== '/') {
106
- if (filename.indexOf(filePrefix) !== 0) {
107
- return await next();
108
- }
109
- filename = filename.slice(filePrefix.length);
110
- }
111
- const fullpath = node_path_1.default.join(dir, filename);
112
- // files that can be accessed should be under options.dir
113
- if (!fullpath.startsWith(dir)) {
114
- return await next();
115
- }
116
- const stats = await (0, utility_1.exists)(fullpath);
117
- if (!stats)
118
- return await next();
119
- if (!stats.isFile())
120
- return await next();
121
- file = loadFile(filename, dir, options, files);
122
- }
123
- ctx.status = 200;
124
- if (enableGzip)
125
- ctx.vary('Accept-Encoding');
126
- if (!file.buffer) {
127
- const stats = await promises_1.default.stat(file.path);
128
- if (stats.mtime.getTime() !== file.mtime.getTime()) {
129
- file.mtime = stats.mtime;
130
- file.md5 = undefined;
131
- file.length = stats.size;
132
- }
133
- }
134
- ctx.response.lastModified = file.mtime;
135
- if (file.md5) {
136
- ctx.response.etag = file.md5;
137
- }
138
- if (ctx.fresh) {
139
- ctx.status = 304;
140
- return;
141
- }
142
- ctx.type = file.type;
143
- ctx.length = file.zipBuffer ? file.zipBuffer.length : file.length;
144
- ctx.set('cache-control', file.cacheControl ?? 'public, max-age=' + file.maxAge);
145
- if (file.md5)
146
- ctx.set('content-md5', file.md5);
147
- if (ctx.method === 'HEAD') {
148
- return;
149
- }
150
- const acceptGzip = ctx.acceptsEncodings('gzip') === 'gzip';
151
- if (file.zipBuffer) {
152
- if (acceptGzip) {
153
- ctx.set('content-encoding', 'gzip');
154
- ctx.body = file.zipBuffer;
155
- }
156
- else {
157
- ctx.body = file.buffer;
158
- }
159
- return;
160
- }
161
- const shouldGzip = enableGzip
162
- && file.length > 1024
163
- && acceptGzip
164
- && file.type && (0, compressible_1.compressible)(file.type);
165
- if (file.buffer) {
166
- if (shouldGzip) {
167
- const gzFile = files.get(filename + '.gz');
168
- if (options.usePrecompiledGzip && gzFile && gzFile.buffer) {
169
- // if .gz file already read from disk
170
- file.zipBuffer = gzFile.buffer;
171
- }
172
- else {
173
- file.zipBuffer = await gzip(file.buffer);
174
- }
175
- ctx.set('content-encoding', 'gzip');
176
- ctx.body = file.zipBuffer;
177
- }
178
- else {
179
- ctx.body = file.buffer;
180
- }
181
- return;
182
- }
183
- const stream = (0, node_fs_1.createReadStream)(file.path);
184
- // update file hash
185
- if (!file.md5) {
186
- const hash = node_crypto_1.default.createHash('md5');
187
- stream.on('data', hash.update.bind(hash));
188
- stream.on('end', () => {
189
- file.md5 = hash.digest('base64');
190
- });
191
- }
192
- ctx.body = stream;
193
- // enable gzip will remove content length
194
- if (shouldGzip) {
195
- ctx.remove('content-length');
196
- ctx.set('content-encoding', 'gzip');
197
- ctx.body = stream.pipe(node_zlib_1.default.createGzip());
198
- }
199
- };
200
- }
201
- /**
202
- * load file and add file content to cache
203
- */
204
- function loadFile(name, dir, options, fileManager) {
205
- const pathname = node_path_1.default.normalize(node_path_1.default.join(options.prefix, name));
206
- if (!fileManager.get(pathname)) {
207
- fileManager.set(pathname, {});
208
- }
209
- const obj = fileManager.get(pathname);
210
- const filename = obj.path = node_path_1.default.join(dir, name);
211
- const stats = (0, node_fs_1.statSync)(filename);
212
- const buffer = (0, node_fs_1.readFileSync)(filename);
213
- obj.cacheControl = options.cacheControl;
214
- obj.maxAge = obj.maxAge ? obj.maxAge : options.maxAge || 0;
215
- obj.type = obj.mime = mime_types_1.default.lookup(pathname) || 'application/octet-stream';
216
- obj.mtime = stats.mtime;
217
- obj.length = stats.size;
218
- obj.md5 = node_crypto_1.default.createHash('md5').update(buffer).digest('base64');
219
- debug('file: %s', JSON.stringify(obj, null, 2));
220
- if (options.buffer) {
221
- obj.buffer = buffer;
222
- }
223
- return obj;
224
- }
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBeUlBLGtDQWdMQztBQXpURCw4REFBaUM7QUFDakMseUNBQWdEO0FBQ2hELGdFQUFrQztBQUNsQyxxQ0FBbUU7QUFDbkUsMERBQTZCO0FBQzdCLDBEQUE2QjtBQUM3Qiw0REFBOEI7QUFDOUIsc0RBQW1EO0FBQ25ELGdGQUEyQztBQUMzQyxxQ0FBK0U7QUFFL0UsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBUSxFQUFDLHlCQUF5QixDQUFDLENBQUM7QUFFbEQsTUFBTSxJQUFJLEdBQUcsSUFBQSxxQkFBUyxFQUFDLG1CQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUE2RmxDLE1BQWEsV0FBVztJQUN0QixLQUFLLENBQWE7SUFDbEIsR0FBRyxDQUFXO0lBRWQsWUFBWSxLQUEyQjtRQUNyQyxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBQyxHQUFHLEtBQUssVUFBVSxJQUFJLE9BQU8sS0FBSyxDQUFDLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNoRixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQWtCLENBQUM7UUFDbEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQWU7UUFDOUIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFF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
@@ -1,3 +0,0 @@
1
- {
2
- "type": "commonjs"
3
- }
@@ -1,99 +0,0 @@
1
- export type FileFilter = (path: string) => boolean;
2
- export interface FileMeta {
3
- maxAge?: number;
4
- cacheControl?: 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;
13
- }
14
- export interface FileMap {
15
- [path: string]: FileMeta;
16
- }
17
- export interface FileStore {
18
- get(key: string): unknown;
19
- set(key: string, value: unknown): void;
20
- }
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;
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;
84
- }
85
- type Next = () => Promise<void>;
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;
92
- }
93
- type MiddlewareFunc = (ctx: any, next: Next) => Promise<void> | void;
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/esm/index.js DELETED
@@ -1,217 +0,0 @@
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('@eggjs/koa-static-cache');
12
- const gzip = promisify(zlib.gzip);
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 = () => { return true; };
59
- if (Array.isArray(options.filter)) {
60
- fileFilter = (file) => {
61
- return options.filter.includes(file);
62
- };
63
- }
64
- if (typeof options.filter === 'function') {
65
- fileFilter = options.filter;
66
- }
67
- if (options.preload !== false) {
68
- readDir(dir).filter(fileFilter).forEach(name => {
69
- loadFile(name, dir, options, files);
70
- });
71
- }
72
- return async (ctx, next) => {
73
- // only accept HEAD and GET
74
- if (ctx.method !== 'HEAD' && ctx.method !== 'GET')
75
- return await next();
76
- // check prefix first to avoid calculate
77
- if (!ctx.path.startsWith(options.prefix))
78
- return await next();
79
- // decode for `/%E4%B8%AD%E6%96%87`
80
- // normalize for `//index`
81
- let filename = path.normalize(safeDecodeURIComponent(ctx.path));
82
- // check alias
83
- if (options.alias && options.alias[filename]) {
84
- filename = options.alias[filename];
85
- }
86
- let file = files.get(filename);
87
- // try to load file
88
- if (!file) {
89
- if (!options.dynamic)
90
- return await next();
91
- if (path.basename(filename)[0] === '.')
92
- return await next();
93
- if (filename.charAt(0) === path.sep) {
94
- filename = filename.slice(1);
95
- }
96
- // trim prefix
97
- if (options.prefix !== '/') {
98
- if (filename.indexOf(filePrefix) !== 0) {
99
- return await next();
100
- }
101
- filename = filename.slice(filePrefix.length);
102
- }
103
- const fullpath = path.join(dir, filename);
104
- // files that can be accessed should be under options.dir
105
- if (!fullpath.startsWith(dir)) {
106
- return await next();
107
- }
108
- const stats = await exists(fullpath);
109
- if (!stats)
110
- return await next();
111
- if (!stats.isFile())
112
- return await next();
113
- file = loadFile(filename, dir, options, files);
114
- }
115
- ctx.status = 200;
116
- if (enableGzip)
117
- ctx.vary('Accept-Encoding');
118
- if (!file.buffer) {
119
- const stats = await fs.stat(file.path);
120
- if (stats.mtime.getTime() !== file.mtime.getTime()) {
121
- file.mtime = stats.mtime;
122
- file.md5 = undefined;
123
- file.length = stats.size;
124
- }
125
- }
126
- ctx.response.lastModified = file.mtime;
127
- if (file.md5) {
128
- ctx.response.etag = file.md5;
129
- }
130
- if (ctx.fresh) {
131
- ctx.status = 304;
132
- return;
133
- }
134
- ctx.type = file.type;
135
- ctx.length = file.zipBuffer ? file.zipBuffer.length : file.length;
136
- ctx.set('cache-control', file.cacheControl ?? 'public, max-age=' + file.maxAge);
137
- if (file.md5)
138
- ctx.set('content-md5', file.md5);
139
- if (ctx.method === 'HEAD') {
140
- return;
141
- }
142
- const acceptGzip = ctx.acceptsEncodings('gzip') === 'gzip';
143
- if (file.zipBuffer) {
144
- if (acceptGzip) {
145
- ctx.set('content-encoding', 'gzip');
146
- ctx.body = file.zipBuffer;
147
- }
148
- else {
149
- ctx.body = file.buffer;
150
- }
151
- return;
152
- }
153
- const shouldGzip = enableGzip
154
- && file.length > 1024
155
- && acceptGzip
156
- && file.type && compressible(file.type);
157
- if (file.buffer) {
158
- if (shouldGzip) {
159
- const gzFile = files.get(filename + '.gz');
160
- if (options.usePrecompiledGzip && gzFile && gzFile.buffer) {
161
- // if .gz file already read from disk
162
- file.zipBuffer = gzFile.buffer;
163
- }
164
- else {
165
- file.zipBuffer = await gzip(file.buffer);
166
- }
167
- ctx.set('content-encoding', 'gzip');
168
- ctx.body = file.zipBuffer;
169
- }
170
- else {
171
- ctx.body = file.buffer;
172
- }
173
- return;
174
- }
175
- const stream = createReadStream(file.path);
176
- // update file hash
177
- if (!file.md5) {
178
- const hash = crypto.createHash('md5');
179
- stream.on('data', hash.update.bind(hash));
180
- stream.on('end', () => {
181
- file.md5 = hash.digest('base64');
182
- });
183
- }
184
- ctx.body = stream;
185
- // enable gzip will remove content length
186
- if (shouldGzip) {
187
- ctx.remove('content-length');
188
- ctx.set('content-encoding', 'gzip');
189
- ctx.body = stream.pipe(zlib.createGzip());
190
- }
191
- };
192
- }
193
- /**
194
- * load file and add file content to cache
195
- */
196
- function loadFile(name, dir, options, fileManager) {
197
- const pathname = path.normalize(path.join(options.prefix, name));
198
- if (!fileManager.get(pathname)) {
199
- fileManager.set(pathname, {});
200
- }
201
- const obj = fileManager.get(pathname);
202
- const filename = obj.path = path.join(dir, name);
203
- const stats = statSync(filename);
204
- const buffer = readFileSync(filename);
205
- obj.cacheControl = options.cacheControl;
206
- obj.maxAge = obj.maxAge ? obj.maxAge : options.maxAge || 0;
207
- obj.type = obj.mime = mime.lookup(pathname) || 'application/octet-stream';
208
- obj.mtime = stats.mtime;
209
- obj.length = stats.size;
210
- obj.md5 = crypto.createHash('md5').update(buffer).digest('base64');
211
- debug('file: %s', JSON.stringify(obj, null, 2));
212
- if (options.buffer) {
213
- obj.buffer = buffer;
214
- }
215
- return obj;
216
- }
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25FLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixJQUFJLHNCQUFzQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRS9FLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBRWxELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUE2RmxDLE1BQU0sT0FBTyxXQUFXO0lBQ3RCLEtBQUssQ0FBYTtJQUNsQixHQUFHLENBQVc7SUFFZCxZQUFZLEtBQTJCO1FBQ3JDLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLEdBQUcsS0FBSyxVQUFVLElBQUksT0FBTyxLQUFLLENBQUMsR0FBRyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ2hGLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBa0IsQ0FBQztRQUNsQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFB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
@@ -1,3 +0,0 @@
1
- {
2
- "type": "module"
3
- }
package/dist/package.json DELETED
@@ -1,4 +0,0 @@
1
- {
2
- "name": "@eggjs/koa-static-cache",
3
- "version": "6.1.0"
4
- }