@aigne/secrets 0.1.6 → 1.74.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/rolldown_runtime.cjs +29 -0
- package/dist/base.cjs +21 -0
- package/dist/base.d.cts +20 -0
- package/dist/base.d.cts.map +1 -0
- package/dist/base.d.mts +20 -0
- package/dist/base.d.mts.map +1 -0
- package/dist/base.mjs +21 -0
- package/dist/base.mjs.map +1 -0
- package/dist/file.cjs +125 -0
- package/dist/file.d.cts +23 -0
- package/dist/file.d.cts.map +1 -0
- package/dist/file.d.mts +23 -0
- package/dist/file.d.mts.map +1 -0
- package/dist/file.mjs +123 -0
- package/dist/file.mjs.map +1 -0
- package/dist/index.cjs +19 -0
- package/dist/index.d.cts +9 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +9 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +17 -0
- package/dist/index.mjs.map +1 -0
- package/dist/keytar.cjs +117 -0
- package/dist/keytar.d.cts +25 -0
- package/dist/keytar.d.cts.map +1 -0
- package/dist/keytar.d.mts +25 -0
- package/dist/keytar.d.mts.map +1 -0
- package/dist/keytar.mjs +117 -0
- package/dist/keytar.mjs.map +1 -0
- package/dist/types.d.cts +32 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +32 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/util.cjs +52 -0
- package/dist/util.mjs +52 -0
- package/dist/util.mjs.map +1 -0
- package/package.json +28 -37
- package/CHANGELOG.md +0 -493
- package/lib/cjs/base.d.ts +0 -15
- package/lib/cjs/base.js +0 -23
- package/lib/cjs/file.d.ts +0 -19
- package/lib/cjs/file.js +0 -147
- package/lib/cjs/index.d.ts +0 -7
- package/lib/cjs/index.js +0 -39
- package/lib/cjs/keytar.d.ts +0 -21
- package/lib/cjs/keytar.js +0 -186
- package/lib/cjs/package.json +0 -3
- package/lib/cjs/types.d.ts +0 -28
- package/lib/cjs/types.js +0 -2
- package/lib/cjs/util.d.ts +0 -4
- package/lib/cjs/util.js +0 -57
- package/lib/esm/base.d.ts +0 -15
- package/lib/esm/base.js +0 -19
- package/lib/esm/file.d.ts +0 -19
- package/lib/esm/file.js +0 -140
- package/lib/esm/index.d.ts +0 -7
- package/lib/esm/index.js +0 -18
- package/lib/esm/keytar.d.ts +0 -21
- package/lib/esm/keytar.js +0 -149
- package/lib/esm/package.json +0 -3
- package/lib/esm/types.d.ts +0 -28
- package/lib/esm/types.js +0 -1
- package/lib/esm/util.d.ts +0 -4
- package/lib/esm/util.js +0 -54
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region rolldown:runtime
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
11
|
+
key = keys[i];
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
13
|
+
__defProp(to, key, {
|
|
14
|
+
get: ((k) => from[k]).bind(null, key),
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
23
|
+
value: mod,
|
|
24
|
+
enumerable: true
|
|
25
|
+
}) : target, mod));
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
|
|
29
|
+
exports.__toESM = __toESM;
|
package/dist/base.cjs
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/base.ts
|
|
3
|
+
var BaseSecretStore = class {
|
|
4
|
+
normalizeHostFrom(url) {
|
|
5
|
+
try {
|
|
6
|
+
return new URL(url).host;
|
|
7
|
+
} catch {
|
|
8
|
+
return url;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
parseKey(v) {
|
|
12
|
+
try {
|
|
13
|
+
return JSON.parse(v);
|
|
14
|
+
} catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
exports.BaseSecretStore = BaseSecretStore;
|
package/dist/base.d.cts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CredentialEntry, GetDefaultOptions, ISecretStore, ItemInfo } from "./types.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/base.d.ts
|
|
4
|
+
declare abstract class BaseSecretStore implements ISecretStore {
|
|
5
|
+
abstract available(): Promise<boolean>;
|
|
6
|
+
abstract setItem(key: string, value: ItemInfo): Promise<void>;
|
|
7
|
+
abstract getItem(key: string): Promise<ItemInfo | null>;
|
|
8
|
+
abstract deleteItem(key: string): Promise<boolean>;
|
|
9
|
+
abstract listItems(): Promise<CredentialEntry[] | null>;
|
|
10
|
+
abstract listEntries(): Promise<ItemInfo[]>;
|
|
11
|
+
abstract listMap(): Promise<Record<string, ItemInfo>>;
|
|
12
|
+
abstract setDefaultItem(value: ItemInfo): Promise<void>;
|
|
13
|
+
abstract getDefaultItem(options?: GetDefaultOptions): Promise<ItemInfo | null>;
|
|
14
|
+
abstract deleteDefaultItem(): Promise<void>;
|
|
15
|
+
protected normalizeHostFrom(url: string): string;
|
|
16
|
+
protected parseKey(v: string): ItemInfo | null;
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { BaseSecretStore };
|
|
20
|
+
//# sourceMappingURL=base.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.cts","names":[],"sources":["../src/base.ts"],"mappings":";;;uBAEsB,eAAA,YAA2B,YAAA;EAAA,SAAA,UAAA,GACzB,OAAA;EAAA,SAAA,QAAA,GAAA,UAAA,KAAA,EAEe,QAAA,GAAW,OAAA;EAAA,SAAA,QAAA,GAAA,WACjB,OAAA,CAAQ,QAAA;EAAA,SAAA,WAAA,GAAA,WACL,OAAA;EAAA,SAAA,UAAA,GAEZ,OAAA,CAAQ,eAAA;EAAA,SAAA,YAAA,GACN,OAAA,CAAQ,QAAA;EAAA,SAAA,QAAA,GACZ,OAAA,CAAQ,MAAA,SAAe,QAAA;EAAA,SAAA,eAAA,KAAA,EAEZ,QAAA,GAAW,OAAA;EAAA,SAAA,eAAA,OAAA,GACR,iBAAA,GAAoB,OAAA,CAAQ,QAAA;EAAA,SAAA,kBAAA,GAChC,OAAA;EAAA,UAAA,kBAAA,GAAA;EAAA,UAAA,SAAA,CAAA,WAUC,QAAA;AAAA"}
|
package/dist/base.d.mts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CredentialEntry, GetDefaultOptions, ISecretStore, ItemInfo } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/base.d.ts
|
|
4
|
+
declare abstract class BaseSecretStore implements ISecretStore {
|
|
5
|
+
abstract available(): Promise<boolean>;
|
|
6
|
+
abstract setItem(key: string, value: ItemInfo): Promise<void>;
|
|
7
|
+
abstract getItem(key: string): Promise<ItemInfo | null>;
|
|
8
|
+
abstract deleteItem(key: string): Promise<boolean>;
|
|
9
|
+
abstract listItems(): Promise<CredentialEntry[] | null>;
|
|
10
|
+
abstract listEntries(): Promise<ItemInfo[]>;
|
|
11
|
+
abstract listMap(): Promise<Record<string, ItemInfo>>;
|
|
12
|
+
abstract setDefaultItem(value: ItemInfo): Promise<void>;
|
|
13
|
+
abstract getDefaultItem(options?: GetDefaultOptions): Promise<ItemInfo | null>;
|
|
14
|
+
abstract deleteDefaultItem(): Promise<void>;
|
|
15
|
+
protected normalizeHostFrom(url: string): string;
|
|
16
|
+
protected parseKey(v: string): ItemInfo | null;
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { BaseSecretStore };
|
|
20
|
+
//# sourceMappingURL=base.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.mts","names":[],"sources":["../src/base.ts"],"mappings":";;;uBAEsB,eAAA,YAA2B,YAAA;EAAA,SAAA,UAAA,GACzB,OAAA;EAAA,SAAA,QAAA,GAAA,UAAA,KAAA,EAEe,QAAA,GAAW,OAAA;EAAA,SAAA,QAAA,GAAA,WACjB,OAAA,CAAQ,QAAA;EAAA,SAAA,WAAA,GAAA,WACL,OAAA;EAAA,SAAA,UAAA,GAEZ,OAAA,CAAQ,eAAA;EAAA,SAAA,YAAA,GACN,OAAA,CAAQ,QAAA;EAAA,SAAA,QAAA,GACZ,OAAA,CAAQ,MAAA,SAAe,QAAA;EAAA,SAAA,eAAA,KAAA,EAEZ,QAAA,GAAW,OAAA;EAAA,SAAA,eAAA,OAAA,GACR,iBAAA,GAAoB,OAAA,CAAQ,QAAA;EAAA,SAAA,kBAAA,GAChC,OAAA;EAAA,UAAA,kBAAA,GAAA;EAAA,UAAA,SAAA,CAAA,WAUC,QAAA;AAAA"}
|
package/dist/base.mjs
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/base.ts
|
|
2
|
+
var BaseSecretStore = class {
|
|
3
|
+
normalizeHostFrom(url) {
|
|
4
|
+
try {
|
|
5
|
+
return new URL(url).host;
|
|
6
|
+
} catch {
|
|
7
|
+
return url;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
parseKey(v) {
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(v);
|
|
13
|
+
} catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
//#endregion
|
|
20
|
+
export { BaseSecretStore };
|
|
21
|
+
//# sourceMappingURL=base.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.mjs","names":[],"sources":["../src/base.ts"],"sourcesContent":["import type { CredentialEntry, GetDefaultOptions, ISecretStore, ItemInfo } from \"./types.js\";\n\nexport abstract class BaseSecretStore implements ISecretStore {\n abstract available(): Promise<boolean>;\n\n abstract setItem(key: string, value: ItemInfo): Promise<void>;\n abstract getItem(key: string): Promise<ItemInfo | null>;\n abstract deleteItem(key: string): Promise<boolean>;\n\n abstract listItems(): Promise<CredentialEntry[] | null>;\n abstract listEntries(): Promise<ItemInfo[]>;\n abstract listMap(): Promise<Record<string, ItemInfo>>;\n\n abstract setDefaultItem(value: ItemInfo): Promise<void>;\n abstract getDefaultItem(options?: GetDefaultOptions): Promise<ItemInfo | null>;\n abstract deleteDefaultItem(): Promise<void>;\n\n protected normalizeHostFrom(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return url;\n }\n }\n\n protected parseKey(v: string): ItemInfo | null {\n try {\n const parsed = JSON.parse(v);\n return parsed;\n } catch {\n return null;\n }\n }\n}\n"],"mappings":";AAEA,IAAsB,kBAAtB,MAA8D;CAe5D,AAAU,kBAAkB,KAAqB;AAC/C,MAAI;AACF,UAAO,IAAI,IAAI,IAAI,CAAC;UACd;AACN,UAAO;;;CAIX,AAAU,SAAS,GAA4B;AAC7C,MAAI;AAEF,UADe,KAAK,MAAM,EAAE;UAEtB;AACN,UAAO"}
|
package/dist/file.cjs
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_base = require('./base.cjs');
|
|
3
|
+
let node_fs_promises = require("node:fs/promises");
|
|
4
|
+
node_fs_promises = require_rolldown_runtime.__toESM(node_fs_promises);
|
|
5
|
+
let node_path = require("node:path");
|
|
6
|
+
node_path = require_rolldown_runtime.__toESM(node_path);
|
|
7
|
+
let yaml = require("yaml");
|
|
8
|
+
|
|
9
|
+
//#region src/file.ts
|
|
10
|
+
var FileStore = class extends require_base.BaseSecretStore {
|
|
11
|
+
filepath;
|
|
12
|
+
constructor(options) {
|
|
13
|
+
super();
|
|
14
|
+
this.filepath = options.filepath;
|
|
15
|
+
}
|
|
16
|
+
async available() {
|
|
17
|
+
try {
|
|
18
|
+
await node_fs_promises.default.access(node_path.default.dirname(this.filepath));
|
|
19
|
+
return true;
|
|
20
|
+
} catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async load() {
|
|
25
|
+
try {
|
|
26
|
+
const parsed = (0, yaml.parse)(await node_fs_promises.default.readFile(this.filepath, "utf-8"));
|
|
27
|
+
if (!parsed || typeof parsed !== "object") return {};
|
|
28
|
+
return parsed;
|
|
29
|
+
} catch {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async save(data) {
|
|
34
|
+
const yaml$1 = (0, yaml.stringify)(data);
|
|
35
|
+
await node_fs_promises.default.mkdir(node_path.default.dirname(this.filepath), { recursive: true });
|
|
36
|
+
await node_fs_promises.default.writeFile(this.filepath, yaml$1, "utf-8");
|
|
37
|
+
}
|
|
38
|
+
async setItem(key, value) {
|
|
39
|
+
if (!await this.available()) throw new Error("File store not available");
|
|
40
|
+
const data = await this.load();
|
|
41
|
+
data[key] = value;
|
|
42
|
+
await this.save(data);
|
|
43
|
+
}
|
|
44
|
+
async getItem(key) {
|
|
45
|
+
if (!await this.available()) return null;
|
|
46
|
+
try {
|
|
47
|
+
return (await this.load())[key] || null;
|
|
48
|
+
} catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async deleteItem(key) {
|
|
53
|
+
if (!await this.available()) return false;
|
|
54
|
+
try {
|
|
55
|
+
const data = await this.load();
|
|
56
|
+
if (data[key]) {
|
|
57
|
+
delete data[key];
|
|
58
|
+
await this.save(data);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
} catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async listItems() {
|
|
67
|
+
if (!await this.available()) return null;
|
|
68
|
+
try {
|
|
69
|
+
const data = await this.load();
|
|
70
|
+
const entries = [];
|
|
71
|
+
for (const [host, config] of Object.entries(data)) {
|
|
72
|
+
if (host === "default") continue;
|
|
73
|
+
entries.push({
|
|
74
|
+
account: host,
|
|
75
|
+
password: JSON.stringify(config)
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return entries.length > 0 ? entries : null;
|
|
79
|
+
} catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async listEntries() {
|
|
84
|
+
const list = await this.listItems();
|
|
85
|
+
if (!list) return [];
|
|
86
|
+
return list.reduce((acc, c) => {
|
|
87
|
+
if (c.password && c.account) acc.push(this.parseKey(c.password));
|
|
88
|
+
return acc;
|
|
89
|
+
}, []);
|
|
90
|
+
}
|
|
91
|
+
async listMap() {
|
|
92
|
+
const list = await this.listItems();
|
|
93
|
+
if (!list) return {};
|
|
94
|
+
return list.reduce((acc, host) => {
|
|
95
|
+
if (host.account && host.password) {
|
|
96
|
+
const parsed = this.parseKey(host.password);
|
|
97
|
+
if (parsed) acc[host.account] = parsed;
|
|
98
|
+
}
|
|
99
|
+
return acc;
|
|
100
|
+
}, {});
|
|
101
|
+
}
|
|
102
|
+
async setDefaultItem(value) {
|
|
103
|
+
if (!await this.available()) throw new Error("File store not available");
|
|
104
|
+
const data = await this.load();
|
|
105
|
+
data["default"] = value;
|
|
106
|
+
await this.save(data);
|
|
107
|
+
}
|
|
108
|
+
async getDefaultItem() {
|
|
109
|
+
if (!await this.available()) return null;
|
|
110
|
+
try {
|
|
111
|
+
return (await this.load()).default ?? null;
|
|
112
|
+
} catch {}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
async deleteDefaultItem() {
|
|
116
|
+
if (!await this.available()) throw new Error("File store not available");
|
|
117
|
+
const data = await this.load();
|
|
118
|
+
delete data.default;
|
|
119
|
+
await this.save(data);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
var file_default = FileStore;
|
|
123
|
+
|
|
124
|
+
//#endregion
|
|
125
|
+
exports.default = file_default;
|
package/dist/file.d.cts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CredentialEntry, ItemInfo, StoreOptions } from "./types.cjs";
|
|
2
|
+
import { BaseSecretStore } from "./base.cjs";
|
|
3
|
+
|
|
4
|
+
//#region src/file.d.ts
|
|
5
|
+
declare class FileStore extends BaseSecretStore {
|
|
6
|
+
private filepath;
|
|
7
|
+
constructor(options: Required<Pick<StoreOptions, "filepath">>);
|
|
8
|
+
available(): Promise<boolean>;
|
|
9
|
+
private load;
|
|
10
|
+
private save;
|
|
11
|
+
setItem(key: string, value: ItemInfo): Promise<void>;
|
|
12
|
+
getItem(key: string): Promise<ItemInfo | null>;
|
|
13
|
+
deleteItem(key: string): Promise<boolean>;
|
|
14
|
+
listItems(): Promise<CredentialEntry[] | null>;
|
|
15
|
+
listEntries(): Promise<ItemInfo[]>;
|
|
16
|
+
listMap(): Promise<Record<string, ItemInfo>>;
|
|
17
|
+
setDefaultItem(value: ItemInfo): Promise<void>;
|
|
18
|
+
getDefaultItem(): Promise<ItemInfo | null>;
|
|
19
|
+
deleteDefaultItem(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { FileStore };
|
|
23
|
+
//# sourceMappingURL=file.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.d.cts","names":[],"sources":["../src/file.ts"],"mappings":";;;;cAUa,SAAA,SAAkB,eAAA;EAAA,QAAA,QAAA;EAAA,YAAA,OAAA,EAGR,QAAA,CAAS,IAAA,CAAK,YAAA;EAAA,UAAA,GAKhB,OAAA;EAAA,QAAA,IAAA;EAAA,QAAA,IAAA;EAAA,QAAA,GAAA,UAAA,KAAA,EA4Be,QAAA,GAAW,OAAA;EAAA,QAAA,GAAA,WAUjB,OAAA,CAAQ,QAAA;EAAA,WAAA,GAAA,WAWL,OAAA;EAAA,UAAA,GAgBZ,OAAA,CAAQ,eAAA;EAAA,YAAA,GAkBG,OAAA,CAAQ,QAAA;EAAA,QAAA,GAaZ,OAAA,CAAQ,MAAA,SAAe,QAAA;EAAA,eAAA,KAAA,EAiBZ,QAAA,GAAW,OAAA;EAAA,eAAA,GAQf,OAAA,CAAQ,QAAA;EAAA,kBAAA,GAaL,OAAA;AAAA"}
|
package/dist/file.d.mts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CredentialEntry, ItemInfo, StoreOptions } from "./types.mjs";
|
|
2
|
+
import { BaseSecretStore } from "./base.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/file.d.ts
|
|
5
|
+
declare class FileStore extends BaseSecretStore {
|
|
6
|
+
private filepath;
|
|
7
|
+
constructor(options: Required<Pick<StoreOptions, "filepath">>);
|
|
8
|
+
available(): Promise<boolean>;
|
|
9
|
+
private load;
|
|
10
|
+
private save;
|
|
11
|
+
setItem(key: string, value: ItemInfo): Promise<void>;
|
|
12
|
+
getItem(key: string): Promise<ItemInfo | null>;
|
|
13
|
+
deleteItem(key: string): Promise<boolean>;
|
|
14
|
+
listItems(): Promise<CredentialEntry[] | null>;
|
|
15
|
+
listEntries(): Promise<ItemInfo[]>;
|
|
16
|
+
listMap(): Promise<Record<string, ItemInfo>>;
|
|
17
|
+
setDefaultItem(value: ItemInfo): Promise<void>;
|
|
18
|
+
getDefaultItem(): Promise<ItemInfo | null>;
|
|
19
|
+
deleteDefaultItem(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { FileStore };
|
|
23
|
+
//# sourceMappingURL=file.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.d.mts","names":[],"sources":["../src/file.ts"],"mappings":";;;;cAUa,SAAA,SAAkB,eAAA;EAAA,QAAA,QAAA;EAAA,YAAA,OAAA,EAGR,QAAA,CAAS,IAAA,CAAK,YAAA;EAAA,UAAA,GAKhB,OAAA;EAAA,QAAA,IAAA;EAAA,QAAA,IAAA;EAAA,QAAA,GAAA,UAAA,KAAA,EA4Be,QAAA,GAAW,OAAA;EAAA,QAAA,GAAA,WAUjB,OAAA,CAAQ,QAAA;EAAA,WAAA,GAAA,WAWL,OAAA;EAAA,UAAA,GAgBZ,OAAA,CAAQ,eAAA;EAAA,YAAA,GAkBG,OAAA,CAAQ,QAAA;EAAA,QAAA,GAaZ,OAAA,CAAQ,MAAA,SAAe,QAAA;EAAA,eAAA,KAAA,EAiBZ,QAAA,GAAW,OAAA;EAAA,eAAA,GAQf,OAAA,CAAQ,QAAA;EAAA,kBAAA,GAaL,OAAA;AAAA"}
|
package/dist/file.mjs
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { BaseSecretStore } from "./base.mjs";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { parse, stringify } from "yaml";
|
|
5
|
+
|
|
6
|
+
//#region src/file.ts
|
|
7
|
+
var FileStore = class extends BaseSecretStore {
|
|
8
|
+
filepath;
|
|
9
|
+
constructor(options) {
|
|
10
|
+
super();
|
|
11
|
+
this.filepath = options.filepath;
|
|
12
|
+
}
|
|
13
|
+
async available() {
|
|
14
|
+
try {
|
|
15
|
+
await fs.access(path.dirname(this.filepath));
|
|
16
|
+
return true;
|
|
17
|
+
} catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async load() {
|
|
22
|
+
try {
|
|
23
|
+
const parsed = parse(await fs.readFile(this.filepath, "utf-8"));
|
|
24
|
+
if (!parsed || typeof parsed !== "object") return {};
|
|
25
|
+
return parsed;
|
|
26
|
+
} catch {
|
|
27
|
+
return {};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async save(data) {
|
|
31
|
+
const yaml = stringify(data);
|
|
32
|
+
await fs.mkdir(path.dirname(this.filepath), { recursive: true });
|
|
33
|
+
await fs.writeFile(this.filepath, yaml, "utf-8");
|
|
34
|
+
}
|
|
35
|
+
async setItem(key, value) {
|
|
36
|
+
if (!await this.available()) throw new Error("File store not available");
|
|
37
|
+
const data = await this.load();
|
|
38
|
+
data[key] = value;
|
|
39
|
+
await this.save(data);
|
|
40
|
+
}
|
|
41
|
+
async getItem(key) {
|
|
42
|
+
if (!await this.available()) return null;
|
|
43
|
+
try {
|
|
44
|
+
return (await this.load())[key] || null;
|
|
45
|
+
} catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async deleteItem(key) {
|
|
50
|
+
if (!await this.available()) return false;
|
|
51
|
+
try {
|
|
52
|
+
const data = await this.load();
|
|
53
|
+
if (data[key]) {
|
|
54
|
+
delete data[key];
|
|
55
|
+
await this.save(data);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
} catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async listItems() {
|
|
64
|
+
if (!await this.available()) return null;
|
|
65
|
+
try {
|
|
66
|
+
const data = await this.load();
|
|
67
|
+
const entries = [];
|
|
68
|
+
for (const [host, config] of Object.entries(data)) {
|
|
69
|
+
if (host === "default") continue;
|
|
70
|
+
entries.push({
|
|
71
|
+
account: host,
|
|
72
|
+
password: JSON.stringify(config)
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return entries.length > 0 ? entries : null;
|
|
76
|
+
} catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async listEntries() {
|
|
81
|
+
const list = await this.listItems();
|
|
82
|
+
if (!list) return [];
|
|
83
|
+
return list.reduce((acc, c) => {
|
|
84
|
+
if (c.password && c.account) acc.push(this.parseKey(c.password));
|
|
85
|
+
return acc;
|
|
86
|
+
}, []);
|
|
87
|
+
}
|
|
88
|
+
async listMap() {
|
|
89
|
+
const list = await this.listItems();
|
|
90
|
+
if (!list) return {};
|
|
91
|
+
return list.reduce((acc, host) => {
|
|
92
|
+
if (host.account && host.password) {
|
|
93
|
+
const parsed = this.parseKey(host.password);
|
|
94
|
+
if (parsed) acc[host.account] = parsed;
|
|
95
|
+
}
|
|
96
|
+
return acc;
|
|
97
|
+
}, {});
|
|
98
|
+
}
|
|
99
|
+
async setDefaultItem(value) {
|
|
100
|
+
if (!await this.available()) throw new Error("File store not available");
|
|
101
|
+
const data = await this.load();
|
|
102
|
+
data["default"] = value;
|
|
103
|
+
await this.save(data);
|
|
104
|
+
}
|
|
105
|
+
async getDefaultItem() {
|
|
106
|
+
if (!await this.available()) return null;
|
|
107
|
+
try {
|
|
108
|
+
return (await this.load()).default ?? null;
|
|
109
|
+
} catch {}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
async deleteDefaultItem() {
|
|
113
|
+
if (!await this.available()) throw new Error("File store not available");
|
|
114
|
+
const data = await this.load();
|
|
115
|
+
delete data.default;
|
|
116
|
+
await this.save(data);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
var file_default = FileStore;
|
|
120
|
+
|
|
121
|
+
//#endregion
|
|
122
|
+
export { file_default as default };
|
|
123
|
+
//# sourceMappingURL=file.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.mjs","names":[],"sources":["../src/file.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parse, stringify } from \"yaml\";\nimport { BaseSecretStore } from \"./base.js\";\nimport type { CredentialEntry, ItemInfo, StoreOptions } from \"./types.js\";\n\ninterface AIGNEEnv {\n [key: string]: ItemInfo;\n}\n\nexport class FileStore extends BaseSecretStore {\n private filepath: string;\n\n constructor(options: Required<Pick<StoreOptions, \"filepath\">>) {\n super();\n this.filepath = options.filepath;\n }\n\n async available(): Promise<boolean> {\n try {\n await fs.access(path.dirname(this.filepath));\n return true;\n } catch {\n return false;\n }\n }\n\n private async load(): Promise<AIGNEEnv> {\n try {\n const data = await fs.readFile(this.filepath, \"utf-8\");\n const parsed = parse(data) as AIGNEEnv;\n if (!parsed || typeof parsed !== \"object\") {\n return {};\n }\n return parsed;\n } catch {\n return {};\n }\n }\n\n private async save(data: AIGNEEnv): Promise<void> {\n const yaml = stringify(data);\n await fs.mkdir(path.dirname(this.filepath), { recursive: true });\n await fs.writeFile(this.filepath, yaml, \"utf-8\");\n }\n\n async setItem(key: string, value: ItemInfo): Promise<void> {\n if (!(await this.available())) throw new Error(\"File store not available\");\n\n const data = await this.load();\n\n data[key] = value;\n\n await this.save(data);\n }\n\n async getItem(key: string): Promise<ItemInfo | null> {\n if (!(await this.available())) return null;\n\n try {\n const data = await this.load();\n return data[key] || null;\n } catch {\n return null;\n }\n }\n\n async deleteItem(key: string): Promise<boolean> {\n if (!(await this.available())) return false;\n\n try {\n const data = await this.load();\n if (data[key]) {\n delete data[key];\n await this.save(data);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n\n async listItems(): Promise<CredentialEntry[] | null> {\n if (!(await this.available())) return null;\n\n try {\n const data = await this.load();\n const entries: CredentialEntry[] = [];\n\n for (const [host, config] of Object.entries(data)) {\n if (host === \"default\") continue;\n entries.push({ account: host, password: JSON.stringify(config) });\n }\n\n return entries.length > 0 ? entries : null;\n } catch {\n return null;\n }\n }\n\n override async listEntries(): Promise<ItemInfo[]> {\n const list = await this.listItems();\n if (!list) return [];\n\n return list.reduce<ItemInfo[]>((acc, c) => {\n if (c.password && c.account) {\n acc.push(this.parseKey(c.password) as ItemInfo);\n }\n\n return acc;\n }, []);\n }\n\n override async listMap(): Promise<Record<string, ItemInfo>> {\n const list = await this.listItems();\n if (!list) return {};\n\n return list.reduce(\n (acc, host) => {\n if (host.account && host.password) {\n const parsed = this.parseKey(host.password);\n if (parsed) acc[host.account] = parsed;\n }\n\n return acc;\n },\n {} as Record<string, ItemInfo>,\n );\n }\n\n override async setDefaultItem(value: ItemInfo): Promise<void> {\n if (!(await this.available())) throw new Error(\"File store not available\");\n\n const data = await this.load();\n data[\"default\"] = value;\n await this.save(data);\n }\n\n override async getDefaultItem(): Promise<ItemInfo | null> {\n if (!(await this.available())) return null;\n\n try {\n const data = await this.load();\n return data.default ?? null;\n } catch {\n // ignore\n }\n\n return null;\n }\n\n override async deleteDefaultItem(): Promise<void> {\n if (!(await this.available())) throw new Error(\"File store not available\");\n\n const data = await this.load();\n delete data.default;\n await this.save(data);\n }\n}\n\nexport default FileStore;\n"],"mappings":"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"}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
2
|
+
const require_file = require('./file.cjs');
|
|
3
|
+
const require_keytar = require('./keytar.cjs');
|
|
4
|
+
|
|
5
|
+
//#region src/index.ts
|
|
6
|
+
async function createSecretStore(options) {
|
|
7
|
+
if (!options.serviceName) throw new Error("Secret store key is required");
|
|
8
|
+
const keyring = new require_keytar.default(options);
|
|
9
|
+
if (await keyring.available()) return keyring;
|
|
10
|
+
const filepath = options.filepath;
|
|
11
|
+
if (!filepath) throw new Error("Filepath is required");
|
|
12
|
+
return new require_file.default({ filepath });
|
|
13
|
+
}
|
|
14
|
+
var src_default = createSecretStore;
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
exports.FileStore = require_file;
|
|
18
|
+
exports.KeyringStore = require_keytar;
|
|
19
|
+
exports.default = src_default;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CredentialEntry, GetDefaultOptions, ISecretStore, ItemInfo, StoreOptions } from "./types.cjs";
|
|
2
|
+
import { FileStore } from "./file.cjs";
|
|
3
|
+
import { KeyringStore } from "./keytar.cjs";
|
|
4
|
+
|
|
5
|
+
//#region src/index.d.ts
|
|
6
|
+
declare function createSecretStore(options: StoreOptions): Promise<ISecretStore>;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { CredentialEntry, FileStore, GetDefaultOptions, ISecretStore, ItemInfo, KeyringStore, StoreOptions, createSecretStore as default };
|
|
9
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;iBAOe,iBAAA,CAAA,OAAA,EAA2B,YAAA,GAAe,OAAA,CAAQ,YAAA"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CredentialEntry, GetDefaultOptions, ISecretStore, ItemInfo, StoreOptions } from "./types.mjs";
|
|
2
|
+
import { FileStore } from "./file.mjs";
|
|
3
|
+
import { KeyringStore } from "./keytar.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/index.d.ts
|
|
6
|
+
declare function createSecretStore(options: StoreOptions): Promise<ISecretStore>;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { CredentialEntry, FileStore, GetDefaultOptions, ISecretStore, ItemInfo, KeyringStore, StoreOptions, createSecretStore as default };
|
|
9
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;iBAOe,iBAAA,CAAA,OAAA,EAA2B,YAAA,GAAe,OAAA,CAAQ,YAAA"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import file_default from "./file.mjs";
|
|
2
|
+
import keytar_default from "./keytar.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/index.ts
|
|
5
|
+
async function createSecretStore(options) {
|
|
6
|
+
if (!options.serviceName) throw new Error("Secret store key is required");
|
|
7
|
+
const keyring = new keytar_default(options);
|
|
8
|
+
if (await keyring.available()) return keyring;
|
|
9
|
+
const filepath = options.filepath;
|
|
10
|
+
if (!filepath) throw new Error("Filepath is required");
|
|
11
|
+
return new file_default({ filepath });
|
|
12
|
+
}
|
|
13
|
+
var src_default = createSecretStore;
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
export { file_default as FileStore, keytar_default as KeyringStore, src_default as default };
|
|
17
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["KeyringStore","FileStore"],"sources":["../src/index.ts"],"sourcesContent":["import FileStore from \"./file.js\";\nimport KeyringStore from \"./keytar.js\";\nimport type { ISecretStore, StoreOptions } from \"./types.js\";\n\nexport * from \"./types.js\";\nexport { FileStore, KeyringStore };\n\nasync function createSecretStore(options: StoreOptions): Promise<ISecretStore> {\n if (!options.serviceName) {\n throw new Error(\"Secret store key is required\");\n }\n\n const keyring = new KeyringStore(options);\n if (await keyring.available()) {\n return keyring;\n }\n\n const filepath = options.filepath;\n if (!filepath) throw new Error(\"Filepath is required\");\n\n return new FileStore({ filepath });\n}\n\nexport default createSecretStore;\n"],"mappings":";;;;AAOA,eAAe,kBAAkB,SAA8C;AAC7E,KAAI,CAAC,QAAQ,YACX,OAAM,IAAI,MAAM,+BAA+B;CAGjD,MAAM,UAAU,IAAIA,eAAa,QAAQ;AACzC,KAAI,MAAM,QAAQ,WAAW,CAC3B,QAAO;CAGT,MAAM,WAAW,QAAQ;AACzB,KAAI,CAAC,SAAU,OAAM,IAAI,MAAM,uBAAuB;AAEtD,QAAO,IAAIC,aAAU,EAAE,UAAU,CAAC;;AAGpC,kBAAe"}
|
package/dist/keytar.cjs
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_base = require('./base.cjs');
|
|
3
|
+
const require_util = require('./util.cjs');
|
|
4
|
+
let _aigne_core_utils_logger = require("@aigne/core/utils/logger");
|
|
5
|
+
|
|
6
|
+
//#region src/keytar.ts
|
|
7
|
+
const DEFAULT_SERVICE_NAME = "-api-key";
|
|
8
|
+
const DEFAULT_ACCOUNT_NAME_FOR_DEFAULT = "default";
|
|
9
|
+
var KeyringStore = class extends require_base.BaseSecretStore {
|
|
10
|
+
_impl = null;
|
|
11
|
+
serviceName;
|
|
12
|
+
_forceUnavailable;
|
|
13
|
+
_environmentChecked = false;
|
|
14
|
+
_environmentReady = false;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
super();
|
|
17
|
+
const { serviceName, forceKeytarUnavailable = false } = options;
|
|
18
|
+
this.serviceName = `${serviceName}${DEFAULT_SERVICE_NAME}`;
|
|
19
|
+
this._forceUnavailable = !!forceKeytarUnavailable;
|
|
20
|
+
}
|
|
21
|
+
async available() {
|
|
22
|
+
if (this._forceUnavailable) return false;
|
|
23
|
+
if (!this._environmentChecked) {
|
|
24
|
+
const { ready, reason } = require_util.isKeyringEnvironmentReady();
|
|
25
|
+
this._environmentReady = ready;
|
|
26
|
+
if (!ready) _aigne_core_utils_logger.logger.warn(`Keyring environment not ready: ${reason}`);
|
|
27
|
+
this._environmentChecked = true;
|
|
28
|
+
}
|
|
29
|
+
if (!this._environmentReady) return false;
|
|
30
|
+
try {
|
|
31
|
+
if (!this._impl) this._impl = (await import("@zowe/secrets-for-zowe-sdk")).keyring;
|
|
32
|
+
return !!(this._impl && typeof this._impl.getPassword === "function" && typeof this._impl.setPassword === "function" && typeof this._impl.deletePassword === "function");
|
|
33
|
+
} catch (error) {
|
|
34
|
+
_aigne_core_utils_logger.logger.error(`Failed to load keyring: ${error.message}`);
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async setItem(key, value) {
|
|
39
|
+
if (!await this.available()) throw new Error("Keyring not available");
|
|
40
|
+
if (!this._impl) throw new Error("Keyring not loaded");
|
|
41
|
+
return this._impl.setPassword(this.serviceName, key, JSON.stringify(value));
|
|
42
|
+
}
|
|
43
|
+
async getItem(key) {
|
|
44
|
+
if (!await this.available()) return null;
|
|
45
|
+
if (!this._impl) return null;
|
|
46
|
+
try {
|
|
47
|
+
const v = await this._impl.getPassword(this.serviceName, key);
|
|
48
|
+
if (!v) return null;
|
|
49
|
+
return this.parseKey(v);
|
|
50
|
+
} catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async deleteItem(key) {
|
|
55
|
+
if (!await this.available()) return false;
|
|
56
|
+
if (!this._impl) return false;
|
|
57
|
+
try {
|
|
58
|
+
return !!await this._impl.deletePassword(this.serviceName, key);
|
|
59
|
+
} catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async listItems() {
|
|
64
|
+
if (!await this.available()) return null;
|
|
65
|
+
if (!this._impl) return null;
|
|
66
|
+
try {
|
|
67
|
+
if (typeof this._impl.findCredentials === "function") {
|
|
68
|
+
const list = await this._impl.findCredentials(this.serviceName);
|
|
69
|
+
return Array.isArray(list) && list.length > 0 ? list.filter((c) => c.account !== DEFAULT_ACCOUNT_NAME_FOR_DEFAULT) : null;
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
} catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async listEntries() {
|
|
77
|
+
const list = await this.listItems();
|
|
78
|
+
if (!list) return [];
|
|
79
|
+
return list.reduce((acc, c) => {
|
|
80
|
+
if (c.password) {
|
|
81
|
+
const parsed = this.parseKey(c.password);
|
|
82
|
+
if (parsed) acc.push(parsed);
|
|
83
|
+
}
|
|
84
|
+
return acc;
|
|
85
|
+
}, []);
|
|
86
|
+
}
|
|
87
|
+
async listMap() {
|
|
88
|
+
const list = await this.listItems();
|
|
89
|
+
if (!list) return {};
|
|
90
|
+
return list.reduce((acc, host) => {
|
|
91
|
+
if (host.account && host.password) {
|
|
92
|
+
const parsed = this.parseKey(host.password);
|
|
93
|
+
if (parsed) acc[host.account] = parsed;
|
|
94
|
+
}
|
|
95
|
+
return acc;
|
|
96
|
+
}, {});
|
|
97
|
+
}
|
|
98
|
+
async setDefaultItem(value) {
|
|
99
|
+
if (!await this.available()) throw new Error("Keyring not available");
|
|
100
|
+
if (!this._impl) throw new Error("Keyring not loaded");
|
|
101
|
+
return this.setItem(DEFAULT_ACCOUNT_NAME_FOR_DEFAULT, value);
|
|
102
|
+
}
|
|
103
|
+
async getDefaultItem() {
|
|
104
|
+
if (!await this.available()) return null;
|
|
105
|
+
if (!this._impl) return null;
|
|
106
|
+
return this.getItem(DEFAULT_ACCOUNT_NAME_FOR_DEFAULT);
|
|
107
|
+
}
|
|
108
|
+
async deleteDefaultItem() {
|
|
109
|
+
if (!await this.available()) throw new Error("Keyring not available");
|
|
110
|
+
if (!this._impl) throw new Error("Keyring not loaded");
|
|
111
|
+
await this.deleteItem(DEFAULT_ACCOUNT_NAME_FOR_DEFAULT);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
var keytar_default = KeyringStore;
|
|
115
|
+
|
|
116
|
+
//#endregion
|
|
117
|
+
exports.default = keytar_default;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { CredentialEntry, ItemInfo, StoreOptions } from "./types.cjs";
|
|
2
|
+
import { BaseSecretStore } from "./base.cjs";
|
|
3
|
+
|
|
4
|
+
//#region src/keytar.d.ts
|
|
5
|
+
declare class KeyringStore extends BaseSecretStore {
|
|
6
|
+
private _impl;
|
|
7
|
+
private serviceName;
|
|
8
|
+
private _forceUnavailable;
|
|
9
|
+
private _environmentChecked;
|
|
10
|
+
private _environmentReady;
|
|
11
|
+
constructor(options: StoreOptions);
|
|
12
|
+
available(): Promise<boolean>;
|
|
13
|
+
setItem(key: string, value: ItemInfo): Promise<any>;
|
|
14
|
+
getItem(key: string): Promise<ItemInfo | null>;
|
|
15
|
+
deleteItem(key: string): Promise<boolean>;
|
|
16
|
+
listItems(): Promise<CredentialEntry[] | null>;
|
|
17
|
+
listEntries(): Promise<ItemInfo[]>;
|
|
18
|
+
listMap(): Promise<Record<string, ItemInfo>>;
|
|
19
|
+
setDefaultItem(value: ItemInfo): Promise<void>;
|
|
20
|
+
getDefaultItem(): Promise<ItemInfo | null>;
|
|
21
|
+
deleteDefaultItem(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
export { KeyringStore };
|
|
25
|
+
//# sourceMappingURL=keytar.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keytar.d.cts","names":[],"sources":["../src/keytar.ts"],"mappings":";;;;cAQa,YAAA,SAAqB,eAAA;EAAA,QAAA,KAAA;EAAA,QAAA,WAAA;EAAA,QAAA,iBAAA;EAAA,QAAA,mBAAA;EAAA,QAAA,iBAAA;EAAA,YAAA,OAAA,EAOX,YAAA;EAAA,UAAA,GASN,OAAA;EAAA,QAAA,GAAA,UAAA,KAAA,EAsCmB,QAAA,GAAQ,OAAA;EAAA,QAAA,GAAA,WAOd,OAAA,CAAQ,QAAA;EAAA,WAAA,GAAA,WAaL,OAAA;EAAA,UAAA,GAYZ,OAAA,CAAQ,eAAA;EAAA,YAAA,GAkBG,OAAA,CAAQ,QAAA;EAAA,QAAA,GAaZ,OAAA,CAAQ,MAAA,SAAe,QAAA;EAAA,eAAA,KAAA,EAiBZ,QAAA,GAAW,OAAA;EAAA,eAAA,GAOf,OAAA,CAAQ,QAAA;EAAA,kBAAA,GAOL,OAAA;AAAA"}
|