@sapphire-sh/utils 1.82.0 → 1.84.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/lib/cjs/date.d.ts +1 -0
- package/lib/cjs/date.d.ts.map +1 -1
- package/lib/cjs/date.js +3 -1
- package/lib/cjs/date.js.map +1 -1
- package/lib/cjs/download.d.ts +1 -1
- package/lib/cjs/download.d.ts.map +1 -1
- package/lib/cjs/download.js +25 -2
- package/lib/cjs/download.js.map +1 -1
- package/lib/cjs/env.d.ts +3 -0
- package/lib/cjs/env.d.ts.map +1 -0
- package/lib/cjs/env.js +25 -0
- package/lib/cjs/env.js.map +1 -0
- package/lib/cjs/eslint.d.ts.map +1 -1
- package/lib/cjs/eslint.js +14 -2
- package/lib/cjs/eslint.js.map +1 -1
- package/lib/cjs/eslintNext.d.ts +3 -0
- package/lib/cjs/eslintNext.d.ts.map +1 -0
- package/lib/cjs/eslintNext.js +11 -0
- package/lib/cjs/eslintNext.js.map +1 -0
- package/lib/cjs/eslintRules.d.ts +1 -0
- package/lib/cjs/eslintRules.d.ts.map +1 -1
- package/lib/cjs/eslintRules.js +33 -1
- package/lib/cjs/eslintRules.js.map +1 -1
- package/lib/cjs/format.d.ts +2 -0
- package/lib/cjs/format.d.ts.map +1 -0
- package/lib/cjs/format.js +20 -0
- package/lib/cjs/format.js.map +1 -0
- package/lib/cjs/fs.d.ts +3 -0
- package/lib/cjs/fs.d.ts.map +1 -1
- package/lib/cjs/fs.js +22 -6
- package/lib/cjs/fs.js.map +1 -1
- package/lib/cjs/http.d.ts +3 -1
- package/lib/cjs/http.d.ts.map +1 -1
- package/lib/cjs/http.js +27 -16
- package/lib/cjs/http.js.map +1 -1
- package/lib/cjs/index.d.ts +15 -3
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +26 -1
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/json.d.ts +12 -0
- package/lib/cjs/json.d.ts.map +1 -0
- package/lib/cjs/json.js +41 -0
- package/lib/cjs/json.js.map +1 -0
- package/lib/cjs/logger.d.ts +9 -1
- package/lib/cjs/logger.d.ts.map +1 -1
- package/lib/cjs/logger.js +28 -5
- package/lib/cjs/logger.js.map +1 -1
- package/lib/cjs/math.d.ts +2 -0
- package/lib/cjs/math.d.ts.map +1 -0
- package/lib/cjs/math.js +11 -0
- package/lib/cjs/math.js.map +1 -0
- package/lib/cjs/notify.d.ts +1 -0
- package/lib/cjs/notify.d.ts.map +1 -1
- package/lib/cjs/notify.js +18 -1
- package/lib/cjs/notify.js.map +1 -1
- package/lib/cjs/retry.d.ts +10 -0
- package/lib/cjs/retry.d.ts.map +1 -0
- package/lib/cjs/retry.js +22 -0
- package/lib/cjs/retry.js.map +1 -0
- package/lib/cjs/serialLimiter.d.ts +3 -0
- package/lib/cjs/serialLimiter.d.ts.map +1 -0
- package/lib/cjs/serialLimiter.js +29 -0
- package/lib/cjs/serialLimiter.js.map +1 -0
- package/lib/cjs/slackLogBatcher.d.ts +12 -0
- package/lib/cjs/slackLogBatcher.d.ts.map +1 -0
- package/lib/cjs/slackLogBatcher.js +54 -0
- package/lib/cjs/slackLogBatcher.js.map +1 -0
- package/lib/cjs/vitestNext.d.ts +3 -0
- package/lib/cjs/vitestNext.d.ts.map +1 -0
- package/lib/cjs/vitestNext.js +21 -0
- package/lib/cjs/vitestNext.js.map +1 -0
- package/lib/date.d.ts +1 -0
- package/lib/date.d.ts.map +1 -1
- package/lib/date.js +1 -0
- package/lib/date.js.map +1 -1
- package/lib/download.d.ts +1 -1
- package/lib/download.d.ts.map +1 -1
- package/lib/download.js +25 -2
- package/lib/download.js.map +1 -1
- package/lib/env.d.ts +3 -0
- package/lib/env.d.ts.map +1 -0
- package/lib/env.js +20 -0
- package/lib/env.js.map +1 -0
- package/lib/eslint.d.ts.map +1 -1
- package/lib/eslint.js +14 -2
- package/lib/eslint.js.map +1 -1
- package/lib/eslintNext.d.ts +3 -0
- package/lib/eslintNext.d.ts.map +1 -0
- package/lib/eslintNext.js +6 -0
- package/lib/eslintNext.js.map +1 -0
- package/lib/eslintRules.d.ts +1 -0
- package/lib/eslintRules.d.ts.map +1 -1
- package/lib/eslintRules.js +32 -0
- package/lib/eslintRules.js.map +1 -1
- package/lib/format.d.ts +2 -0
- package/lib/format.d.ts.map +1 -0
- package/lib/format.js +16 -0
- package/lib/format.js.map +1 -0
- package/lib/fs.d.ts +3 -0
- package/lib/fs.d.ts.map +1 -1
- package/lib/fs.js +18 -5
- package/lib/fs.js.map +1 -1
- package/lib/http.d.ts +3 -1
- package/lib/http.d.ts.map +1 -1
- package/lib/http.js +25 -15
- package/lib/http.js.map +1 -1
- package/lib/index.d.ts +15 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +10 -3
- package/lib/index.js.map +1 -1
- package/lib/json.d.ts +12 -0
- package/lib/json.d.ts.map +1 -0
- package/lib/json.js +31 -0
- package/lib/json.js.map +1 -0
- package/lib/logger.d.ts +9 -1
- package/lib/logger.d.ts.map +1 -1
- package/lib/logger.js +28 -5
- package/lib/logger.js.map +1 -1
- package/lib/math.d.ts +2 -0
- package/lib/math.d.ts.map +1 -0
- package/lib/math.js +7 -0
- package/lib/math.js.map +1 -0
- package/lib/notify.d.ts +1 -0
- package/lib/notify.d.ts.map +1 -1
- package/lib/notify.js +16 -0
- package/lib/notify.js.map +1 -1
- package/lib/retry.d.ts +10 -0
- package/lib/retry.d.ts.map +1 -0
- package/lib/retry.js +18 -0
- package/lib/retry.js.map +1 -0
- package/lib/serialLimiter.d.ts +3 -0
- package/lib/serialLimiter.d.ts.map +1 -0
- package/lib/serialLimiter.js +25 -0
- package/lib/serialLimiter.js.map +1 -0
- package/lib/slackLogBatcher.d.ts +12 -0
- package/lib/slackLogBatcher.d.ts.map +1 -0
- package/lib/slackLogBatcher.js +49 -0
- package/lib/slackLogBatcher.js.map +1 -0
- package/lib/vitestNext.d.ts +3 -0
- package/lib/vitestNext.d.ts.map +1 -0
- package/lib/vitestNext.js +16 -0
- package/lib/vitestNext.js.map +1 -0
- package/package.json +21 -1
package/lib/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAAyE;AAAhE,qGAAA,UAAU,OAAA;AAAE,yGAAA,cAAc,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AACrD,mCAA+C;AAAtC,iGAAA,OAAO,OAAA;AAAE,oGAAA,UAAU,OAAA;AAC5B,uCAA4C;AAAnC,0GAAA,cAAc,OAAA;AACvB,yCAA0C;AAAjC,wGAAA,WAAW,OAAA;AACpB,qDAAiD;AAAxC,+GAAA,YAAY,OAAA;AACrB,qCAAiE;AAAxD,oGAAA,SAAS,OAAA;AAAE,oGAAA,SAAS,OAAA;AAAE,yGAAA,cAAc,OAAA;AAE7C,uDAAmD;AAA1C,iHAAA,aAAa,OAAA;AACtB,qCAA2G;AAAlG,mGAAA,QAAQ,OAAA;AAAE,qGAAA,UAAU,OAAA;AAAE,oGAAA,SAAS,OAAA;AAAE,oGAAA,SAAS,OAAA;AAAE,oGAAA,SAAS,OAAA;AAAE,uGAAA,YAAY,OAAA;AAAE,oGAAA,SAAS,OAAA;AAEvF,yCAA+C;AAAtC,qGAAA,QAAQ,OAAA;AAAE,mGAAA,MAAM,OAAA;AAEzB,qCAAkC;AAAzB,gGAAA,KAAK,OAAA;AACd,yCAA8E;AAArE,6GAAA,gBAAgB,OAAA;AAAE,wGAAA,WAAW,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AACxD,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AACd,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AAEd,uDAAyD;AAAhD,uHAAA,mBAAmB,OAAA;AAE5B,2DAAyE;AAAhE,gHAAA,UAAU,OAAA;AAAE,2HAAA,qBAAqB,OAAA;AAE1C,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AACd,yCAAyC;AAAhC,uGAAA,UAAU,OAAA;AACnB,6CAAyC;AAAhC,uGAAA,QAAQ,OAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type JsonValue = string | number | boolean | null | JsonValue[] | JsonObject;
|
|
2
|
+
export interface JsonObject {
|
|
3
|
+
[key: string]: JsonValue;
|
|
4
|
+
}
|
|
5
|
+
export declare const isJsonObject: (value: unknown) => value is JsonObject;
|
|
6
|
+
export declare const parseJson: (text: string) => JsonValue | null;
|
|
7
|
+
export declare const getObject: (object: JsonObject, key: string) => JsonObject | null;
|
|
8
|
+
export declare const getArray: (object: JsonObject, key: string) => JsonValue[];
|
|
9
|
+
export declare const getString: (object: JsonObject, key: string) => string | null;
|
|
10
|
+
export declare const getNumber: (object: JsonObject, key: string) => number | null;
|
|
11
|
+
export declare const getBoolean: (object: JsonObject, key: string) => boolean | null;
|
|
12
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/json.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,UAAU,CAAC;AAEpF,MAAM,WAAW,UAAU;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,UACc,CAAC;AAEtE,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,SAAS,GAAG,IAOpD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,QAAQ,UAAU,EAAE,KAAK,MAAM,KAAG,UAAU,GAAG,IAGxE,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,QAAQ,UAAU,EAAE,KAAK,MAAM,KAAG,SAAS,EAGnE,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,QAAQ,UAAU,EAAE,KAAK,MAAM,KAAG,MAAM,GAAG,IAGpE,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,QAAQ,UAAU,EAAE,KAAK,MAAM,KAAG,MAAM,GAAG,IAGpE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,QAAQ,UAAU,EAAE,KAAK,MAAM,KAAG,OAAO,GAAG,IAGtE,CAAC"}
|
package/lib/cjs/json.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getBoolean = exports.getNumber = exports.getString = exports.getArray = exports.getObject = exports.parseJson = exports.isJsonObject = void 0;
|
|
4
|
+
const isJsonObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
5
|
+
exports.isJsonObject = isJsonObject;
|
|
6
|
+
const parseJson = (text) => {
|
|
7
|
+
try {
|
|
8
|
+
const parsed = JSON.parse(text);
|
|
9
|
+
return parsed;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
exports.parseJson = parseJson;
|
|
16
|
+
const getObject = (object, key) => {
|
|
17
|
+
const value = object[key];
|
|
18
|
+
return (0, exports.isJsonObject)(value) ? value : null;
|
|
19
|
+
};
|
|
20
|
+
exports.getObject = getObject;
|
|
21
|
+
const getArray = (object, key) => {
|
|
22
|
+
const value = object[key];
|
|
23
|
+
return Array.isArray(value) ? value : [];
|
|
24
|
+
};
|
|
25
|
+
exports.getArray = getArray;
|
|
26
|
+
const getString = (object, key) => {
|
|
27
|
+
const value = object[key];
|
|
28
|
+
return typeof value === 'string' ? value : null;
|
|
29
|
+
};
|
|
30
|
+
exports.getString = getString;
|
|
31
|
+
const getNumber = (object, key) => {
|
|
32
|
+
const value = object[key];
|
|
33
|
+
return typeof value === 'number' ? value : null;
|
|
34
|
+
};
|
|
35
|
+
exports.getNumber = getNumber;
|
|
36
|
+
const getBoolean = (object, key) => {
|
|
37
|
+
const value = object[key];
|
|
38
|
+
return typeof value === 'boolean' ? value : null;
|
|
39
|
+
};
|
|
40
|
+
exports.getBoolean = getBoolean;
|
|
41
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/json.ts"],"names":[],"mappings":";;;AAMO,MAAM,YAAY,GAAG,CAAC,KAAc,EAAuB,EAAE,CACnE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AADzD,QAAA,YAAY,gBAC6C;AAE/D,MAAM,SAAS,GAAG,CAAC,IAAY,EAAoB,EAAE;IAC3D,IAAI,CAAC;QACJ,MAAM,MAAM,GAAc,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC,CAAC;AAPW,QAAA,SAAS,aAOpB;AAEK,MAAM,SAAS,GAAG,CAAC,MAAkB,EAAE,GAAW,EAAqB,EAAE;IAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC,CAAC;AAHW,QAAA,SAAS,aAGpB;AAEK,MAAM,QAAQ,GAAG,CAAC,MAAkB,EAAE,GAAW,EAAe,EAAE;IACxE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1C,CAAC,CAAC;AAHW,QAAA,QAAQ,YAGnB;AAEK,MAAM,SAAS,GAAG,CAAC,MAAkB,EAAE,GAAW,EAAiB,EAAE;IAC3E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC,CAAC;AAHW,QAAA,SAAS,aAGpB;AAEK,MAAM,SAAS,GAAG,CAAC,MAAkB,EAAE,GAAW,EAAiB,EAAE;IAC3E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC,CAAC;AAHW,QAAA,SAAS,aAGpB;AAEK,MAAM,UAAU,GAAG,CAAC,MAAkB,EAAE,GAAW,EAAkB,EAAE;IAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC,CAAC;AAHW,QAAA,UAAU,cAGrB"}
|
package/lib/cjs/logger.d.ts
CHANGED
|
@@ -4,12 +4,20 @@ export declare enum LogLevel {
|
|
|
4
4
|
WARN = 3,
|
|
5
5
|
ERROR = 4
|
|
6
6
|
}
|
|
7
|
-
type Payload =
|
|
7
|
+
type Payload = unknown;
|
|
8
|
+
export interface LogEntry {
|
|
9
|
+
level: LogLevel;
|
|
10
|
+
message: string;
|
|
11
|
+
payload?: unknown;
|
|
12
|
+
timestamp: Date;
|
|
13
|
+
}
|
|
14
|
+
export type LogSink = (entry: LogEntry) => void;
|
|
8
15
|
export declare const logger: {
|
|
9
16
|
debug: (message: string, payload?: Payload) => void;
|
|
10
17
|
info: (message: string, payload?: Payload) => void;
|
|
11
18
|
warn: (message: string, payload?: Payload) => void;
|
|
12
19
|
error: (message: string, payload?: Payload) => void;
|
|
20
|
+
addSink: (sink: LogSink) => (() => void);
|
|
13
21
|
setLevel: (level: LogLevel | string) => void;
|
|
14
22
|
};
|
|
15
23
|
export {};
|
package/lib/cjs/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAEA,oBAAY,QAAQ;IACnB,KAAK,IAAI;IACT,IAAI,IAAA;IACJ,IAAI,IAAA;IACJ,KAAK,IAAA;CACL;AAED,KAAK,OAAO,GAAG,OAAO,CAAC;AAEvB,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;CAChB;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAgEhD,eAAO,MAAM,MAAM;qBACD,MAAM,YAAY,OAAO;oBAC1B,MAAM,YAAY,OAAO;oBACzB,MAAM,YAAY,OAAO;qBACxB,MAAM,YAAY,OAAO;oBAC1B,OAAO,KAAG,CAAC,MAAM,IAAI,CAAC;sBASpB,QAAQ,GAAG,MAAM;CAYnC,CAAC"}
|
package/lib/cjs/logger.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.logger = exports.LogLevel = void 0;
|
|
4
|
+
const env_js_1 = require("./env.js");
|
|
4
5
|
var LogLevel;
|
|
5
6
|
(function (LogLevel) {
|
|
6
7
|
LogLevel[LogLevel["DEBUG"] = 1] = "DEBUG";
|
|
@@ -8,8 +9,13 @@ var LogLevel;
|
|
|
8
9
|
LogLevel[LogLevel["WARN"] = 3] = "WARN";
|
|
9
10
|
LogLevel[LogLevel["ERROR"] = 4] = "ERROR";
|
|
10
11
|
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
12
|
+
const sinks = [];
|
|
13
|
+
// JSON.stringify is typed as returning string, but returns undefined for values it cannot
|
|
14
|
+
// serialize, such as functions and symbols.
|
|
15
|
+
const stringify = (value) => JSON.stringify(value);
|
|
11
16
|
const serializePayload = (payload) => {
|
|
12
|
-
const
|
|
17
|
+
const serialized = stringify(payload instanceof Error ? { error: payload.message, name: payload.name, stack: payload.stack } : payload);
|
|
18
|
+
const json = serialized ?? `"[${typeof payload}]"`;
|
|
13
19
|
return json.padStart(json.length + 1);
|
|
14
20
|
};
|
|
15
21
|
const levelMap = {
|
|
@@ -20,8 +26,8 @@ const levelMap = {
|
|
|
20
26
|
};
|
|
21
27
|
const parseLevel = (level) => levelMap[level.toUpperCase()];
|
|
22
28
|
const resolveInitialLevel = () => {
|
|
23
|
-
const envLevel =
|
|
24
|
-
if (envLevel === undefined
|
|
29
|
+
const envLevel = (0, env_js_1.readEnv)('LOG_LEVEL');
|
|
30
|
+
if (envLevel === undefined) {
|
|
25
31
|
return LogLevel.INFO;
|
|
26
32
|
}
|
|
27
33
|
return parseLevel(envLevel) ?? LogLevel.INFO;
|
|
@@ -31,8 +37,8 @@ const log = (level, message, payload) => {
|
|
|
31
37
|
if (level < currentLevel) {
|
|
32
38
|
return;
|
|
33
39
|
}
|
|
34
|
-
const
|
|
35
|
-
const prefix = `[${
|
|
40
|
+
const timestamp = new Date();
|
|
41
|
+
const prefix = `[${timestamp.toISOString()}] [${LogLevel[level].toUpperCase()}]`;
|
|
36
42
|
const payloadStr = payload === undefined ? '' : serializePayload(payload);
|
|
37
43
|
const output = `${prefix} ${message}${payloadStr}`;
|
|
38
44
|
if (level === LogLevel.ERROR) {
|
|
@@ -47,12 +53,29 @@ const log = (level, message, payload) => {
|
|
|
47
53
|
else {
|
|
48
54
|
console.log(output);
|
|
49
55
|
}
|
|
56
|
+
for (const sink of sinks) {
|
|
57
|
+
try {
|
|
58
|
+
sink({ level, message, payload, timestamp });
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error('[logger] sink failed', error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
50
64
|
};
|
|
51
65
|
exports.logger = {
|
|
52
66
|
debug: (message, payload) => log(LogLevel.DEBUG, message, payload),
|
|
53
67
|
info: (message, payload) => log(LogLevel.INFO, message, payload),
|
|
54
68
|
warn: (message, payload) => log(LogLevel.WARN, message, payload),
|
|
55
69
|
error: (message, payload) => log(LogLevel.ERROR, message, payload),
|
|
70
|
+
addSink: (sink) => {
|
|
71
|
+
sinks.push(sink);
|
|
72
|
+
return () => {
|
|
73
|
+
const index = sinks.indexOf(sink);
|
|
74
|
+
if (index !== -1) {
|
|
75
|
+
sinks.splice(index, 1);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
},
|
|
56
79
|
setLevel: (level) => {
|
|
57
80
|
if (typeof level === 'string') {
|
|
58
81
|
const resolved = parseLevel(level);
|
package/lib/cjs/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":";;;AAAA,IAAY,QAKX;AALD,WAAY,QAAQ;IACnB,yCAAS,CAAA;IACT,uCAAI,CAAA;IACJ,uCAAI,CAAA;IACJ,yCAAK,CAAA;AACN,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/math.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,MAK/D,CAAC"}
|
package/lib/cjs/math.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.clamp = void 0;
|
|
4
|
+
const clamp = (value, min, max) => {
|
|
5
|
+
if (min > max) {
|
|
6
|
+
throw new RangeError(`Invalid clamp range: min ${min} is greater than max ${max}`);
|
|
7
|
+
}
|
|
8
|
+
return Math.min(max, Math.max(min, value));
|
|
9
|
+
};
|
|
10
|
+
exports.clamp = clamp;
|
|
11
|
+
//# sourceMappingURL=math.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/math.ts"],"names":[],"mappings":";;;AAAO,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAU,EAAE;IACxE,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAAC,4BAA4B,GAAG,wBAAwB,GAAG,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC;AALW,QAAA,KAAK,SAKhB"}
|
package/lib/cjs/notify.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export declare const notifySlack: (url: string, text: string) => Promise<void>;
|
|
2
|
+
export declare const pingHealthchecks: (url: string, timeoutMs?: number) => Promise<void>;
|
|
2
3
|
export declare const notifyMattermost: (baseUrl: string, token: string, channelId: string, message: string) => Promise<void>;
|
|
3
4
|
//# sourceMappingURL=notify.d.ts.map
|
package/lib/cjs/notify.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/notify.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,WAAW,GAAU,KAAK,MAAM,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAyBzE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,WAAW,MAAM,EACjB,SAAS,MAAM,KACb,OAAO,CAAC,IAAI,CAcd,CAAC"}
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/notify.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,WAAW,GAAU,KAAK,MAAM,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAyBzE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,KAAK,MAAM,EAAE,kBAAgB,KAAG,OAAO,CAAC,IAAI,CAclF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,WAAW,MAAM,EACjB,SAAS,MAAM,KACb,OAAO,CAAC,IAAI,CAcd,CAAC"}
|
package/lib/cjs/notify.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.notifyMattermost = exports.notifySlack = void 0;
|
|
3
|
+
exports.notifyMattermost = exports.pingHealthchecks = exports.notifySlack = void 0;
|
|
4
4
|
const logger_js_1 = require("./logger.js");
|
|
5
5
|
const sleep_js_1 = require("./sleep.js");
|
|
6
6
|
const MAX_RETRIES = 2;
|
|
@@ -31,6 +31,23 @@ const notifySlack = async (url, text) => {
|
|
|
31
31
|
}
|
|
32
32
|
};
|
|
33
33
|
exports.notifySlack = notifySlack;
|
|
34
|
+
const pingHealthchecks = async (url, timeoutMs = 4096) => {
|
|
35
|
+
try {
|
|
36
|
+
const resp = await fetch(url, {
|
|
37
|
+
method: 'GET',
|
|
38
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
39
|
+
});
|
|
40
|
+
if (!resp.ok) {
|
|
41
|
+
logger_js_1.logger.warn('[pingHealthchecks] ping failed', { status: resp.status });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
logger_js_1.logger.warn('[pingHealthchecks] ping threw', {
|
|
46
|
+
message: error instanceof Error ? error.message : String(error),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
exports.pingHealthchecks = pingHealthchecks;
|
|
34
51
|
const notifyMattermost = async (baseUrl, token, channelId, message) => {
|
|
35
52
|
logger_js_1.logger.debug('[notifyMattermost] posting to channel', { channelId, messageLength: message.length });
|
|
36
53
|
const resp = await fetch(`${baseUrl}/api/v4/posts`, {
|
package/lib/cjs/notify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/notify.ts"],"names":[],"mappings":";;;AAAA,2CAAqC;AACrC,yCAAmC;AAEnC,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE9B,MAAM,WAAW,GAAG,KAAK,EAAE,GAAW,EAAE,IAAY,EAAiB,EAAE;IAC7E,kBAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC7B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,cAAc,EAAE,kBAAkB;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;SAC9B,CAAC,CAAC;QACH,kBAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACzD,MAAM,OAAO,GACZ,gBAAgB,KAAK,IAAI,IAAI,gBAAgB,KAAK,EAAE;YACnD,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,GAAG,IAAI;YAC9C,CAAC,CAAC,uBAAuB,CAAC;QAC5B,kBAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3E,MAAM,IAAA,gBAAK,EAAC,OAAO,CAAC,CAAC;IACtB,CAAC;AACF,CAAC,CAAC;AAzBW,QAAA,WAAW,eAyBtB;AAEK,MAAM,gBAAgB,GAAG,KAAK,EACpC,OAAe,EACf,KAAa,EACb,SAAiB,EACjB,OAAe,EACC,EAAE;IAClB,kBAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpG,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,eAAe,EAAE;QACnD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACR,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,cAAc,EAAE,kBAAkB;SAClC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;KACxD,CAAC,CAAC;IACH,kBAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAChE,CAAC;AACF,CAAC,CAAC;AAnBW,QAAA,gBAAgB,oBAmB3B"}
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/notify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface RetryOptions {
|
|
2
|
+
maxAttempts?: number;
|
|
3
|
+
baseDelayMs?: number;
|
|
4
|
+
jitterMs?: number;
|
|
5
|
+
isRetryable?: (error: unknown) => boolean;
|
|
6
|
+
delayMs?: (error: unknown, attempt: number) => number | undefined;
|
|
7
|
+
onRetry?: (error: unknown, attempt: number, delayMs: number) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare const retry: <T>(fn: () => Promise<T>, options?: RetryOptions) => Promise<T>;
|
|
10
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/retry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAClE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE;AAED,eAAO,MAAM,KAAK,GAAU,CAAC,EAAE,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,YAAY,KAAG,OAAO,CAAC,CAAC,CAuBtF,CAAC"}
|
package/lib/cjs/retry.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.retry = void 0;
|
|
4
|
+
const sleep_js_1 = require("./sleep.js");
|
|
5
|
+
const retry = async (fn, options) => {
|
|
6
|
+
const { maxAttempts = 4, baseDelayMs = 1024, jitterMs = 512, isRetryable = () => true, delayMs, onRetry, } = options ?? {};
|
|
7
|
+
for (let attempt = 1;; attempt++) {
|
|
8
|
+
try {
|
|
9
|
+
return await fn();
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (attempt >= maxAttempts || !isRetryable(error)) {
|
|
13
|
+
throw error;
|
|
14
|
+
}
|
|
15
|
+
const resolvedDelayMs = delayMs?.(error, attempt) ?? baseDelayMs * 2 ** (attempt - 1);
|
|
16
|
+
onRetry?.(error, attempt, resolvedDelayMs);
|
|
17
|
+
await (0, sleep_js_1.sleep)(resolvedDelayMs, jitterMs);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
exports.retry = retry;
|
|
22
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/retry.ts"],"names":[],"mappings":";;;AAAA,yCAAmC;AAW5B,MAAM,KAAK,GAAG,KAAK,EAAK,EAAoB,EAAE,OAAsB,EAAc,EAAE;IAC1F,MAAM,EACL,WAAW,GAAG,CAAC,EACf,WAAW,GAAG,IAAI,EAClB,QAAQ,GAAG,GAAG,EACd,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,EACxB,OAAO,EACP,OAAO,GACP,GAAG,OAAO,IAAI,EAAE,CAAC;IAElB,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC;YACJ,OAAO,MAAM,EAAE,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,OAAO,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnD,MAAM,KAAK,CAAC;YACb,CAAC;YAED,MAAM,eAAe,GAAG,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YACtF,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;YAC3C,MAAM,IAAA,gBAAK,EAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC;IACF,CAAC;AACF,CAAC,CAAC;AAvBW,QAAA,KAAK,SAuBhB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialLimiter.d.ts","sourceRoot":"","sources":["../../src/serialLimiter.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAEpF,eAAO,MAAM,mBAAmB,GAAI,eAAe,MAAM,KAAG,aA2B3D,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSerialLimiter = void 0;
|
|
4
|
+
const sleep_js_1 = require("./sleep.js");
|
|
5
|
+
const createSerialLimiter = (minIntervalMs) => {
|
|
6
|
+
const tails = new Map();
|
|
7
|
+
const startedAt = new Map();
|
|
8
|
+
return async (task, key = '') => {
|
|
9
|
+
const previous = tails.get(key);
|
|
10
|
+
const run = (async () => {
|
|
11
|
+
if (previous !== undefined) {
|
|
12
|
+
await previous;
|
|
13
|
+
}
|
|
14
|
+
const previousStartedAt = startedAt.get(key);
|
|
15
|
+
if (previousStartedAt !== undefined) {
|
|
16
|
+
const remainingMs = minIntervalMs - (Date.now() - previousStartedAt);
|
|
17
|
+
if (remainingMs > 0) {
|
|
18
|
+
await (0, sleep_js_1.sleep)(remainingMs);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
startedAt.set(key, Date.now());
|
|
22
|
+
return task();
|
|
23
|
+
})();
|
|
24
|
+
tails.set(key, Promise.allSettled([run]));
|
|
25
|
+
return run;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
exports.createSerialLimiter = createSerialLimiter;
|
|
29
|
+
//# sourceMappingURL=serialLimiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialLimiter.js","sourceRoot":"","sources":["../../src/serialLimiter.ts"],"names":[],"mappings":";;;AAAA,yCAAmC;AAI5B,MAAM,mBAAmB,GAAG,CAAC,aAAqB,EAAiB,EAAE;IAC3E,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,OAAO,KAAK,EAAK,IAAsB,EAAE,GAAG,GAAG,EAAE,EAAc,EAAE;QAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEhC,MAAM,GAAG,GAAG,CAAC,KAAK,IAAgB,EAAE;YACnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC5B,MAAM,QAAQ,CAAC;YAChB,CAAC;YAED,MAAM,iBAAiB,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,WAAW,GAAG,aAAa,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,CAAC,CAAC;gBACrE,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;oBACrB,MAAM,IAAA,gBAAK,EAAC,WAAW,CAAC,CAAC;gBAC1B,CAAC;YACF,CAAC;YAED,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC/B,OAAO,IAAI,EAAE,CAAC;QACf,CAAC,CAAC,EAAE,CAAC;QAEL,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1C,OAAO,GAAG,CAAC;IACZ,CAAC,CAAC;AACH,CAAC,CAAC;AA3BW,QAAA,mBAAmB,uBA2B9B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface SlackLogBatcherOptions {
|
|
2
|
+
webhookUrl: string;
|
|
3
|
+
flushIntervalMs?: number;
|
|
4
|
+
maxChunkLength?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface SlackLogBatcher {
|
|
7
|
+
enqueue: (line: string) => void;
|
|
8
|
+
flush: () => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare const chunkLines: (lines: string[], maxLength: number) => string[];
|
|
11
|
+
export declare const createSlackLogBatcher: (options: SlackLogBatcherOptions) => SlackLogBatcher;
|
|
12
|
+
//# sourceMappingURL=slackLogBatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slackLogBatcher.d.ts","sourceRoot":"","sources":["../../src/slackLogBatcher.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,sBAAsB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,EAAE,EAAE,WAAW,MAAM,KAAG,MAAM,EAoBrE,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,SAAS,sBAAsB,KAAG,eAiCvE,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSlackLogBatcher = exports.chunkLines = void 0;
|
|
4
|
+
const logger_js_1 = require("./logger.js");
|
|
5
|
+
const notify_js_1 = require("./notify.js");
|
|
6
|
+
const chunkLines = (lines, maxLength) => {
|
|
7
|
+
const chunks = [];
|
|
8
|
+
let current = null;
|
|
9
|
+
for (const line of lines) {
|
|
10
|
+
if (current === null) {
|
|
11
|
+
current = line;
|
|
12
|
+
}
|
|
13
|
+
else if (current.length + 1 + line.length > maxLength) {
|
|
14
|
+
chunks.push(current);
|
|
15
|
+
current = line;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
current = `${current}\n${line}`;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (current !== null) {
|
|
22
|
+
chunks.push(current);
|
|
23
|
+
}
|
|
24
|
+
return chunks;
|
|
25
|
+
};
|
|
26
|
+
exports.chunkLines = chunkLines;
|
|
27
|
+
const createSlackLogBatcher = (options) => {
|
|
28
|
+
const { webhookUrl, flushIntervalMs = 4096, maxChunkLength = 16384 } = options;
|
|
29
|
+
let queue = [];
|
|
30
|
+
let timer = null;
|
|
31
|
+
const flush = async () => {
|
|
32
|
+
if (timer !== null) {
|
|
33
|
+
globalThis.clearTimeout(timer);
|
|
34
|
+
timer = null;
|
|
35
|
+
}
|
|
36
|
+
const lines = queue;
|
|
37
|
+
queue = [];
|
|
38
|
+
for (const chunk of (0, exports.chunkLines)(lines, maxChunkLength)) {
|
|
39
|
+
try {
|
|
40
|
+
await (0, notify_js_1.notifySlack)(webhookUrl, chunk);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
logger_js_1.logger.error('[slackLogBatcher] failed to send a chunk', error instanceof Error ? error : { error: String(error) });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const enqueue = (line) => {
|
|
48
|
+
queue.push(line);
|
|
49
|
+
timer ??= globalThis.setTimeout(() => void flush(), flushIntervalMs);
|
|
50
|
+
};
|
|
51
|
+
return { enqueue, flush };
|
|
52
|
+
};
|
|
53
|
+
exports.createSlackLogBatcher = createSlackLogBatcher;
|
|
54
|
+
//# sourceMappingURL=slackLogBatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slackLogBatcher.js","sourceRoot":"","sources":["../../src/slackLogBatcher.ts"],"names":[],"mappings":";;;AAAA,2CAAqC;AACrC,2CAA0C;AAanC,MAAM,UAAU,GAAG,CAAC,KAAe,EAAE,SAAiB,EAAY,EAAE;IAC1E,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAkB,IAAI,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,CAAC;YACP,OAAO,GAAG,GAAG,OAAO,KAAK,IAAI,EAAE,CAAC;QACjC,CAAC;IACF,CAAC;IAED,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AApBW,QAAA,UAAU,cAoBrB;AAEK,MAAM,qBAAqB,GAAG,CAAC,OAA+B,EAAmB,EAAE;IACzF,MAAM,EAAE,UAAU,EAAE,eAAe,GAAG,IAAI,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAE/E,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,IAAI,KAAK,GAAoD,IAAI,CAAC;IAElE,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;QACvC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACpB,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,KAAK,GAAG,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC;QACpB,KAAK,GAAG,EAAE,CAAC;QAEX,KAAK,MAAM,KAAK,IAAI,IAAA,kBAAU,EAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC;gBACJ,MAAM,IAAA,uBAAW,EAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,kBAAM,CAAC,KAAK,CACX,0CAA0C,EAC1C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CACzD,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;QAChC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,KAAK,KAAK,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,KAAK,EAAE,EAAE,eAAe,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC,CAAC;AAjCW,QAAA,qBAAqB,yBAiChC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitestNext.d.ts","sourceRoot":"","sources":["../../src/vitestNext.ts"],"names":[],"mappings":";AAKA,wBAUG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
7
|
+
const config_1 = require("vitest/config");
|
|
8
|
+
const vitest_js_1 = __importDefault(require("./vitest.js"));
|
|
9
|
+
// vitest runs from the project root, so cwd-relative paths point at the consuming project.
|
|
10
|
+
exports.default = (0, config_1.mergeConfig)(vitest_js_1.default, {
|
|
11
|
+
resolve: {
|
|
12
|
+
alias: {
|
|
13
|
+
'@': node_path_1.default.resolve(process.cwd(), 'src'),
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
test: {
|
|
17
|
+
include: ['src/**/*.{test,spec}.?(c|m)[jt]s?(x)'],
|
|
18
|
+
exclude: ['**/node_modules/**', '**/.next/**'],
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=vitestNext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitestNext.js","sourceRoot":"","sources":["../../src/vitestNext.ts"],"names":[],"mappings":";;;;;AAAA,0DAA6B;AAC7B,0CAA4C;AAC5C,4DAA+B;AAE/B,2FAA2F;AAC3F,kBAAe,IAAA,oBAAW,EAAC,mBAAI,EAAE;IAChC,OAAO,EAAE;QACR,KAAK,EAAE;YACN,GAAG,EAAE,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC;SACvC;KACD;IACD,IAAI,EAAE;QACL,OAAO,EAAE,CAAC,sCAAsC,CAAC;QACjD,OAAO,EAAE,CAAC,oBAAoB,EAAE,aAAa,CAAC;KAC9C;CACD,CAAC,CAAC"}
|
package/lib/date.d.ts
CHANGED
package/lib/date.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../src/date.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,GAAI,MAAM,IAAI,KAAG,MAe7C,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,IAAI,MAAM,KAAG,MAmB3C,CAAC"}
|
|
1
|
+
{"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../src/date.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,GAAI,MAAM,IAAI,KAAG,MAe7C,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,MAAM,IAAI,EAAE,WAAW,MAAM,KAAG,MACoD,CAAC;AAEhH,eAAO,MAAM,cAAc,GAAI,IAAI,MAAM,KAAG,MAmB3C,CAAC"}
|
package/lib/date.js
CHANGED
|
@@ -12,6 +12,7 @@ export const toLocalISOString = (date) => {
|
|
|
12
12
|
const offsetMinutes = `${Math.abs(offset) % 60}`.padStart(2, '0');
|
|
13
13
|
return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${ms}${sign}${offsetHours}:${offsetMinutes}`;
|
|
14
14
|
};
|
|
15
|
+
export const formatDate = (date, timeZone) => new Intl.DateTimeFormat('en-CA', { timeZone, year: 'numeric', month: '2-digit', day: '2-digit' }).format(date);
|
|
15
16
|
export const formatDuration = (ms) => {
|
|
16
17
|
if (ms < 1000) {
|
|
17
18
|
return `${ms}ms`;
|
package/lib/date.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.js","sourceRoot":"","sources":["../src/date.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAU,EAAE;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACrC,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5E,MAAM,aAAa,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAElE,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,IAAI,OAAO,IAAI,EAAE,GAAG,IAAI,GAAG,WAAW,IAAI,aAAa,EAAE,CAAC;AAC7G,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAU,EAAU,EAAE;IACpD,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QACf,OAAO,GAAG,EAAE,IAAI,CAAC;IAClB,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"date.js","sourceRoot":"","sources":["../src/date.ts"],"names":[],"mappings":"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"}
|
package/lib/download.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const download: (url: string, filePath: string, init?: RequestInit, timeoutMs?: number) => Promise<
|
|
1
|
+
export declare const download: (url: string, filePath: string, init?: RequestInit, timeoutMs?: number) => Promise<number>;
|
|
2
2
|
//# sourceMappingURL=download.d.ts.map
|
package/lib/download.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,QAAQ,GACpB,KAAK,MAAM,EACX,UAAU,MAAM,EAChB,OAAO,WAAW,EAClB,kBAAyB,KACvB,OAAO,CAAC,MAAM,CAgBhB,CAAC"}
|
package/lib/download.js
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
|
+
import { Readable } from 'node:stream';
|
|
3
|
+
import { pipeline } from 'node:stream/promises';
|
|
2
4
|
import { HttpError } from './http.js';
|
|
5
|
+
// fetch hands back the global ReadableStream, which Readable.fromWeb does not accept,
|
|
6
|
+
// so the body is drained through its reader instead.
|
|
7
|
+
const readChunks = async function* (body) {
|
|
8
|
+
const reader = body.getReader();
|
|
9
|
+
try {
|
|
10
|
+
for (;;) {
|
|
11
|
+
const result = await reader.read();
|
|
12
|
+
if (result.done) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
yield result.value;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
reader.releaseLock();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
3
22
|
export const download = async (url, filePath, init, timeoutMs = 5 * 60 * 1000) => {
|
|
4
23
|
const resp = await fetch(url, {
|
|
5
24
|
signal: AbortSignal.timeout(timeoutMs),
|
|
@@ -8,7 +27,11 @@ export const download = async (url, filePath, init, timeoutMs = 5 * 60 * 1000) =
|
|
|
8
27
|
if (!resp.ok) {
|
|
9
28
|
throw new HttpError(resp.status, resp.statusText);
|
|
10
29
|
}
|
|
11
|
-
|
|
12
|
-
|
|
30
|
+
if (resp.body === null) {
|
|
31
|
+
throw new Error(`Response body is empty: ${url}`);
|
|
32
|
+
}
|
|
33
|
+
await pipeline(Readable.from(readChunks(resp.body)), fs.createWriteStream(filePath));
|
|
34
|
+
const { size } = await fs.promises.stat(filePath);
|
|
35
|
+
return size;
|
|
13
36
|
};
|
|
14
37
|
//# sourceMappingURL=download.js.map
|
package/lib/download.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.js","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC5B,GAAW,EACX,QAAgB,EAChB,IAAkB,EAClB,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,sFAAsF;AACtF,qDAAqD;AACrD,MAAM,UAAU,GAAG,KAAK,SAAS,CAAC,EAAE,IAAmC;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,IAAI,CAAC;QACJ,SAAS,CAAC;YACT,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO;YACR,CAAC;YACD,MAAM,MAAM,CAAC,KAAK,CAAC;QACpB,CAAC;IACF,CAAC;YAAS,CAAC;QACV,MAAM,CAAC,WAAW,EAAE,CAAC;IACtB,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC5B,GAAW,EACX,QAAgB,EAChB,IAAkB,EAClB,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EACP,EAAE;IACpB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC7B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;QACtC,GAAG,IAAI;KACP,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACd,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAErF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC;AACb,CAAC,CAAC"}
|
package/lib/env.d.ts
ADDED
package/lib/env.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,SAY/C,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,MAMzC,CAAC"}
|
package/lib/env.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const readEnv = (name) => {
|
|
2
|
+
// The root entry re-exports modules that read env at load time, so a browser
|
|
3
|
+
// bundle without `process` must get undefined rather than a ReferenceError.
|
|
4
|
+
if (typeof process === 'undefined') {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
const value = process.env[name];
|
|
8
|
+
if (value === undefined || value === '') {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
};
|
|
13
|
+
export const requireEnv = (name) => {
|
|
14
|
+
const value = readEnv(name);
|
|
15
|
+
if (value === undefined) {
|
|
16
|
+
throw new Error(`Missing required env var: ${name}`);
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=env.js.map
|
package/lib/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAsB,EAAE;IAC3D,6EAA6E;IAC7E,4EAA4E;IAC5E,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC"}
|
package/lib/eslint.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eslint.d.ts","sourceRoot":"","sources":["../src/eslint.ts"],"names":[],"mappings":";AAOA,
|
|
1
|
+
{"version":3,"file":"eslint.d.ts","sourceRoot":"","sources":["../src/eslint.ts"],"names":[],"mappings":";AAOA,wBAuJE"}
|