local-risk-alert-feed 0.1.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/dist/cjs/adapters/index.js +8 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/lambda.js +143 -0
- package/dist/cjs/adapters/lambda.js.map +1 -0
- package/dist/cjs/adapters/vercel.js +119 -0
- package/dist/cjs/adapters/vercel.js.map +1 -0
- package/dist/cjs/core/alert-aggregator.js +207 -0
- package/dist/cjs/core/alert-aggregator.js.map +1 -0
- package/dist/cjs/core/alert-feed.js +236 -0
- package/dist/cjs/core/alert-feed.js.map +1 -0
- package/dist/cjs/core/index.js +22 -0
- package/dist/cjs/core/index.js.map +1 -0
- package/dist/cjs/core/plugin-registry.js +193 -0
- package/dist/cjs/core/plugin-registry.js.map +1 -0
- package/dist/cjs/core/plugin-resolver.js +121 -0
- package/dist/cjs/core/plugin-resolver.js.map +1 -0
- package/dist/cjs/core/time-range.js +67 -0
- package/dist/cjs/core/time-range.js.map +1 -0
- package/dist/cjs/errors/fetch-error.js +71 -0
- package/dist/cjs/errors/fetch-error.js.map +1 -0
- package/dist/cjs/errors/index.js +15 -0
- package/dist/cjs/errors/index.js.map +1 -0
- package/dist/cjs/errors/plugin-error.js +80 -0
- package/dist/cjs/errors/plugin-error.js.map +1 -0
- package/dist/cjs/errors/validation-error.js +49 -0
- package/dist/cjs/errors/validation-error.js.map +1 -0
- package/dist/cjs/geo/distance.js +94 -0
- package/dist/cjs/geo/distance.js.map +1 -0
- package/dist/cjs/geo/index.js +18 -0
- package/dist/cjs/geo/index.js.map +1 -0
- package/dist/cjs/geo/point-in-radius.js +86 -0
- package/dist/cjs/geo/point-in-radius.js.map +1 -0
- package/dist/cjs/index.js +90 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/plugins/air-quality/airnow.plugin.js +343 -0
- package/dist/cjs/plugins/air-quality/airnow.plugin.js.map +1 -0
- package/dist/cjs/plugins/air-quality/index.js +6 -0
- package/dist/cjs/plugins/air-quality/index.js.map +1 -0
- package/dist/cjs/plugins/base-plugin.js +213 -0
- package/dist/cjs/plugins/base-plugin.js.map +1 -0
- package/dist/cjs/plugins/events/index.js +6 -0
- package/dist/cjs/plugins/events/index.js.map +1 -0
- package/dist/cjs/plugins/events/phoenix-events.plugin.js +382 -0
- package/dist/cjs/plugins/events/phoenix-events.plugin.js.map +1 -0
- package/dist/cjs/plugins/fire-emt/index.js +6 -0
- package/dist/cjs/plugins/fire-emt/index.js.map +1 -0
- package/dist/cjs/plugins/fire-emt/phoenix-fire.plugin.js +262 -0
- package/dist/cjs/plugins/fire-emt/phoenix-fire.plugin.js.map +1 -0
- package/dist/cjs/plugins/index.js +28 -0
- package/dist/cjs/plugins/index.js.map +1 -0
- package/dist/cjs/plugins/police-blotter/index.js +6 -0
- package/dist/cjs/plugins/police-blotter/index.js.map +1 -0
- package/dist/cjs/plugins/police-blotter/phoenix-police.plugin.js +198 -0
- package/dist/cjs/plugins/police-blotter/phoenix-police.plugin.js.map +1 -0
- package/dist/cjs/plugins/pulsepoint/index.js +6 -0
- package/dist/cjs/plugins/pulsepoint/index.js.map +1 -0
- package/dist/cjs/plugins/pulsepoint/pulsepoint.plugin.js +275 -0
- package/dist/cjs/plugins/pulsepoint/pulsepoint.plugin.js.map +1 -0
- package/dist/cjs/plugins/traffic/arizona-traffic.plugin.js +391 -0
- package/dist/cjs/plugins/traffic/arizona-traffic.plugin.js.map +1 -0
- package/dist/cjs/plugins/traffic/index.js +6 -0
- package/dist/cjs/plugins/traffic/index.js.map +1 -0
- package/dist/cjs/plugins/weather/index.js +6 -0
- package/dist/cjs/plugins/weather/index.js.map +1 -0
- package/dist/cjs/plugins/weather/nws-weather.plugin.js +180 -0
- package/dist/cjs/plugins/weather/nws-weather.plugin.js.map +1 -0
- package/dist/cjs/schemas/alert.schema.js +93 -0
- package/dist/cjs/schemas/alert.schema.js.map +1 -0
- package/dist/cjs/schemas/index.js +24 -0
- package/dist/cjs/schemas/index.js.map +1 -0
- package/dist/cjs/schemas/query.schema.js +76 -0
- package/dist/cjs/schemas/query.schema.js.map +1 -0
- package/dist/cjs/types/alert.js +35 -0
- package/dist/cjs/types/alert.js.map +1 -0
- package/dist/cjs/types/config.js +13 -0
- package/dist/cjs/types/config.js.map +1 -0
- package/dist/cjs/types/geo.js +3 -0
- package/dist/cjs/types/geo.js.map +1 -0
- package/dist/cjs/types/index.js +16 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/plugin.js +3 -0
- package/dist/cjs/types/plugin.js.map +1 -0
- package/dist/cjs/types/query.js +28 -0
- package/dist/cjs/types/query.js.map +1 -0
- package/dist/cjs/utils/cache.js +188 -0
- package/dist/cjs/utils/cache.js.map +1 -0
- package/dist/cjs/utils/csv.js +189 -0
- package/dist/cjs/utils/csv.js.map +1 -0
- package/dist/cjs/utils/date.js +153 -0
- package/dist/cjs/utils/date.js.map +1 -0
- package/dist/cjs/utils/index.js +28 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/retry.js +109 -0
- package/dist/cjs/utils/retry.js.map +1 -0
- package/dist/esm/adapters/index.js +3 -0
- package/dist/esm/adapters/index.js.map +1 -0
- package/dist/esm/adapters/lambda.js +140 -0
- package/dist/esm/adapters/lambda.js.map +1 -0
- package/dist/esm/adapters/vercel.js +116 -0
- package/dist/esm/adapters/vercel.js.map +1 -0
- package/dist/esm/core/alert-aggregator.js +203 -0
- package/dist/esm/core/alert-aggregator.js.map +1 -0
- package/dist/esm/core/alert-feed.js +232 -0
- package/dist/esm/core/alert-feed.js.map +1 -0
- package/dist/esm/core/index.js +6 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/core/plugin-registry.js +189 -0
- package/dist/esm/core/plugin-registry.js.map +1 -0
- package/dist/esm/core/plugin-resolver.js +117 -0
- package/dist/esm/core/plugin-resolver.js.map +1 -0
- package/dist/esm/core/time-range.js +57 -0
- package/dist/esm/core/time-range.js.map +1 -0
- package/dist/esm/errors/fetch-error.js +67 -0
- package/dist/esm/errors/fetch-error.js.map +1 -0
- package/dist/esm/errors/index.js +4 -0
- package/dist/esm/errors/index.js.map +1 -0
- package/dist/esm/errors/plugin-error.js +71 -0
- package/dist/esm/errors/plugin-error.js.map +1 -0
- package/dist/esm/errors/validation-error.js +45 -0
- package/dist/esm/errors/validation-error.js.map +1 -0
- package/dist/esm/geo/distance.js +85 -0
- package/dist/esm/geo/distance.js.map +1 -0
- package/dist/esm/geo/index.js +3 -0
- package/dist/esm/geo/index.js.map +1 -0
- package/dist/esm/geo/point-in-radius.js +79 -0
- package/dist/esm/geo/point-in-radius.js.map +1 -0
- package/dist/esm/index.js +30 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/plugins/air-quality/airnow.plugin.js +339 -0
- package/dist/esm/plugins/air-quality/airnow.plugin.js.map +1 -0
- package/dist/esm/plugins/air-quality/index.js +2 -0
- package/dist/esm/plugins/air-quality/index.js.map +1 -0
- package/dist/esm/plugins/base-plugin.js +209 -0
- package/dist/esm/plugins/base-plugin.js.map +1 -0
- package/dist/esm/plugins/events/index.js +2 -0
- package/dist/esm/plugins/events/index.js.map +1 -0
- package/dist/esm/plugins/events/phoenix-events.plugin.js +378 -0
- package/dist/esm/plugins/events/phoenix-events.plugin.js.map +1 -0
- package/dist/esm/plugins/fire-emt/index.js +2 -0
- package/dist/esm/plugins/fire-emt/index.js.map +1 -0
- package/dist/esm/plugins/fire-emt/phoenix-fire.plugin.js +258 -0
- package/dist/esm/plugins/fire-emt/phoenix-fire.plugin.js.map +1 -0
- package/dist/esm/plugins/index.js +17 -0
- package/dist/esm/plugins/index.js.map +1 -0
- package/dist/esm/plugins/police-blotter/index.js +2 -0
- package/dist/esm/plugins/police-blotter/index.js.map +1 -0
- package/dist/esm/plugins/police-blotter/phoenix-police.plugin.js +194 -0
- package/dist/esm/plugins/police-blotter/phoenix-police.plugin.js.map +1 -0
- package/dist/esm/plugins/pulsepoint/index.js +2 -0
- package/dist/esm/plugins/pulsepoint/index.js.map +1 -0
- package/dist/esm/plugins/pulsepoint/pulsepoint.plugin.js +271 -0
- package/dist/esm/plugins/pulsepoint/pulsepoint.plugin.js.map +1 -0
- package/dist/esm/plugins/traffic/arizona-traffic.plugin.js +387 -0
- package/dist/esm/plugins/traffic/arizona-traffic.plugin.js.map +1 -0
- package/dist/esm/plugins/traffic/index.js +2 -0
- package/dist/esm/plugins/traffic/index.js.map +1 -0
- package/dist/esm/plugins/weather/index.js +2 -0
- package/dist/esm/plugins/weather/index.js.map +1 -0
- package/dist/esm/plugins/weather/nws-weather.plugin.js +176 -0
- package/dist/esm/plugins/weather/nws-weather.plugin.js.map +1 -0
- package/dist/esm/schemas/alert.schema.js +90 -0
- package/dist/esm/schemas/alert.schema.js.map +1 -0
- package/dist/esm/schemas/index.js +5 -0
- package/dist/esm/schemas/index.js.map +1 -0
- package/dist/esm/schemas/query.schema.js +72 -0
- package/dist/esm/schemas/query.schema.js.map +1 -0
- package/dist/esm/types/alert.js +32 -0
- package/dist/esm/types/alert.js.map +1 -0
- package/dist/esm/types/config.js +10 -0
- package/dist/esm/types/config.js.map +1 -0
- package/dist/esm/types/geo.js +2 -0
- package/dist/esm/types/geo.js.map +1 -0
- package/dist/esm/types/index.js +4 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/plugin.js +2 -0
- package/dist/esm/types/plugin.js.map +1 -0
- package/dist/esm/types/query.js +25 -0
- package/dist/esm/types/query.js.map +1 -0
- package/dist/esm/utils/cache.js +181 -0
- package/dist/esm/utils/cache.js.map +1 -0
- package/dist/esm/utils/csv.js +185 -0
- package/dist/esm/utils/csv.js.map +1 -0
- package/dist/esm/utils/date.js +142 -0
- package/dist/esm/utils/date.js.map +1 -0
- package/dist/esm/utils/index.js +5 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/retry.js +102 -0
- package/dist/esm/utils/retry.js.map +1 -0
- package/dist/types/adapters/index.d.ts +5 -0
- package/dist/types/adapters/index.d.ts.map +1 -0
- package/dist/types/adapters/lambda.d.ts +37 -0
- package/dist/types/adapters/lambda.d.ts.map +1 -0
- package/dist/types/adapters/vercel.d.ts +54 -0
- package/dist/types/adapters/vercel.d.ts.map +1 -0
- package/dist/types/core/alert-aggregator.d.ts +81 -0
- package/dist/types/core/alert-aggregator.d.ts.map +1 -0
- package/dist/types/core/alert-feed.d.ts +80 -0
- package/dist/types/core/alert-feed.d.ts.map +1 -0
- package/dist/types/core/index.d.ts +8 -0
- package/dist/types/core/index.d.ts.map +1 -0
- package/dist/types/core/plugin-registry.d.ts +91 -0
- package/dist/types/core/plugin-registry.d.ts.map +1 -0
- package/dist/types/core/plugin-resolver.d.ts +78 -0
- package/dist/types/core/plugin-resolver.d.ts.map +1 -0
- package/dist/types/core/time-range.d.ts +40 -0
- package/dist/types/core/time-range.d.ts.map +1 -0
- package/dist/types/errors/fetch-error.d.ts +46 -0
- package/dist/types/errors/fetch-error.d.ts.map +1 -0
- package/dist/types/errors/index.d.ts +5 -0
- package/dist/types/errors/index.d.ts.map +1 -0
- package/dist/types/errors/plugin-error.d.ts +42 -0
- package/dist/types/errors/plugin-error.d.ts.map +1 -0
- package/dist/types/errors/validation-error.d.ts +34 -0
- package/dist/types/errors/validation-error.d.ts.map +1 -0
- package/dist/types/geo/distance.d.ts +50 -0
- package/dist/types/geo/distance.d.ts.map +1 -0
- package/dist/types/geo/index.d.ts +3 -0
- package/dist/types/geo/index.d.ts.map +1 -0
- package/dist/types/geo/point-in-radius.d.ts +44 -0
- package/dist/types/geo/point-in-radius.d.ts.map +1 -0
- package/dist/types/index.d.ts +32 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/plugins/air-quality/airnow.plugin.d.ts +84 -0
- package/dist/types/plugins/air-quality/airnow.plugin.d.ts.map +1 -0
- package/dist/types/plugins/air-quality/index.d.ts +3 -0
- package/dist/types/plugins/air-quality/index.d.ts.map +1 -0
- package/dist/types/plugins/base-plugin.d.ts +99 -0
- package/dist/types/plugins/base-plugin.d.ts.map +1 -0
- package/dist/types/plugins/events/index.d.ts +3 -0
- package/dist/types/plugins/events/index.d.ts.map +1 -0
- package/dist/types/plugins/events/phoenix-events.plugin.d.ts +71 -0
- package/dist/types/plugins/events/phoenix-events.plugin.d.ts.map +1 -0
- package/dist/types/plugins/fire-emt/index.d.ts +3 -0
- package/dist/types/plugins/fire-emt/index.d.ts.map +1 -0
- package/dist/types/plugins/fire-emt/phoenix-fire.plugin.d.ts +47 -0
- package/dist/types/plugins/fire-emt/phoenix-fire.plugin.d.ts.map +1 -0
- package/dist/types/plugins/index.d.ts +17 -0
- package/dist/types/plugins/index.d.ts.map +1 -0
- package/dist/types/plugins/police-blotter/index.d.ts +3 -0
- package/dist/types/plugins/police-blotter/index.d.ts.map +1 -0
- package/dist/types/plugins/police-blotter/phoenix-police.plugin.d.ts +49 -0
- package/dist/types/plugins/police-blotter/phoenix-police.plugin.d.ts.map +1 -0
- package/dist/types/plugins/pulsepoint/index.d.ts +3 -0
- package/dist/types/plugins/pulsepoint/index.d.ts.map +1 -0
- package/dist/types/plugins/pulsepoint/pulsepoint.plugin.d.ts +61 -0
- package/dist/types/plugins/pulsepoint/pulsepoint.plugin.d.ts.map +1 -0
- package/dist/types/plugins/traffic/arizona-traffic.plugin.d.ts +83 -0
- package/dist/types/plugins/traffic/arizona-traffic.plugin.d.ts.map +1 -0
- package/dist/types/plugins/traffic/index.d.ts +3 -0
- package/dist/types/plugins/traffic/index.d.ts.map +1 -0
- package/dist/types/plugins/weather/index.d.ts +3 -0
- package/dist/types/plugins/weather/index.d.ts.map +1 -0
- package/dist/types/plugins/weather/nws-weather.plugin.d.ts +50 -0
- package/dist/types/plugins/weather/nws-weather.plugin.d.ts.map +1 -0
- package/dist/types/schemas/alert.schema.d.ts +266 -0
- package/dist/types/schemas/alert.schema.d.ts.map +1 -0
- package/dist/types/schemas/index.d.ts +5 -0
- package/dist/types/schemas/index.d.ts.map +1 -0
- package/dist/types/schemas/query.schema.d.ts +150 -0
- package/dist/types/schemas/query.schema.d.ts.map +1 -0
- package/dist/types/types/alert.d.ts +96 -0
- package/dist/types/types/alert.d.ts.map +1 -0
- package/dist/types/types/config.d.ts +63 -0
- package/dist/types/types/config.d.ts.map +1 -0
- package/dist/types/types/geo.d.ts +33 -0
- package/dist/types/types/geo.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +9 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/types/plugin.d.ts +125 -0
- package/dist/types/types/plugin.d.ts.map +1 -0
- package/dist/types/types/query.d.ts +86 -0
- package/dist/types/types/query.d.ts.map +1 -0
- package/dist/types/utils/cache.d.ts +112 -0
- package/dist/types/utils/cache.d.ts.map +1 -0
- package/dist/types/utils/csv.d.ts +38 -0
- package/dist/types/utils/csv.d.ts.map +1 -0
- package/dist/types/utils/date.d.ts +47 -0
- package/dist/types/utils/date.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +7 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/retry.d.ts +51 -0
- package/dist/types/utils/retry.d.ts.map +1 -0
- package/package.json +115 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { APIGatewayProxyEvent, APIGatewayProxyResult, Context } from 'aws-lambda';
|
|
2
|
+
import type { AlertFeedConfig } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Options for the Lambda handler factory.
|
|
5
|
+
*/
|
|
6
|
+
export interface LambdaHandlerOptions extends AlertFeedConfig {
|
|
7
|
+
/** CORS origin(s) to allow (default: '*') */
|
|
8
|
+
corsOrigin?: string | string[];
|
|
9
|
+
/** Additional CORS headers to allow */
|
|
10
|
+
corsHeaders?: string[];
|
|
11
|
+
/** Additional CORS methods to allow */
|
|
12
|
+
corsMethods?: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Lambda handler function type.
|
|
16
|
+
*/
|
|
17
|
+
export type LambdaHandler = (event: APIGatewayProxyEvent, context: Context) => Promise<APIGatewayProxyResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Create an AWS Lambda handler for the AlertFeed.
|
|
20
|
+
*
|
|
21
|
+
* Supports both GET (query parameters) and POST (JSON body) requests.
|
|
22
|
+
*
|
|
23
|
+
* @param options - Handler configuration options
|
|
24
|
+
* @returns Lambda handler function
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* import { createLambdaHandler } from 'local-risk-alert-feed/adapters/lambda';
|
|
29
|
+
* import { PhoenixPolicePlugin } from 'local-risk-alert-feed/plugins/police-blotter';
|
|
30
|
+
*
|
|
31
|
+
* export const handler = createLambdaHandler({
|
|
32
|
+
* plugins: [{ plugin: new PhoenixPolicePlugin() }]
|
|
33
|
+
* });
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function createLambdaHandler(options: LambdaHandlerOptions): LambdaHandler;
|
|
37
|
+
//# sourceMappingURL=lambda.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lambda.d.ts","sourceRoot":"","sources":["../../../src/adapters/lambda.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,KAAK,EAAE,eAAe,EAAsB,MAAM,UAAU,CAAC;AAKpE;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CA4DhF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { AlertFeedConfig } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Options for the Vercel handler factory.
|
|
4
|
+
*/
|
|
5
|
+
export interface VercelHandlerOptions extends AlertFeedConfig {
|
|
6
|
+
/** CORS origin(s) to allow (default: '*') */
|
|
7
|
+
corsOrigin?: string | string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Next.js App Router request type.
|
|
11
|
+
*/
|
|
12
|
+
interface NextRequest {
|
|
13
|
+
method: string;
|
|
14
|
+
url: string;
|
|
15
|
+
json(): Promise<unknown>;
|
|
16
|
+
nextUrl: {
|
|
17
|
+
searchParams: URLSearchParams;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Handler function for Next.js App Router.
|
|
22
|
+
*/
|
|
23
|
+
export type VercelHandler = (request: NextRequest) => Promise<Response>;
|
|
24
|
+
/**
|
|
25
|
+
* Result of createVercelHandler with GET and POST handlers.
|
|
26
|
+
*/
|
|
27
|
+
export interface VercelHandlerResult {
|
|
28
|
+
GET: VercelHandler;
|
|
29
|
+
POST: VercelHandler;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create Next.js App Router handlers for the AlertFeed.
|
|
33
|
+
*
|
|
34
|
+
* Returns GET and POST handlers that can be exported from a route file.
|
|
35
|
+
*
|
|
36
|
+
* @param options - Handler configuration options
|
|
37
|
+
* @returns Object with GET and POST handlers
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // app/api/alerts/route.ts
|
|
42
|
+
* import { createVercelHandler } from 'local-risk-alert-feed/adapters/vercel';
|
|
43
|
+
* import { PhoenixPolicePlugin } from 'local-risk-alert-feed/plugins/police-blotter';
|
|
44
|
+
*
|
|
45
|
+
* const { GET, POST } = createVercelHandler({
|
|
46
|
+
* plugins: [{ plugin: new PhoenixPolicePlugin() }]
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* export { GET, POST };
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare function createVercelHandler(options: VercelHandlerOptions): VercelHandlerResult;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=vercel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel.d.ts","sourceRoot":"","sources":["../../../src/adapters/vercel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAsB,MAAM,UAAU,CAAC;AAKpE;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAChC;AAED;;GAEG;AACH,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,OAAO,EAAE;QACP,YAAY,EAAE,eAAe,CAAC;KAC/B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,aAAa,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CAsDtF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { Alert, RiskLevel, GeoPoint, TimeRange } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Options for aggregating alerts.
|
|
4
|
+
*/
|
|
5
|
+
export interface AggregateOptions {
|
|
6
|
+
/** Minimum risk level to include */
|
|
7
|
+
minRiskLevel?: RiskLevel;
|
|
8
|
+
/** Maximum number of alerts to return */
|
|
9
|
+
limit?: number;
|
|
10
|
+
/** Time range to filter by */
|
|
11
|
+
timeRange?: TimeRange;
|
|
12
|
+
/** Center location for distance calculations */
|
|
13
|
+
location?: GeoPoint;
|
|
14
|
+
/** Radius in meters for location filtering */
|
|
15
|
+
radiusMeters?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Sort order for alerts.
|
|
19
|
+
*/
|
|
20
|
+
export type AlertSortOrder = 'priority-asc' | 'priority-desc' | 'risk-asc' | 'risk-desc' | 'time-asc' | 'time-desc' | 'distance-asc' | 'distance-desc';
|
|
21
|
+
/**
|
|
22
|
+
* Aggregates, filters, deduplicates, and sorts alerts from multiple sources.
|
|
23
|
+
*/
|
|
24
|
+
export declare class AlertAggregator {
|
|
25
|
+
/**
|
|
26
|
+
* Aggregate alerts from multiple sources.
|
|
27
|
+
*
|
|
28
|
+
* Combines alerts, removes duplicates, filters by criteria, and sorts.
|
|
29
|
+
*
|
|
30
|
+
* @param alertSets - Arrays of alerts from different plugins
|
|
31
|
+
* @param options - Aggregation options
|
|
32
|
+
* @returns Aggregated and filtered alerts
|
|
33
|
+
*/
|
|
34
|
+
aggregate(alertSets: Alert[][], options?: AggregateOptions): Alert[];
|
|
35
|
+
/**
|
|
36
|
+
* Remove duplicate alerts based on ID and source.
|
|
37
|
+
*
|
|
38
|
+
* If two alerts have the same external ID from the same source,
|
|
39
|
+
* keep the one with the most recent issued timestamp.
|
|
40
|
+
*/
|
|
41
|
+
deduplicate(alerts: Alert[]): Alert[];
|
|
42
|
+
/**
|
|
43
|
+
* Filter alerts by minimum risk level.
|
|
44
|
+
*/
|
|
45
|
+
filterByRiskLevel(alerts: Alert[], minLevel: RiskLevel): Alert[];
|
|
46
|
+
/**
|
|
47
|
+
* Filter alerts by time range.
|
|
48
|
+
*
|
|
49
|
+
* Includes alerts where:
|
|
50
|
+
* - The issued timestamp falls within the range, OR
|
|
51
|
+
* - The event start/end times overlap with the range
|
|
52
|
+
*/
|
|
53
|
+
filterByTimeRange(alerts: Alert[], range: TimeRange): Alert[];
|
|
54
|
+
/**
|
|
55
|
+
* Filter alerts by distance from a center point.
|
|
56
|
+
*/
|
|
57
|
+
filterByRadius(alerts: Alert[], center: GeoPoint, radiusMeters: number): Alert[];
|
|
58
|
+
/**
|
|
59
|
+
* Sort alerts by one or more criteria.
|
|
60
|
+
*
|
|
61
|
+
* Later criteria are used as tiebreakers.
|
|
62
|
+
*/
|
|
63
|
+
sort(alerts: Alert[], orders: AlertSortOrder[]): Alert[];
|
|
64
|
+
/**
|
|
65
|
+
* Compare two alerts based on a sort order.
|
|
66
|
+
*/
|
|
67
|
+
private compare;
|
|
68
|
+
/**
|
|
69
|
+
* Sort alerts by distance from a center point.
|
|
70
|
+
*/
|
|
71
|
+
sortByDistance(alerts: Alert[], center: GeoPoint, ascending?: boolean): Alert[];
|
|
72
|
+
/**
|
|
73
|
+
* Group alerts by category.
|
|
74
|
+
*/
|
|
75
|
+
groupByCategory(alerts: Alert[]): Map<string, Alert[]>;
|
|
76
|
+
/**
|
|
77
|
+
* Group alerts by source plugin.
|
|
78
|
+
*/
|
|
79
|
+
groupBySource(alerts: Alert[]): Map<string, Alert[]>;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=alert-aggregator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-aggregator.d.ts","sourceRoot":"","sources":["../../../src/core/alert-aggregator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAItE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,eAAe,GACf,UAAU,GACV,WAAW,GACX,UAAU,GACV,WAAW,GACX,cAAc,GACd,eAAe,CAAC;AAEpB;;GAEG;AACH,qBAAa,eAAe;IAC1B;;;;;;;;OAQG;IACH,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,KAAK,EAAE;IAiCxE;;;;;OAKG;IACH,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE;IAwCrC;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,GAAG,KAAK,EAAE;IAKhE;;;;;;OAMG;IACH,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE;IAiC7D;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,KAAK,EAAE;IAOhF;;;;OAIG;IACH,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,KAAK,EAAE;IAUxD;;OAEG;IACH,OAAO,CAAC,OAAO;IAqBf;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,UAAO,GAAG,KAAK,EAAE;IAQ5E;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IAYtD;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;CAWrD"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { AlertFeedConfig, AlertQuery, AlertQueryResponse, PluginRegistration } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Main AlertFeed class that coordinates plugin fetching and alert aggregation.
|
|
4
|
+
*/
|
|
5
|
+
export declare class AlertFeed {
|
|
6
|
+
private registry;
|
|
7
|
+
private resolver;
|
|
8
|
+
private aggregator;
|
|
9
|
+
private config;
|
|
10
|
+
constructor(config?: AlertFeedConfig);
|
|
11
|
+
/**
|
|
12
|
+
* Register plugins synchronously (for constructor use).
|
|
13
|
+
* Initialization happens lazily on first query.
|
|
14
|
+
*/
|
|
15
|
+
private registerPluginsSync;
|
|
16
|
+
/**
|
|
17
|
+
* Register plugins with the feed.
|
|
18
|
+
*
|
|
19
|
+
* @param registrations - Array of plugin registrations
|
|
20
|
+
*/
|
|
21
|
+
registerPlugins(registrations: PluginRegistration[]): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Register a single plugin.
|
|
24
|
+
*
|
|
25
|
+
* @param registration - Plugin registration
|
|
26
|
+
*/
|
|
27
|
+
registerPlugin(registration: PluginRegistration): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Unregister a plugin by ID.
|
|
30
|
+
*
|
|
31
|
+
* @param pluginId - The plugin ID to unregister
|
|
32
|
+
*/
|
|
33
|
+
unregisterPlugin(pluginId: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Query for alerts based on location and filters.
|
|
36
|
+
*
|
|
37
|
+
* @param query - Query parameters
|
|
38
|
+
* @returns Query response with alerts and metadata
|
|
39
|
+
*/
|
|
40
|
+
query(query: AlertQuery): Promise<AlertQueryResponse>;
|
|
41
|
+
/**
|
|
42
|
+
* Fetch alerts from multiple plugins with concurrency control.
|
|
43
|
+
*/
|
|
44
|
+
private fetchFromPlugins;
|
|
45
|
+
/**
|
|
46
|
+
* Fetch alerts from a single plugin with timeout handling.
|
|
47
|
+
*/
|
|
48
|
+
private fetchFromPlugin;
|
|
49
|
+
/**
|
|
50
|
+
* Get total count of alerts across all sets.
|
|
51
|
+
*/
|
|
52
|
+
private getTotalAlertCount;
|
|
53
|
+
/**
|
|
54
|
+
* Split an array into chunks.
|
|
55
|
+
*/
|
|
56
|
+
private chunkArray;
|
|
57
|
+
/**
|
|
58
|
+
* Get registered plugin metadata.
|
|
59
|
+
*
|
|
60
|
+
* @param enabledOnly - Only return enabled plugins (default: true)
|
|
61
|
+
*/
|
|
62
|
+
getPluginMetadata(enabledOnly?: boolean): import("../types").PluginMetadata[];
|
|
63
|
+
/**
|
|
64
|
+
* Check if a plugin is registered.
|
|
65
|
+
*/
|
|
66
|
+
hasPlugin(pluginId: string): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Enable a plugin.
|
|
69
|
+
*/
|
|
70
|
+
enablePlugin(pluginId: string): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Disable a plugin.
|
|
73
|
+
*/
|
|
74
|
+
disablePlugin(pluginId: string): void;
|
|
75
|
+
/**
|
|
76
|
+
* Dispose of the feed and all plugins.
|
|
77
|
+
*/
|
|
78
|
+
dispose(): Promise<void>;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=alert-feed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-feed.d.ts","sourceRoot":"","sources":["../../../src/core/alert-feed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAInB,MAAM,UAAU,CAAC;AASlB;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAKZ;gBAEU,MAAM,CAAC,EAAE,eAAe;IAkBpC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;;;OAIG;IACG,eAAe,CAAC,aAAa,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzE;;;;OAIG;IACG,cAAc,CAAC,YAAY,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE;;;;OAIG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD;;;;;OAKG;IACG,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA6D3D;;OAEG;YACW,gBAAgB;IA8B9B;;OAEG;YACW,eAAe;IAuD7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;;;OAIG;IACH,iBAAiB,CAAC,WAAW,UAAO;IAIpC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { AlertFeed } from './alert-feed';
|
|
2
|
+
export { PluginRegistry } from './plugin-registry';
|
|
3
|
+
export { PluginResolver } from './plugin-resolver';
|
|
4
|
+
export type { PluginResolveOptions, ResolvedPlugin } from './plugin-resolver';
|
|
5
|
+
export { AlertAggregator } from './alert-aggregator';
|
|
6
|
+
export type { AggregateOptions, AlertSortOrder } from './alert-aggregator';
|
|
7
|
+
export { resolveTimeRange, resolveTimeRangePreset, getDefaultTimeRange, getDefaultTimeRangePreset, normalizeTimeRange, getTimeRangeDuration, isTimeRangeInPast, isTimeRangeInFuture, isTimeRangeCurrent, } from './time-range';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { AlertPlugin, PluginRegistration, PluginMetadata } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Registry for managing alert plugins.
|
|
4
|
+
*
|
|
5
|
+
* Handles registration, initialization, and lifecycle of plugins.
|
|
6
|
+
*/
|
|
7
|
+
export declare class PluginRegistry {
|
|
8
|
+
private plugins;
|
|
9
|
+
/**
|
|
10
|
+
* Register a single plugin.
|
|
11
|
+
*
|
|
12
|
+
* @param registration - Plugin registration details
|
|
13
|
+
* @throws DuplicatePluginError if a plugin with the same ID is already registered
|
|
14
|
+
*/
|
|
15
|
+
register(registration: PluginRegistration): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Register multiple plugins at once.
|
|
18
|
+
*
|
|
19
|
+
* @param registrations - Array of plugin registrations
|
|
20
|
+
*/
|
|
21
|
+
registerAll(registrations: PluginRegistration[]): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Unregister a plugin by ID.
|
|
24
|
+
*
|
|
25
|
+
* @param pluginId - The plugin ID to unregister
|
|
26
|
+
* @throws PluginNotFoundError if the plugin is not registered
|
|
27
|
+
*/
|
|
28
|
+
unregister(pluginId: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Get a plugin by ID.
|
|
31
|
+
*
|
|
32
|
+
* @param pluginId - The plugin ID to retrieve
|
|
33
|
+
* @returns The plugin instance or undefined if not found
|
|
34
|
+
*/
|
|
35
|
+
get(pluginId: string): AlertPlugin | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Get all registered plugins.
|
|
38
|
+
*
|
|
39
|
+
* @param enabledOnly - If true, only return enabled plugins (default: true)
|
|
40
|
+
* @returns Array of plugin instances
|
|
41
|
+
*/
|
|
42
|
+
getAll(enabledOnly?: boolean): AlertPlugin[];
|
|
43
|
+
/**
|
|
44
|
+
* Get metadata for all registered plugins.
|
|
45
|
+
*
|
|
46
|
+
* @param enabledOnly - If true, only return enabled plugins
|
|
47
|
+
* @returns Array of plugin metadata
|
|
48
|
+
*/
|
|
49
|
+
getMetadata(enabledOnly?: boolean): PluginMetadata[];
|
|
50
|
+
/**
|
|
51
|
+
* Check if a plugin is registered.
|
|
52
|
+
*
|
|
53
|
+
* @param pluginId - The plugin ID to check
|
|
54
|
+
* @returns true if the plugin is registered
|
|
55
|
+
*/
|
|
56
|
+
has(pluginId: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Enable a registered plugin.
|
|
59
|
+
*
|
|
60
|
+
* @param pluginId - The plugin ID to enable
|
|
61
|
+
*/
|
|
62
|
+
enable(pluginId: string): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Disable a registered plugin.
|
|
65
|
+
*
|
|
66
|
+
* @param pluginId - The plugin ID to disable
|
|
67
|
+
*/
|
|
68
|
+
disable(pluginId: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Check if a plugin is enabled.
|
|
71
|
+
*
|
|
72
|
+
* @param pluginId - The plugin ID to check
|
|
73
|
+
* @returns true if the plugin is enabled
|
|
74
|
+
*/
|
|
75
|
+
isEnabled(pluginId: string): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Get the number of registered plugins.
|
|
78
|
+
*
|
|
79
|
+
* @param enabledOnly - If true, only count enabled plugins
|
|
80
|
+
*/
|
|
81
|
+
size(enabledOnly?: boolean): number;
|
|
82
|
+
/**
|
|
83
|
+
* Dispose all plugins and clear the registry.
|
|
84
|
+
*/
|
|
85
|
+
dispose(): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* Initialize a plugin.
|
|
88
|
+
*/
|
|
89
|
+
private initializePlugin;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=plugin-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-registry.d.ts","sourceRoot":"","sources":["../../../src/core/plugin-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAiBhF;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAkC;IAEjD;;;;;OAKG;IACG,QAAQ,CAAC,YAAY,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB/D;;;;OAIG;IACG,WAAW,CAAC,aAAa,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrE;;;;;OAKG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAejD;;;;;OAKG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI9C;;;;;OAKG;IACH,MAAM,CAAC,WAAW,UAAO,GAAG,WAAW,EAAE;IAYzC;;;;;OAKG;IACH,WAAW,CAAC,WAAW,UAAO,GAAG,cAAc,EAAE;IAIjD;;;;;OAKG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI9B;;;;OAIG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7C;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAU/B;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpC;;;;OAIG;IACH,IAAI,CAAC,WAAW,UAAQ,GAAG,MAAM;IAYjC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAc9B;;OAEG;YACW,gBAAgB;CAmB/B"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { AlertPlugin, GeoPoint, AlertCategory, AlertTemporalType } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Options for resolving plugins.
|
|
4
|
+
*/
|
|
5
|
+
export interface PluginResolveOptions {
|
|
6
|
+
/** The location to check coverage for */
|
|
7
|
+
location: GeoPoint;
|
|
8
|
+
/** Filter by categories the plugin must support */
|
|
9
|
+
categories?: AlertCategory[];
|
|
10
|
+
/** Filter by temporal types the plugin must support */
|
|
11
|
+
temporalTypes?: AlertTemporalType[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Result of plugin resolution with coverage information.
|
|
15
|
+
*/
|
|
16
|
+
export interface ResolvedPlugin {
|
|
17
|
+
plugin: AlertPlugin;
|
|
18
|
+
coversLocation: boolean;
|
|
19
|
+
supportsCategories: boolean;
|
|
20
|
+
supportsTemporalTypes: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolves which plugins are applicable for a given query.
|
|
24
|
+
*
|
|
25
|
+
* Determines plugin coverage based on:
|
|
26
|
+
* - Geographic coverage (global or regional with center + radius)
|
|
27
|
+
* - Supported alert categories
|
|
28
|
+
* - Supported temporal types
|
|
29
|
+
*/
|
|
30
|
+
export declare class PluginResolver {
|
|
31
|
+
/**
|
|
32
|
+
* Resolve which plugins cover the given location and match the filters.
|
|
33
|
+
*
|
|
34
|
+
* @param plugins - Available plugins to check
|
|
35
|
+
* @param options - Resolution options including location and filters
|
|
36
|
+
* @returns Array of plugins that match all criteria
|
|
37
|
+
*/
|
|
38
|
+
resolve(plugins: AlertPlugin[], options: PluginResolveOptions): AlertPlugin[];
|
|
39
|
+
/**
|
|
40
|
+
* Resolve plugins with detailed coverage information.
|
|
41
|
+
*
|
|
42
|
+
* @param plugins - Available plugins to check
|
|
43
|
+
* @param options - Resolution options
|
|
44
|
+
* @returns Array of resolved plugins with coverage details
|
|
45
|
+
*/
|
|
46
|
+
resolveWithDetails(plugins: AlertPlugin[], options: PluginResolveOptions): ResolvedPlugin[];
|
|
47
|
+
/**
|
|
48
|
+
* Get plugins that cover a specific location (regardless of category/temporal filters).
|
|
49
|
+
*
|
|
50
|
+
* @param plugins - Available plugins
|
|
51
|
+
* @param location - The location to check
|
|
52
|
+
* @returns Plugins that cover the location
|
|
53
|
+
*/
|
|
54
|
+
getPluginsForLocation(plugins: AlertPlugin[], location: GeoPoint): AlertPlugin[];
|
|
55
|
+
/**
|
|
56
|
+
* Get plugins that support specific categories.
|
|
57
|
+
*
|
|
58
|
+
* @param plugins - Available plugins
|
|
59
|
+
* @param categories - Categories to filter by
|
|
60
|
+
* @returns Plugins that support at least one of the specified categories
|
|
61
|
+
*/
|
|
62
|
+
getPluginsForCategories(plugins: AlertPlugin[], categories: AlertCategory[]): AlertPlugin[];
|
|
63
|
+
/**
|
|
64
|
+
* Get global plugins (plugins that cover all locations).
|
|
65
|
+
*
|
|
66
|
+
* @param plugins - Available plugins
|
|
67
|
+
* @returns Plugins with global coverage
|
|
68
|
+
*/
|
|
69
|
+
getGlobalPlugins(plugins: AlertPlugin[]): AlertPlugin[];
|
|
70
|
+
/**
|
|
71
|
+
* Get regional plugins (plugins that cover specific geographic areas).
|
|
72
|
+
*
|
|
73
|
+
* @param plugins - Available plugins
|
|
74
|
+
* @returns Plugins with regional coverage
|
|
75
|
+
*/
|
|
76
|
+
getRegionalPlugins(plugins: AlertPlugin[]): AlertPlugin[];
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=plugin-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-resolver.d.ts","sourceRoot":"","sources":["../../../src/core/plugin-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAExF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yCAAyC;IACzC,QAAQ,EAAE,QAAQ,CAAC;IACnB,mDAAmD;IACnD,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,uDAAuD;IACvD,aAAa,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,qBAAa,cAAc;IACzB;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,oBAAoB,GAAG,WAAW,EAAE;IA+B7E;;;;;;OAMG;IACH,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,oBAAoB,GAAG,cAAc,EAAE;IA2B3F;;;;;;OAMG;IACH,qBAAqB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,WAAW,EAAE;IAIhF;;;;;;OAMG;IACH,uBAAuB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,WAAW,EAAE;IAW3F;;;;;OAKG;IACH,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAIvD;;;;;OAKG;IACH,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;CAG1D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { TimeRange, TimeRangeInput, TimeRangePreset } from '../types';
|
|
2
|
+
import { resolveTimeRange as resolveTimeRangeUtil, resolveTimeRangePreset } from '../utils';
|
|
3
|
+
/**
|
|
4
|
+
* Re-export time range utilities for use in core module.
|
|
5
|
+
*/
|
|
6
|
+
export declare const resolveTimeRange: typeof resolveTimeRangeUtil;
|
|
7
|
+
export { resolveTimeRangePreset };
|
|
8
|
+
/**
|
|
9
|
+
* Get the default time range preset.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getDefaultTimeRangePreset(): TimeRangePreset;
|
|
12
|
+
/**
|
|
13
|
+
* Get the default resolved time range.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getDefaultTimeRange(): TimeRange;
|
|
16
|
+
/**
|
|
17
|
+
* Normalize a time range input to an explicit TimeRange.
|
|
18
|
+
*
|
|
19
|
+
* @param input - Time range input (preset or explicit)
|
|
20
|
+
* @param defaultPreset - Default preset to use if input is undefined
|
|
21
|
+
* @returns Normalized TimeRange
|
|
22
|
+
*/
|
|
23
|
+
export declare function normalizeTimeRange(input?: TimeRangeInput, defaultPreset?: TimeRangePreset): TimeRange;
|
|
24
|
+
/**
|
|
25
|
+
* Get the duration of a time range in milliseconds.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getTimeRangeDuration(range: TimeRange): number;
|
|
28
|
+
/**
|
|
29
|
+
* Check if a time range is in the past.
|
|
30
|
+
*/
|
|
31
|
+
export declare function isTimeRangeInPast(range: TimeRange): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Check if a time range is in the future.
|
|
34
|
+
*/
|
|
35
|
+
export declare function isTimeRangeInFuture(range: TimeRange): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Check if a time range spans the current time.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isTimeRangeCurrent(range: TimeRange): boolean;
|
|
40
|
+
//# sourceMappingURL=time-range.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-range.d.ts","sourceRoot":"","sources":["../../../src/core/time-range.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAE5F;;GAEG;AACH,eAAO,MAAM,gBAAgB,6BAAuB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,eAAe,CAE3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,SAAS,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,CAAC,EAAE,cAAc,EACtB,aAAa,GAAE,eAA4B,GAC1C,SAAS,CAMX;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAE7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAG5D"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error thrown when an HTTP fetch operation fails.
|
|
3
|
+
*/
|
|
4
|
+
export declare class FetchError extends Error {
|
|
5
|
+
readonly code = "FETCH_ERROR";
|
|
6
|
+
readonly url: string;
|
|
7
|
+
readonly statusCode?: number;
|
|
8
|
+
readonly statusText?: string;
|
|
9
|
+
readonly cause?: Error;
|
|
10
|
+
constructor(message: string, url: string, options?: {
|
|
11
|
+
statusCode?: number;
|
|
12
|
+
statusText?: string;
|
|
13
|
+
cause?: Error;
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* Create a FetchError from a failed Response object.
|
|
17
|
+
*/
|
|
18
|
+
static fromResponse(url: string, response: Response): FetchError;
|
|
19
|
+
/**
|
|
20
|
+
* Create a FetchError from a network error.
|
|
21
|
+
*/
|
|
22
|
+
static fromNetworkError(url: string, error: Error): FetchError;
|
|
23
|
+
/**
|
|
24
|
+
* Check if this is a client error (4xx status code).
|
|
25
|
+
*/
|
|
26
|
+
isClientError(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Check if this is a server error (5xx status code).
|
|
29
|
+
*/
|
|
30
|
+
isServerError(): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Check if this error is retryable (network error or 5xx status).
|
|
33
|
+
*/
|
|
34
|
+
isRetryable(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Convert to a plain object for serialization.
|
|
37
|
+
*/
|
|
38
|
+
toJSON(): {
|
|
39
|
+
code: string;
|
|
40
|
+
message: string;
|
|
41
|
+
url: string;
|
|
42
|
+
statusCode?: number;
|
|
43
|
+
statusText?: string;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=fetch-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-error.d.ts","sourceRoot":"","sources":["../../../src/errors/fetch-error.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;gBAGrB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,KAAK,CAAC;KACf;IAWH;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,UAAU;IAOhE;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,UAAU;IAM9D;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,MAAM,IAAI;QACR,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;CASF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { PluginError, PluginInitializationError, PluginFetchError, PluginTimeoutError, DuplicatePluginError, PluginNotFoundError, } from './plugin-error';
|
|
2
|
+
export { ValidationError } from './validation-error';
|
|
3
|
+
export type { ValidationIssue } from './validation-error';
|
|
4
|
+
export { FetchError } from './fetch-error';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,yBAAyB,EACzB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for plugin-related errors.
|
|
3
|
+
*/
|
|
4
|
+
export declare class PluginError extends Error {
|
|
5
|
+
readonly pluginId: string;
|
|
6
|
+
readonly code: string;
|
|
7
|
+
constructor(message: string, pluginId: string, code?: string);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Error thrown when a plugin fails to initialize.
|
|
11
|
+
*/
|
|
12
|
+
export declare class PluginInitializationError extends PluginError {
|
|
13
|
+
readonly cause?: Error;
|
|
14
|
+
constructor(pluginId: string, message: string, cause?: Error);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Error thrown when a plugin fetch operation fails.
|
|
18
|
+
*/
|
|
19
|
+
export declare class PluginFetchError extends PluginError {
|
|
20
|
+
readonly cause?: Error;
|
|
21
|
+
constructor(pluginId: string, message: string, cause?: Error);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Error thrown when a plugin operation times out.
|
|
25
|
+
*/
|
|
26
|
+
export declare class PluginTimeoutError extends PluginError {
|
|
27
|
+
readonly timeoutMs: number;
|
|
28
|
+
constructor(pluginId: string, timeoutMs: number);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Error thrown when trying to register a plugin with a duplicate ID.
|
|
32
|
+
*/
|
|
33
|
+
export declare class DuplicatePluginError extends PluginError {
|
|
34
|
+
constructor(pluginId: string);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Error thrown when a referenced plugin is not found.
|
|
38
|
+
*/
|
|
39
|
+
export declare class PluginNotFoundError extends PluginError {
|
|
40
|
+
constructor(pluginId: string);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=plugin-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-error.d.ts","sourceRoot":"","sources":["../../../src/errors/plugin-error.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,SAAiB;CAOrE;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,WAAW;IACxD,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;gBAEX,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM7D;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;gBAEX,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM7D;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,WAAW;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAUhD;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,WAAW;gBACvC,QAAQ,EAAE,MAAM;CAK7B;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,WAAW;gBACtC,QAAQ,EAAE,MAAM;CAK7B"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ZodError } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Represents a single validation issue.
|
|
4
|
+
*/
|
|
5
|
+
export interface ValidationIssue {
|
|
6
|
+
path: string;
|
|
7
|
+
message: string;
|
|
8
|
+
code: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Error thrown when input validation fails.
|
|
12
|
+
*/
|
|
13
|
+
export declare class ValidationError extends Error {
|
|
14
|
+
readonly code = "VALIDATION_ERROR";
|
|
15
|
+
readonly issues: ValidationIssue[];
|
|
16
|
+
constructor(message: string, issues: ValidationIssue[]);
|
|
17
|
+
/**
|
|
18
|
+
* Create a ValidationError from a Zod error.
|
|
19
|
+
*/
|
|
20
|
+
static fromZodError(error: ZodError): ValidationError;
|
|
21
|
+
/**
|
|
22
|
+
* Get a formatted string representation of all issues.
|
|
23
|
+
*/
|
|
24
|
+
getFormattedIssues(): string;
|
|
25
|
+
/**
|
|
26
|
+
* Convert to a plain object for serialization.
|
|
27
|
+
*/
|
|
28
|
+
toJSON(): {
|
|
29
|
+
code: string;
|
|
30
|
+
message: string;
|
|
31
|
+
issues: ValidationIssue[];
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=validation-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-error.d.ts","sourceRoot":"","sources":["../../../src/errors/validation-error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,KAAK,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC;gBAEvB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE;IAOtD;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,eAAe;IAarD;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAM5B;;OAEG;IACH,MAAM,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,eAAe,EAAE,CAAA;KAAE;CAOvE"}
|