@logship/logger 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/README.md +42 -0
- package/dist/src/client.d.ts +17 -0
- package/dist/src/client.d.ts.map +1 -0
- package/dist/src/client.js +143 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +12 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/transports/noop.d.ts +4 -0
- package/dist/src/transports/noop.d.ts.map +1 -0
- package/dist/src/transports/noop.js +11 -0
- package/dist/src/transports/noop.js.map +1 -0
- package/dist/src/types.d.ts +41 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +10 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +34 -0
package/README.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# @logship/logger
|
|
2
|
+
|
|
3
|
+
Logger SDK: send logs to the ingestion API with buffer, batch, and retry.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @logship/logger
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { init } from '@logship/logger';
|
|
15
|
+
|
|
16
|
+
const logger = init({
|
|
17
|
+
apiKey: process.env.LOGGER_API_KEY,
|
|
18
|
+
minLevel: 'info',
|
|
19
|
+
defaultMetadata: { service: 'api', version: '1.0' },
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
logger.info('User signed in', { userId: 123 });
|
|
23
|
+
logger.error('Payment failed', { orderId: 'ord_abc' });
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Config
|
|
27
|
+
|
|
28
|
+
- **apiKey** (required): API key from the dashboard.
|
|
29
|
+
- **minLevel**: `'debug' | 'info' | 'warn' | 'error'` – events below are dropped. Default `'debug'`.
|
|
30
|
+
- **minLevelByEnv**: e.g. `{ production: 'info' }` – overrides minLevel when `env` matches.
|
|
31
|
+
- **sampleRate**: 0–1; 1 = keep all. Error/warn are always kept unless overridden by sampleRateByLevel.
|
|
32
|
+
- **sampleRateByLevel**: e.g. `{ info: 0.1 }` – per-level sampling.
|
|
33
|
+
- **defaultMetadata**: Merged into every log's metadata.
|
|
34
|
+
- **env**: Environment name (e.g. `'production'`) for minLevelByEnv.
|
|
35
|
+
|
|
36
|
+
## Other languages
|
|
37
|
+
|
|
38
|
+
- **Go:** Use the same ingestion API (`POST /v1/logs` with `Authorization: Bearer <api_key>`). Request body: `{"events":[{...}]}`. See [LOGGER_GO_CLIENT.md](../../documentation/LOGGER_GO_CLIENT.md) in the repo for install (none for REST), request shape, and a minimal Go example. Published as **@logship/logger** on npm.
|
|
39
|
+
|
|
40
|
+
## Sprint 1
|
|
41
|
+
|
|
42
|
+
- No flush to API yet; events are buffered in memory. Flush will be wired in a later sprint.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { LEVEL_ORDER, type LogEvent, type LogLevel, type LoggerConfig } from './types';
|
|
2
|
+
declare const LEVELS: LogLevel[];
|
|
3
|
+
export interface LoggerInstance {
|
|
4
|
+
debug(message: string, metadata?: Record<string, unknown>): void;
|
|
5
|
+
info(message: string, metadata?: Record<string, unknown>): void;
|
|
6
|
+
warn(message: string, metadata?: Record<string, unknown>): void;
|
|
7
|
+
error(message: string, metadata?: Record<string, unknown>): void;
|
|
8
|
+
/** Flush buffer: send up to batchSize events to each transport. */
|
|
9
|
+
flush(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare function init(config: LoggerConfig): LoggerInstance;
|
|
12
|
+
/** For tests: get current buffer (read-only). */
|
|
13
|
+
export declare function getBuffer(): readonly LogEvent[];
|
|
14
|
+
/** For tests: clear buffer and config; stop flush interval. */
|
|
15
|
+
export declare function reset(): void;
|
|
16
|
+
export { LEVEL_ORDER, LEVELS };
|
|
17
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvF,QAAA,MAAM,MAAM,EAAE,QAAQ,EAAuC,CAAC;AAgC9D,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACjE,mEAAmE;IACnE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAmCD,wBAAgB,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAqCzD;AA4BD,iDAAiD;AACjD,wBAAgB,SAAS,IAAI,SAAS,QAAQ,EAAE,CAE/C;AAED,+DAA+D;AAC/D,wBAAgB,KAAK,IAAI,IAAI,CAO5B;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LEVELS = exports.LEVEL_ORDER = void 0;
|
|
4
|
+
exports.init = init;
|
|
5
|
+
exports.getBuffer = getBuffer;
|
|
6
|
+
exports.reset = reset;
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
Object.defineProperty(exports, "LEVEL_ORDER", { enumerable: true, get: function () { return types_1.LEVEL_ORDER; } });
|
|
9
|
+
const noop_1 = require("./transports/noop");
|
|
10
|
+
const LEVELS = ['debug', 'info', 'warn', 'error'];
|
|
11
|
+
exports.LEVELS = LEVELS;
|
|
12
|
+
const DEFAULT_BATCH_SIZE = 50;
|
|
13
|
+
const DEFAULT_FLUSH_INTERVAL_MS = 5000;
|
|
14
|
+
function randomId() {
|
|
15
|
+
return 'evt_' + Math.random().toString(36).slice(2) + Date.now().toString(36);
|
|
16
|
+
}
|
|
17
|
+
function effectiveMinLevel(config) {
|
|
18
|
+
const env = config.env ?? (typeof process !== 'undefined' ? process.env?.NODE_ENV ?? '' : '');
|
|
19
|
+
const envKey = typeof env === 'string' ? env : '';
|
|
20
|
+
const byEnv = config.minLevelByEnv?.[envKey];
|
|
21
|
+
const level = byEnv ?? config.minLevel ?? 'debug';
|
|
22
|
+
return types_1.LEVEL_ORDER[level] ?? types_1.LEVEL_ORDER.debug;
|
|
23
|
+
}
|
|
24
|
+
function effectiveSampleRate(level, config) {
|
|
25
|
+
const byLevel = config.sampleRateByLevel;
|
|
26
|
+
if (byLevel && level in byLevel)
|
|
27
|
+
return byLevel[level];
|
|
28
|
+
if (level === 'error' || level === 'warn')
|
|
29
|
+
return 1;
|
|
30
|
+
return config.sampleRate ?? 1;
|
|
31
|
+
}
|
|
32
|
+
function mergeMetadata(defaultMetadata, metadata) {
|
|
33
|
+
if (!defaultMetadata && !metadata)
|
|
34
|
+
return undefined;
|
|
35
|
+
return { ...defaultMetadata, ...metadata };
|
|
36
|
+
}
|
|
37
|
+
let globalConfig = null;
|
|
38
|
+
const buffer = [];
|
|
39
|
+
let flushIntervalId = null;
|
|
40
|
+
function getEffectiveTransports(config) {
|
|
41
|
+
const t = config.transports;
|
|
42
|
+
if (t && t.length > 0)
|
|
43
|
+
return t;
|
|
44
|
+
return [noop_1.noopTransport];
|
|
45
|
+
}
|
|
46
|
+
function getBatchSize(config) {
|
|
47
|
+
const n = config.batchSize ?? DEFAULT_BATCH_SIZE;
|
|
48
|
+
return n > 0 ? n : DEFAULT_BATCH_SIZE;
|
|
49
|
+
}
|
|
50
|
+
async function doFlush() {
|
|
51
|
+
const config = globalConfig;
|
|
52
|
+
if (!config)
|
|
53
|
+
return;
|
|
54
|
+
const batchSize = getBatchSize(config);
|
|
55
|
+
const batch = buffer.splice(0, batchSize);
|
|
56
|
+
if (batch.length === 0)
|
|
57
|
+
return;
|
|
58
|
+
const transports = getEffectiveTransports(config);
|
|
59
|
+
await Promise.all(transports.map(async (t) => {
|
|
60
|
+
try {
|
|
61
|
+
await t.send([...batch]);
|
|
62
|
+
}
|
|
63
|
+
catch (_err) {
|
|
64
|
+
// best-effort: one transport failure does not block others
|
|
65
|
+
}
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
function init(config) {
|
|
69
|
+
if (!config?.apiKey || String(config.apiKey).trim() === '') {
|
|
70
|
+
throw new Error('Logger.init: apiKey is required');
|
|
71
|
+
}
|
|
72
|
+
if (flushIntervalId) {
|
|
73
|
+
clearInterval(flushIntervalId);
|
|
74
|
+
flushIntervalId = null;
|
|
75
|
+
}
|
|
76
|
+
globalConfig = {
|
|
77
|
+
...config,
|
|
78
|
+
batchSize: config.batchSize ?? DEFAULT_BATCH_SIZE,
|
|
79
|
+
flushIntervalMs: config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,
|
|
80
|
+
};
|
|
81
|
+
const intervalMs = globalConfig.flushIntervalMs ?? 0;
|
|
82
|
+
if (intervalMs > 0) {
|
|
83
|
+
flushIntervalId = setInterval(() => {
|
|
84
|
+
doFlush().catch(() => { });
|
|
85
|
+
}, intervalMs);
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
debug(msg, meta) {
|
|
89
|
+
enqueue('debug', msg, meta);
|
|
90
|
+
},
|
|
91
|
+
info(msg, meta) {
|
|
92
|
+
enqueue('info', msg, meta);
|
|
93
|
+
},
|
|
94
|
+
warn(msg, meta) {
|
|
95
|
+
enqueue('warn', msg, meta);
|
|
96
|
+
},
|
|
97
|
+
error(msg, meta) {
|
|
98
|
+
enqueue('error', msg, meta);
|
|
99
|
+
},
|
|
100
|
+
async flush() {
|
|
101
|
+
await doFlush();
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function enqueue(level, message, metadata) {
|
|
106
|
+
const config = globalConfig;
|
|
107
|
+
if (!config)
|
|
108
|
+
return;
|
|
109
|
+
const minOrder = effectiveMinLevel(config);
|
|
110
|
+
if (types_1.LEVEL_ORDER[level] < minOrder)
|
|
111
|
+
return;
|
|
112
|
+
const rate = effectiveSampleRate(level, config);
|
|
113
|
+
if (rate < 1 && Math.random() >= rate)
|
|
114
|
+
return;
|
|
115
|
+
const merged = mergeMetadata(config.defaultMetadata, metadata);
|
|
116
|
+
const event = {
|
|
117
|
+
id: randomId(),
|
|
118
|
+
level,
|
|
119
|
+
message,
|
|
120
|
+
metadata: Object.keys(merged ?? {}).length ? merged : undefined,
|
|
121
|
+
timestamp: new Date().toISOString(),
|
|
122
|
+
env: config.env,
|
|
123
|
+
};
|
|
124
|
+
buffer.push(event);
|
|
125
|
+
const batchSize = getBatchSize(config);
|
|
126
|
+
if (buffer.length >= batchSize) {
|
|
127
|
+
setImmediate(() => doFlush().catch(() => { }));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** For tests: get current buffer (read-only). */
|
|
131
|
+
function getBuffer() {
|
|
132
|
+
return buffer;
|
|
133
|
+
}
|
|
134
|
+
/** For tests: clear buffer and config; stop flush interval. */
|
|
135
|
+
function reset() {
|
|
136
|
+
if (flushIntervalId) {
|
|
137
|
+
clearInterval(flushIntervalId);
|
|
138
|
+
flushIntervalId = null;
|
|
139
|
+
}
|
|
140
|
+
buffer.length = 0;
|
|
141
|
+
globalConfig = null;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAC5F,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.noopTransport = exports.LEVELS = exports.LEVEL_ORDER = exports.reset = exports.getBuffer = exports.init = void 0;
|
|
4
|
+
var client_1 = require("./client");
|
|
5
|
+
Object.defineProperty(exports, "init", { enumerable: true, get: function () { return client_1.init; } });
|
|
6
|
+
Object.defineProperty(exports, "getBuffer", { enumerable: true, get: function () { return client_1.getBuffer; } });
|
|
7
|
+
Object.defineProperty(exports, "reset", { enumerable: true, get: function () { return client_1.reset; } });
|
|
8
|
+
Object.defineProperty(exports, "LEVEL_ORDER", { enumerable: true, get: function () { return client_1.LEVEL_ORDER; } });
|
|
9
|
+
Object.defineProperty(exports, "LEVELS", { enumerable: true, get: function () { return client_1.LEVELS; } });
|
|
10
|
+
var noop_1 = require("./transports/noop");
|
|
11
|
+
Object.defineProperty(exports, "noopTransport", { enumerable: true, get: function () { return noop_1.noopTransport; } });
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAA4F;AAAnF,8FAAA,IAAI,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,+FAAA,KAAK,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,gGAAA,MAAM,OAAA;AAEpD,0CAAkD;AAAzC,qGAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../../src/transports/noop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,UAAU,CAAC;AAEpD,wDAAwD;AACxD,eAAO,MAAM,aAAa,EAAE,SAK3B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.noopTransport = void 0;
|
|
4
|
+
/** Built-in transport that drops all events (no-op). */
|
|
5
|
+
exports.noopTransport = {
|
|
6
|
+
name: 'noop',
|
|
7
|
+
async send(_events) {
|
|
8
|
+
// no-op
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=noop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop.js","sourceRoot":"","sources":["../../../src/transports/noop.ts"],"names":[],"mappings":";;;AAEA,wDAAwD;AAC3C,QAAA,aAAa,GAAc;IACtC,IAAI,EAAE,MAAM;IACZ,KAAK,CAAC,IAAI,CAAC,OAAmB;QAC5B,QAAQ;IACV,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log levels: debug < info < warn < error
|
|
3
|
+
*/
|
|
4
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
5
|
+
export declare const LEVEL_ORDER: Record<LogLevel, number>;
|
|
6
|
+
export interface LogEvent {
|
|
7
|
+
id: string;
|
|
8
|
+
level: LogLevel;
|
|
9
|
+
message: string;
|
|
10
|
+
metadata?: Record<string, unknown>;
|
|
11
|
+
timestamp: string;
|
|
12
|
+
env?: string;
|
|
13
|
+
source?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Transport: receives batches of events on flush. */
|
|
16
|
+
export interface Transport {
|
|
17
|
+
name: string;
|
|
18
|
+
send(events: LogEvent[]): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export interface LoggerConfig {
|
|
21
|
+
apiKey: string;
|
|
22
|
+
/** Minimum level to send; events below are dropped. Default 'debug' */
|
|
23
|
+
minLevel?: LogLevel;
|
|
24
|
+
/** Per-environment min level, e.g. { production: 'info' } */
|
|
25
|
+
minLevelByEnv?: Record<string, LogLevel>;
|
|
26
|
+
/** Global sampling rate 0–1; 1 = keep all. Default 1 */
|
|
27
|
+
sampleRate?: number;
|
|
28
|
+
/** Per-level sampling; error/warn default to 1 if not set */
|
|
29
|
+
sampleRateByLevel?: Partial<Record<LogLevel, number>>;
|
|
30
|
+
/** Merged into every log's metadata */
|
|
31
|
+
defaultMetadata?: Record<string, unknown>;
|
|
32
|
+
/** Environment name (e.g. 'production'); used for minLevelByEnv */
|
|
33
|
+
env?: string;
|
|
34
|
+
/** Max events per batch when flushing. Default 50 */
|
|
35
|
+
batchSize?: number;
|
|
36
|
+
/** Max ms before auto-flush even if batch not full. Default 5000; 0 = no interval */
|
|
37
|
+
flushIntervalMs?: number;
|
|
38
|
+
/** Transports to send batches to on flush. Default [noopTransport] */
|
|
39
|
+
transports?: Transport[];
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAKhD,CAAC;AAEF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,sDAAsD;AACtD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";;;AAKa,QAAA,WAAW,GAA6B;IACnD,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@logship/logger",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Logger SDK: send logs to ingestion API with buffer, batch, retry",
|
|
5
|
+
"main": "dist/src/index.js",
|
|
6
|
+
"types": "dist/src/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"test": "npm run build && node --test dist/__tests__/*.test.js",
|
|
10
|
+
"test:run": "npm run build && node --test dist/__tests__/*.test.js",
|
|
11
|
+
"lint": "echo 'Lint placeholder'"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist/src",
|
|
15
|
+
"README.md"
|
|
16
|
+
],
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=18"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"logger",
|
|
22
|
+
"logging",
|
|
23
|
+
"sdk"
|
|
24
|
+
],
|
|
25
|
+
"author": "",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^20.10.0",
|
|
32
|
+
"typescript": "^5.3.0"
|
|
33
|
+
}
|
|
34
|
+
}
|