cors-whitelist-ip 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +284 -0
- package/dist/cjs/adapters/cache/InMemoryCacheAdapter.d.ts +19 -0
- package/dist/cjs/adapters/cache/InMemoryCacheAdapter.d.ts.map +1 -0
- package/dist/cjs/adapters/cache/InMemoryCacheAdapter.js +69 -0
- package/dist/cjs/adapters/cache/InMemoryCacheAdapter.js.map +1 -0
- package/dist/cjs/adapters/cache/NoCacheAdapter.d.ts +14 -0
- package/dist/cjs/adapters/cache/NoCacheAdapter.d.ts.map +1 -0
- package/dist/cjs/adapters/cache/NoCacheAdapter.js +29 -0
- package/dist/cjs/adapters/cache/NoCacheAdapter.js.map +1 -0
- package/dist/cjs/adapters/cache/index.d.ts +3 -0
- package/dist/cjs/adapters/cache/index.d.ts.map +1 -0
- package/dist/cjs/adapters/cache/index.js +8 -0
- package/dist/cjs/adapters/cache/index.js.map +1 -0
- package/dist/cjs/adapters/storage/InMemoryStorageAdapter.d.ts +30 -0
- package/dist/cjs/adapters/storage/InMemoryStorageAdapter.d.ts.map +1 -0
- package/dist/cjs/adapters/storage/InMemoryStorageAdapter.js +70 -0
- package/dist/cjs/adapters/storage/InMemoryStorageAdapter.js.map +1 -0
- package/dist/cjs/adapters/storage/index.d.ts +3 -0
- package/dist/cjs/adapters/storage/index.d.ts.map +1 -0
- package/dist/cjs/adapters/storage/index.js +6 -0
- package/dist/cjs/adapters/storage/index.js.map +1 -0
- package/dist/cjs/core/CorsWhitelist.d.ts +60 -0
- package/dist/cjs/core/CorsWhitelist.d.ts.map +1 -0
- package/dist/cjs/core/CorsWhitelist.js +273 -0
- package/dist/cjs/core/CorsWhitelist.js.map +1 -0
- package/dist/cjs/core/index.d.ts +4 -0
- package/dist/cjs/core/index.d.ts.map +1 -0
- package/dist/cjs/core/index.js +22 -0
- package/dist/cjs/core/index.js.map +1 -0
- package/dist/cjs/core/types.d.ts +201 -0
- package/dist/cjs/core/types.d.ts.map +1 -0
- package/dist/cjs/core/types.js +3 -0
- package/dist/cjs/core/types.js.map +1 -0
- package/dist/cjs/core/utils.d.ts +31 -0
- package/dist/cjs/core/utils.d.ts.map +1 -0
- package/dist/cjs/core/utils.js +82 -0
- package/dist/cjs/core/utils.js.map +1 -0
- package/dist/cjs/frameworks/express.d.ts +15 -0
- package/dist/cjs/frameworks/express.d.ts.map +1 -0
- package/dist/cjs/frameworks/express.js +49 -0
- package/dist/cjs/frameworks/express.js.map +1 -0
- package/dist/cjs/frameworks/fastify.d.ts +18 -0
- package/dist/cjs/frameworks/fastify.d.ts.map +1 -0
- package/dist/cjs/frameworks/fastify.js +49 -0
- package/dist/cjs/frameworks/fastify.js.map +1 -0
- package/dist/cjs/frameworks/index.d.ts +5 -0
- package/dist/cjs/frameworks/index.d.ts.map +1 -0
- package/dist/cjs/frameworks/index.js +15 -0
- package/dist/cjs/frameworks/index.js.map +1 -0
- package/dist/cjs/frameworks/koa.d.ts +15 -0
- package/dist/cjs/frameworks/koa.d.ts.map +1 -0
- package/dist/cjs/frameworks/koa.js +48 -0
- package/dist/cjs/frameworks/koa.js.map +1 -0
- package/dist/cjs/frameworks/node-http.d.ts +16 -0
- package/dist/cjs/frameworks/node-http.d.ts.map +1 -0
- package/dist/cjs/frameworks/node-http.js +46 -0
- package/dist/cjs/frameworks/node-http.js.map +1 -0
- package/dist/cjs/index.d.ts +12 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +43 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/adapters/cache/InMemoryCacheAdapter.d.ts +19 -0
- package/dist/esm/adapters/cache/InMemoryCacheAdapter.d.ts.map +1 -0
- package/dist/esm/adapters/cache/InMemoryCacheAdapter.js +69 -0
- package/dist/esm/adapters/cache/InMemoryCacheAdapter.js.map +1 -0
- package/dist/esm/adapters/cache/NoCacheAdapter.d.ts +14 -0
- package/dist/esm/adapters/cache/NoCacheAdapter.d.ts.map +1 -0
- package/dist/esm/adapters/cache/NoCacheAdapter.js +29 -0
- package/dist/esm/adapters/cache/NoCacheAdapter.js.map +1 -0
- package/dist/esm/adapters/cache/index.d.ts +3 -0
- package/dist/esm/adapters/cache/index.d.ts.map +1 -0
- package/dist/esm/adapters/cache/index.js +8 -0
- package/dist/esm/adapters/cache/index.js.map +1 -0
- package/dist/esm/adapters/storage/InMemoryStorageAdapter.d.ts +30 -0
- package/dist/esm/adapters/storage/InMemoryStorageAdapter.d.ts.map +1 -0
- package/dist/esm/adapters/storage/InMemoryStorageAdapter.js +70 -0
- package/dist/esm/adapters/storage/InMemoryStorageAdapter.js.map +1 -0
- package/dist/esm/adapters/storage/index.d.ts +3 -0
- package/dist/esm/adapters/storage/index.d.ts.map +1 -0
- package/dist/esm/adapters/storage/index.js +6 -0
- package/dist/esm/adapters/storage/index.js.map +1 -0
- package/dist/esm/core/CorsWhitelist.d.ts +60 -0
- package/dist/esm/core/CorsWhitelist.d.ts.map +1 -0
- package/dist/esm/core/CorsWhitelist.js +273 -0
- package/dist/esm/core/CorsWhitelist.js.map +1 -0
- package/dist/esm/core/index.d.ts +4 -0
- package/dist/esm/core/index.d.ts.map +1 -0
- package/dist/esm/core/index.js +22 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/core/types.d.ts +201 -0
- package/dist/esm/core/types.d.ts.map +1 -0
- package/dist/esm/core/types.js +3 -0
- package/dist/esm/core/types.js.map +1 -0
- package/dist/esm/core/utils.d.ts +31 -0
- package/dist/esm/core/utils.d.ts.map +1 -0
- package/dist/esm/core/utils.js +82 -0
- package/dist/esm/core/utils.js.map +1 -0
- package/dist/esm/frameworks/express.d.ts +15 -0
- package/dist/esm/frameworks/express.d.ts.map +1 -0
- package/dist/esm/frameworks/express.js +49 -0
- package/dist/esm/frameworks/express.js.map +1 -0
- package/dist/esm/frameworks/fastify.d.ts +18 -0
- package/dist/esm/frameworks/fastify.d.ts.map +1 -0
- package/dist/esm/frameworks/fastify.js +49 -0
- package/dist/esm/frameworks/fastify.js.map +1 -0
- package/dist/esm/frameworks/index.d.ts +5 -0
- package/dist/esm/frameworks/index.d.ts.map +1 -0
- package/dist/esm/frameworks/index.js +15 -0
- package/dist/esm/frameworks/index.js.map +1 -0
- package/dist/esm/frameworks/koa.d.ts +15 -0
- package/dist/esm/frameworks/koa.d.ts.map +1 -0
- package/dist/esm/frameworks/koa.js +48 -0
- package/dist/esm/frameworks/koa.js.map +1 -0
- package/dist/esm/frameworks/node-http.d.ts +16 -0
- package/dist/esm/frameworks/node-http.d.ts.map +1 -0
- package/dist/esm/frameworks/node-http.js +46 -0
- package/dist/esm/frameworks/node-http.js.map +1 -0
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +43 -0
- package/dist/esm/index.js.map +1 -0
- package/package.json +147 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RequestHandler } from 'express';
|
|
2
|
+
import { CorsWhitelist } from '../core/CorsWhitelist';
|
|
3
|
+
import { CorsWhitelistOptions } from '../core/types';
|
|
4
|
+
/**
|
|
5
|
+
* Create Express middleware for CORS whitelist validation
|
|
6
|
+
*/
|
|
7
|
+
export declare function createExpressMiddleware(corsWhitelist: CorsWhitelist): RequestHandler;
|
|
8
|
+
/**
|
|
9
|
+
* Factory function to create both CorsWhitelist instance and Express middleware
|
|
10
|
+
*/
|
|
11
|
+
export declare function corsWhitelistExpress(options: CorsWhitelistOptions): {
|
|
12
|
+
corsWhitelist: CorsWhitelist;
|
|
13
|
+
middleware: RequestHandler;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=express.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../../src/frameworks/express.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAmC,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,oBAAoB,EAGrB,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,aAAa,GAC3B,cAAc,CAoChB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,oBAAoB,GAC5B;IAAE,aAAa,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,cAAc,CAAA;CAAE,CAK9D"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createExpressMiddleware = createExpressMiddleware;
|
|
4
|
+
exports.corsWhitelistExpress = corsWhitelistExpress;
|
|
5
|
+
const CorsWhitelist_1 = require("../core/CorsWhitelist");
|
|
6
|
+
/**
|
|
7
|
+
* Create Express middleware for CORS whitelist validation
|
|
8
|
+
*/
|
|
9
|
+
function createExpressMiddleware(corsWhitelist) {
|
|
10
|
+
return async (req, res, next) => {
|
|
11
|
+
const genericReq = {
|
|
12
|
+
headers: req.headers,
|
|
13
|
+
method: req.method,
|
|
14
|
+
url: req.url,
|
|
15
|
+
ip: req.ip || req.socket?.remoteAddress,
|
|
16
|
+
};
|
|
17
|
+
const genericRes = {
|
|
18
|
+
setHeader: (name, value) => res.setHeader(name, value),
|
|
19
|
+
get statusCode() {
|
|
20
|
+
return res.statusCode;
|
|
21
|
+
},
|
|
22
|
+
set statusCode(code) {
|
|
23
|
+
res.statusCode = code;
|
|
24
|
+
},
|
|
25
|
+
end: (body) => {
|
|
26
|
+
if (body) {
|
|
27
|
+
res.setHeader('Content-Type', 'application/json');
|
|
28
|
+
res.end(body);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
res.end();
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
const shouldContinue = await corsWhitelist.handleRequest(genericReq, genericRes);
|
|
36
|
+
if (shouldContinue) {
|
|
37
|
+
next();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Factory function to create both CorsWhitelist instance and Express middleware
|
|
43
|
+
*/
|
|
44
|
+
function corsWhitelistExpress(options) {
|
|
45
|
+
const corsWhitelist = new CorsWhitelist_1.CorsWhitelist(options);
|
|
46
|
+
const middleware = createExpressMiddleware(corsWhitelist);
|
|
47
|
+
return { corsWhitelist, middleware };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../../../src/frameworks/express.ts"],"names":[],"mappings":";;AAWA,0DAsCC;AAKD,oDAOC;AA5DD,yDAAsD;AAOtD;;GAEG;AACH,SAAgB,uBAAuB,CACrC,aAA4B;IAE5B,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC/D,MAAM,UAAU,GAAmB;YACjC,OAAO,EAAE,GAAG,CAAC,OAAwD;YACrE,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa;SACxC,CAAC;QAEF,MAAM,UAAU,GAAoB;YAClC,SAAS,EAAE,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC;YACtE,IAAI,UAAU;gBACZ,OAAO,GAAG,CAAC,UAAU,CAAC;YACxB,CAAC;YACD,IAAI,UAAU,CAAC,IAAY;gBACzB,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;YACxB,CAAC;YACD,GAAG,EAAE,CAAC,IAAa,EAAE,EAAE;gBACrB,IAAI,IAAI,EAAE,CAAC;oBACT,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;oBAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,GAAG,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;SACF,CAAC;QAEF,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,aAAa,CACtD,UAAU,EACV,UAAU,CACX,CAAC;QAEF,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAClC,OAA6B;IAE7B,MAAM,aAAa,GAAG,IAAI,6BAAa,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,uBAAuB,CAAC,aAAa,CAAC,CAAC;IAE1D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { FastifyPluginCallback } from 'fastify';
|
|
2
|
+
import { CorsWhitelist } from '../core/CorsWhitelist';
|
|
3
|
+
import { CorsWhitelistOptions } from '../core/types';
|
|
4
|
+
export interface FastifyCorsOptions extends CorsWhitelistOptions {
|
|
5
|
+
/** Hook to use for CORS check (default: 'onRequest') */
|
|
6
|
+
hook?: 'onRequest' | 'preValidation' | 'preHandler';
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Fastify plugin for CORS whitelist validation
|
|
10
|
+
*/
|
|
11
|
+
export declare const fastifyCorsWhitelist: FastifyPluginCallback<FastifyCorsOptions>;
|
|
12
|
+
export default fastifyCorsWhitelist;
|
|
13
|
+
declare module 'fastify' {
|
|
14
|
+
interface FastifyInstance {
|
|
15
|
+
corsWhitelist: CorsWhitelist;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=fastify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../../../src/frameworks/fastify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,qBAAqB,EAGtB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,oBAAoB,EAGrB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,wDAAwD;IACxD,IAAI,CAAC,EAAE,WAAW,GAAG,eAAe,GAAG,YAAY,CAAC;CACrD;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,qBAAqB,CAAC,kBAAkB,CAiD1E,CAAC;AAGF,eAAe,oBAAoB,CAAC;AAGpC,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,eAAe;QACvB,aAAa,EAAE,aAAa,CAAC;KAC9B;CACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fastifyCorsWhitelist = void 0;
|
|
4
|
+
const CorsWhitelist_1 = require("../core/CorsWhitelist");
|
|
5
|
+
/**
|
|
6
|
+
* Fastify plugin for CORS whitelist validation
|
|
7
|
+
*/
|
|
8
|
+
const fastifyCorsWhitelist = (fastify, options, done) => {
|
|
9
|
+
const corsWhitelist = new CorsWhitelist_1.CorsWhitelist(options);
|
|
10
|
+
const hook = options.hook ?? 'onRequest';
|
|
11
|
+
// Store the instance on fastify for access elsewhere
|
|
12
|
+
fastify.decorate('corsWhitelist', corsWhitelist);
|
|
13
|
+
fastify.addHook(hook, async (req, reply) => {
|
|
14
|
+
const genericReq = {
|
|
15
|
+
headers: req.headers,
|
|
16
|
+
method: req.method,
|
|
17
|
+
url: req.url,
|
|
18
|
+
ip: req.ip,
|
|
19
|
+
};
|
|
20
|
+
let responseSent = false;
|
|
21
|
+
const genericRes = {
|
|
22
|
+
setHeader: (name, value) => reply.header(name, value),
|
|
23
|
+
get statusCode() {
|
|
24
|
+
return reply.statusCode;
|
|
25
|
+
},
|
|
26
|
+
set statusCode(code) {
|
|
27
|
+
reply.status(code);
|
|
28
|
+
},
|
|
29
|
+
end: (body) => {
|
|
30
|
+
responseSent = true;
|
|
31
|
+
if (body) {
|
|
32
|
+
reply.type('application/json').send(body);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
reply.send();
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
const shouldContinue = await corsWhitelist.handleRequest(genericReq, genericRes);
|
|
40
|
+
if (!shouldContinue && !responseSent) {
|
|
41
|
+
return; // Reply already sent
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
done();
|
|
45
|
+
};
|
|
46
|
+
exports.fastifyCorsWhitelist = fastifyCorsWhitelist;
|
|
47
|
+
// For ES module default export compatibility
|
|
48
|
+
exports.default = exports.fastifyCorsWhitelist;
|
|
49
|
+
//# sourceMappingURL=fastify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["../../../src/frameworks/fastify.ts"],"names":[],"mappings":";;;AAMA,yDAAsD;AAYtD;;GAEG;AACI,MAAM,oBAAoB,GAA8C,CAC7E,OAAwB,EACxB,OAA2B,EAC3B,IAA2B,EAC3B,EAAE;IACF,MAAM,aAAa,GAAG,IAAI,6BAAa,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IAEzC,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IAEjD,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,GAAmB,EAAE,KAAmB,EAAE,EAAE;QACvE,MAAM,UAAU,GAAmB;YACjC,OAAO,EAAE,GAAG,CAAC,OAAwD;YACrE,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,EAAE,EAAE,GAAG,CAAC,EAAE;SACX,CAAC;QAEF,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,MAAM,UAAU,GAAoB;YAClC,SAAS,EAAE,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;YACrE,IAAI,UAAU;gBACZ,OAAO,KAAK,CAAC,UAAU,CAAC;YAC1B,CAAC;YACD,IAAI,UAAU,CAAC,IAAY;gBACzB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;YACD,GAAG,EAAE,CAAC,IAAa,EAAE,EAAE;gBACrB,YAAY,GAAG,IAAI,CAAC;gBACpB,IAAI,IAAI,EAAE,CAAC;oBACT,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,CAAC;YACH,CAAC;SACF,CAAC;QAEF,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,aAAa,CACtD,UAAU,EACV,UAAU,CACX,CAAC;QAEF,IAAI,CAAC,cAAc,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,OAAO,CAAC,qBAAqB;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AAjDW,QAAA,oBAAoB,wBAiD/B;AAEF,6CAA6C;AAC7C,kBAAe,4BAAoB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createExpressMiddleware, corsWhitelistExpress, } from './express';
|
|
2
|
+
export { fastifyCorsWhitelist, type FastifyCorsOptions, } from './fastify';
|
|
3
|
+
export { createKoaMiddleware, corsWhitelistKoa } from './koa';
|
|
4
|
+
export { createNodeHttpHandler, corsWhitelistHttp, type HttpHandler, } from './node-http';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/frameworks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,oBAAoB,EACpB,KAAK,kBAAkB,GACxB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.corsWhitelistHttp = exports.createNodeHttpHandler = exports.corsWhitelistKoa = exports.createKoaMiddleware = exports.fastifyCorsWhitelist = exports.corsWhitelistExpress = exports.createExpressMiddleware = void 0;
|
|
4
|
+
var express_1 = require("./express");
|
|
5
|
+
Object.defineProperty(exports, "createExpressMiddleware", { enumerable: true, get: function () { return express_1.createExpressMiddleware; } });
|
|
6
|
+
Object.defineProperty(exports, "corsWhitelistExpress", { enumerable: true, get: function () { return express_1.corsWhitelistExpress; } });
|
|
7
|
+
var fastify_1 = require("./fastify");
|
|
8
|
+
Object.defineProperty(exports, "fastifyCorsWhitelist", { enumerable: true, get: function () { return fastify_1.fastifyCorsWhitelist; } });
|
|
9
|
+
var koa_1 = require("./koa");
|
|
10
|
+
Object.defineProperty(exports, "createKoaMiddleware", { enumerable: true, get: function () { return koa_1.createKoaMiddleware; } });
|
|
11
|
+
Object.defineProperty(exports, "corsWhitelistKoa", { enumerable: true, get: function () { return koa_1.corsWhitelistKoa; } });
|
|
12
|
+
var node_http_1 = require("./node-http");
|
|
13
|
+
Object.defineProperty(exports, "createNodeHttpHandler", { enumerable: true, get: function () { return node_http_1.createNodeHttpHandler; } });
|
|
14
|
+
Object.defineProperty(exports, "corsWhitelistHttp", { enumerable: true, get: function () { return node_http_1.corsWhitelistHttp; } });
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/frameworks/index.ts"],"names":[],"mappings":";;;AAAA,qCAGmB;AAFjB,kHAAA,uBAAuB,OAAA;AACvB,+GAAA,oBAAoB,OAAA;AAEtB,qCAGmB;AAFjB,+GAAA,oBAAoB,OAAA;AAGtB,6BAA8D;AAArD,0GAAA,mBAAmB,OAAA;AAAE,uGAAA,gBAAgB,OAAA;AAC9C,yCAIqB;AAHnB,kHAAA,qBAAqB,OAAA;AACrB,8GAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Middleware } from 'koa';
|
|
2
|
+
import { CorsWhitelist } from '../core/CorsWhitelist';
|
|
3
|
+
import { CorsWhitelistOptions } from '../core/types';
|
|
4
|
+
/**
|
|
5
|
+
* Create Koa middleware for CORS whitelist validation
|
|
6
|
+
*/
|
|
7
|
+
export declare function createKoaMiddleware(corsWhitelist: CorsWhitelist): Middleware;
|
|
8
|
+
/**
|
|
9
|
+
* Factory function to create both CorsWhitelist instance and Koa middleware
|
|
10
|
+
*/
|
|
11
|
+
export declare function corsWhitelistKoa(options: CorsWhitelistOptions): {
|
|
12
|
+
corsWhitelist: CorsWhitelist;
|
|
13
|
+
middleware: Middleware;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=koa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koa.d.ts","sourceRoot":"","sources":["../../../src/frameworks/koa.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,UAAU,EAAE,MAAM,KAAK,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,oBAAoB,EAGrB,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,aAAa,GAAG,UAAU,CAoC5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,oBAAoB,GAC5B;IAAE,aAAa,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAK1D"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createKoaMiddleware = createKoaMiddleware;
|
|
4
|
+
exports.corsWhitelistKoa = corsWhitelistKoa;
|
|
5
|
+
const CorsWhitelist_1 = require("../core/CorsWhitelist");
|
|
6
|
+
/**
|
|
7
|
+
* Create Koa middleware for CORS whitelist validation
|
|
8
|
+
*/
|
|
9
|
+
function createKoaMiddleware(corsWhitelist) {
|
|
10
|
+
return async (ctx, next) => {
|
|
11
|
+
const genericReq = {
|
|
12
|
+
headers: ctx.headers,
|
|
13
|
+
method: ctx.method,
|
|
14
|
+
url: ctx.url,
|
|
15
|
+
ip: ctx.ip,
|
|
16
|
+
};
|
|
17
|
+
let responseEnded = false;
|
|
18
|
+
const genericRes = {
|
|
19
|
+
setHeader: (name, value) => ctx.set(name, value),
|
|
20
|
+
get statusCode() {
|
|
21
|
+
return ctx.status;
|
|
22
|
+
},
|
|
23
|
+
set statusCode(code) {
|
|
24
|
+
ctx.status = code;
|
|
25
|
+
},
|
|
26
|
+
end: (body) => {
|
|
27
|
+
responseEnded = true;
|
|
28
|
+
if (body) {
|
|
29
|
+
ctx.type = 'application/json';
|
|
30
|
+
ctx.body = body;
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
const shouldContinue = await corsWhitelist.handleRequest(genericReq, genericRes);
|
|
35
|
+
if (shouldContinue && !responseEnded) {
|
|
36
|
+
await next();
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Factory function to create both CorsWhitelist instance and Koa middleware
|
|
42
|
+
*/
|
|
43
|
+
function corsWhitelistKoa(options) {
|
|
44
|
+
const corsWhitelist = new CorsWhitelist_1.CorsWhitelist(options);
|
|
45
|
+
const middleware = createKoaMiddleware(corsWhitelist);
|
|
46
|
+
return { corsWhitelist, middleware };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=koa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koa.js","sourceRoot":"","sources":["../../../src/frameworks/koa.ts"],"names":[],"mappings":";;AAWA,kDAoCC;AAKD,4CAOC;AA1DD,yDAAsD;AAOtD;;GAEG;AACH,SAAgB,mBAAmB,CAAC,aAA4B;IAC9D,OAAO,KAAK,EAAE,GAAY,EAAE,IAAU,EAAE,EAAE;QACxC,MAAM,UAAU,GAAmB;YACjC,OAAO,EAAE,GAAG,CAAC,OAAwD;YACrE,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,EAAE,EAAE,GAAG,CAAC,EAAE;SACX,CAAC;QAEF,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,MAAM,UAAU,GAAoB;YAClC,SAAS,EAAE,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;YAChE,IAAI,UAAU;gBACZ,OAAO,GAAG,CAAC,MAAM,CAAC;YACpB,CAAC;YACD,IAAI,UAAU,CAAC,IAAY;gBACzB,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;YACpB,CAAC;YACD,GAAG,EAAE,CAAC,IAAa,EAAE,EAAE;gBACrB,aAAa,GAAG,IAAI,CAAC;gBACrB,IAAI,IAAI,EAAE,CAAC;oBACT,GAAG,CAAC,IAAI,GAAG,kBAAkB,CAAC;oBAC9B,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;gBAClB,CAAC;YACH,CAAC;SACF,CAAC;QAEF,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,aAAa,CACtD,UAAU,EACV,UAAU,CACX,CAAC;QAEF,IAAI,cAAc,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAC9B,OAA6B;IAE7B,MAAM,aAAa,GAAG,IAAI,6BAAa,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAEtD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { IncomingMessage, ServerResponse } from 'http';
|
|
2
|
+
import { CorsWhitelist } from '../core/CorsWhitelist';
|
|
3
|
+
import { CorsWhitelistOptions } from '../core/types';
|
|
4
|
+
export type HttpHandler = (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
|
|
5
|
+
/**
|
|
6
|
+
* Create plain Node.js HTTP handler for CORS whitelist validation
|
|
7
|
+
*/
|
|
8
|
+
export declare function createNodeHttpHandler(corsWhitelist: CorsWhitelist): HttpHandler;
|
|
9
|
+
/**
|
|
10
|
+
* Factory function to create both CorsWhitelist instance and HTTP handler
|
|
11
|
+
*/
|
|
12
|
+
export declare function corsWhitelistHttp(options: CorsWhitelistOptions): {
|
|
13
|
+
corsWhitelist: CorsWhitelist;
|
|
14
|
+
handler: HttpHandler;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=node-http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-http.d.ts","sourceRoot":"","sources":["../../../src/frameworks/node-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,oBAAoB,EAGrB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,WAAW,GAAG,CACxB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,aAAa,GAC3B,WAAW,CAgCb;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,oBAAoB,GAC5B;IAAE,aAAa,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAKxD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createNodeHttpHandler = createNodeHttpHandler;
|
|
4
|
+
exports.corsWhitelistHttp = corsWhitelistHttp;
|
|
5
|
+
const CorsWhitelist_1 = require("../core/CorsWhitelist");
|
|
6
|
+
/**
|
|
7
|
+
* Create plain Node.js HTTP handler for CORS whitelist validation
|
|
8
|
+
*/
|
|
9
|
+
function createNodeHttpHandler(corsWhitelist) {
|
|
10
|
+
return async (req, res) => {
|
|
11
|
+
const genericReq = {
|
|
12
|
+
headers: req.headers,
|
|
13
|
+
method: req.method || 'GET',
|
|
14
|
+
url: req.url || '/',
|
|
15
|
+
ip: req.socket.remoteAddress,
|
|
16
|
+
};
|
|
17
|
+
const genericRes = {
|
|
18
|
+
setHeader: (name, value) => res.setHeader(name, value),
|
|
19
|
+
get statusCode() {
|
|
20
|
+
return res.statusCode;
|
|
21
|
+
},
|
|
22
|
+
set statusCode(code) {
|
|
23
|
+
res.statusCode = code;
|
|
24
|
+
},
|
|
25
|
+
end: (body) => {
|
|
26
|
+
if (body) {
|
|
27
|
+
res.setHeader('Content-Type', 'application/json');
|
|
28
|
+
res.end(body);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
res.end();
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
return corsWhitelist.handleRequest(genericReq, genericRes);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Factory function to create both CorsWhitelist instance and HTTP handler
|
|
40
|
+
*/
|
|
41
|
+
function corsWhitelistHttp(options) {
|
|
42
|
+
const corsWhitelist = new CorsWhitelist_1.CorsWhitelist(options);
|
|
43
|
+
const handler = createNodeHttpHandler(corsWhitelist);
|
|
44
|
+
return { corsWhitelist, handler };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=node-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-http.js","sourceRoot":"","sources":["../../../src/frameworks/node-http.ts"],"names":[],"mappings":";;AAgBA,sDAkCC;AAKD,8CAOC;AA7DD,yDAAsD;AAYtD;;GAEG;AACH,SAAgB,qBAAqB,CACnC,aAA4B;IAE5B,OAAO,KAAK,EACV,GAAoB,EACpB,GAAmB,EACD,EAAE;QACpB,MAAM,UAAU,GAAmB;YACjC,OAAO,EAAE,GAAG,CAAC,OAAwD;YACrE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,KAAK;YAC3B,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG;YACnB,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa;SAC7B,CAAC;QAEF,MAAM,UAAU,GAAoB;YAClC,SAAS,EAAE,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC;YACtE,IAAI,UAAU;gBACZ,OAAO,GAAG,CAAC,UAAU,CAAC;YACxB,CAAC;YACD,IAAI,UAAU,CAAC,IAAY;gBACzB,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;YACxB,CAAC;YACD,GAAG,EAAE,CAAC,IAAa,EAAE,EAAE;gBACrB,IAAI,IAAI,EAAE,CAAC;oBACT,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;oBAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,GAAG,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;SACF,CAAC;QAEF,OAAO,aAAa,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAC/B,OAA6B;IAE7B,MAAM,aAAa,GAAG,IAAI,6BAAa,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAErD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { CorsWhitelist } from './core/CorsWhitelist';
|
|
2
|
+
export * from './core/types';
|
|
3
|
+
export * from './core/utils';
|
|
4
|
+
export { InMemoryStorageAdapter } from './adapters/storage/InMemoryStorageAdapter';
|
|
5
|
+
export type { InMemoryStorageConfig } from './adapters/storage/InMemoryStorageAdapter';
|
|
6
|
+
export { InMemoryCacheAdapter } from './adapters/cache/InMemoryCacheAdapter';
|
|
7
|
+
export { NoCacheAdapter } from './adapters/cache/NoCacheAdapter';
|
|
8
|
+
export { createExpressMiddleware, corsWhitelistExpress, } from './frameworks/express';
|
|
9
|
+
export { fastifyCorsWhitelist, type FastifyCorsOptions, } from './frameworks/fastify';
|
|
10
|
+
export { createKoaMiddleware, corsWhitelistKoa } from './frameworks/koa';
|
|
11
|
+
export { createNodeHttpHandler, corsWhitelistHttp, type HttpHandler, } from './frameworks/node-http';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAGvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,oBAAoB,EACpB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,WAAW,GACjB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.corsWhitelistHttp = exports.createNodeHttpHandler = exports.corsWhitelistKoa = exports.createKoaMiddleware = exports.fastifyCorsWhitelist = exports.corsWhitelistExpress = exports.createExpressMiddleware = exports.NoCacheAdapter = exports.InMemoryCacheAdapter = exports.InMemoryStorageAdapter = exports.CorsWhitelist = void 0;
|
|
18
|
+
// Core exports
|
|
19
|
+
var CorsWhitelist_1 = require("./core/CorsWhitelist");
|
|
20
|
+
Object.defineProperty(exports, "CorsWhitelist", { enumerable: true, get: function () { return CorsWhitelist_1.CorsWhitelist; } });
|
|
21
|
+
__exportStar(require("./core/types"), exports);
|
|
22
|
+
__exportStar(require("./core/utils"), exports);
|
|
23
|
+
// Storage adapters
|
|
24
|
+
var InMemoryStorageAdapter_1 = require("./adapters/storage/InMemoryStorageAdapter");
|
|
25
|
+
Object.defineProperty(exports, "InMemoryStorageAdapter", { enumerable: true, get: function () { return InMemoryStorageAdapter_1.InMemoryStorageAdapter; } });
|
|
26
|
+
// Cache adapters
|
|
27
|
+
var InMemoryCacheAdapter_1 = require("./adapters/cache/InMemoryCacheAdapter");
|
|
28
|
+
Object.defineProperty(exports, "InMemoryCacheAdapter", { enumerable: true, get: function () { return InMemoryCacheAdapter_1.InMemoryCacheAdapter; } });
|
|
29
|
+
var NoCacheAdapter_1 = require("./adapters/cache/NoCacheAdapter");
|
|
30
|
+
Object.defineProperty(exports, "NoCacheAdapter", { enumerable: true, get: function () { return NoCacheAdapter_1.NoCacheAdapter; } });
|
|
31
|
+
// Framework adapters (re-exported for convenience)
|
|
32
|
+
var express_1 = require("./frameworks/express");
|
|
33
|
+
Object.defineProperty(exports, "createExpressMiddleware", { enumerable: true, get: function () { return express_1.createExpressMiddleware; } });
|
|
34
|
+
Object.defineProperty(exports, "corsWhitelistExpress", { enumerable: true, get: function () { return express_1.corsWhitelistExpress; } });
|
|
35
|
+
var fastify_1 = require("./frameworks/fastify");
|
|
36
|
+
Object.defineProperty(exports, "fastifyCorsWhitelist", { enumerable: true, get: function () { return fastify_1.fastifyCorsWhitelist; } });
|
|
37
|
+
var koa_1 = require("./frameworks/koa");
|
|
38
|
+
Object.defineProperty(exports, "createKoaMiddleware", { enumerable: true, get: function () { return koa_1.createKoaMiddleware; } });
|
|
39
|
+
Object.defineProperty(exports, "corsWhitelistKoa", { enumerable: true, get: function () { return koa_1.corsWhitelistKoa; } });
|
|
40
|
+
var node_http_1 = require("./frameworks/node-http");
|
|
41
|
+
Object.defineProperty(exports, "createNodeHttpHandler", { enumerable: true, get: function () { return node_http_1.createNodeHttpHandler; } });
|
|
42
|
+
Object.defineProperty(exports, "corsWhitelistHttp", { enumerable: true, get: function () { return node_http_1.corsWhitelistHttp; } });
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,eAAe;AACf,sDAAqD;AAA5C,8GAAA,aAAa,OAAA;AACtB,+CAA6B;AAC7B,+CAA6B;AAE7B,mBAAmB;AACnB,oFAAmF;AAA1E,gIAAA,sBAAsB,OAAA;AAG/B,iBAAiB;AACjB,8EAA6E;AAApE,4HAAA,oBAAoB,OAAA;AAC7B,kEAAiE;AAAxD,gHAAA,cAAc,OAAA;AAEvB,mDAAmD;AACnD,gDAG8B;AAF5B,kHAAA,uBAAuB,OAAA;AACvB,+GAAA,oBAAoB,OAAA;AAEtB,gDAG8B;AAF5B,+GAAA,oBAAoB,OAAA;AAGtB,wCAAyE;AAAhE,0GAAA,mBAAmB,OAAA;AAAE,uGAAA,gBAAgB,OAAA;AAC9C,oDAIgC;AAH9B,kHAAA,qBAAqB,OAAA;AACrB,8GAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CacheAdapter } from '../../core/types';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory cache adapter using a simple Map.
|
|
4
|
+
* Suitable for single-instance applications and testing.
|
|
5
|
+
*/
|
|
6
|
+
export declare class InMemoryCacheAdapter implements CacheAdapter {
|
|
7
|
+
private cache;
|
|
8
|
+
private cleanupInterval;
|
|
9
|
+
constructor(cleanupIntervalMs?: number);
|
|
10
|
+
get<T = string>(key: string): Promise<T | null>;
|
|
11
|
+
set<T = string>(key: string, value: T, ttlSeconds: number): Promise<void>;
|
|
12
|
+
delete(key: string): Promise<void>;
|
|
13
|
+
deletePattern(pattern: string): Promise<void>;
|
|
14
|
+
clear(): Promise<void>;
|
|
15
|
+
has(key: string): Promise<boolean>;
|
|
16
|
+
dispose(): Promise<void>;
|
|
17
|
+
private cleanup;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=InMemoryCacheAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryCacheAdapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cache/InMemoryCacheAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOhD;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,eAAe,CAA+C;gBAE1D,iBAAiB,GAAE,MAAc;IAQvC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAe/C,GAAG,CAAC,CAAC,GAAG,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,EACR,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAOV,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,OAAO,CAAC,OAAO;CAQhB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryCacheAdapter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* In-memory cache adapter using a simple Map.
|
|
6
|
+
* Suitable for single-instance applications and testing.
|
|
7
|
+
*/
|
|
8
|
+
class InMemoryCacheAdapter {
|
|
9
|
+
constructor(cleanupIntervalMs = 60000) {
|
|
10
|
+
this.cache = new Map();
|
|
11
|
+
this.cleanupInterval = null;
|
|
12
|
+
// Periodically clean up expired entries
|
|
13
|
+
this.cleanupInterval = setInterval(() => this.cleanup(), cleanupIntervalMs);
|
|
14
|
+
}
|
|
15
|
+
async get(key) {
|
|
16
|
+
const entry = this.cache.get(key);
|
|
17
|
+
if (!entry) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
if (Date.now() > entry.expiresAt) {
|
|
21
|
+
this.cache.delete(key);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return entry.value;
|
|
25
|
+
}
|
|
26
|
+
async set(key, value, ttlSeconds) {
|
|
27
|
+
this.cache.set(key, {
|
|
28
|
+
value,
|
|
29
|
+
expiresAt: Date.now() + ttlSeconds * 1000,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async delete(key) {
|
|
33
|
+
this.cache.delete(key);
|
|
34
|
+
}
|
|
35
|
+
async deletePattern(pattern) {
|
|
36
|
+
// Convert simple pattern to regex (supports * as wildcard)
|
|
37
|
+
const regexPattern = pattern.replace(/\*/g, '.*');
|
|
38
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
39
|
+
for (const key of this.cache.keys()) {
|
|
40
|
+
if (regex.test(key)) {
|
|
41
|
+
this.cache.delete(key);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async clear() {
|
|
46
|
+
this.cache.clear();
|
|
47
|
+
}
|
|
48
|
+
async has(key) {
|
|
49
|
+
const value = await this.get(key);
|
|
50
|
+
return value !== null;
|
|
51
|
+
}
|
|
52
|
+
async dispose() {
|
|
53
|
+
if (this.cleanupInterval) {
|
|
54
|
+
clearInterval(this.cleanupInterval);
|
|
55
|
+
this.cleanupInterval = null;
|
|
56
|
+
}
|
|
57
|
+
this.cache.clear();
|
|
58
|
+
}
|
|
59
|
+
cleanup() {
|
|
60
|
+
const now = Date.now();
|
|
61
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
62
|
+
if (now > entry.expiresAt) {
|
|
63
|
+
this.cache.delete(key);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.InMemoryCacheAdapter = InMemoryCacheAdapter;
|
|
69
|
+
//# sourceMappingURL=InMemoryCacheAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryCacheAdapter.js","sourceRoot":"","sources":["../../../../src/adapters/cache/InMemoryCacheAdapter.ts"],"names":[],"mappings":";;;AAOA;;;GAGG;AACH,MAAa,oBAAoB;IAI/B,YAAY,oBAA4B,KAAK;QAHrC,UAAK,GAAqC,IAAI,GAAG,EAAE,CAAC;QACpD,oBAAe,GAA0C,IAAI,CAAC;QAGpE,wCAAwC;QACxC,IAAI,CAAC,eAAe,GAAG,WAAW,CAChC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EACpB,iBAAiB,CAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAa,GAAW;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC,KAAU,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,GAAG,CACP,GAAW,EACX,KAAQ,EACR,UAAkB;QAElB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,2DAA2D;QAC3D,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC;QAE9C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,KAAK,KAAK,IAAI,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,OAAO;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA/ED,oDA+EC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CacheAdapter } from '../../core/types';
|
|
2
|
+
/**
|
|
3
|
+
* No-op cache adapter that doesn't cache anything.
|
|
4
|
+
* Used as the default when no cache is configured.
|
|
5
|
+
*/
|
|
6
|
+
export declare class NoCacheAdapter implements CacheAdapter {
|
|
7
|
+
get<T = string>(_key: string): Promise<T | null>;
|
|
8
|
+
set<T = string>(_key: string, _value: T, _ttlSeconds: number): Promise<void>;
|
|
9
|
+
delete(_key: string): Promise<void>;
|
|
10
|
+
deletePattern(_pattern: string): Promise<void>;
|
|
11
|
+
clear(): Promise<void>;
|
|
12
|
+
has(_key: string): Promise<boolean>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=NoCacheAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoCacheAdapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cache/NoCacheAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD;;;GAGG;AACH,qBAAa,cAAe,YAAW,YAAY;IAC3C,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAIhD,GAAG,CAAC,CAAC,GAAG,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,EACT,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAIV,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG1C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NoCacheAdapter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* No-op cache adapter that doesn't cache anything.
|
|
6
|
+
* Used as the default when no cache is configured.
|
|
7
|
+
*/
|
|
8
|
+
class NoCacheAdapter {
|
|
9
|
+
async get(_key) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
async set(_key, _value, _ttlSeconds) {
|
|
13
|
+
// No-op
|
|
14
|
+
}
|
|
15
|
+
async delete(_key) {
|
|
16
|
+
// No-op
|
|
17
|
+
}
|
|
18
|
+
async deletePattern(_pattern) {
|
|
19
|
+
// No-op
|
|
20
|
+
}
|
|
21
|
+
async clear() {
|
|
22
|
+
// No-op
|
|
23
|
+
}
|
|
24
|
+
async has(_key) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.NoCacheAdapter = NoCacheAdapter;
|
|
29
|
+
//# sourceMappingURL=NoCacheAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoCacheAdapter.js","sourceRoot":"","sources":["../../../../src/adapters/cache/NoCacheAdapter.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACH,MAAa,cAAc;IACzB,KAAK,CAAC,GAAG,CAAa,IAAY;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CACP,IAAY,EACZ,MAAS,EACT,WAAmB;QAEnB,QAAQ;IACV,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,QAAQ;IACV,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,QAAQ;IACV,CAAC;IAED,KAAK,CAAC,KAAK;QACT,QAAQ;IACV,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA5BD,wCA4BC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryCacheAdapter = exports.NoCacheAdapter = void 0;
|
|
4
|
+
var NoCacheAdapter_1 = require("./NoCacheAdapter");
|
|
5
|
+
Object.defineProperty(exports, "NoCacheAdapter", { enumerable: true, get: function () { return NoCacheAdapter_1.NoCacheAdapter; } });
|
|
6
|
+
var InMemoryCacheAdapter_1 = require("./InMemoryCacheAdapter");
|
|
7
|
+
Object.defineProperty(exports, "InMemoryCacheAdapter", { enumerable: true, get: function () { return InMemoryCacheAdapter_1.InMemoryCacheAdapter; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapters/cache/index.ts"],"names":[],"mappings":";;;AAAA,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { StorageAdapter, WhitelistEntry } from '../../core/types';
|
|
2
|
+
export interface InMemoryStorageConfig {
|
|
3
|
+
globalWhitelist?: string[];
|
|
4
|
+
whitelistEntries?: WhitelistEntry[];
|
|
5
|
+
apiKeys?: Map<string | number, string>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* In-memory storage adapter for testing and simple use cases.
|
|
9
|
+
* Data is stored in memory and lost when the process exits.
|
|
10
|
+
*/
|
|
11
|
+
export declare class InMemoryStorageAdapter implements StorageAdapter {
|
|
12
|
+
private globalWhitelist;
|
|
13
|
+
private whitelistEntries;
|
|
14
|
+
private apiKeys;
|
|
15
|
+
constructor(config?: InMemoryStorageConfig);
|
|
16
|
+
getGlobalWhitelist(): Promise<string[]>;
|
|
17
|
+
getWhitelistEntries(): Promise<WhitelistEntry[]>;
|
|
18
|
+
getOrganisationWhitelist(organisationId: string | number): Promise<WhitelistEntry[]>;
|
|
19
|
+
findOrganisationByDomain(domain: string): Promise<string | number | null>;
|
|
20
|
+
getApiKey(organisationId: string | number, _type?: 'client' | 'server'): Promise<string | null>;
|
|
21
|
+
isIpWhitelisted(ip: string): Promise<boolean>;
|
|
22
|
+
isDomainWhitelisted(domain: string): Promise<boolean>;
|
|
23
|
+
addGlobalDomain(domain: string): void;
|
|
24
|
+
removeGlobalDomain(domain: string): void;
|
|
25
|
+
addWhitelistEntry(entry: WhitelistEntry): void;
|
|
26
|
+
removeWhitelistEntry(id: string | number): void;
|
|
27
|
+
setApiKey(organisationId: string | number, apiKey: string): void;
|
|
28
|
+
clear(): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=InMemoryStorageAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryStorageAdapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/storage/InMemoryStorageAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlE,MAAM,WAAW,qBAAqB;IACpC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,CAAC,EAAE,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,eAAe,CAAW;IAClC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,OAAO,CAA+B;gBAElC,MAAM,GAAE,qBAA0B;IAMxC,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIvC,mBAAmB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIhD,wBAAwB,CAC5B,cAAc,EAAE,MAAM,GAAG,MAAM,GAC9B,OAAO,CAAC,cAAc,EAAE,CAAC;IAMtB,wBAAwB,CAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAQ5B,SAAS,CACb,cAAc,EAAE,MAAM,GAAG,MAAM,EAC/B,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAC1B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAInB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM7C,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW3D,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMrC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOxC,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAI9C,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAO/C,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhE,KAAK,IAAI,IAAI;CAKd"}
|