@zeltjs/kv 0.8.1 → 0.8.2-canary.1

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.
@@ -0,0 +1,8 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_adaptor_memory = require("../adaptor-memory-30VRE4-j.cjs");
3
+ Object.defineProperty(exports, "MemoryKVAdaptor", {
4
+ enumerable: true,
5
+ get: function() {
6
+ return require_adaptor_memory.MemoryKVAdaptor;
7
+ }
8
+ });
@@ -0,0 +1,2 @@
1
+ import { t as MemoryKVAdaptor } from "../index-BIhs_eQ2.cjs";
2
+ export { MemoryKVAdaptor };
@@ -0,0 +1,117 @@
1
+ const require_util = require("./util-MAB5bAAE.cjs");
2
+ let _zeltjs_core = require("@zeltjs/core");
3
+ //#region src/adaptor-memory/memory-kv.adaptor.ts
4
+ function _ts_decorate(decorators, target, key, desc) {
5
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
6
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
7
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
8
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
9
+ }
10
+ function _ts_metadata(k, v) {
11
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
12
+ }
13
+ /** @throws {ZeltKVInvalidTtlError} */ function validateTtl(ttlSec) {
14
+ if (ttlSec !== void 0 && ttlSec <= 0) throw new require_util.ZeltKVInvalidTtlError({ ttlSec });
15
+ }
16
+ function makeEntry(raw, ttlSec) {
17
+ return ttlSec !== void 0 ? {
18
+ raw,
19
+ expiresAt: Date.now() + ttlSec * 1e3
20
+ } : { raw };
21
+ }
22
+ var MemoryKVAdaptor = class {
23
+ gc() {
24
+ const now = Date.now();
25
+ for (const [key, entry] of this.data) if (entry.expiresAt !== void 0 && entry.expiresAt <= now) this.data.delete(key);
26
+ }
27
+ async startup() {}
28
+ async shutdown() {
29
+ clearInterval(this.gcInterval);
30
+ }
31
+ namespace(prefix) {
32
+ return new MemoryKVStore(this.data, prefix, this.util);
33
+ }
34
+ constructor(util = (0, _zeltjs_core.inject)(require_util.KVUtilService), lifecycle = (0, _zeltjs_core.inject)(_zeltjs_core.LifecycleManager)) {
35
+ this.util = util;
36
+ this.data = /* @__PURE__ */ new Map();
37
+ this.gcInterval = setInterval(() => this.gc(), 6e4);
38
+ this.gcInterval.unref();
39
+ lifecycle.register(this);
40
+ }
41
+ };
42
+ MemoryKVAdaptor = _ts_decorate([
43
+ (0, _zeltjs_core.Injectable)(),
44
+ _ts_metadata("design:type", Function),
45
+ _ts_metadata("design:paramtypes", [void 0, void 0])
46
+ ], MemoryKVAdaptor);
47
+ var MemoryKVStore = class MemoryKVStore {
48
+ k(key) {
49
+ return this.util.joinPrefix(this.prefix, key);
50
+ }
51
+ current(key) {
52
+ const entry = this.data.get(this.k(key));
53
+ if (!entry) return void 0;
54
+ if (entry.expiresAt !== void 0 && entry.expiresAt <= Date.now()) {
55
+ this.data.delete(this.k(key));
56
+ return;
57
+ }
58
+ return entry;
59
+ }
60
+ async get(key) {
61
+ const entry = this.current(key);
62
+ return entry ? this.util.deserialize(entry.raw) : void 0;
63
+ }
64
+ /** @throws {ZeltKVInvalidTtlError} */ async set(key, value, opts) {
65
+ validateTtl(opts?.ttlSec);
66
+ const raw = this.util.serialize(value);
67
+ this.data.set(this.k(key), makeEntry(raw, opts?.ttlSec));
68
+ }
69
+ async del(key) {
70
+ this.data.delete(this.k(key));
71
+ }
72
+ async has(key) {
73
+ return this.current(key) !== void 0;
74
+ }
75
+ /** @throws {ZeltKVInvalidTtlError} */ async expire(key, ttlSec) {
76
+ validateTtl(ttlSec);
77
+ const entry = this.current(key);
78
+ if (!entry) return false;
79
+ entry.expiresAt = Date.now() + ttlSec * 1e3;
80
+ return true;
81
+ }
82
+ namespace(sub) {
83
+ return new MemoryKVStore(this.data, this.util.joinPrefix(this.prefix, sub), this.util);
84
+ }
85
+ /** @throws {ZeltKVInvalidTtlError} */ async incr(key, by = 1, opts) {
86
+ validateTtl(opts?.ttlSec);
87
+ const k = this.k(key);
88
+ const entry = this.current(key);
89
+ if (!entry) {
90
+ const raw = this.util.serialize(by);
91
+ this.data.set(k, makeEntry(raw, opts?.ttlSec));
92
+ return by;
93
+ }
94
+ const next = (this.util.deserialize(entry.raw) ?? 0) + by;
95
+ entry.raw = this.util.serialize(next);
96
+ return next;
97
+ }
98
+ /** @throws {ZeltKVInvalidTtlError} */ async setnx(key, value, opts) {
99
+ validateTtl(opts?.ttlSec);
100
+ if (this.current(key)) return false;
101
+ const raw = this.util.serialize(value);
102
+ this.data.set(this.k(key), makeEntry(raw, opts?.ttlSec));
103
+ return true;
104
+ }
105
+ constructor(data, prefix, util) {
106
+ this.data = data;
107
+ this.prefix = prefix;
108
+ this.util = util;
109
+ }
110
+ };
111
+ //#endregion
112
+ Object.defineProperty(exports, "MemoryKVAdaptor", {
113
+ enumerable: true,
114
+ get: function() {
115
+ return MemoryKVAdaptor;
116
+ }
117
+ });
@@ -0,0 +1,103 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_util = require("../util-MAB5bAAE.cjs");
3
+ let _zeltjs_core = require("@zeltjs/core");
4
+ let _zeltjs_redis = require("@zeltjs/redis");
5
+ //#region src/adaptor-redis/lua-scripts.lib.ts
6
+ const INCR_WITH_TTL_LUA = `
7
+ if ARGV[2] ~= '' then
8
+ redis.call('SET', KEYS[1], 0, 'EX', ARGV[2], 'NX')
9
+ end
10
+ return redis.call('INCRBY', KEYS[1], ARGV[1])
11
+ `;
12
+ //#endregion
13
+ //#region src/adaptor-redis/redis-kv-store.lib.ts
14
+ /** @throws {ZeltKVInvalidTtlError} */ const validateTtl = (ttlSec) => {
15
+ if (ttlSec !== void 0 && ttlSec <= 0) throw new require_util.ZeltKVInvalidTtlError({ ttlSec });
16
+ };
17
+ var RedisKVStore = class RedisKVStore {
18
+ k(key) {
19
+ return this.util.joinPrefix(this.prefix, key);
20
+ }
21
+ async get(key) {
22
+ const raw = await this.client.get(this.k(key));
23
+ return raw === null ? void 0 : this.util.deserialize(raw);
24
+ }
25
+ /** @throws {ZeltKVInvalidTtlError} */ async set(key, value, opts) {
26
+ validateTtl(opts?.ttlSec);
27
+ const json = this.util.serialize(value);
28
+ if (opts?.ttlSec !== void 0) await this.client.set(this.k(key), json, "EX", opts.ttlSec);
29
+ else await this.client.set(this.k(key), json);
30
+ }
31
+ async del(key) {
32
+ await this.client.del(this.k(key));
33
+ }
34
+ async has(key) {
35
+ return await this.client.exists(this.k(key)) === 1;
36
+ }
37
+ /** @throws {ZeltKVInvalidTtlError} */ async expire(key, ttlSec) {
38
+ validateTtl(ttlSec);
39
+ return await this.client.expire(this.k(key), ttlSec) === 1;
40
+ }
41
+ namespace(sub) {
42
+ return new RedisKVStore(this.client, this.util.joinPrefix(this.prefix, sub), this.util);
43
+ }
44
+ /** @throws {ZeltKVInvalidTtlError} */ async incr(key, by = 1, opts) {
45
+ validateTtl(opts?.ttlSec);
46
+ const ttlArg = opts?.ttlSec !== void 0 ? String(opts.ttlSec) : "";
47
+ return this.client.incrWithTtl(this.k(key), by, ttlArg);
48
+ }
49
+ /** @throws {ZeltKVInvalidTtlError} */ async setnx(key, value, opts) {
50
+ validateTtl(opts?.ttlSec);
51
+ const json = this.util.serialize(value);
52
+ return (opts?.ttlSec !== void 0 ? await this.client.set(this.k(key), json, "EX", opts.ttlSec, "NX") : await this.client.set(this.k(key), json, "NX")) === "OK";
53
+ }
54
+ constructor(client, prefix, util) {
55
+ this.client = client;
56
+ this.prefix = prefix;
57
+ this.util = util;
58
+ }
59
+ };
60
+ //#endregion
61
+ //#region src/adaptor-redis/redis-kv.adaptor.ts
62
+ function _ts_decorate(decorators, target, key, desc) {
63
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
64
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
65
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
66
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
67
+ }
68
+ function _ts_metadata(k, v) {
69
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
70
+ }
71
+ var RedisKVAdaptor = class {
72
+ async startup() {
73
+ this.redis.client.defineCommand("incrWithTtl", {
74
+ numberOfKeys: 1,
75
+ lua: INCR_WITH_TTL_LUA
76
+ });
77
+ }
78
+ async shutdown() {}
79
+ namespace(prefix) {
80
+ return new RedisKVStore(this.redis.client, prefix, this.util);
81
+ }
82
+ constructor(redis = (0, _zeltjs_core.inject)(_zeltjs_redis.RedisService), util = (0, _zeltjs_core.inject)(require_util.KVUtilService), lifecycle = (0, _zeltjs_core.inject)(_zeltjs_core.LifecycleManager)) {
83
+ this.redis = redis;
84
+ this.util = util;
85
+ lifecycle.register(this);
86
+ }
87
+ };
88
+ RedisKVAdaptor = _ts_decorate([
89
+ (0, _zeltjs_core.Injectable)(),
90
+ _ts_metadata("design:type", Function),
91
+ _ts_metadata("design:paramtypes", [
92
+ void 0,
93
+ void 0,
94
+ void 0
95
+ ])
96
+ ], RedisKVAdaptor);
97
+ //#endregion
98
+ Object.defineProperty(exports, "RedisKVAdaptor", {
99
+ enumerable: true,
100
+ get: function() {
101
+ return RedisKVAdaptor;
102
+ }
103
+ });
@@ -0,0 +1,16 @@
1
+ import { n as AtomicKVAdaptor, r as AtomicKVStore, s as NonEmptyString, t as KVUtilService } from "../kvutil.service-DhchyF5s.cjs";
2
+ import { Lifecycle, LifecycleManager } from "@zeltjs/core";
3
+ import { RedisService } from "@zeltjs/redis";
4
+
5
+ //#region src/adaptor-redis/redis-kv.adaptor.d.ts
6
+ declare class RedisKVAdaptor implements AtomicKVAdaptor, Lifecycle {
7
+ private readonly redis;
8
+ private readonly util;
9
+ constructor(redis?: RedisService, util?: KVUtilService, lifecycle?: LifecycleManager);
10
+ startup(): Promise<void>;
11
+ shutdown(): Promise<void>;
12
+ namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore;
13
+ }
14
+ //#endregion
15
+ export { RedisKVAdaptor };
16
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/adaptor-redis/redis-kv.adaptor.ts"],"mappings":";;;;;cAUa,cAAA,YAA0B,eAAA,EAAiB,SAAA;EAAA,iBAEnC,KAAA;EAAA,iBACA,IAAA;cADA,KAAA,GAAK,YAAA,EACL,IAAA,GAAI,aAAA,EACrB,SAAA,GAAS,gBAAA;EAKL,OAAA,CAAA,GAAW,OAAA;EAOX,QAAA,CAAA,GAAY,OAAA;EAElB,SAAA,wBAAA,CAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,aAAA;AAAA"}
@@ -0,0 +1,17 @@
1
+ import { n as AtomicKVAdaptor, r as AtomicKVStore, s as NonEmptyString, t as KVUtilService } from "./kvutil.service-DhchyF5s.cjs";
2
+ import { Lifecycle, LifecycleManager } from "@zeltjs/core";
3
+
4
+ //#region src/adaptor-memory/memory-kv.adaptor.d.ts
5
+ declare class MemoryKVAdaptor implements AtomicKVAdaptor, Lifecycle {
6
+ private readonly util;
7
+ private readonly data;
8
+ private readonly gcInterval;
9
+ constructor(util?: KVUtilService, lifecycle?: LifecycleManager);
10
+ private gc;
11
+ startup(): Promise<void>;
12
+ shutdown(): Promise<void>;
13
+ namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore;
14
+ }
15
+ //#endregion
16
+ export { MemoryKVAdaptor as t };
17
+ //# sourceMappingURL=index-BIhs_eQ2.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BIhs_eQ2.d.cts","names":[],"sources":["../src/adaptor-memory/memory-kv.adaptor.ts"],"mappings":";;;;cA6Ba,eAAA,YAA2B,eAAA,EAAiB,SAAA;EAAA,iBAKpC,IAAA;EAAA,iBAJF,IAAA;EAAA,iBACA,UAAA;cAGE,IAAA,GAAI,aAAA,EACrB,SAAA,GAAS,gBAAA;EAAA,QAOH,EAAA;EASF,OAAA,CAAA,GAAW,OAAA;EAEX,QAAA,CAAA,GAAY,OAAA;EAIlB,SAAA,wBAAA,CAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,aAAA;AAAA"}
package/dist/index.cjs ADDED
@@ -0,0 +1,28 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_util = require("./util-MAB5bAAE.cjs");
3
+ const require_adaptor_memory = require("./adaptor-memory-30VRE4-j.cjs");
4
+ Object.defineProperty(exports, "KVUtilService", {
5
+ enumerable: true,
6
+ get: function() {
7
+ return require_util.KVUtilService;
8
+ }
9
+ });
10
+ Object.defineProperty(exports, "MemoryKV", {
11
+ enumerable: true,
12
+ get: function() {
13
+ return require_adaptor_memory.MemoryKVAdaptor;
14
+ }
15
+ });
16
+ Object.defineProperty(exports, "MemoryKVAdaptor", {
17
+ enumerable: true,
18
+ get: function() {
19
+ return require_adaptor_memory.MemoryKVAdaptor;
20
+ }
21
+ });
22
+ Object.defineProperty(exports, "MemoryKVService", {
23
+ enumerable: true,
24
+ get: function() {
25
+ return require_adaptor_memory.MemoryKVAdaptor;
26
+ }
27
+ });
28
+ exports.ZeltKVInvalidTtlError = require_util.ZeltKVInvalidTtlError;
@@ -0,0 +1,15 @@
1
+ import { a as KVAdaptor, c as SetOptions, i as Defined, n as AtomicKVAdaptor, o as KVStore, r as AtomicKVStore, s as NonEmptyString, t as KVUtilService } from "./kvutil.service-DhchyF5s.cjs";
2
+ import { t as MemoryKVAdaptor } from "./index-BIhs_eQ2.cjs";
3
+
4
+ //#region src/kv.errors.d.ts
5
+ declare const ZeltKVInvalidTtlError: new (context: {
6
+ ttlSec: number;
7
+ }, cause?: unknown) => Error & {
8
+ readonly name: string;
9
+ readonly context: {
10
+ ttlSec: number;
11
+ };
12
+ };
13
+ //#endregion
14
+ export { type AtomicKVAdaptor, type AtomicKVStore, type Defined, type KVAdaptor, type KVStore, KVUtilService, MemoryKVAdaptor as MemoryKV, MemoryKVAdaptor, MemoryKVAdaptor as MemoryKVService, type NonEmptyString, type SetOptions, ZeltKVInvalidTtlError };
15
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/kv.errors.ts"],"mappings":";;;;cAEa,qBAAA,OAAqB,OAAA;;uBAGjC,KAAA;EAAA"}
@@ -0,0 +1,59 @@
1
+ //#region src/kv.types.d.ts
2
+ /** 空文字を型レベルで禁止 */
3
+ type NonEmptyString<S extends string> = S extends '' ? never : S;
4
+ /** undefined を除外した値型 */
5
+ type Defined = {} | null;
6
+ /** Top-level adaptor. namespace で view を取り出すまで data ops は不可。 */
7
+ interface KVAdaptor {
8
+ namespace<const S extends string>(prefix: NonEmptyString<S>): KVStore;
9
+ }
10
+ /** atomic 操作対応の adaptor。namespace の戻り値が AtomicKVStore */
11
+ interface AtomicKVAdaptor extends KVAdaptor {
12
+ namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore;
13
+ }
14
+ /** namespaced view。実際の data ops はここ */
15
+ interface KVStore {
16
+ get<T>(key: string): Promise<T | undefined>;
17
+ /**
18
+ * @throws {ZeltKVInvalidTtlError}
19
+ */
20
+ set<T extends Defined>(key: string, value: T, opts?: SetOptions): Promise<void>;
21
+ del(key: string): Promise<void>;
22
+ has(key: string): Promise<boolean>;
23
+ /**
24
+ * TTL 延長 (session touch / lock extend 用)。key 不在時は false。
25
+ * @throws {ZeltKVInvalidTtlError}
26
+ */
27
+ expire(key: string, ttlSec: number): Promise<boolean>;
28
+ /** 子 namespace。チェーン可能。 */
29
+ namespace<const S extends string>(prefix: NonEmptyString<S>): KVStore;
30
+ }
31
+ /** atomic 操作対応 view */
32
+ interface AtomicKVStore extends KVStore {
33
+ /**
34
+ * atomic incr。最初の incr 時のみ TTL をセット。
35
+ * @throws {ZeltKVInvalidTtlError}
36
+ */
37
+ incr(key: string, by?: number, opts?: {
38
+ ttlSec?: number;
39
+ }): Promise<number>;
40
+ /**
41
+ * atomic set if not exists。set されたら true、既存なら false。
42
+ * @throws {ZeltKVInvalidTtlError}
43
+ */
44
+ setnx<T extends Defined>(key: string, value: T, opts?: SetOptions): Promise<boolean>;
45
+ namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore;
46
+ }
47
+ type SetOptions = {
48
+ ttlSec?: number;
49
+ };
50
+ //#endregion
51
+ //#region src/util/kvutil.service.d.ts
52
+ declare class KVUtilService {
53
+ joinPrefix(a: string, b: string): string;
54
+ serialize(value: Defined): string;
55
+ deserialize<T>(raw: string | null): T | undefined;
56
+ }
57
+ //#endregion
58
+ export { KVAdaptor as a, SetOptions as c, Defined as i, AtomicKVAdaptor as n, KVStore as o, AtomicKVStore as r, NonEmptyString as s, KVUtilService as t };
59
+ //# sourceMappingURL=kvutil.service-DhchyF5s.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kvutil.service-DhchyF5s.d.cts","names":[],"sources":["../src/kv.types.ts","../src/util/kvutil.service.ts"],"mappings":";;KACY,cAAA,qBAAmC,CAAA,sBAAuB,CAAA;;KAI1D,OAAA;;UAGK,SAAA;EACf,SAAA,yBAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,OAAA;AAAA;;UAI/C,eAAA,SAAwB,SAAA;EACvC,SAAA,yBAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,aAAA;AAAA;;UAI/C,OAAA;EACf,GAAA,IAAO,GAAA,WAAc,OAAA,CAAQ,CAAA;EAXd;;;EAef,GAAA,WAAc,OAAA,EAAS,GAAA,UAAa,KAAA,EAAO,CAAA,EAAG,IAAA,GAAO,UAAA,GAAa,OAAA;EAClE,GAAA,CAAI,GAAA,WAAc,OAAA;EAClB,GAAA,CAAI,GAAA,WAAc,OAAA;EAhBmD;;;;EAqBrE,MAAA,CAAO,GAAA,UAAa,MAAA,WAAiB,OAAA;EArBoB;EAuBzD,SAAA,yBAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,OAAA;AAAA;;UAI/C,aAAA,SAAsB,OAAA;EAvBtB;;;;EA4Bf,IAAA,CAAK,GAAA,UAAa,EAAA,WAAa,IAAA;IAAS,MAAA;EAAA,IAAoB,OAAA;EA5BZ;;;;EAiChD,KAAA,WAAgB,OAAA,EAAS,GAAA,UAAa,KAAA,EAAO,CAAA,EAAG,IAAA,GAAO,UAAA,GAAa,OAAA;EACpE,SAAA,yBAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,aAAA;AAAA;AAAA,KAGpD,UAAA;EACV,MAAA;AAAA;;;cC7CW,aAAA;EACX,UAAA,CAAW,CAAA,UAAW,CAAA;EAItB,SAAA,CAAU,KAAA,EAAO,OAAA;EAIjB,WAAA,GAAA,CAAe,GAAA,kBAAqB,CAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"util-BMIWgHNV.js","names":["defineError","ZeltKVInvalidTtlError","ctx","ttlSec","Injectable","unsafeTypedJsonParse","KVUtilService","joinPrefix","a","b","serialize","value","JSON","stringify","deserialize","raw","undefined"],"sources":["../src/kv.errors.ts","../../src/callable.ts","../../src/class-token.ts","../../src/json.ts","../src/util/kvutil.service.ts"],"sourcesContent":["import { defineError } from '@zeltjs/core/internal-bridge/errors';\n\nexport const ZeltKVInvalidTtlError = defineError(\n 'ZeltKVInvalidTtlError',\n (ctx: { ttlSec: number }) => `ttlSec must be > 0, got ${ctx.ttlSec}`,\n);\n","export const toUnknownCallable = (fn: unknown): ((...args: unknown[]) => unknown) =>\n fn as (...args: unknown[]) => unknown;\n","export const isClassToken = <T extends object = object>(\n value: unknown,\n): value is new (\n ...args: never[]\n) => T => typeof value === 'function' && 'prototype' in value;\n","export const unsafeTypedJsonParse = <T>(data: string): T => JSON.parse(data) as T;\n","import { Injectable } from '@zeltjs/core';\nimport { unsafeTypedJsonParse } from '@zeltjs/unsafe-type-lib';\n\nimport type { Defined } from '../kv.types';\n\n@Injectable()\nexport class KVUtilService {\n joinPrefix(a: string, b: string): string {\n return a + b;\n }\n\n serialize(value: Defined): string {\n return JSON.stringify(value);\n }\n\n deserialize<T>(raw: string | null): T | undefined {\n if (raw === null) return undefined;\n return unsafeTypedJsonParse<T>(raw);\n }\n}\n"],"mappings":";;;AAEA,MAAaC,wBAAwBD,YACnC,0BACCE,QAA4B,2BAA2BA,IAAIC,SAAQ;;;AGJtE,MAAa,wBAA2B,SAAoB,KAAK,MAAM,KAAK;;;;;;;;;ACM5E,IAAaG,gBAAb,MAAaA;CACXC,WAAWC,GAAWC,GAAmB;AACvC,SAAOD,IAAIC;;CAGbC,UAAUC,OAAwB;AAChC,SAAOC,KAAKC,UAAUF,MAAAA;;CAGxBG,YAAeC,KAAmC;AAChD,MAAIA,QAAQ,KAAM,QAAOC,KAAAA;AACzB,SAAOX,qBAAwBU,IAAAA"}
1
+ {"version":3,"file":"util-BMIWgHNV.js","names":["defineError","ZeltKVInvalidTtlError","ctx","ttlSec","Injectable","unsafeTypedJsonParse","KVUtilService","joinPrefix","a","b","serialize","value","JSON","stringify","deserialize","raw","undefined"],"sources":["../src/kv.errors.ts","../../src/callable.ts","../../src/class-constructor.ts","../../src/deferred-value.ts","../../src/injection-token-weak-map.ts","../../src/json.ts","../../src/keyed-values.ts","../src/util/kvutil.service.ts"],"sourcesContent":["import { defineError } from '@zeltjs/core/internal-bridge/errors';\n\nexport const ZeltKVInvalidTtlError = defineError(\n 'ZeltKVInvalidTtlError',\n (ctx: { ttlSec: number }) => `ttlSec must be > 0, got ${ctx.ttlSec}`,\n);\n","export const toUnknownCallable = (fn: unknown): ((...args: unknown[]) => unknown) =>\n fn as (...args: unknown[]) => unknown;\n","export const isClassConstructor = <T extends object = object>(\n value: unknown,\n): value is new (\n ...args: never[]\n) => T => {\n if (typeof value !== 'function') return false;\n\n try {\n Reflect.construct(Object, [], value);\n return true;\n } catch {\n return false;\n }\n};\n","export const DEFERRED_VALUE_TYPE: unique symbol = Symbol('zelt.deferredValueType');\n\nexport type DeferredValueHandle<T> = {\n readonly [DEFERRED_VALUE_TYPE]: T;\n};\n\nexport type DeferredValueOf<THandle extends DeferredValueHandle<unknown>> =\n THandle[typeof DEFERRED_VALUE_TYPE];\n\nexport const unsafeResolveDeferredValue = <THandle extends DeferredValueHandle<unknown>>(\n handle: THandle,\n value: unknown,\n): DeferredValueOf<THandle> => {\n void handle;\n return value as DeferredValueOf<THandle>;\n};\n","import type { InjectionToken } from '@needle-di/core';\n\ntype TokenKey = new (...args: never[]) => unknown;\n\nexport class UnsafeInjectionTokenWeakMap {\n private readonly map = new WeakMap<TokenKey, InjectionToken<unknown>>();\n\n get<T>(key: TokenKey): InjectionToken<T> | undefined {\n const token = this.map.get(key);\n return token as InjectionToken<T> | undefined;\n }\n\n set<T>(key: TokenKey, token: InjectionToken<T>): void {\n this.map.set(key, token as InjectionToken<unknown>);\n }\n}\n","export const unsafeTypedJsonParse = <T>(data: string): T => JSON.parse(data) as T;\n","type KeyedItem = {\n readonly key: PropertyKey;\n};\n\nexport type KeyedMethodValue<TItem, TMethod extends PropertyKey> = TMethod extends keyof TItem\n ? TItem[TMethod] extends (...args: readonly never[]) => infer TValue\n ? Awaited<TValue>\n : never\n : never;\n\nexport type ObjectFromKeyedValues<\n TItems extends readonly KeyedItem[],\n TMethod extends PropertyKey,\n> = {\n readonly [TItem in TItems[number] as TItem['key']]: KeyedMethodValue<TItem, TMethod>;\n};\n\nexport type MapFromKeyedValues<\n TItems extends readonly KeyedItem[],\n TMethod extends PropertyKey,\n> = ReadonlyMap<TItems[number], KeyedMethodValue<TItems[number], TMethod>>;\n\nexport type KeyedValues<TItems extends readonly KeyedItem[], TMethod extends PropertyKey> = {\n readonly object: ObjectFromKeyedValues<TItems, TMethod>;\n readonly map: MapFromKeyedValues<TItems, TMethod>;\n};\n\ntype IsEmptyObject<T> = keyof T extends never ? true : false;\n\nexport type ObjectFromNonEmptyKeyedValues<\n TItems extends readonly KeyedItem[],\n TMethod extends PropertyKey,\n> = {\n readonly [TItem in TItems[number] as IsEmptyObject<KeyedMethodValue<TItem, TMethod>> extends true\n ? never\n : TItem['key']]: KeyedMethodValue<TItem, TMethod>;\n};\n\nconst isEmptyObject = (value: object): boolean => Object.keys(value).length === 0;\n\nexport const unsafeObjectFromKeyedValuesSync = <\n const TMethod extends PropertyKey,\n const TItems extends readonly (KeyedItem & {\n readonly [TKey in TMethod]: () => object;\n })[],\n>(\n items: TItems,\n method: TMethod,\n): ObjectFromKeyedValues<TItems, TMethod> => {\n const result: Record<PropertyKey, object> = {};\n\n for (const item of items) {\n result[item.key] = item[method]();\n }\n\n return result as ObjectFromKeyedValues<TItems, TMethod>;\n};\n\nexport const unsafeObjectFromNonEmptyKeyedValuesSync = <\n const TMethod extends PropertyKey,\n const TItems extends readonly (KeyedItem & {\n readonly [TKey in TMethod]: () => object;\n })[],\n>(\n items: TItems,\n method: TMethod,\n): ObjectFromNonEmptyKeyedValues<TItems, TMethod> => {\n const result: Record<PropertyKey, object> = {};\n\n for (const item of items) {\n const value = item[method]();\n if (!isEmptyObject(value)) {\n result[item.key] = value;\n }\n }\n\n return result as ObjectFromNonEmptyKeyedValues<TItems, TMethod>;\n};\n\nexport const unsafeObjectFromKeyedValues = async <\n TContext,\n const TMethod extends PropertyKey,\n const TItems extends readonly (KeyedItem & {\n readonly [TKey in TMethod]: (context: TContext) => object | Promise<object>;\n })[],\n>(\n items: TItems,\n method: TMethod,\n context: TContext,\n): Promise<ObjectFromKeyedValues<TItems, TMethod>> => {\n const result: Record<PropertyKey, object> = {};\n\n for (const item of items) {\n result[item.key] = await item[method](context);\n }\n\n return result as ObjectFromKeyedValues<TItems, TMethod>;\n};\n\nexport const unsafeKeyedValues = async <\n TContext,\n const TMethod extends PropertyKey,\n const TItems extends readonly (KeyedItem & {\n readonly [TKey in TMethod]: (context: TContext) => object | Promise<object>;\n })[],\n>(\n items: TItems,\n method: TMethod,\n context: TContext,\n): Promise<KeyedValues<TItems, TMethod>> => {\n const object: Record<PropertyKey, object> = {};\n const map = new Map<KeyedItem, object>();\n\n for (const item of items) {\n const value = await item[method](context);\n object[item.key] = value;\n map.set(item, value);\n }\n\n return {\n object: object as ObjectFromKeyedValues<TItems, TMethod>,\n map: map as unknown as MapFromKeyedValues<TItems, TMethod>,\n };\n};\n\nexport const unsafeGetKeyedValueForClass = <\n const TMethod extends PropertyKey,\n const TItems extends readonly KeyedItem[],\n const TClass extends abstract new (\n ...args: never[]\n ) => TItems[number],\n>(\n items: TItems,\n values: MapFromKeyedValues<TItems, TMethod>,\n itemClass: TClass,\n): KeyedMethodValue<InstanceType<TClass>, TMethod> | undefined => {\n const item = items.find((candidate) => candidate instanceof itemClass);\n if (!item) return undefined;\n return values.get(item) as KeyedMethodValue<InstanceType<TClass>, TMethod> | undefined;\n};\n","import { Injectable } from '@zeltjs/core';\nimport { unsafeTypedJsonParse } from '@zeltjs/unsafe-type-lib';\n\nimport type { Defined } from '../kv.types';\n\n@Injectable()\nexport class KVUtilService {\n joinPrefix(a: string, b: string): string {\n return a + b;\n }\n\n serialize(value: Defined): string {\n return JSON.stringify(value);\n }\n\n deserialize<T>(raw: string | null): T | undefined {\n if (raw === null) return undefined;\n return unsafeTypedJsonParse<T>(raw);\n }\n}\n"],"mappings":";;;AAEA,MAAaC,wBAAwBD,YACnC,0BACCE,QAA4B,2BAA2BA,IAAIC,SAAQ;;;AKJtE,MAAa,wBAA2B,SAAoB,KAAK,MAAM,KAAK;;;;;;;;;AEM5E,IAAaG,gBAAb,MAAaA;CACXC,WAAWC,GAAWC,GAAmB;AACvC,SAAOD,IAAIC;;CAGbC,UAAUC,OAAwB;AAChC,SAAOC,KAAKC,UAAUF,MAAAA;;CAGxBG,YAAeC,KAAmC;AAChD,MAAIA,QAAQ,KAAM,QAAOC,KAAAA;AACzB,SAAOX,qBAAwBU,IAAAA"}
@@ -0,0 +1,40 @@
1
+ let _zeltjs_core = require("@zeltjs/core");
2
+ //#region src/kv.errors.ts
3
+ const ZeltKVInvalidTtlError = (0, require("@zeltjs/core/internal-bridge/errors").defineError)("ZeltKVInvalidTtlError", (ctx) => `ttlSec must be > 0, got ${ctx.ttlSec}`);
4
+ //#endregion
5
+ //#region ../unsafe-type-lib/dist/index.js
6
+ const unsafeTypedJsonParse = (data) => JSON.parse(data);
7
+ //#endregion
8
+ //#region src/util/kvutil.service.ts
9
+ function _ts_decorate(decorators, target, key, desc) {
10
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
11
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
12
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
13
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
14
+ }
15
+ var KVUtilService = class {
16
+ joinPrefix(a, b) {
17
+ return a + b;
18
+ }
19
+ serialize(value) {
20
+ return JSON.stringify(value);
21
+ }
22
+ deserialize(raw) {
23
+ if (raw === null) return void 0;
24
+ return unsafeTypedJsonParse(raw);
25
+ }
26
+ };
27
+ KVUtilService = _ts_decorate([(0, _zeltjs_core.Injectable)()], KVUtilService);
28
+ //#endregion
29
+ Object.defineProperty(exports, "KVUtilService", {
30
+ enumerable: true,
31
+ get: function() {
32
+ return KVUtilService;
33
+ }
34
+ });
35
+ Object.defineProperty(exports, "ZeltKVInvalidTtlError", {
36
+ enumerable: true,
37
+ get: function() {
38
+ return ZeltKVInvalidTtlError;
39
+ }
40
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeltjs/kv",
3
- "version": "0.8.1",
3
+ "version": "0.8.2-canary.1",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -13,16 +13,34 @@
13
13
  },
14
14
  "exports": {
15
15
  ".": {
16
- "types": "./dist/index.d.ts",
17
- "import": "./dist/index.js"
16
+ "import": {
17
+ "types": "./dist/index.d.ts",
18
+ "default": "./dist/index.js"
19
+ },
20
+ "require": {
21
+ "types": "./dist/index.d.cts",
22
+ "default": "./dist/index.cjs"
23
+ }
18
24
  },
19
25
  "./adaptor-memory": {
20
- "types": "./dist/adaptor-memory/index.d.ts",
21
- "import": "./dist/adaptor-memory/index.js"
26
+ "import": {
27
+ "types": "./dist/adaptor-memory/index.d.ts",
28
+ "default": "./dist/adaptor-memory/index.js"
29
+ },
30
+ "require": {
31
+ "types": "./dist/adaptor-memory/index.d.cts",
32
+ "default": "./dist/adaptor-memory/index.cjs"
33
+ }
22
34
  },
23
35
  "./adaptor-redis": {
24
- "types": "./dist/adaptor-redis/index.d.ts",
25
- "import": "./dist/adaptor-redis/index.js"
36
+ "import": {
37
+ "types": "./dist/adaptor-redis/index.d.ts",
38
+ "default": "./dist/adaptor-redis/index.js"
39
+ },
40
+ "require": {
41
+ "types": "./dist/adaptor-redis/index.d.cts",
42
+ "default": "./dist/adaptor-redis/index.cjs"
43
+ }
26
44
  }
27
45
  },
28
46
  "files": [
@@ -30,8 +48,8 @@
30
48
  ],
31
49
  "peerDependencies": {
32
50
  "vitest": ">=4 <5",
33
- "@zeltjs/core": "0.8.1",
34
- "@zeltjs/redis": "0.8.1"
51
+ "@zeltjs/core": "0.8.2-canary.1",
52
+ "@zeltjs/redis": "0.8.2-canary.1"
35
53
  },
36
54
  "peerDependenciesMeta": {
37
55
  "@zeltjs/redis": {
@@ -41,13 +59,14 @@
41
59
  "devDependencies": {
42
60
  "@types/node": "22.19.17",
43
61
  "ioredis": "5.10.1",
44
- "@zeltjs/core": "0.8.1",
45
- "@zeltjs/unsafe-type-lib": "0.8.1",
46
- "@zeltjs/redis": "0.8.1"
62
+ "@zeltjs/core": "0.8.2-canary.1",
63
+ "@zeltjs/redis": "0.8.2-canary.1",
64
+ "@zeltjs/unsafe-type-lib": "0.8.2-canary.1"
47
65
  },
48
66
  "volta": {
49
67
  "extends": "../../package.json"
50
68
  },
69
+ "main": "./dist/index.cjs",
51
70
  "scripts": {
52
71
  "build": "tsdown",
53
72
  "test": "vitest run",